僵尸网络&恶意软等程序,随着检测手段的更新(在早期,僵尸主机通产采用轮询的方法访问硬编码的C&C域名或IP来访问服务器获取域名,但是这种方式在安全人员进行逆向之后会得到有效的屏蔽),黑客们也升级了肉鸡的C&C手段;用DGA算法在终端生成大量备选域名,而攻击者与恶意软件运行同一套DGA算法,生成相同的备选域名列表。
当需要发动攻击的时候,选择其中少量进行注册,便可以建立通信,并且可以对注册的域名应用速变IP技术,快速变换IP,从而域名和IP都可以进行快速变化。目前,黑客攻击者为了防止恶意域名被发现,会使用Domain Flux或者IP Flux来快速生成大量的恶意域名。(Domain Flux是通过不断变换域名,指向同一个IP,IP Flux是只有一个域名,不断变换IP,一个域名可以使用多个IP)。
很显然,在这种方式下,传统基于黑名单的防护手段无法起作用,一方面,黑名单的更新速度远远赶不上DGA域名的生成速度,另一方面,防御者必须阻断所有的DGA域名才能阻断C2通信,因此,DGA域名的使用使得攻击容易,防守困难。
DGA(域名生成算法)是一种利用随机字符来生成C&C域名,从而逃避域名黑名单检测的技术手段。例如,一个由Cryptolocker创建的DGA生成域xeogrhxquuubt.com,如果我们的进程尝试其它建立连接,那么我们的机器就可能感染Cryptolocker勒索病毒。域名黑名单通常用于检测和阻断这些域的连接,但对于不断更新的DGA算法并不奏效,所以在本次实验中我们来学习如果使用机器学习的方法对DGA进行检测。

DGA算法由两部分构成,种子(算法输入)和算法,可以根据种子和算法对DGA域名进行分类
种子分类:
1.基于时间的种子(Time dependence)。DGA算法将会使用时间信息作为输入,如:感染主机的系统时间,http响应的时间等。
2.是否具有确定性(Determinism)。主流的DGA算法的输入是确定的,因此AGD可以被提前计算,但是也有一些DGA算法的输入是不确定的,如:Bedep[4]以欧洲中央银行每天发布的外汇参考汇率作为种子,Torpig[5]用twitter的关键词作为种子,只有在确定时间窗口内注册域名才能生效。
算法分类:
现有DGA生成算法一般可以分为如下4类:
1.基于算术。该类型算法会生成一组可用ASCII编码表示的值,从而构成DGA域名,流行度最高。
2.基于哈希。用哈希值的16进制表示产生DGA域名,被使用的哈希算法常有:MD5,SHA256。
3.基于词典。该方式会从专有词典中挑选单词进行组合,减少域名字符上的随机性,迷惑性更强,字典内嵌在恶意程序中或者从公有服务中提取。
4.基于排列组合。对一个初始域名进行字符上的排列组合。
DGA域名存活时间:
DGA域名的存活时间一般较短,大部分域名的存活时间为1-7天

接着我们学习本次实验使用的机器学习算法-朴素贝叶斯的流程:

可以看到,整个朴素贝叶斯分类分为三个阶段:
第一阶段——准备工作阶段,这个阶段的任务是为朴素贝叶斯分类做必要的准备,主要工作是根据具体情况确定特征属性,并对每个特征属性进行适当划分,然后由人工对一部分待分类项进行分类,形成训练样本集合。这一阶段的输入是所有待分类数据,输出是特征属性和训练样本。这一阶段是整个朴素贝叶斯分类中唯一需要人工完成的阶段,其质量对整个过程将有重要影响,分类器的质量很大程度上由特征属性、特征属性划分及训练样本质量决定。
第二阶段——分类器训练阶段,这个阶段的任务就是生成分类器,主要工作是计算每个类别在训练样本中的出现频率及每个特征属性划分对每个类别的条件概率估计,并将结果记录。其输入是特征属性和训练样本,输出是分类器。这一阶段是机械性阶段,根据前面讨论的公式可以由程序自动计算完成。
第三阶段——应用阶段。这个阶段的任务是使用分类器对待分类项进行分类,其输入是分类器和待分类项,输出是待分类项与类别的映射关系。这一阶段也是机械性阶段,由程序完成。
实验中会使用sklearn中封装好的朴素贝叶斯算法。在scikit-learn中,一共有3个朴素贝叶斯的分类算法类。分别是GaussianNB,MultinomialNB和BernoulliNB。其中GaussianNB就是先验为高斯分布的朴素贝叶斯,MultinomialNB就是先验为多项式分布的朴素贝叶斯,而BernoulliNB就是先验为伯努利分布的朴素贝叶斯。我们使用GaussianNB。接下来我们简单试试看

