DGA域名指僵尸网络通过算法生成的随机性较高的域名,此类域名往往被攻击者用于构建自己的恶意软件基础设施,用于绕过安全产品的黑名单,从而规避安全设备的拦截以建立C2链接或DNS通道传输。

1.数据集:

本小节使用alexa前1000域名(679个样本:label标记为0)作为白样本,使用dga-cryptolocker(1000个样本:label标记为1)和dga-tovar-goz(1000个样本:label标记为2)做为黑样本.

def load_alexa(filename):domain_list=[]csv_reader = csv.reader(open(filename))for row in csv_reader:domain=row[1]if len(domain) >= MIN_LEN:domain_list.append(domain)return domain_listdef load_dga(filename):domain_list=[]with open(filename) as f:for line in f:domain=line.split(",")[0]if len(domain) >= MIN_LEN:domain_list.append(domain)return  domain_listdef nb_dga():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.特征化:

本小节DGA域名使用2-gram分割域名,切割单元为字符(r='\w')并映射为向量,具体代码如下:

    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.训练样本:

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

4.可视化:

使用TSNE将高维向量降维,其中DGA是使用x表示

    tsne = TSNE(learning_rate=100)x=tsne.fit_transform(x)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.annotate(label,xy=(x1,x2),xytext=(x1,x2))plt.show()

5.完整代码:

相比原作者提供的源码,新增了计算准确率的部分

# -*- coding:utf-8 -*-
import numpy as np
import csv
import matplotlib.pyplot as plt
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.cluster import KMeans
from sklearn.manifold import TSNE#处理域名的最小长度
MIN_LEN=10#随机程度
random_state = 170def load_alexa(filename):domain_list=[]csv_reader = csv.reader(open(filename))for row in csv_reader:domain=row[1]if len(domain) >= MIN_LEN:domain_list.append(domain)return domain_listdef load_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.txtwith open(filename) as f:for line in f:domain=line.split(",")[0]if len(domain) >= MIN_LEN:domain_list.append(domain)return  domain_listdef kmeans_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))#x_domain_list = np.concatenate((x1_domain_list, x2_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))#y = np.concatenate((y1, y2))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)tsne = TSNE(learning_rate=100)x=tsne.fit_transform(x)print(np.mean(y_pred == y) * 100)for i,label in enumerate(x):#print('index:', i, 'label:', label)x1,x2=x[i]if y_pred[i] == 1:plt.scatter(x1,x2,marker='o')else:plt.scatter(x1, x2,marker='x')#plt.annotate(label,xy=(x1,x2),xytext=(x1,x2))plt.show()if __name__ == '__main__':kmeans_dga()

6.运行结果:

72.15189873417721

可视化如下

看起来效果不怎么地啊

7.测试场景2:

测试仅区分正常数据与cryptolock家族的DGA域名,代码修改如下

def kmeans_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))y1=[0]*len(x1_domain_list)y2=[1]*len(x2_domain_list)y3=[1]*len(x3_domain_list)y = np.concatenate((y1, y2))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)tsne = TSNE(learning_rate=100)x=tsne.fit_transform(x)print(np.mean(y_pred == y) * 100)for i,label in enumerate(x):#print('index:', i, 'label:', label)x1,x2=x[i]if y_pred[i] == 1:plt.scatter(x1,x2,marker='o')else:plt.scatter(x1, x2,marker='x')plt.show()

测试结果如下所示,看起来也没有好到哪里去

82.4074074074074

可视化

8.测试多种场景:

将代码改为可配置组合,源码如下

# -*- coding:utf-8 -*-
import numpy as np
import csv
import matplotlib.pyplot as plt
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.cluster import KMeans
from sklearn.manifold import TSNE#处理域名的最小长度
MIN_LEN=10#随机程度
random_state = 170def load_alexa(filename):domain_list=[]csv_reader = csv.reader(open(filename))for row in csv_reader:domain=row[1]if len(domain) >= MIN_LEN:domain_list.append(domain)return domain_listdef load_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.txtwith open(filename) as f:for line in f:domain=line.split(",")[0]if len(domain) >= MIN_LEN:domain_list.append(domain)return  domain_listdef kmeans_dga(domain_x=123, pic_show=False):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")y1=[0]*len(x1_domain_list)y2=[1]*len(x2_domain_list)y3=[1]*len(x3_domain_list)x_domain_list = np.concatenate((x1_domain_list, x2_domain_list, x3_domain_list))y = np.concatenate((y1, y2, y3))if domain_x ==12:x_domain_list = np.concatenate((x1_domain_list, x2_domain_list))y = np.concatenate((y1, y2))elif domain_x ==13:x_domain_list = np.concatenate((x1_domain_list, x3_domain_list))y1 = [0] * len(x1_domain_list)y2 = [1] * len(x3_domain_list)y = np.concatenate((y1, y2))elif domain_x == 23:x_domain_list = np.concatenate((x2_domain_list, x3_domain_list))y1 = [0] * len(x2_domain_list)y2 = [1] * len(x3_domain_list)y = np.concatenate((y1, y2))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)score = np.mean(y_pred == y) * 100print(domain_x, score)if pic_show:tsne = TSNE(learning_rate=100)x = tsne.fit_transform(x)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.annotate(label,xy=(x1,x2),xytext=(x1,x2))plt.show()if __name__ == '__main__':kmeans_dga(domain_x=123)kmeans_dga(domain_x=12)kmeans_dga(domain_x=13)kmeans_dga(domain_x=23)

