国外安全研究者爆料中国黑客组织针对越南政府的APT攻击样本

近日,法国安全研究者兼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

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180917B1CKC100?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券