概述
IcedID是一种银行木马,该木马在浏览器上执行Web注入,并作为监测并操纵流量的代理。该木马能够窃取受害者的信息,例如凭据。然后,会将被窃取的信息发送到远程服务器。
最近,FortiGuard Labs团队开始对一些IcedID样本进行分析。在本系列文章中,我将详细分析新的IcedID恶意软件样本,本系列将分为三个部分。
· 第一部分:脱壳、挂钩和进程注入
· 第二部分:IcedID核心Payload分析
· 第三部分:子进程分析
本文是该系列的第一部分,让我们来逐一突破。
0x01 恶意PE可执行文件
我们所分析的样本是PE可执行文件,最常见的是受感染的Office文件。下图展现了执行PE文件后产生的进程树。我们可以看到,这个IcedID样本最终创建了一个svchost.exe父进程和三个svchost.exe子进程。此外,它还可以提供Trickbot Payload,在其中以红色突出显示。在这一系列文章中,我们不会涉及对Trickbot Payload的分析,我们只关注IcedID内部的工作原理。
执行IcedID样本后产生的进程树:
如上图所示,PE可执行文件首先使用命令行参数“-q=xxxxxxxxxx”启动其自身。随后,继续启动svchost.exe进程。在启动第一个svchost.exe进程之后,前两个进程将会退出。最后,这个svchost.exe父进程启动3个svchost.exe子进程。
0x02 解压缩PE可执行文件
接下来,我们可以开始动态分析PE执行的过程。从入口点跟踪几步后,程序进入到函数sub_00415CAE(),如下所示。
跳转到trampoline代码:
在trampoline代码中,它用于解密代码段。最终,它可以跳转到程序真正的入口点。此时,PE可执行文件的脱壳过程就已经完成。
跳转回实际入口点0x401000:
下面是程序真正入口点的伪代码:
该程序的主要功能列表如下:
1. 检查命令行参数是否以“-q=”开头。如果是,则跳转到步骤2,否则跳转到步骤3。
2. 创建svchost.exe进程,并执行进程注入。
3. 使用TSC参数(“-q=xxxxxxxxx”)创建新进程。
我们在没有任何参数的情况下运行此示例,因此可以进入到步骤3(sub_4012E9)。
函数sub_4012E9:
在执行rdtsc指令后,返回值将会被转换为字符串,并作为新进程执行的参数。接下来,程序在进程上下文中设置环境变量。变量的名称是不带前缀“-q=”的命令行参数。
在进程上下文中设置环境变量:
最后,调用CreateProcessA函数,以使用参数创建其自身。
接下来,我们继续对新运行的进程进行分析。
0x03 挂钩技术和进程注入
启动新进程后,程序进入实际入口点,如上所示。此时,check_parameter()函数返回TRUE,因为命令行参数以“-q=”开头。然后,会转到sub_40124A()函数。
sub_40124A()的伪代码:
在函数hook_NtCreateUserProcess()中,首先调用函数NtProtectVirtualMemory,将函数NtCreateUserProcess的前五个字节的保护更改为PAGE_EXECUTE_READWRITE。然后,它使用JMP指令来修改这五个字节。最后,再次调用函数NtProtectVirtualMemory将前五个字节恢复为原来的保护模式。
挂钩函数NtCreateUserProcess:
以下是函数NtCreateUserProcess的汇编代码:
在函数CreateProcessA中,代码调用低级API NtCreateUserProcess,程序转到trampoline代码sub_4010B7()。下面是trampoline代码的伪代码。
Trampoline代码实际执行的操作如下:
1. 对函数NtCreateUserProcess取消挂钩;
2. 调用函数NtCreateUserProcess,负责执行创建新进程的主要工作;
3. 使用RtlDecompressBuffer释放缓冲区;
4. 对svchost.exe执行进程注入,并在svchost.exe的进程空间中挂钩RtlExitUserProcess。
接下来,让我们具体来分析下步骤4。下面是该步骤中函数sub_401745()的伪代码,在svchost.exe中实现进程注入,并挂钩其RtlExitUserProcess:
首先,使用NtAllocateVirtualMemory在远程进程空间(svchost.exe)中分配内存区域。接下来,它使用ZwWriteVirutalMemory在svchost.exe进程中执行代码注入,注入到内存区域。
在svchost.exe进程中实现进程注入:
然后,在svchost.exe的进程空间中,为RtlExitUserProcess设置一个挂钩。需要注意的是,这里与此前挂钩RtlExitUserProcess和NtCreateUserProcess时存在一些差别。前者是挂钩远程进程空间的API,而后者是挂钩当前进程空间的API。
挂钩RtlExitUserProcess:
挂钩后的RtlExitUserProcess的汇编代码如下所示:
在此前已经创建了没有参数的svchost.exe进程。如果在没有参数的情况下运行svchost.exe,则可以立即退出,在退出后,将调用低级API RtlExitUserProcess。由于IcedID恶意软件挂钩了RtlExitUserProcess,因此它可以跳转到trampoline代码,以执行IcedID Payload。
远程进程svchost.exe中注入的内存区域如下图所示。我们可以看出,已经注入了两个内存区域。代码段存储在存储区域(0xa1000 ~ 0xa7000)之中。
Svchost.exe进程的注入内存区域:
如图14所示,它将跳转到0xA2B2D,该部分位于存储区(0xA1000 – 0xA7000)中。Trampoline代码与该存储区域的偏移量为0x2B2D。
0x03 结论
我们已经详细分析了IcedID恶意软件的脱壳、挂钩和进程注入技术,以及如何执行IcedID Payload。在下一篇文章中,我们将对IcedID Payload(0xA2B2D)进行深入分析。敬请期待!
0x04 解决方案
该恶意PE文件已经被FortiGuard反病毒服务检测为“W32/Kryptik.GTSU!tr”。
0x05 参考信息
SHA-256哈希值
PE可执行文件(b8113a604e6c190bbd8b687fd2ba7386d4d98234f5138a71bcf15f0a3c812e91)