import numpy as np
from sklearn.naive_bayes import GaussianNB
X = np.array([[-1, -1], [-2, -1], [-3, -2], [1, 1], [2, 1], [3, 2]])
Y = np.array([1, 1, 1, 2, 2, 2])
clf = GaussianNB()
clf.fit(X, Y)
GaussianNB(priors=None, var_smoothing=1e-09)

print(clf.predict([[-0.8, -1]]))
[1]

首先导入库文件

给出数据

选择分类器并进行训练

进行预测

接下来考虑数据来源。数据的话分为白样本和黑样本
白样本我们选择来自Alexa的前1000的域名。这里简单介绍下Alexa排名。Alexa排名,是指网站的世界排名。Alexa提供包括综合排名、放量排名、页面访问量排名等多个信息,人们认为它是比较权威的网站流量评价指标。Alexa排名是每三个月公布一次。排名依据是用户链接数和页面浏览数三个月的几何平均值。
可以在这里看到数据https://www.alexa.com/topsites
写本次实验指导书时部分排名如下

提取出前1000的域名写入top-1000.csv
再来考虑黑样本的来源,dga的来源有很多,这里用国内360 netlab的数据

在上图中可以看到有很多家族,我们这里就以选取cryptolocker和dyre进行实验
以cryptolocker为例,访问如下网址

就可以下载cryptolocker.txt
里面的内容就是实时更新的dga

我们简单将其处理后保存为cryptolocker.txt。dyre也是同理,保存为dyre.txt

我们接下来写代码
首先加载数据集,来自alexa的数据是白样本,来自360 netlab的dga数据是黑样本

这里需要根据数据集自身的特点来写,用于将文档中的域名提取出来。代码中的MIN_LEN为最小长度,我们设为10,即提取出长度大于等于10的域名。
这里可以将load_alexa函数单独改写为alexa.py,来看看是否能成功提取
代码如下

测试如下

可以看到是能够提取出来的,load_dga函数的功能测试也是同理,这里不再重复
接下来就是打标签

分别标记为0,1,2
然后使用n-gram处理,这里使用2-gram
N-Gram是一种基于统计语言模型的算法。它的基本思想是将文本里面的内容按照字节进行大小为N的滑动窗口操作,形成了长度是N的字节片段序列。
每一个字节片段称为gram,对所有gram的出现频度进行统计,并且按照事先设定好的阈值进行过滤,形成关键gram列表,也就是这个文本的向量特征空间,列表中的每一种gram就是一个特征向量维度。
该模型基于这样一种假设,第N个词的出现只与前面N-1个词相关,而与其它任何词都不相关,整句的概率就是各个词出现概率的乘积。这些概率可以通过直接从语料中统计N个词同时出现的次数得到。
如果用的是2-gram,那么针对hetian.com,则处理之后会得到he,ei,ti,ia.an,nc,co,om
我们将2-gram处理后的结果进行映射,得到特征化的向量

可以将代码文件dga.py中的相应注释去掉,可以打印出来看看

接下来使用GaussianNB进行训练,采用10折交叉验证,并打印结果

测试结果如下

可以看到准确率达到了96%左右,还是不错的。

参考:
1.https://www.cnblogs.com/leoo2sk/archive/2010/09/17/naive-bayesian-classifier.html
2.https://zhuanlan.zhihu.com/p/32829048
3.《web安全与机器学习》
4.https://github.com/duoergun0729/1book/

