1. 前言
互联网环境通信流量千千万,当我们安全研究人员在做流量分析时无法避免遇到非明文数据,对于自己数据的流量特征可以一眼分析出来通信内容,但是恶意流量通信非常之多,当你看到这样的流量,你是否能够分析出该流量数据传输的是什么内容?
通信流量整体内容可读性较差,完全看不出来恶意流量要传输的内容是什么。
且针对于这种内容如果提取对应的检测规则,仅通过流量层的分析是无法提取的。
接下来我们来从逆向的层面来还原数据传输的意义。
2. 行为分析
2.1 整体流程图
样本的整体执行流程如下:
2.2 释放诱饵文档
首先运行样本,样本释放并运行诱饵文档用来迷惑受害者。
随后,通过二次文件释放以及dll调用来加载最终的恶意DLL实现服务启动达到恶意通信目的。
2.3 定位最终载荷
木马行为如下,发现可疑行为
并通过该文件在服务列表中定位到对应的服务
3. 逆向分析
3.1 关键函数定位
定位目标dll使用IDA进行逆向分析,对应的导出函数如下:
进入Servicemain函数进行分析,定位恶意代码主函数。
3.2 注册服务启动
首先创建服务名,名字如下:Net1Service,和火绒剑定位到的服务名如出一辙
3.3 创建线程
恶意代码主函数创建线程,所有的操作均在线程回调函数中。
3.4 回溯函数调用
线程回调函数整体均使用内存地址寻址调用的方式来实现目标函数的加载,可读性较差加强逆向分析难度。
交叉引用回溯到函数赋值位置
3.5 互斥体创建
运行恶意代码前判断目标互斥体是否存在,如果存在则不再继续感染当前主机,否则创建互斥体执行后续恶意代码
经过动态调试分析,确认“v3+16”函数为上线包处理函数
3.6 C2解析
进入函数内部,该函数首先对目标c2进行DNS解析,解析成功后获取到目标ip。
3.7 上线包数据获取
地址随后进行上线包数据信息获取操作。
首先获取受害者主机的mac地址,随后按照02x%进行格式化。
随后将格式化后的mac地址信息拼接到上线包数据指定偏移0x04。
随后GetUserInfo函数负责包含剩余其他所有上线包数据的获取。
获取后的数据拼接如下图所示:
其中包含被害者主机的mac地址、cpu主频、cpu核数、物理内存大小、国家语言地区、计算机名、系统版本等。其中需要注意的是,此木马在获取受害者所处的国家语言地区时使用的通过编码页数来间接判断语言地区。
3.8 加密函数分析
获取完数据后使用加密函数对所有明文上线包信息进行加密,这里使用的异或加密,密钥为0xf7。
加密后的数据如下所示,和最初抓取的pcap中的通信流量数据相同。
加密完成后,开始发送上线信息,其中上线包大小为474字节。
这也刚好和wireshark中抓取的包大小一致。
4. 解密还原原始数据
通过以上的详细逆向操作,已经将通信流量的数据全部还原解密,下表为通信数据具体的数据结构以及对应的解释。
整体数据结构还原。
偏移 | 大小 | 含义 |
Buf[0] | 4字节 | 固定硬编码 |
Buf[4] | / | 受害者mac地址 |
Buf[17] | 4字节 | 受害者CPU主频率 |
Buf[21] | 4字节 | 受害者物理内存大小 |
Buf[29] | 4字节 | 受害者国家所处地区 |
Buf[33] | 4字节 | 受害者国家所处地区 |
Buf[41] | 4字节 | 受害者操作系统版本 |
Buf[45] | 4字节 | 受害者CPU核数 |
Buf[218] | / | 受害者计算机名 |
5. 总结
本篇文章作者通过逆向的角度来还原恶意流量中的真实通信数据,其中关键思路在于如何定位出目标流量通信数据对应的PID以及逆向+调试定位还原数据结构。