近日,法国安全研究者兼BotConf和FastIR公司创始人Sebastien Larinier,**针对RTF文档相关的CVE-2017–11882漏洞利用专门制作了一条YARA规则,来捕获攻击线索。**经过海量数据比对,他发现了一个用来执行APT攻击的恶意RTF文档样本,其中的内容和越南岘港市海洲郡的建设项目相关,文档标题为《Chương trình hoạt động cnit 2018》。据Sebastien Larinier声称,按照该恶意文档表现出来的各项行为指标和特征值,他怀疑该APT攻击文档的幕后使用者为中国的黑客组织1937CN。
本文中,Sebastien Larinier着重描述了该恶意文档的感染攻击机制、网络攻击架构以及攻击者采用的相关TTPs技术。
感染攻击链
Joe sandbox 在线沙盒分析网站对该文档的详细感染行为给出了很好的描述:
该恶意RTF文档利用漏洞会向目标操作系统中写入以下两个文件:
一个名为 RasTls.dll 的dll文件
一个名为dascgosrky.exe的可执行文件
RTF文档分析
在Python的RTF分析工具rtfobj帮助下,可以发现恶意RTF文档中的三个ole对象:一个类名为package的ole对象,以及另两个不良结构的ole对象。
在名为package的ole对象中,存在一个8.t文件的加载路径:
这种技术看似是用来执行 .sct 格式文件,以向网络下载一个可执行程序,植入到目标操作系统中。McAfee安全实验室曾用 .sct文件为样本对这种技术进行过分析。这种技术由于简单有效,并且支持Office相关文档,屡次被很多攻击者进行了在野利用。这以上路径中,可以看到,RTF文档会从系统%TMP% 目录中加载一个 8.t 文件。经分析,8.t 文件为一个加密文件:
经检查,另两个不良结构的ole对象为涉及“Equation Native”流的ole公式对象,其中可以看到CVE-2017–11882漏洞利用的影子:
ole对象末尾,能看到很多API接口的runPE技术调用,这样恶意程序会挂起一个系统进程,并在其中注入恶意执行代码。另外,还发现了对象开始处的有意思的字符串: 7e079a2524fa63a55fbcfe:
该字符串曾在“响尾蛇”APT攻击的ole公式对象中出现过,可能攻击者都使用了同一套恶意程序组装工具。现在有了加载文件8.t ,以及runPE技术的确定。接下来,需要来做更深入的shellcode分析。
逆向ShellCode
在分析伊始,Sebastien认为 Winword.exe 会调用 CreateProcess 函数来创建EQNEDT32.exe进程,所以他决定在CreateProcess 函数的调用处设置一个断点。
但是,后来发现,EQNEDT32.exe 进程是由Winword.exe利用COM Object对象调用的,并不是由 CreateProcess 函数来创建的,而且Winword.exe也不是EQNEDT32.exe的父进程。所以,只好在EQNEDT32.exe启动时附加上调试器。为此,可以采用映像劫持(Image File Execution Options,IFEO)方法来进行分析。
所谓的映像劫持(IFEO)就是Image File Execution Options,位于注册表的 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options 由于这个项主要是用来调试程序用的,对一般用户意义不大。默认是只有管理员和local system有权读写修改。通俗来说,就是比如我想运行a.exe,结果运行的却是b.exe,也就是说在这种情况下,a程序被b给劫持了,即你想运行的程序被另外一个程序代替了。
先在Image File Execution Options的注册表荐中创建了一个名为EQNEDT32.exe的键值:
然后,为它设置一个EQNEDT32.exe执行是启动调试器的变量串值,以此把调试器附加到EQNEDT32.exe进程中去。
当打开恶意RTF文档后,Winword.exe和EQNEDT32.exe两个进程同时启动。
在EQNEDT32.exe进程的入口点处,调试器被附加进入:
现在,检查文件8.t是否在 %TMP% 目录中创建生成,果然8.t被drop到了 %TMP% 目录中:
然后,在函数CreateFile处设置断点,查看漏洞利用的shellcode是否会读取文件8.t。在call eqnedt32.41E5EE处,函数CreateFile被调用。文件路径的参数在堆栈执行push dword ptr ss:[ebp-4]操作被压入堆栈,也即把内存ss:[ebp-4]处存放的双字压入堆栈。
Shellcode使用函数CreateFile把文件8.t创建生成到%TMP% 目录下,现在,可以在调用函数处返回用户代码。
深入分析之后,进入shellcode区域,其地址空间已经发生改变。以下即为漏洞利用代码的shellcode段:
在函数CreateFile调用之后, 函数GetFileSize被调用以获取文件大小:
之后就是一个VirtualAlloc函数。VirtualAlloc是一个Windows API函数,该函数的功能是在调用进程的虚地址空间,预定或者提交一部分页,也可理解为申请内存空间。这里的VirtualAlloc函数在1FD0000 (eax value)处申请创建了一个内存页面,用它来加载文件8.t:
VirtualAlloc函数之后,创建的内存页面由EAX操作指向:
分配的内存页面:
然后,用函数ReadFile去读取文件8.t:
接着,文件8.t被读取加载到了分配的内存页面 1FD0000 处,以下为文件8.t在内存页面中的样式:
在0066C82A内存处,shellcode会对文件8.t进行编码解密,解密循环是围绕解密密钥进行的一系列异或(XOR)操作,解密开始,解密密钥被设置到了7BF48E63中。以下为解密循环:
之后,执行异或(XOR)操作,解密密钥被设置到了EAX寄存器中:
如果检查异或(XOR)操作的目的地ds:[edx+ebx],可以发现,在01FD0000处发生了文件8.t加载行为,两步执行解密之后,终于可以在内存区开头看到神奇的字符串“MZ”了,MZ为window的PE文件标志。
解密循环结束之后,我们会在内存01FD0000处得到一个PE程序,到此,文件8.t被解密了:
接下来,shellcode使用VirtualAlloc函数在02070000处创建了一个内存页面:
之前,在内存01FD0000处解密得到的PE程序被拷贝到了这个地址处:
在EQNEDT32.exe运行过程中,shellcode调用GetModuleFileNameA函数来获取自身文件的完整路径。之后,shellcode将正常的EQNEDT32.exe进程进行分支,创建出另一个独立的EQNEDT32.exe进程,并把它执行挂起状态:
以下为NTWriteVirtualMemory写入内存时涉及的堆栈:
之后,shellcode会把挂起状态的进程重启,以此执行新注入的PE程序。所以,可以发现在OLE对象开头处存在所有的API调用,并且存在runPE方法来启动新注入的 EQNEDT32.exe 程序。
EQNEDT32.exe独立进程的分支创建分析
前面提过,被注入覆盖的新进程EQNEDT32.exe会在目标操作系统中写入以下两个文件:
一个名为 RasTls.dll 的dll文件
一个名为dascgosrky.exe的可执行文件
在该方法开始,存在一个xor循环:
之后,会调用压缩方法函数zlib:
在sub_4012D0处,文件释放函数dropFiles会被两次调用。
检查整个流程,可以发现,函数dropFiles只会被sub_4012D0进行调用,如下:
由于EQNEDT32.exe每次的执行,都会由函数CreateFile的onstaticcache.dat文件启动,所以,在函数CreateFile处设置了一个断点:
然后,回到用户代码中,在函数dropFiles初次被调用的0040159A处再设置一个断点,以便进行静态分析:
这样,就能分析第二遍解密循环了,先要来初始化解密函数:
接着,可以发现xor异或和把结果储存在esi+eax中操作:
解密循环第一步中,结果被写入EQNEDT32.exe进程地址空间的411BC0:
循环完成之后,可以得到zlib压缩对象的头信息:
在内存页面021E0000中,会被分配存储dll文件:
同时,在其中一个PE进程dascgosrky.exe会被解压缩:
之后,RasTls.dll文件由以下路径被创建,并被储存在ebx寄存器中:
L”C:\Users\IEUser\AppData\Roaming\Microsoft\Windows\Network Shortcuts\RasTls.dll”
在此过程中,函数dropFiles被两次调用进行解密和PE文件的解压缩操作。EQNEDT32.exe进程的文件存储偏移位于00434EF8 ,而其PE解压缩程序dascgosrky.exe存储在025D0020处。如下图所示:
之后,dascgosrky.exe释放到以下系统路径中,其基地址ebx为005DA228
L”C:\Users\IEUser\AppData\Roaming\Microsoft\Windows\Network Shortcuts\dascgosrky.exe”
由此,可以在网络行为中监测到以下两个文件释放到操作系统中:
dll劫持
表面来看,dascgosrky.exe程序是一个赛门铁克公司签发的合法可信文件:
它为了加载RasTls.dll,会调用sub_401940处的 LoadLibrary 和 GetProcaddress 方法,来实现其恶意行为。以下为其加载的恶意行为:
攻击者利用的网络架构
在该IP地址中,存在多个越南语相关的对应域名,这些域名还和IP地址176.223.165.122有关联:
其中两个越语域名有点意思:
把这两次攻击的各项TTP指标进行对比,发现基本相似,攻击者都使用了RTF文档作为前期入侵,而用DLL劫持作为后期payload加载。
总结
基于以上发现,Sebastien Larinier推断,中国黑客组织 1937CN 以同样的TTPs手法和更新过的工具组件,针对越南政府部门开展着持续的网络攻击。Sebastien认为,1937CN创建RTF恶意文档的特性和“响尾蛇”APT组织相似。Sebastien Larinier声称将会在后续的分析中给出更多证据。
IOC
域名:
dulichculao.com
thoitiet.malware-sinkhole.net
toonganuh.com
IP地址:
192.99.181.14
176.223.165.122
RTFs:
8.t:
2c60d4312e4416745e56048ee35e694a79e1bc77e7e4d0b5811e64c84a72d2d7
PE:
f9ebf6aeb3f0fb0c29bd8f3d652476cd1fe8bd9a0c11cb15c43de33bbce0bf68 (exe)
Update:
The payload is PlugX. Thanks to Gabor Szappanos https://twitter.com/GaborSzappanos/status/1024622354582908928
Update IOCs:
f9ebf6aeb3f0fb0c29bd8f3d652476cd1fe8bd9a0c11cb15c43de33bbce0bf68 RasTls.exe
b70069e1c8e829bfd7090ba3dfbf0e256fc7dfcefc6acafb3b53abcf2caa2253 b7.rtf
087d8bee1db61273a7cd533d52b63265d3a8a8b897526d7849c48bcdba4b22ec RasTls.dll
f9ebf6aeb3f0fb0c29bd8f3d652476cd1fe8bd9a0c11cb15c43de33bbce0bf68 RasTls.exe
332aa26d719a20f3a26b2b00a9ca5d2e090b33f5070b057f4950d4f088201ab9 rtf
*参考来源:medium,clouds 编译,转载请注明来自 FreeBuf.COM
领取专属 10元无门槛券
私享最新 技术干货