10.3 示例:使用K-Means算法检测DGA域名

域名生成算法(Domain Generation Algorithm,DGA)是一项古老但一直活跃的技术,是中心结构僵尸网络赖以生存的关键武器,该技术给打击和关闭该类型僵尸网络造成了不小的麻烦,研究人员需要快速掌握域名生成算法和输入,对生成的域名及时进行处置。我们使用K-Means算法进行聚类,观察DGA与正常域名的聚类情况。DGA详细内容请阅读第12章,完整演示代码请见本书GitHub上的10-2.py。

1.数据搜集和数据清洗

加载alexa前100的域名作为白样本,标记为0;分别加载cryptolocker和post-tovar-goz家族的DGA域名,分别标记为2和3:


x1_domain_list = load_alexa("../data/dga/top-100.csv")
x2_domain_list = load_dga("../data/dga/dga-cryptolocke-50.txt")
x3_domain_list = load_dga("../data/dga/dga-post-tovar-goz-50.txt")
x_domain_list=np.concatenate((x1_domain_list, x2_domain_list,x3_domain_list))
y1=[0]*len(x1_domain_list)
y2=[1]*len(x2_domain_list)
y3=[2]*len(x3_domain_list)
y=np.concatenate((y1, y2,y3))

2.特征化

特征化过程如图10-4所示。

图10-4 DGA域名2-gram处理

以2-gram分隔域名,切割单元为字符,以整个数据集合的2-gram结果作为词汇表并进行映射,得到特征化的向量:


cv = CountVectorizer(ngram_range=(2, 2), decode_error="ignore",
                                      token_pattern=r"\w", min_df=1)
x= cv.fit_transform(x_domain_list).toarray()

3.训练样本

实例化K-Means算法:


model=KMeans(n_clusters=2, random_state=random_state)
y_pred = model.fit_predict(x)

4.效果验证

使用TSNE将高维向量降维,便于作图:


tsne = TSNE(learning_rate=100)
x=tsne.fit_transform(x)

可视化聚类效果(见图10-5),其中DGA域名使用符号“×”标识:


for i,label in enumerate(x):
    x1,x2=x[i]
    if y_pred[i] == 1:
        plt.scatter(x1,x2,marker='o')
    else:
        plt.scatter(x1, x2,marker='x')
    plt.show()

图10-5 DGA与正常域名聚类效果