针对“DorkBot”的样本分析 – 作者:三五年后

概述

DorkBot是一种已知的恶意软件,最早可以追溯到2012年。它被认为通过社会媒体链接、即时消息应用程序或受感染的可移动设备等多种方式进行传播。尽管它是众所周知的恶意软件家族中的一员,但我们相信已经有更多的网络感染了Dorkbot,而且超过了我们之前的预计,其中受影响最大的国家是斯里兰卡、印度和俄罗斯。

image.png 
Dorkbot感染的地理分布

恶意软件本质上是一个通用的下载器和一些二进制组件的启动器,主要模块是用于执行DDoS攻击或窃取密码。此次的分析是基于在过去一个月中多次捕获到的一个在野样本。 

DorkBot恶意软件被打包在一个dropper中,其中payload被嵌入到一个RC4加密的blob(二进制大对象)中。这个blob可以在二进制编码的资源部分中找到,并且使用Base64编码。

image.png 
图1: Base64 编码& RC4加密资源 

RC4密文的前缀是32字节的元数据,其中包含了以字节为单位解密的RC4密钥。 

image.png 
图 2: 解码资源的结构 

dropper先对Base64编码的payload进行解码,然后对其进行后续解密,最后的结果由一段用于PE加载的shellcode和恶意软件原始二进制文件组成。在解密之后,控制权被移交给位于原始二进制文件中的shellcode,然后将其进行装载并执行入口处代码。 

image.png 
图3: 解密和执行嵌入在资源中的payload

该恶意软件的dropper可以通过一个特殊的循环来识别,该循环中会出现一个消息框调用一个未定义的句柄,其值为0xFFFFA481,显示文本为“Will exec”。

image.png

Payload

Payload主要包含下列行为:

检验参数:如果是一个文件名作为参数传递,它将在当前目录中查找并使用ShellExecuteW执行。但是,如果参数以“\”结尾,那么它将被假定为一个目录名。在后一种情况下,通过使用ShellExecuteW生成“exe”,将目录路径附加到当前目录作为参数,并在新窗口中打开。该特性是为了在恶意软件下运行其他进程,并利用它来替换所有的快捷方式来运行恶意软件,然后使用它来生成实际的快捷路径,从而在系统中实现长时间驻留。

拷贝自身:恶意软件会在%appdata%中创建自己的副本。

反虚拟机:使用SetupDiGetDeviceRegistryPropertyA获取硬盘的设备名称,并检查它是否包含一个下面的子字符串:“vbox”、“qemu”,“vmware”,“virtual hd”。如果包含,恶意软件将判断为在虚拟机中运行,进而会终止进程。

终止自启动进程:枚举以下注册表项,关闭所有非恶意软件相关的自启动进程:

image.png 
图4: 通过注册表run key键值,枚举和终止自启动进程

计算ComputerID:每台被感染的机器都有一个“<computer_name>#<calculated_md5>”格式的ID,其中第二个参数是系统信息缓冲区的MD5哈希,其结构如下:

image.png

在运行时可以看到这种结构的一个例子: 

image.png 
图 5: 用于计算Machine ID的hash值的缓冲区结构

计算GUID:恶意软件中的大多数对象(事件、互斥、文件名等)都是基于生成的GUID来命名的,此次的GUID按照如下方式构建(基于前面提到的系统信息结构,当前进程所有者的SID和一个key作为参数传递给GUID生成函数):

DWORD Data1: MD5(sysinfo)[0..3] xorkey

DWORD Data2|Data3: MD5(sysinfo)[4..7]xor key

DWORD Data4[0..3]:MD5(sysinfo)[8..11] xor CRC32(user_SID)

DWORD Data4[4..7]:MD5(sysinfo)[12..15] xor CRC32(user_SID)

APC注入:创建一个挂起的进程,将恶意软件的内存映射注入进去,将其主线程的控制函数(接下来要叙述的)作为一个APC队列,并恢复其主线程。因此,上述函数开始运行在svchost.exe进程中。 

