K-Means检测DGA域名
什么是K-Means算法?
K-Means算法是最经典的基于划分的聚类方法,它的中心思想是,以空间中k个点为中心进行聚类,通过迭代的方法,逐次更新各聚类中心的值,直至得到最好的聚类结果。
- 从n个数据对象任意选择k个对象作为初始聚类中心,对于剩余的其他对象,则根据它们与这些聚类中心的相似度,分别将它们分配给与其最相似的聚类。
- 计算每个新聚类的聚类中心。
- 不断重复这一过程,直到标准聚类函数开始收敛。
1.数据搜集和数据清洗
使用alexa前1000域名(679个样本)作为白样本,标记为0,由于域名长度设置最低长度10,所以选取到679个样本,
使用dga-cryptolocker(1000个样本)和dga-tovar-goz(1000个样本)做为黑样本,标记为1和2,总共2679个样本。
x1_domain_list=load_alexa("../data/top-1000.csv")x2_domain_list=load_dga("../data/dga-cryptolocke-1000.txt")x3_domain_list=load_dga("../data/dga-post-tovar-goz-1000.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.特征化
以2-gram
处理dga域名,切割单元是字符,以整个数据集合的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()
特征名称向量像下面这样:
[u00,u01,u02,u03,u04,u05,u06,u07,u08,u09,uzu,uzv,uzw,uzx,uzy,uzz]
3.训练样本
实例化K-Means算法:
model=KMeans(n_clusters=2,random_state=random_state)
4.效果验证
对比训练结果与实际结果:
y_pred=model.fit_predict(x)printy_predprintyprintnp.mean(y_pred==y)*100
准确率78%,不咋滴。
[00001000000000000001100001110000000100100001000001010100000000000110010000000001010100001000000010010111111011111101111110111111011110101111110111101001110111011101110111011101110111011101110111011101][00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111]78.0
5.完整代码
importsysimportreimportnumpyasnpfromsklearn.externalsimportjoblibimportcsvimportmatplotlib.pyplotaspltimportosfromsklearn.feature_extraction.textimportCountVectorizerfromsklearnimportcross_validationimportosfromsklearn.naive_bayesimportGaussianNBfromsklearn.clusterimportKMeansfromsklearn.manifoldimportTSNE处理域名的最小长度MIN_LEN=10随机程度random_state=170defload_alexa(filename):domain_list=[]csv_reader=csv.reader(open(filename))forrowincsv_reader:domain=row[1]ifdomain>=MIN_LEN:domain_list.append(domain)returndomain_listdefload_dga(filename):domain_list=[]xsxqeadsbgvpdke.co.uk,Domain used by Cryptolocker - Flashback DGA for 13 Apr 2017,2017-04-13,http://osint.bambenekconsulting.com/manual/cl.txtwithopen(filename)asf:forlineinf:domain=line.split(",")[0]ifdomain>=MIN_LEN:domain_list.append(domain)returndomain_listdefkmeans_dga():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=[1]*len(x3_domain_list)y=np.concatenate((y1,y2,y3))cv=CountVectorizer(ngram_range=(2,2),decode_error="ignore",token_pattern=r"\w",min_df=1)x=cv.fit_transform(x_domain_list).toarray()model=KMeans(n_clusters=2,random_state=random_state)y_pred=model.fit_predict(x)printy_predprintyprintnp.mean(y_pred==y)*100if__name__==__main__:kmeans_dga()
LSTM网络非常适合基于时间序列数据进行分类,处理和预测,因为在时间序列中的重要事件之间可能存在未知持续时间的滞后。开发LSTM是为了处理在训练传统RNN时可能遇到的爆炸和消失的梯度问题。对于间隙长度的相对不敏感性是LSTM相对于RNN,隐马尔可夫模型和其他序列学习方法在许多应用中的优势。
所有递归神经网络都具有神经网络的链式重复模块。在标准的 RNN 中,这个重复模块具有非常简单的结构,例如只有单个 tanh 层。
LSTM 也具有这种类似的链式结构,但重复模块具有不同的结构。不是一个单独的神经网络层,而是四个,并且以非常特殊的方式进行交互。
首先,先熟悉以上使用符号。
在上面的图中,每行包含一个完整的向量,从一个节点的输出到其他节点的输入。粉色圆圈表示逐点运算,如向量加法;而黄色框表示学习的神经网络层。行合并表示串联,而分支表示其内容正在被复制,并且副本将转到不同的位置。
DGA域名检测的工程实践