导语:在上一篇文章中,我介绍了Kronos和UPAS Ki之间的一些区别。本篇文章将介绍剩余的其他区别,比如恶意有效载荷的注入,Rootkit功能,C2通信过程。
在上一篇文章中,我介绍了Kronos和UPAS Ki之间的一些区别。今天,我再来介绍剩余的其他区别,比如恶意有效载荷的注入,Rootkit功能,C2通信过程。
恶意有效载荷的注入
同样,在注入之后执行的恶意有效载荷将根据底层系统架构而有所不同。对于32位进程,注入的有效载荷将执行以下操作:
1.根据传递给有效载荷的config_struct来分配全局变量;
2.加载dll的原始映像;
3.使用注入过程设置的互斥对象名称创建互斥对象;
4.检查是否有卸载标志,如果没有,则分为以下两种情况:
4.1 创建一个线程将自己注入所有其他进程中,并将hook函数设置为在注入时应执行的函数;
4.2 创建一个线程,负责通过USB渠道传播恶意软件;
4.3 进入与C2服务器通信的无限循环过程;
64位进程的有效载荷的过程与32位进程的有效载荷非常类似,区别就在于,它不检查卸载标志,这意味受害者无法执行恶意软件的卸载。另外,64位进程的有效载荷也不会将其注入到其他进程中,使rootkit失效,两个有效载荷的比较可以在下图中看得清清楚楚:
注入到explorer.exe\iexplore.exe后,UPAS Kit所调用的函数
由于接下来,研究人员将重点讨论UPAS Kit的hook机制和C2通信过程,因此我们只会在这里看到通过USB渠道所进行的传播过程。其具体过程就是先通过注册一个新的窗口类(使用前面描述的互斥对象的名称),然后输入一个无限循环的消息。
注册的USB扩展线程的窗口类
每个截获的消息将由一个专门的函数处理,该函数将检查截获的消息是否表示的是插入的USB传播渠道,如果是,则会启动传播操作并将其报告给C2服务器。
处理USB传播窗口类的程序
传播过程启动后,通过将恶意软件文件复制到USB驱动器并使用字符串“[autorun]\r\nopen=<malware_filename>_a.exe\r\n”生成新的autorun.inf文件。然后,恶意扩展模块将会开始查找任何.lnk文件,并将用以下路径替换它们的路径:
‘/C start \”\” \”<original_filename>\\\” && start \”\” \”<malicious_filename>_l.exe\”‘.
这将导致原始文件和恶意软件文件同时被执行,原因是它们的快捷执行方式都是一样的。路径替换是使用IShellLinkW COM类完成的,如下所示。
替换.lnk文件中的路径
Rootkit功能的实现
Rootkit是一种特殊的恶意软件,它的功能是在安装目标上隐藏自身及指定的文件、进程和网络链接等信息,比较多见的是Rootkit一般都和木马、后门等其他恶意程序结合使用。
UPASKit使用了一个非常直接的inline hook机制(内存注入的一种),inline hook的核心思想是:通过替换目标函数头部指令实现在函数执行之前跳转到其他的指令区域,执行完毕跳转回到原来的函数,跳转到的指令区域通常是我们自己编写的函数,inline hook技术对于编写外挂和外挂式补丁意义重大。具体工作流程如下:
1.检查目标函数是否已进行了hook,通过将目标函数的第一个字节与0xE9(即jmp指令)进行比较;
2.如果没有进行hook,则inline hook就开始分解函数的第一个字节,一般情况下至少会有5个字节被如此处理。为此,inline hook会使用一个简单的反汇编引擎(disassembly engine),该引擎仅计算每条指令的反汇编字节数,这些字节被称为被盗字节(stolen bytes)。
3.inline hook技术会准备一个具有21个NOP字节(0x90)的缓冲区,然后将偷来的字节注入该缓冲区。此外,inline hook技术还会修改NOP字节的最后5个字节,并跳转到被盗字节的地址。最后,inline hook技术还会将缓冲区的保护设置为用于原始字节(即应该是可执行的)的保护。
4.将原始函数的被窃字节部分设置为0,并将前该函数的前5个字节替换为跳转过来的hook函数。
以下就是进行了hook的ntdll.dll函数,目的是隐藏恶意软件的构件,从而使其隐蔽工作:
1.NtResumeThread:将拦截的二进制注入到恶意软件新创建的进程中;
2.NtQuerySystemInformation:检查请求的信息类是否是SystemProcessInformation,如果是,则将请求的PID与列入白名单的explorer.exe PID进行比较。如果内容匹配,它将把SYSTEM_PROCESS_INFORMATION条目(与rogue explorer.exe之前的进程对应)设置成指向explorer.exe的后续进程。
3.NtQueryDirectoryFile:隐藏恶意软件副本所在的目录;
4.NtEnumerateValueKey:隐藏与恶意软件相对应的注册表运行项;
5.NtDeleteValueKey:同NtEnumerateValueKey;
6.NtSetValueKey:如果请求项是恶意软件的运行项,则会停止该操作;
7.NtSetInformationFile:检查文件信息类是否与以下之一函数进行对应:FileDispositionInformation,FileRenameInformation,FileEndOfFileInformation或FileAllocationInformation。如果对应,请将文件名称与白名单中的恶意软件的副本二进制文件进行比较,如果匹配则避免该操作。
8.NtOpenProcess:如果请求的PID是恶意explorer.exe进程的PID,则避免该操作。
9.NtWriteFile:如果目标文件是恶意软件的二进制文件,则避免该操作。
值得注意的是,与UPAS KIT不同,Kronos使用的hook方法则截然不同。虽然两者都进行了inline hook,但Kronos的使用显然更稳定和更安全。不过inline hook会引发了一个并发问题,即在所有被盗的字节被覆盖之前发生的上下文切换可能会导致系统崩溃,原因就是彼此的代码不一致。因此,Kronos的hook方法是使用'lock cmpxch8b'指令对序言字节进行原子写入(atomic write),许多并发算法中都显示了原子的读-修改-写组合。从这个意义上说,UPAS kit的hook引擎就要简单得多,它使用的是WriteProcessMemory函数执行不安全的写入操作。
但即便如此,研究人员还是能够发现其中的相似性,这就是使用的hook函数是一样的。上述8个hook函数在Kronos中也出现过,并且作用也完全相同。这表明,这些二进制文件中的部分rootkit组件可能被重复使用了。
C&C服务器通信
与C&C服务器的交互,是使用HTTP协议完成的。大部分通信是在恶意软件执行所有其他操作(即注入,hook和USB传播)之后完成的。在这个通信序列中,恶意软件会无限循环地将信号发送到服务器,并使用以下信息更新它:
1.系统架构;
2.指示%TEMP%目录中的恶意软件副本是否仍然存在的标志;
3.操作系统版本;
4.恶意操作版本(本文是1.0.0.0);
不过,服务器会响应“卸载”和“下载”两个命令,其中, “下载”还包含两个子命令:“更新”和“执行”。在一个响应中可以同时发送多个命令,由“|”字符分隔,命令序列将在第一次出现“!”字符后开始,其中,每个命令的参数由空格分隔。
另一个可能发送到C2服务器的消息是USB传播内容的更新,一旦将自动运行文件和恶意软件二进制文件复制到USB上,C2服务器就会接收到更新的内容。
实质上,这是UPASKit的核心内容所在,即充当其他模块的秘密下载和传播程序。2012年传播的UPAS Kit的部分模块是可以在exploit.in论坛的以下主题中找到的。
虽然目前,研究人员还没有调查其他模块,但从他们的描述中可以看出,它们与ZeuS及其一些变体使用的模块类似。
IOCs
所用的UPAS Kit样本:1e87d2cbc136d9695b59e67f37035a45a9ad30f5fccc216387a03c0a62afa9d4
所用的Kronos样本:4181d8a4c2eda01094ca28d333a14b144641a5d529821b0083f61624422b25ed