工作线程控制函数:该函数包含恶意软件的主要功能,以线程的形式调用各种功能。预计这个函数将会在前面提到的APC注入后的宿主exe中运行,如果失败,将在当前进程的上下文中运行。然而由于代码中出现的一个bug,后者将不会在现实中发生。在进程句柄关闭后,正在启动的svchost.exe主线程句柄也会关闭。这会导致进程崩溃,从而避免进一步的恶意活动。 

函数本身的行为如下:

Ø PE加载操作,即进行重定位操作以及解析导入的恶意软件映射的执行。

Ø 创建一个隐藏的计划任务(使用ITask COM类),该任务设置为在当前用户的登录时启动。

Ø 创建注册表runkey,在HKCM\Software\Microsoft\Windows\CurrentVersion\Run。键的名称是预先生成的GUID,路径为复制到%appdata%下的恶意文件。

Ø 在一个单独的线程中删除原始的恶意软件文件(除非当恶意软件从一个非移动介质运行,并成功地注入到exe)。

如果恶意软件是由可移动的媒体执行的,它将在HCKU\Software\Classes\CLSID下注册一个指定的类,类名是GUID,键值为0xDEADBEEF。

image.png 
图6:恶意软件注册一个类

文件修改监控:一个线程会不断地计算%appdata%下复制的恶意二进制文件的CRC32,并将其与原始文件的CRC32进行比较。一旦发生变化,复制文件会被删除,并将其重写为原始文件的内容。

image.png 
图7: 文件更改监视器代码

替换快捷方式:遍历所有安装的驱动器(通过GetLogicalDriveStringsW获取)并枚举所有文件,以找到具有“.lnk”扩展名的文件。如果找到这样的文件,则通过以下参数去执行exe去修改目标路径(使用IPersistFile COM类):

Ø 由恶意软件生成的包含恶意软件副本的路径。

Ø 枚举文件的路径,它将通过执行恶意软件本身来调用。

注入进程监控代码:该恶意软件将枚举所有正在运行的进程,并排除64位进程、当前进程和运行名为“teamviewer.exe、tv_w32.exe”的进程。

image.png 
图8:将TeamViewer排除在注入的目标进程之外。

所有其他进程(以及恶意软件创建的notepad.exe进程)将被注入以下代码:

image.png 
图9:注入进程监视代码

指针0x11111111、0x22222222、0x33333333和0x44444444将在注入函数之前被替换,如下所示:

image.png 
图10: 在进程监视payload中把无效指针替换成真实的函数指针

注入的代码本身将无限期地等待一个事件,当原始的恶意软件进程被终止时,信号量将会被释放。当出现这种情况,注入的进程监控代码将会再次启动恶意软件。

l通信:所有C2域名都存放在一个以AES256-CBC加密的blob二进制文件中,排列成一个指针列表,在.data区段偏移16的位置中可以找到。

image.png 
图11:被加密的CnC域名表

解密的密钥为“GD!brWJJBeTgTGSgEFB/quRcfCkBHWgl”。

image.png 
图12:CnC域名的解密函数

在恶意软件中可以观察到以下类型的通信:

Ø HTTP GET 请求一个文件从样本的C2服务中。C2将通过“v%d”格式的子域进行联系,其中的%d数值是从运行时的全局变量中获取。如果从服务器成功返回一个文件,那么它将一10字符的随机数命名存在在%appdata%下,并使用CreateProcessW启动。

注意:其他变种的恶意软件可能使用不同的子域名,例如“up%d”。

Ø 基于TCP的原始协议,用于获取可从中下载文件的新CnC地址。协议请求消息是一个包含170个字节的缓冲区,具有以下结构:

image.png 
图13:请求CnC的原始协议结构

响应包由517字节组成,具有以下结构:

image.png 
图14:来自CnC的响应包

IOCs

153a3104fe52062844fed64c7a033d8378f7977f– Dropper 

0cf0f00b7c78d68365b4c890c76941051e244e6f– Unpacked

*参考来源:checkpoint,由三五年后编译,转载请注明来自FreeBuf.COM

来源:freebuf.com 2018-02-16 15:00:43 by: 三五年后

© 版权声明
THE END
喜欢就支持一下吧
点赞0
分享
评论 抢沙发

请登录后发表评论