2.3 Festi网络通信协议
为了与C&C服务器通信并执行其恶意活动,Festi使用了一种定制的网络通信协议,它必须保护该协议不被窃听。在调查Festi僵尸网络的过程中[1],我们获得了一份与之通信的C&C服务器列表,并发现其中一些服务器主要用于发送垃圾邮件,而另一些服务器则执行DDoS攻击,这两种类型都执行单一通信协议。Festi通信协议由两个阶段组成:初始化阶段(获得C&C IP地址)和工作阶段(向C&C请求工作描述)。
2.3.1 初始化阶段
在初始化阶段,恶意软件获得C&C服务器的IP地址,服务器的域名存储在僵尸主机的二进制文件中。这个过程中有趣的是,恶意软件从C&C服务器域名中手动解析C&C IP地址。具体来说,它构造一个DNS请求包来解析C&C服务器的域名,并将该包发送到端口53的两台主机8.8.8.8或8.8.4.4中的一台,这两台主机都是谷歌DNS服务器。作为回应,Festi接收到一个IP地址,它可以在随后的通信中使用。
手动解析域名可以使僵尸网络更能抵御攻击。如果Festi不得不依赖当地ISP的DNS服务器来解析域名,那么ISP就有可能通过修改DNS信息来阻止对C&C服务器的访问。比如,执法机构发布了阻止这些域名的搜查令。然而,通过手工制作DNS请求并将其发送到谷歌服务器,恶意软件绕过了ISP的DNS基础设施,使得删除更加困难。
2.3.2 工作阶段
在工作阶段,Festi向C&C服务器请求关于它要执行的任务的信息。与C&C服务器的通信是通过TCP执行的。发送到C&C服务器的网络包请求的布局如图2-9所示,它由一个消息头和一组插件特定数据组成。
图2-9 发送到C&C服务器的网络包的布局
消息头由配置管理器插件生成,包含以下信息:
- Festi版本信息
- 是否有系统调试器
- 是否有虚拟化软件(VMWare)
- 是否有网络流量监控软件(WinPcap)
- 操作系统版本信息
特定于插件的数据由Tag-Value-Term(标记-值-项)数组组成:
- Tag:一个16位整数,指定标记后面的值类型。
- Value:以字节、字、双字、以null结尾的字符串或二进制数组形式表示的特定数据。
- Term:表示条目结束的结束字0xABDC。
标记-值-项方案为恶意软件提供了一种方便的方法,可以将特定于插件的数据序列化为发送给C&C服务器的网络请求。
数据在通过网络发送之前会用一种简单的加密算法进行模糊处理。加密算法的Python实现如代码清单2-5所示。
代码清单2-5 网络加密算法的Python实现
该恶意软件使用一个带有固定4字节密钥的滚动异或算法。
[1]Eugene Rodionov and Aleksandr Matrosov,“King of Spam: Festi Botnet Analysis,”May 2012, http://www.welivesecurity.com/wp-content/media_files/king-of-spam-festi-botnet-analysis.pdf.