使用随机森林对恶意软件C&C加密通信流量分类

发布于 / Python / 1 条评论

研究背景

中间人攻击是一种常见的网络攻击手段,一个潜在的对手可以通过 arp 欺骗使用户的流量全部通过自己可控的计算机,或直接控制网关设备监听用户流量,以达到获取用户通讯内容,篡改通讯内容,甚至通过植入恶意代码而达到一些具有破坏性的目的。

HTTPS 解决了中间人攻击这一漏洞。在早期,HTTPS 使用 SSL 协议加密流量,而 SSL 协议被证明是有漏洞的一种加密协议,在新版本的 HTTPS协议中抛弃了不安全的 SSL,开始使用 TLS 协议。

TLS 协议是一种加密安全通讯协议,一个合法的 HTTPS 服务器会部署一个使用用户信任的合法CA 颁发的证书,该证书包含私钥和公钥,在服务器与客户端使用 TLS 协议握手时,服务端会将公钥发送给客户端,客户端会生成一个足够长的随机字符串作为密钥,并使用公钥把该生成的密钥进行非对称加密发送给服务端,服务端使用私钥即可解密。这样,客户端和服务端就实现了密钥交换,在接下来的通讯中,为了减少资源消耗,客户端和服务端将使用这个密钥对通讯内容进行对称加密。

根据 Google Chrome 的统计,全球使用 HTTPS网站的数量在不断上升,并趋近 100%,详见Google 透明度报告

在网站通讯加密化的过程中,恶意软件的通讯也逐渐开始使用 TLS 加密。根据 Cisco 的报告,在2017 年 5 月,21.5%的恶意软件使用 TLS 来加密自己的 C2 通讯。根据 MTA 公开的流量样本统计,在2020 年有 51.2%的恶意软件使用 TLS 加密自己的C2 通讯。

这给安全人员带来了极大的挑战。在以往,安全人员通常提取恶意软件的 C2 通讯特征,使用深度包匹配技术,在 snort 或其他安全系统添加规则以实现对疑似 C2 通讯的阻断或报警。而使用 TLS加密的恶意软件则无法通过深度包识别检测。因此研究恶意软件 TLS 加密流量检测很有必要。

研究现状

目前检测恶意加密流量最广泛使用的方案是通过客户端指纹方式进行校验。JA3 指纹是一种可以通过 TLS 明文握手字段信息标识一个客户端的方案,它通过将客户端的 TLS 版本号、拓展字段、加密算法、圆锥曲线参数等进行拼接得到一个字符串,并使用 md5 对这个字符串进行哈希运算得到一个指纹字符串,由于不同客户端在编译时使用的OpenSSL 拓展版本可能不一样,同时它们的参数也有很大可能不一样,因此大多数客户端的指纹都不一样。

image.png

在理想状态下,JA3 指纹和客户端是一一对应的,但是现在发现越来越多的客户端出现了指纹相同的情况,这可能是碰巧两个客户端使用了同一OpenSSL 版本或编译时使用了同样的参数,也可能是一些木马精心伪造一些客户端的特征,甚至直接内 置 一 个 Chrome 内 核 把 自 己 的 通 讯 伪 造 成Chrome 。 也 有 一 些 木 马 为 了 方 便 直 接 使 用PowerShell 发包请求通讯。这就很容易造成误报漏报,给通过指纹方式进行识别威胁带来了很大的挑战。

指纹识别需要维护一个很庞大的指纹库,例如JA3 团队维护了一个 JA3 指纹库:JA3er,该指纹库由社区贡献者通过类似投票的方式完善,难免会有错误的指纹出现。因此分析恶意流量和正常流量行为上的特征并通过模型训练分类很有必要。

基于指纹和行为进行检测

对于一些威胁而言,其 TLS 参数可以轻易的改变,但是它的行为却难以改变。因此可以考虑在指纹的基础上添加行为信息,构造一个基于指纹+行为的恶意软件加密流量分类器。在指纹方面,我参考了 JA3 的工作流程,使用了 TLS 的拓展、加密算法、圆锥曲线参数信息。将 RFC 文档中的所有拓展、加密算法、圆锥曲线参数字段张成向量并拼接,并遍历流量使用的拓展、加密算法等,若包含某个字段,则向量相关位置标记为 1.这个向量作为指纹向量。在行为层面,我使用了大量的统计学特征,其中包含如下行为:

1.基于字节:总字节量(目的是提取 botnet流量中的相似性,例如一些定长命令)、平均长度、具有相同长度的数据包总数占总数据包总数(目的是检测是否由心跳行为)、负载长度标准差

2.基于时间:每秒 bit 数、每秒包数、平均到达时间

3.基于行为:重连次数(一些恶意软件通过频繁重连以躲避检测)、首包长度(许多恶意软件在交换第一个数据包时表现出相同的行为)、连接时长、使用端口是否合法(22,443,3389,995 等使用 TLS 的协议的端口均认为是合法端口)

4.基于包:交换了多少包、空包数量、小包数量、入站包数与出站包数相比、逐包长度(这里使用的是 TLS 层的 Application Data 作为包的长度,它的长度能更好的提现负载大小信息)

