域名生成算法(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与正常域名聚类效果