1 基本工作内容
我们大众平时所使用的网站,其实只占互联网中很小的部分,这部分的网络称为“表网”,即暴露公开访问地址和接口的网络。而互联网中96%的内容其实是正常用户不可见的,它们不一定是故意隐藏,可能只是无法通过公开内容发现,这部分的网络称为“深网”。暗网作为深网中的更小一部分,是搭建在表网上的一种匿名通信网络,在暗网之中不仅用户行为是匿名的,而且暗网网站被故意隐藏,因此只能通过特定的浏览器和软件访问。在暗网之中存在很多非法网站和交易活动,但是由于匿名性无法对行为的主体和具体内容进行追溯和画像,因此需要了解暗网的原理和利用其他数据分析技术。
暗网的基本匿名通信原理是多层加密,这也是暗网名称“Tor”的来源。用户和网站服务器通信时先随机选择三个中继节点,分别为入口节点、中间节点和出口节点。传输的信息通过商定的不同密钥层层加密,每个节点只知道自己所对应的密钥信息和前后两个节点的身份,所以没有一个节点可以同时知道用户身份、服务器身份以及传输内容,从而实现了匿名通信。
暗网之中存在五种不同实体
1.第一种是客户端,它代表访问暗网的用户具体指的是用户使用tor浏览器或者其他代理软件。
2. 第二种是暗网服务器,它代表隐藏的网站服务器,在表网之中网站服务器的IP地址可以通过DNS进行域名解析得知,而暗网服务器的IP地址是无法查询得知的。
3. 第三种是目录服务器,它负责储存网站信息,便于暗网用户进行查询。
4. 第四种是介绍点,它是用户和暗网服务器进行协商的中介,负责协助两者完成连接的建立。第五种是会合点,它是用户和暗网服务器进行通信的最终中介,最终网站访问过程的所有交互流量信息通过它完成中转。
完整的暗网网站建立和用户访问过程分为七步,其中每一步建立的Tor连接都基于之前的基本匿名通信原理。
1. 首先暗网服务器会选取一些介绍点并建立匿名Tor连接;
2. 然后暗网服务器会将网站URL、公钥和介绍点信息以私钥签名并上传到目录服务器中;
3. 第三步是客户端查询目录服务器以获取对应网站的介绍点和公钥信息;
4. 第四步中客户端随机选择会合点并建立Tor连接,发送给会合点一个一次性 ‘secret’ 用于之后校验;
5. 第五步中客户端与介绍点建立Tor连接,并用暗网服务器公钥加密会合点信息和‘secret’,发送给介绍点并通知其转发给暗网服务器;
6. 之后介绍点将加密信息转发给暗网服务器;
7. 最后暗网服务器用私钥解密信息,获知会合点信息和‘secret’,然后与会合点建立Tor连接,并在连接后发送‘secret’供会合点进行双边校验,若校验成功则最终连接建立成功。除了通过Tor访问暗网特有内容,也可以通过Tor匿名访问表网内容,从而达到隐藏自己的IP信息以及通信网站对象的目的。
正是由于通信机制的复杂性,才为非法活动提供了有力的庇护,很多时候即使知道非法活动正在发生也无法进行溯源和取证。所以,首先我们打算建立一个暗网的白盒环境以供我们进行分析研究。在建立的白盒模型中,网络连接方式和各实体数量都可以由我们自由定义,并且我们可以在任何一个节点处进行流量收集,了解流量在暗网中具体的流动方式。在现实世界中,即使你知道用户在通过暗网进行访问,但是你也不知道他的具体行为,甚至最基本的问题比如他在访问什么网站都无法得知。于是我们的工作考虑这样一个基本模型,假如知道某个用户此时在通过暗网进行网站的访问,并且知道在访问的可能网站集合,那么如何通过分析用户流量确定用户此时访问的是其中哪个网站。
综上所述,我们的工作主要分为三个部分。第一部分中,我们需要搭建一个私有且完整的暗网环境,这个白盒环境可以供我们进行各种实验和分析。第二部分中,我们打算利用搭建的暗网环境进行用户访问行为的模拟,并在关键节点处收集流量。第三部分,我们打算对收集的流量进行分析工作,建立网站识别的模型并给出基本结果。
2 采用的关键技术
在第一部分的工作中,我们考虑使用Docker容器进行暗网环境中节点的模拟。具体来说,首先我们需要构建暗网节点的镜像文件,我们选择引入的操作系统版本为 debian:unstable 版本,在此基础之上我们构建了tor运行所需要的配置环境,安装了所需要的各种依赖文件和tor应用,最终生成了我们暗网节点的基础镜像。之后,我们通过Docker Compose来利用镜像来构建容器,模拟不同种类节点的配置和相互的网络连接,不同类型的节点涉及的Tor配置文件会有所区别,因此在构建容器的时候要对不同种类的节点设置特殊的配置字段,并执行不同的节点配置命令。
在第二部分的工作中,首先我们考虑使用python爬虫技术来模拟用户利用暗网访问网站的行为。因为单纯使用curl命令进行代理访问暗网的话,接收的网站内容只会涉及到源码的少量内容,而不会动态加载丰富的网站组件,对于流量收集工作来说是远远不够的。具体来说,我们使用的是python的selenium webdriver库。对于每个网站,我们模拟用户加载整个完整页面并停留10秒钟时间,表示一次完整的访问过程。同时,我们在容器中的Tor客户端和Tor入口节点之间通过tcpdump工具抓包,收集这段时间内交互的所有数据包信息,作为一次网站访问的流量轨迹。
第三部分的工作主要涉及到如何利用收集的流量轨迹进行分析。想要知道一段流量对应的是哪个网站,就需要用到网站指纹分析技术。它的主要思想是收集用户访问网站过程中产生的一段连续数据包作为网站的指纹,可以从中试图提取特征进行分析,试图发现指纹中存在的一些特定流量规律。我们参考的论文为发表在CCS’19上的《Triplet Fingerprinting: More Practical and Portable Website Fingerprinting with N-shot Learning》,文中的攻击模型假设攻击者有能力收集到客户端和入口节点之间的通信流量,这与我们进行的流量收集工作是条件相符的。一个关键点是,对于不同的网站来说,用户在通过暗网访问时产生的流量规律是不同的,于是此类研究工作考虑使用机器学习对流量特征进行学习,利用构建的分类模型来判断流量对应的网站。在机器学习中,数据量、训练时间和准确度都是需要考虑的重要问题。一般的机器学习模型需要大量的训练数据来完成模型训练,因此首先会造成流量收集工作难度和耗时较大,这也对应着更强的攻击能力假设,与实际现实条件差距较大。另外,使用大量的训练数据意味着训练用时较长,导致攻击效率较低。准确度是考虑的最终评价标准,尽管很多时候准确度和优化前两个因素是相违的,但是我们考虑在三者之间进行权衡的同时,依然希望在符合现实的训练数据不大的情况下,得到一个较高的分类准确度。除了此三者,我们需要考虑模型的可扩展性,比如我们引入了一个新的网站类型,那么之前的模型是否能通过更新的方式来继续使用,如果可以更新那么更新所需的数据量又是多大。综上所述,我们需要选择合适的模型和训练方法,来尽可能符合各类条件和参考指标。
我们参考论文中的方法,输入数据为流量轨迹中每一个流量包的方向,从客户端发往入口节点表示为+1,客户端从入口节点接收表示为-1,构建一个长度为2000的流量方向向量,多的部分进行截取,少于这个长度则补0。首先使用Triplet Network训练一个特征提取器,将输入的流量方向向量转换为一个64维的特征嵌入向量。Triplet Network每次训练输入三个不同向量作为一个三元组(A,P,N),分别表示锚节点、正样本和负样本。其中,正样本和锚节点来自同一个网站的样本集,负样本取自其他网站的样本集。我们训练特征提取器的目的是使得到的特征嵌入向量里,属于同一个网站的两个向量距离近,而属于不同网站的向量之间距离远。整个特征提取器的训练过程称为预训练阶段,这个阶段采用的是无监督学习,这部分利用的数据量可以很大,来构建一个尽可能最佳的特征提取模型。得到特征提取器的实现模型可以有很多种,如GoogleNet、ResNet、Xception、DF等都能用来作为的架构,最终我们选择了DF模型,它在论文实验中被认为是效果最好的。
预训练完特征提取器后,就可以将其用于正式的训练和测试阶段。在这个阶段中,输入依旧是之前所述的2000维方向向量,将其通过特征提取器后转换为64维特征嵌入向量,之后将特征嵌入向量通过K-NN模型完成最终的分类,输出为预测的网站结果。因为经过了特征提取器的加工,正式训练所需要的数据量相较于之前的预训练阶段可以少很多,对应的现实场景是:当我们引入新的网站时,可以利用少量的流量样本数据就可以完成模型的训练工作。
综上所述,第三部分工作利用之前收集的流量训练网站分类模型,最终通过使用的训练样本数和准确度作为网站指纹分析方法优劣的检验标准。
3 所取得的主要成果
在实习开始的第1周中,我们进行了暗网基础概念和原理的学习,熟悉了暗网的基本通信过程,了解了存在于暗网中的各种节点特性,为之后搭建暗网靶场环境打下了坚实基础。
在实习第2周内,我们学习了Docker容器和镜像文件的使用、构建方法,以及Docker Compose文件的编写方式,并自己进行了若干实例的操作和经验总结。
在第3、4周的时间中,我们成功构建了完整的暗网靶场环境,模拟了暗网之中功能不同的各种节点。主要包括1个客户端节点,3个目录服务器,以及入口节点、中继节点以及出口节点总计40个,于是在每次客户端访问时我们就可以拥有数千种可能的匿名通信三节点组合方式。所有的节点以Docker网桥为中介彼此相互连接,都可以互相进行通信。首先我们验证了我们靶场环境搭建的正确性,我们通过客户端节点Tor代理访问网站时,通过tcpdump进行在客户端上抓包,的确观察到了它与入口节点之间的流量激增情况,表示一次暗网访问过程的正常进行。
第5、6周的工作中,我们利用搭建的暗网靶场进行了用户行为模拟和相应的流量收集工作。首先,我们手动挑选了9个国内的热门网站,包括bilibili、baidu、qq等,之所以选择这9个网站是因为一方面它们每日的用户访问数目大更加受到用户偏好,另一方面我通过少数样例数据发现它们每次访问产生的流量包数目大小偏差范围较小,在我们的初步实验中更加适合以流量方向向量作为依据。对于每个网站,我们使用python采用一定的时间间隔模拟了100次用户访问行为,同时在暗网靶场中进行tcpdump抓包,最终通过流量包处理和提取还原了每次的访问流量轨迹,记录了每个包的方向和数据包大小。
在最后第7、8周的工作中,我们查阅了相关网站指纹分析的技术资料,精读了相关的顶会论文,确定了使用的模型和训练方法,最终利用收集的数据完成了一个少量数据场景下的初步实验,仅仅用于检验我们流量收集和指纹分析方法的合理性和可能的优势。首先我们利用五个网站的数据,结合Triplet Network和DF模型预训练了特征提取器,具体选择batch size为32、epoch为10、输出嵌入向量为64维,并采用SGD作为优化器进行模型更新。在正式的训练和测试阶段,考虑了使用两种方式进行不同场景下结果的验证。在第一种场景下,我们使用与预训练过程中相同的五个网站进行正式训练和测试,对应的场景是最简单的训练和分类模型,没有涉及到新网站的引入和可能引发的模型更新。第二种场景下,我们使用与预训练中不同的网站流量样本进行正式训练和测试,即之前没有用到的另外四个网站的相关数据。为了验证正式训练阶段使用样本数量对实验结果的影响,考虑了正式训练样本数量分别为5、10、15和20四种情况,然后每个网站随机另选70个样本进行测试,进行10次重复实验以其准确度的平均值作为模型效果的估计。在最终得到的实验结果中,在第一种实验场景下,在训练样本量为5,10,15,20时分别达到了()的平均准确度,表示在不变的网站集合中预测效果较好。在第二种实验场景下,4种训练样本规模对应的准确度分别为(),可以发现即使正式训练网站与预训练网站完全不同的情况下,采用少量样本依旧达到了较高的准确度,证明了模型较好的的可扩展性。
声明:本文来自风眼实验室,版权归作者所有。文章内容仅代表作者独立观点,不代表安全内参立场,转载目的在于传递更多信息。如有侵权,请联系 anquanneican@163.com。