5.基于域名:是否使用国际/国家顶级域名或其他域名,域名字节熵(一定程度上能表示一些复杂混乱的 DGA 域名)

同时,对于 TLS 证书,我提取了证书的个数、签发者的信息长度(为了表达证书签发者的信息完善程度)、证书类型、是否为自签证书(恶意软件为了节约成本通常使用自签发证书,如果证书的subject 和 issuer 相同,且 subject key identifier、authority key identifier 相同,则可能为自签发证书)、公钥长度、有效期(正常流量的有效期通常为 3 个月-2 年,恶意流量自签证书有效期可能长达十年)、是否处于有效期内、主题长度、拓展个数、域名数量、等信息。

最后,将指纹向量、行为向量、特征向量进行直接拼接,得到一个表示一条 TLS 流特征的向量,向量维度为 1*612。

实验

在实验前,我调研了三款恶意流量数据集,分别是 stratosphereips 实验室的 CTU-13 数据集、加拿大 网 络 安 全 研 究 所 的 CIC 数 据 集 和MTA的数据集。其中 CTU-13 数据集在捕获流量时使用了 HTTPS代理,导致证书字段被 HTTPS 代理的证书所替代,CIC 的数据集加密流量较少,而且时间比较早,很多程序仍在使用已经弃用了的 SSL 协议,因此这两个数据集不适合做本文的研究,本文使用的恶意流量数据集均为 MTA 数据集。MTA 数据集是一个从2013 年开始至今的恶意软件流量采集项目,通过写一个爬虫工具,下载了从全部的恶意流量 pcap 文件,并使用 Cisco 提供的一个 Pcap流特征提取工具:Joy ,将 pcap 文件中的 TLS 和 TCP 特征提取出来,保存为 json 文件。并按照 TCP 四元组进行聚合、排序、去重,以去除乱序和重传包,对于重组报文,Joy 会自动进行拼接并识别上层协议。最后,提取json 中本文所需要的特征,并保存为 CSV 文件。通过观察发现,这其中有较多的背景流量(例如Windows update 和一些广告恶意软件访问 Google ADs),这些流量的 host 很多都在 alexa top 100w 内。将 alexa top 100w 域名列表作为白名单可以过滤掉绝大部分正常流量。其余的通过逐个 pcap 分析,并借助 virustotal 情报,得到一份白名单,这其中包含很多木马在通讯前访问外部 API 以获取 IP 地址的流量域名,这些流量将在生成最终用于训练的数据集是被剔除。

最终得到了 61 个恶意家族样本,总共 212477条流。

正常流量为规模为 30 人的某公司安全研究团队的网关上通过端口镜像采集了两天的流量,该团队人员具有极强的安全意识,且这两天内无人运行恶意样本,全部在正常使用网络。为了样本的多样性,我下载了一部分 stratosphereips 实验室的CTU-Normal 的开源数据集,这些数据集同样也是在网关上采集的流量,最终得到 563298 条流。

由于 MTA 的数据集内不同恶意软件家族内的流量分布不均,数量差异很大,因此对于每个家族都随机取 100 条流,以避免在分析数据和模型训练时产生偏差。

根据提取的特征对数据的一些简要的分析,以下为节选了部分由代表性的分析图,其中 benign 为正常流量,malware 为异常流量

image.png

使用合法端口的概率

image.png

使用国际顶级域名的概率

image.png

使用非国际、非国家域名的概率

image.png

证书域名(SAN)包含请求域名(SNI)的概率

image.png

公钥长度

image.png

证书中拓展数量

image.png

证书信息完善度(主题字段数量)

通过上图可以发现恶意流量与正常流量在所选的特征上有显著差异,因此可以用于流量分类,可以进一步的实验。

在分类器上,我选择了随机森林分类器,因为随机森林分类器具有较强的分类能力,而且不用比较麻烦的数据预处理工作。随机森林分类器的树的数量是一个关键参数,不同数量的树可能对分类精度有较大影响,较少的树可能无法很好的分类数据,较多的树可能造成随机森林的过拟合。为了实验找到一个最好的值,将树的数量从 10-250 遍历,每次遍历都训练一次模型,并将分类精度绘制折线图,从图中可以发现,当树的数量为 130 时,可以达到较高的分类精度,而超过 150 时,分类精度提升效果不再显著,同时训练时间也大幅提高。因此后续的实验全部在 150 棵树的森林中进行。

随机森林可以将分类时每个特征的重要程度输出出来,本实验中特征重要度≥0.01 的特征柱状图如下:

image.png

通过使用 70%的数据进行训练,使用剩余 30%的数据进行测试,在测试集上得到了 99.9995%的准确率。其中正常流量误报率为 0%,恶意流量漏报率为 99.9972%。

这个效果是不错的(实验室环境中)但是在真实场景中尚未测试,怀疑会出现较高的误报率。而且该方案存在严重的概念漂移问题,例如:

使用2013-2018 年的流量进行训练,使用 2018-2020 年的流量逐个季度进行测试,发现精确度呈下降趋势。

image.png

实验代码详见:kidultff/MaliciousTLSAnalyzer (github.com)

转载原创文章请注明,转载自: 斐斐のBlog » 使用随机森林对恶意软件C&C加密通信流量分类
  1. Chen

    你好,能分享下数据集么