The homework of DNS Security Course
-
域名信息
domain220w.txt 1/2的原始数据
domain300w.txt 3/4的原始数据
数据格式: 递归服务器IP,查询域名,请求类型,TTL,应答首个RR(resource record)类型,应答值(使用';'分隔),字段使用逗号分隔。
数据爬取方式: 主动 -
Alexatop前100w访问域名
rank | domain |
---|---|
1 | google.com |
2 | baidu.com |
-
特征:
基于文本的特征:<head></head> <title></title> <a></a> <table></table> <li></li> <ol></ol>
网页上合成图像的数量/非合成图像的数量/链接数量特征降维:
基于Hash的方法[3] -
现行主流分类方法:
线性分类器 - 感知器算法
非线性分类器 - SVM
统计分类器 - KNN -
基于文本内容识别赌博/色情网站
-
数据获取
考虑到爬取执行的时间, 首先对550w个域名进行数据清洗(wash_data.py), 包括:
尝试去掉重复的域名请求, 结果发现数据集中没有完全相同的两个域名请求;
去掉一些不指向具体网页的域名, 这类域名在请求中频繁出现, 包括网易的DNS检测域名xx.netease.com, 艾瑞数据在视频等网站中记录用户行为使用的域名xx.irs01.com, 即时通讯软件向服务器拉取数据使用的域名xx.imtmp.net, 反向PTR查询使用的域名xx.in-addr.arpa等;
去掉一些知名域的子域名, 如xx.qq.com, xx.gov.cn等.
清洗之后待检测的域名数量减少到304w, 因为目标是色情赌博网站, 数据清洗在节省爬取时间的同时不会破坏检测效果.
下一步通过爬虫爬取剩余网站列表的内容(build_sample.py), 在爬取时, 对http和https都无法访问的网站(包括浏览器不能建立连接/404error/无文本内容等情况), 尝试访问该请求的CNAME记录, 也就是别名; 若仍无法访问再请求该域名的上层次级域, 尽量爬取到内容.
获取网页源代码后遍历其标签树, 得到其中所有<a>和</a>标签之间的文本信息, 使用结巴分词模块把文本切分成词语, 同时去除空格/换行符/数字/标点符号和停用词.
(会检测到被挂马了赌博色情链接的网站, 因没有具体说明, 暂且把这些也算入在内) -
根据之前项目得到一个赌博/色情网站的常用关键词列表(见source/word.pick文件)
- 用脚本和人工的方法筛选出部分赌博/色情网站页面, 作为训练数据(url-词语列表-判别结果 source/word_x.txt)
- 特征提取
常见的提取文本特征的方法有one-hot和TF-IDF两种, 与将词频计算在内的TF-IDF方法相比, one-hot只考虑了词语的出现与否(本项目采用one-hot编码)
在我们的项目中已经生成关键词列表(设长度为n), 对于每一个网页生成一个长度为n的数组, 遍历其词语列表, 若与关键词列表中的项匹配, 则将该关键词对应的位置1 - 模型建立
使用基于tensorflow的keras建立全连接神经网络, 其结构如下:
-
模型训练
采用k折训练方法, 因为训练样本太少, k折验证可以提升小训练集在神经网络中的表达能力 -
计算模型结果
根据上一步的模型训练结果对爬取到的网页数据进行判断, 并将分类结果写入结果文件(source/label.txt)
更新:进一步扩大了词库(2w->8w多个), 根据新的词库进一步训练得到近2w个赌博色情网站, 结果见source/bad_result_2.txt
-
-
核心思想(相较于基于网页内容的方法)
轻量级爬虫(避免干扰正常工作影响速度 nodejs异步)
无监督(不需要训练集)
基于页面以外的特征(不必下载页面) -
主要方法
基于匹配的方法 - 黑名单(慢,不够灵活)
基于机器学习的方法 - 提取特征并训练判别
基于图的方法 - 可以用来发掘新的恶意域名(研究较少)
基于域名生成算法的方法 - 如DGA等(局限性比较大) -
特征选取
上图是两篇论文中对域名数据特征的选择, 可以分为两个方面, 一方面是词法特征, 另一个方面是网络属性, 以下先对所有的属性进行汇总:
编号 域名词法特征 特征含义 1 域名长度 整个域名的长度(不含分隔符.) 2 分割符个数 .的个数(如www.taobao.com 为2) 3 特殊字符个数 除了数字和字母以外的字符 4 数字占总长度的比例 数字个数与域名长度之比 5 分隔符内数字个数的最大值 两个.之间数字的最大个数 6 域名分隔符间的最大长度 两个.之间字符的最大个数 7 数字/字母转换频率 数字和字母两种字符切换的频率 编号 域名网络特征 特征含义 1 TTL平均值 所有相同域名的TTL平均值 2 应答类型 dns请求的应答类型 3 应答值个数 同一个域名被映射的IP地址个数 提取基于网页内容的判别结果中的数据作为黑名单, 以及在判别结果中出现的部分alextop域名作为白名单, 进行以上特征的统计分析:
第一个是域名长度的统计, 可以看出与正常域名相比, 赌博色情域名的长度曲线更尖锐, 往往集中于10到15的长度第二个是对分隔符'.'的出现次数统计, 可以看出赌博色情网站比正常网站的分隔符略多
第三个是对特殊字符的出现频率检测, 在这一项上两者没有表现出特别大的区别
第四个是数字占域名总长度比例的统计, 对正常域名来说, 数字的比例几乎都小于0.1, 而赌博色情网站的比例则分布的比较平均
第五个是分隔符内数字个数的最大值, 它与上一项的主要差别在于与总长度无关, 同样的, 对正常域名来说, 很少出现大于2个的数字, 而赌博色情域名则较长出现多个数字
第六个是分隔符间的最大长度, 结果与域名总长度类似
第七个是数字字母的转换频率, 如a11b的转换频率就是2, 这一项正常域名和赌博色情域名的差别也比较大, 正常域名的切换频率普遍都比较小,而赌博色情域名则大多有1-3次的转换频率
从以上结果可以看出, 在长度、字母/数字数量和出现频率等方面, 正常域名和赌博色情域名均表现出了差别。
再从网络特征方面来看, 对白名单和黑名单中的域名进行进一步的请求探测(使用dnspython库, 最新stable版本1.15.0 更新于sep 2016):
dnspython的resolver模块提供了dns查询的借口---query方法, 可以指定查询类型, 如A, CNAME, AAAA等, 查询结果可能为NoAnswer(无响应), NXDOMAIN(域名不存在), TimeOut(请求超时)等
我们对黑名单和白名单中的所有域名进行了请求, 得到了它们特征之间的对比图像:
首先是TTL值, 前一张图片是重新请求的黑名单与白名单的TTL值, 可以看出黑名单的值明显较为分散但是对于五个月前的请求值, 又发现白名单的请求值较为分散(因此这个特征有待商榷):
而对于请求类型来说, 明显可以看出白名单中域名的类型分布更加分散, 这是因为公司和机构有更多的资金去进行优化, 而赌博色情网站大多为了盈利, 而且域名时常有变动, 不会进行较全面的映射
从解析的ip个数来说,两者的分布十分相似:
-
分类算法
随机森林分类器 -
参考文献:
[1] 黄凯,傅建明,黄坚伟, 等.一种基于字符及解析特征的恶意域名检测方法[J].计算机仿真,2018,35(3):287-292.
[2] 张洋,柳厅文,沙泓州, 等.基于多元属性特征的恶意域名检测[J].计算机应用,2016,36(4):941-944,984. DOI:10.11772/j.issn.1001-9081.2016.04.0941. [3] CALA - An unsupervised URL-based web page classification system
[4] 基于url特征检测的违法网站识别方法(基于HOST/PATH等信息) -
基本思路
1.无监督学习
通过上述特征提取的基本特征对待检测的域名进行聚类分析2.监督学习
利用网页内容训练的结果集作为训练数据进行监督学习 -
实现说明
-
概述
在前期工作中,已经分别得到了关于赌博色情网站DNS域名的一份黑名单与白名单,通过对黑名单与白名单中相关网站DNS域名标注标签,其中正常网站标签为0,色情网站标签为1,赌博网站标签为2。使用python中的机器学习库sklearn,使用有监督学习的方法,分别测试了决策树,SVM支持向量机,SGD分类器三种测试模型,并分别得到了三份分类结果集。 -
实现流程
(1)处理训练集数据
使用的黑名单文件为bad_list_result.txt,白名单文件为white_list_result.txt,首先分别将黑名单及白名单导入。导入的DNS数据存储在字典中。随后根据参考文献《一种基于字符及解析特征的恶意域名检测方法[J],黄凯等》提出的十一项词法特征对DNS数据进行处理,并加上对应的标签,其中十一项特征如下,处理的结果如图所示:| 编号 | 域名词法特征 | 特征含义 |
| ------ | ------ | ------ |
| 1 | 域名长度 | 整个域名的长度(不含分隔符.) |
| 2 | 分隔符个数 | .的个数(如www.taobao.com 为2) |
| 3 | 特殊字符个数 | 除了数字和字母以外的字符 |
| 4 | 数字占总长度的比例 | 数字个数与域名长度之比 |
| 5 | 分隔符内数字个数的最大值 | 两个.之间数字的最大个数 |
| 6 | 域名分隔符间的最大长度 | 两个.之间字符的最大个数 |
| 7 | 数字/字母转换频率 | 数字和字母两种字符切换的频率 |
| 8 | 是否存在IP地址 | 域名中是否存在IP地址 |
| 9 | 分隔符内数字个数的最大值 | 两个.之间数字的最大个数 |
| 10 | 大写字母个数 | 域名中大写字母的个数 |
| 11 | 数字个数 | 域名中数字的个数 |
(2)处理测试集数据
测试集的数据来源于all_list_result.txt,其中有60w条待测试的数据,需要将数据读入并且使用于(1)步中相同的办法处理数据,作为测试集。(3)模型选择
经过小组讨论,在这次的实现中分别测试了三种分类模型,分别为决策树,SVM和SGD分类器。
a. 决策树的优势 ·便于理解和解释。树的结构可以可视化出来。训练需要的数据少。其他机器学习模型通常需要数据规范化,比如构建虚拟变量和移除缺失值,不过请注意,这种模型不支持缺失值。
·由于训练决策树的数据点的数量导致了决策树的使用开销呈指数分布(训练树模型的时间复杂度是参与训练数据点的对数值)。
·能够处理数值型数据和分类数据。其他的技术通常只能用来专门分析某一种变量类型的数据集。详情请参阅算法。
·能够处理多路输出的问题。
·使用白盒模型。如果某种给定的情况在该模型中是可以观察的,那么就可以轻易的通过布尔逻辑来解释这种情况。相比之下,在黑盒模型中的结果就是很难说明清楚。
·可以通过数值统计测试来验证该模型。这对事解释验证该模型的可靠性成为可能。
·即使该模型假设的结果与真实模型所提供的数据有些违反,其表现依旧良好。b. 支持向量机的优势 ·在高维空间中非常高效. ·即使在数据维度比样本数量大的情况下仍然有效. ·在决策函数(称为支持向量)中使用训练集的子集,因此它也是高效利用内存的. ·通用性: 不同的核函数 核函数 与特定的决策函数一一对应.常见的 kernel 已经提供,也可以指定定制的内核
c. Stochastic Gradient Descent(随机梯度下降法)的优势:
·高效。
·易于实现 (有大量优化代码的机会)。实现的对应部分见下图:
(4)结果分析与讨论
使用三种模型的分类结果分别为tree_result.txt,svm_result.txt,SGDClassifier_result.txt。
分类结果不是十分理想,经过小组讨论得到的原因有两个:一,训练集太少,用于训练的黑白名单数据分别只有5000条,即便是决策树只需要较少数据这也不太够,因此模型训练的结果不是十分理想;二,调参,在一的基础上,各个模型的部分参数不是十分好调,无法对训练效果进行优化。 -
爬取网页用更复杂的判断, 与现有的黑名单对比
准确率P, 召回率R, F1对结果进行评价 :
P = TP / TP + FP
R = TP / TP + FN
F1 = 2PR / P + R
如果分类器能够正确地检测出恶意域名,则TP=1;如 果分类器能够正确地检测出正常域名,则TN=1;如果分类 器不能正确地检测出恶意域名,则FP=1;如果分类器不能 正确地检测出正常域名,则=1。
1. Identifying Gambling and Porn Websites with Image Recognition
这篇文章里中用截图的方式对整个网页的内容进行抓取(截图的代码可以参考:https://blog.csdn.net/qiqiyingse/article/details/62896264)
然后使用SURF算法提取特征点(SURF算法:https://blog.csdn.net/tengfei461807914/article/details/79177897)
特征点聚类后建立BoW词袋模型(这是一个通过BoW搜索同类图像的代码:http://yongyuan.name/blog/CBIR-BoW-for-image-retrieval-and-practice.html)
最后用SVM(支持向量机)做监督学习
2. An efficient scheme for automatic web pages categorization using the support vector machine(New Review of Hypermedia & Multimedia,2016)
首先对先前的分类方法进行了评估,提出在小训练集上svm的表现比贝叶斯好
然后提出在html5出现之后,之前的基于网页标签的特征提取需要进行改进,并提出了新的方法
最后用svm对网页进行分类,并做出评估
3. LWCS: a large-scale web page classification system based on anchor graph hashing
文章介绍了LWCS这个大规模网页分类系统的组成和工作原理
第一步是网页爬虫,使用heritrix这个基于Java的开源爬虫,改为数据库初始化,增加了筛选重复网页的过滤器,重写了工作队列
第二步是对爬下来的原始数据去噪, 然后使用NLPIR将文本内容分割为短语
第三步是特征选择,采用tf-idf方法(https://blog.csdn.net/allenshi_szl/article/details/6283375) 选择每个类别的前500个词语
第四步是锚点图哈希, 用K均值聚类方法生成锚点, 以及最后的哈希码
第五步是使用KNN分类器计算每个需要判别的网页与训练集中网页的相似度, 并把它归为相似度最大的一类
4. Building a Dynamic Reputation System for DNS
基于被动DNS信息搜集的DNS信誉评判系统, 可以生成一个动态的域名黑名单, 可检测出最新生成的恶意域名
其数据来自美国两个州的骨干网DNS...