本文是国外研究者对一款DDoS木马的分析,木马文件MD5为:67877403db7f8ce451b72924188443f8
安装
在这个恶意软件的主函数中有两个子程序是用于检查恶意软件是否已经安装到了系统上。
此木马检测注册表和文件的路径如下图:
仔细观察,便会发现安装文件位于syswow64 文件夹中,这也就意味着此木马适用于64位系统环境中,在所有32位操作系统中将无法安装。
从注册表的检测过程中,我们可以看到此木马会使用“Iptablex Services”作为服务名称并安装一个服务。
如果前两个检测都失败了,它将会继续检查提供给自身的参数。
1: xxxxClient 2: del
当此木马程序被用于C2通信和所有的初始化完成过程,使用的参数是“xxxxClient”。
使用参数“del”,删除此木马程序。
在第一次运行时,大多数检测都会失败。此木马程序会执行到以下节点:
在安装的进程被调用前,先调用“TerminateProcessWithModules”。这个子程序将列举所有进程和加载的dll,如果发现一个和此木马程序具有相同到名称模块,程序便会终止执行。
如果父程序的ID与当前进程相同,就会跳过终止程序。这么做是因为安装程序本身就作为子进程启动的。更多细节参考见后文。
实际上,这个子程序本身有很多bug。它调用的“ConvertUnicodetoAscii”是从PROCESSENTRY32.szExeFile中获取了一个字符串参数,是一个ASCII字符串。因此它永远不会成功终结一个已经运行相同恶意软件的程序。
它不仅会进一步继续创建并启动“Iptablex Service”服务器,也将再次带参数“del”执行自身。
服务从ServiceProc子进程启动。在初始化阶段,创建了两个Windows全局事件对象,“Global//hbllxxxxServer”和“Global//hbllxxxxClient”。
这些事件对于子进程来说非常重要,因为它必须知道初始化阶段是否结束。从而进一步启动来自带有参数“xxxClient”服务本身的另一个Exe文件。
如下自程序将启动一个新的实例。
CheckEvents子进程用于检查全局事件是否已经设置完毕。C2的参数(端口以及IP或者域名)使用以下简单算法进行解码。
如果Ip地址域存在,在DWORD(EncodedByteStream + 1)使用一个0xaaaaaaaa占位字符便可以检查域名。
如果我们绕了过去,进一步对其进行检测会发现这个域名使用了常数端口号2345。
为了跳过安装进程并让分析更加简单,以下程序能够在开始调试之前让事件保持活跃。
#define WIN32_LEAN_AND_MEAN #include <windows.h> signed int __cdecl startEvent() { HANDLE hObject; HANDLE hEvent; hObject = CreateEventA(0, 0, 0, “Global//hbllxxxxServer”); if ( hObject ) { if ( GetLastError() != 183 ) { hEvent = CreateEventA(0, 0, 1, “Global//hbllxxxxClient”); if ( hEvent ) return 1; } CloseHandle(hObject); } return 0; } int main(int argc, char **argv) { startEvent(); while (1) { Sleep(3000); } }
如果我们开始带有“xxxxClient”参数的二进制,我们便可以跳过安装阶段,直接进入c2通信子进程。
C2通信
最初初始化包被传送到c2c,它包含关联数据纯文本操作系统(大多数与硬件安装有关)。如果发现Windows2008服务器和AMD处理器,数据包中会产生一个变量。
发送初始化数据包之后,创建一个线程用于接收来自服务器的命令。将时间设置为30秒,如果30秒内没有收到任何消息,“xy”便会被发送至服务器。
长度大于或等于262字节的任何请求都会被丢弃。
将来自C2的命令发送至如TCP_RAW DDOS攻击的处理程序,更新二进制文件。