工作背景
在分析 IoT 僵尸网络时,识别C&C 服务器至关重要。C&C 服务器的 IP 地址一直都是商业威胁情报的重要组成部分,由于 C&C 服务器通信协议日渐复杂并且活跃周期较短,时效性和准确性也非常重要。如果可以自动化识别 IoT 恶意软件使用的 C&C 服务器,能够提供极有价值的威胁情报。
工作设计
首先在沙盒中执行 IoT 恶意软件触发C&C请求,紧接着 Profiler在所有流量中剥离出 C&C 流量,再通过 MitM 将流量重定向至给定的 IP:端口 空间范围,最后通过分析通信确定目标是否为 C&C 服务器。
激活 C&C 流量
要按照样本文件的架构使用对应架构的环境,使用 QEMU 和 RiotMan 来模拟所需环境。
C&C 流量剥离
算法如下所示。首先过滤掉不相关的协议(ICMP、DHCP、ARP、NTP等),接着计算与对端的连接次数/请求解析次数大不大。针对域名要过滤掉信誉高的域名,针对IP:端口计算连接频率与对端端口号出现的IP 地址数。
重定向探测
通过中间人模块来重定向流量,出于伦理考量需要做映射和限制。
确定C&C 服务器
在传输层使用两种方式:
(1)SYN-DATA 感知。在 SYN 设置低于阈值且存在数据交换时,即可认为是 C&C 服务器。即便握手也不代表在应用层面连接成功,但失败后一直重试也可能是C&C 服务器。
(2)指纹识别。将网络流建模成对话的模式:确定流的开始与结束,保证流符合 TCP 标准规范,再提取数据包属性。算法如下所示,属性可以是数据包大小、字节熵值或者 Payload 中的字符串等。通过这种方式,可以将每个流都转换成字符串。转换成字符串后,比较字符串间的相似度(最长公共序列,LCS)再进行聚类(K-Means)。
第一个流中,完成握手后客户端发送 11 字节数据,随后服务器回复 4 字节数据,客户端响应 1 字节数据结束。第二个流中,完成握手后客户端发送 2 字节数据,随后服务器回复 13 字节数据,紧接着服务器与客户端互相确认 FIN 流结束。
工作准备
C2Miner 使用 Python 和 Shell 编写,总计约 3500 行代码。
除了向 C&C 服务器发送的流量之外,全部都被过滤掉了。
从 MalwareBazaar 与 VirusTotal 中收集 1447 个 MIPS 架构的样本,平均每天可收集到四个新样本。
分析期间,样本向 15 万个“IP:端口”组合发出了 300 万次请求。一共有 202 个样本文件与 C&C 服务器建立了连接,生成了 230MB 流量(其中,C&C 流量只占 0.06%)。
这些样本覆盖了 11 个恶意软件家族,但 MIPS 样本的杀软标签很不准确。
工作评估
对比之下,最为稳定的就是指纹识别的方法。
聚类也可以很好地表征恶意软件家族的行为,但并不完美。大多数 Mirai 的样本模式为CLIENT_4.CLIENT_1.CLIENT_2.SERVER_2,大多数 Gafgyt 的样本模式为SERVER_4.SERVER_1.SERVER_4.SERVER_1,这二者就覆盖率 68% 的 C&C 通信。
该方法对 84% 的样本文件都有效。
工作思考
根据既定模式在大网展开探测,C2Miner 发现了好几个活跃的 C&C 服务器。
尽管每天识别出一个活跃 C&C 服务器,但受制于各方条件限制已经相当好了。
即使是正确的 C&C 服务器,也未必一定会正确响应。