输出结果如下

123 72.15189873417721
12 82.4074074074074
13 33.33333333333333
23 60.0

结果都不怎么样,即便是分类y_pred预测为0或者1,怎么看效果都不怎么样。

《Web安全之机器学习入门》笔记:第十章 10.3 K-Means算法检测DGA域名相关推荐

  1. 机器学习入门笔记(三):K近邻算法

    文章目录 一.K近邻算法的基本概念 1.1 K近邻算法实现 二.K近邻分类三要素 2.1 距离度量 2.2 K值的选择 2.2.1 基于m-fold cross validation的 K值选择 2. ...

  2. 机器学习入门笔记:(4.3)SMO算法

    前言 之前的博客中,已经介绍了SVM的原理: 机器学习入门学习笔记:(4.1)SVM算法 机器学习入门学习笔记:(4.2)核函数和软间隔 最后我们得到的优化问题如下: maxα∑i=1mαi−12∑i ...

  3. 机器学习入门笔记(一):模型性能评价与选择

    文章目录 一.训练误差与测试误差 1.1 基本概念 1.2 训练误差 1.3 泛化误差(测试误差) 1.4 过拟合 二.模型评估方法 2.1 留出法(hold-out) 2.2 正则化 2.3 交叉验 ...

  4. 机器学习入门笔记总目录

    机器学习入门笔记是我参考周志华老师的<机器学习>西瓜书.李杭老师的<统计学习方法>第二版以及课程教材等资料写的. 该目录主要记录关于机器学习和算法基本概念的博客链接. ---- ...

  5. 机器学习入门笔记(七):聚类

    文章目录 一.聚类的基本概念 1.1 相似度或距离 1.2 类或簇 1.3 类与类之间的距离 二.层次聚类 2.1 基本概念 2.1 算法描述 2.3 例题 三.K均值聚类 3.1 模型 3.2 策略 ...

  6. 机器学习入门笔记(五):决策树

    文章目录 一.决策树模型与学习 1.1 决策树模型 1.2 决策树与 if-then 规则 1.3 决策树与条件概率分布 1.4 决策树的学习 二.特征选择 2.1 信息增益 2.2 例题:利用信息增 ...

  7. 机器学习入门笔记(四):朴素贝叶斯分类

    文章目录 一.朴素贝叶斯法 1.1 实现原理 1.2 后验概率最大化 二.朴素贝叶斯法的参数估计 2.1 极大似然估计 2.2 学习与分类算法 2.3 朴素贝叶斯分类器例题 2.4 贝叶斯估计 推荐文 ...

  8. 机器学习入门笔记(二):线性模型

    文章目录 一.基本形式 二.线性回归 2.1 离散属性连续化 2.2 最小二乘法 2.3 多元线性回归 2.4 广义线性模型 三.对数几率回归(逻辑回归) 3.1 最大似然估计 四.线性判别分析(LD ...

  9. 《Web安全之机器学习入门》笔记:第十六章 16.7 识别异常操作

    本小节通过RNN识别异常操作. 1.数据集 def load_user_cmd_new(filename):cmd_list=[]dist=[]with open(filename) as f:i=0 ...

最新文章

  1. 【论文速递】最新计算机视觉/图像处理方向论文
  2. 云无边界,阿里云混合云数据同步发布
  3. 架构探险笔记7-事务管理简介
  4. php找不到gearmanClent类,centos 使用docker搭建Gearman任务分发系统 ,Gearman的安装和使用...
  5. python编写加密程序_用Python实现一个简单的加密程序
  6. 神经网络有趣案例_求解三体问题快了1亿倍,新型神经网络问世
  7. 如何在 Gitee 上使用 GPG
  8. 微信支付 body不是UTF-8编码以及中文签名错误的问题
  9. atitit.RandomAccessFile rws rwd 的区别于联系
  10. NOD32和小红伞的90天免费KEY申请
  11. 搜索引擎网站收录入口大全
  12. SQL Server版本和下载地址
  13. 3GPP 5G协议规范
  14. 巧妙地帮你的手机节省流量,担心流量超出的机友们看过(转)
  15. maven项目的pom.xml文件添加依赖
  16. Linux 配置git同步GitHub代码
  17. 【问题记录】04 MyBatis报错:Parameter ‘XXX‘ not found. Available parameters are [page, hashMap, param1, param
  18. 恭喜 SphereEx 联合创始人潘娟成为亚马逊云科技新晋 Data Hero
  19. 百度地图 Error inflating class com.baidu.mapapi.map.MapView 错误
  20. 大数据综合平台概要设计(PPT)

热门文章

  1. mybatis plus page eq 多个条件
  2. 苹果自研处理器搭载全新MacBook 价格更亲民
  3. ICCBDAI 2022 - 十二月无数计算机学者齐聚张家界
  4. 前端遇到的那些技术难点
  5. 基于国产FPGA紫光同创Titan2 PG2T390H的PCIe链式DMA控制器设计
  6. 2022年数据中心产业发展将呈现三大新趋势
  7. 计算机系统基础 - Lab1
  8. 赋范线性空间上的有界线性泛函
  9. 迟了太久,就不必到了
  10. 计算机原理与应用 第二章——ARM处理器