朴素贝叶斯算法检测DGA相关推荐

  1. ML之NB:(NLP)基于sklearn库利用不同语种数据集训练NB(朴素贝叶斯)算法,对新语种进行语种检测

    ML之NB:(NLP)基于sklearn库利用不同语种数据集训练NB(朴素贝叶斯)算法,对新语种进行语种检测 目录 输出结果 训练数据集 设计思路 核心代码 输出结果 测试01:I love you ...

  2. 朴素贝叶斯算法代码实现(垃圾邮件检测)

    1.文本预处理 (1)分词 首先需要对文本进行分词操作,转换为list,同时词语全部小写,并去除字母数量小于等于2的单词 # 将词切分为list def textParse(input_string) ...

  3. 【机器学习入门】(2) 朴素贝叶斯算法:原理、实例应用(文档分类预测)附python完整代码及数据集

    各位同学好,今天我向大家介绍python机器学习中的朴素贝叶斯算法.内容有:算法的基本原理:案例实战--新闻文档的分类预测. 案例简介:新闻数据有20个主题,有10万多篇文章,每篇文章对应不同的主题, ...

  4. 算法高级(43)-过滤垃圾邮件、短信?-朴素贝叶斯算法

    一.算法介绍 朴素贝叶斯算法,简称NB算法,是贝叶斯决策理论的一部分,是基于贝叶斯定理与特征条件独立假设的分类方法. 两个重要概念: 先验概率是指根据以往经验和分析得到的概率,它往往作为"由 ...

  5. 朴素贝叶斯算法_朴素贝叶斯算法原理

    摘要:本文介绍了贝叶斯公式,并根据公式而产生的朴素贝叶斯分类算法在机器学习中的应用,并列举了朴素贝叶斯分类算法的优缺点. 1贝叶斯公式的理解 贝叶斯定理(Bayes' theorem)是概率论中的一个 ...

  6. Python微调文本顺序对抗朴素贝叶斯算法垃圾邮件分类机制

    封面图片:<Python可以这样学>,ISBN:9787302456469,董付国,清华大学出版社 图书详情(京东): ================= 关于朴素贝叶斯算法中文垃圾邮件分 ...

  7. 算法的优缺点_朴素贝叶斯算法的优缺点

      机器学习算法与自然语言处理推荐  来源:http://www.cnblogs.com/pinard/p/6069267.html 作者:刘建平Pinard [机器学习算法与自然语言处理导读]朴素贝 ...

  8. 人工智能知识全面讲解:垃圾邮件克星——朴素贝叶斯算法

    6.1 什么是朴素贝叶斯 6.1.1 一个流量预测的场景 某广告平台接到小明和小李两家服装店的需求,准备在A.B两个线上渠道 投放广告.因为小明和小李两家店都卖女装,属于同一行业相同品类的广告, 所以 ...

  9. 朴素贝叶斯算法的推理与实现

    什么是naive bayes 朴素贝叶斯 naive bayes,是一种概率类的机器学习算法,主要用于解决分类问题 为什么被称为朴素贝叶斯? 为什么被称为朴素,难道仅仅是因为贝叶斯很天真吗?实际上是因 ...

最新文章

  1. 【100题】第五十九题 用C++编写不能被继承的类
  2. python正则匹配ip地址_Python正则表达式匹配ip地址实例
  3. 1.深度好文:带缓冲I/O 和不带缓冲I/O的区别与联系
  4. canopen c++程序编写_JAVA、C、C++、Python同样是高级语言,为什么只有C和C++可以编写单片机程序?...
  5. boost::random模块实现允许直观地检查分布函数的结果的测试程序
  6. json解析对应的value为null_JSON 学习笔记第一天——初识
  7. 关于ExecuteNonQuery执行存储过程的返回值 、、实例讲解存储过程的返回值与传出参数、、、C#获取存储过程的 Return返回值和Output输出参数值...
  8. 再谈typedef(重点为函数指针)
  9. 基于Python+Django的图书馆管理系统
  10. c/c++ 时间函数总结 linux-转
  11. shell截取字符串的8种方法
  12. 第十一课 Solidity语言编辑器REMIX指导大全
  13. UART、RS232、RS485协议简单总结
  14. python 日本 地图 热力图_python 在百度地图上画热力图
  15. Z820安装Win7系统出现0X0000007B蓝屏报错无限重启的解决方法与相关问题
  16. 计算机设置调整吃鸡,绝地求生韦神托马斯主播的电脑画面设置灵敏度_绝地求生主播的电脑画面设置和灵敏度介绍_游戏吧...
  17. 主流短视频SDK调研对比报告
  18. [JAVA][2013蓝桥杯模拟赛 JAVA本科B组][第四题:二阶魔方]
  19. 由Debuggerd导致的Android系统死机问题分析
  20. msm8909+pm8916开机卡在sbl1

热门文章

  1. python做图片美化_python图片美化
  2. 谷歌app使用的是什么字体_Google字体无法在中国使用-如何修复
  3. 精品微信小程序健康食谱菜谱系统+后台管理系统|前后分离VUE
  4. ACM——二分、三分
  5. 3d建模一般学多久?太长的话,我就不玩了。
  6. css实现倾斜条纹(斑马线),可用于进度条等
  7. Android 获取音频MP3文件的专辑缩略图
  8. 15个具有高度影响力的Apache开源项目
  9. 多因子选股模型python_量化交易——因子选股、多因子选股策略
  10. 2023年元旦倒计时案例