看到腾讯电脑管家在freebuf上发了一篇《NDAY漏洞CVE-2017-11882与0Day漏洞CVE-2018-0802漏洞组合传播远控木马的样本分析》,觉得这个样本很有学习意义。就根据这个样本,梳理了下相关的知识点整理成这个报告。
分析
-
rtf
分析报告中提到该样本为rtf文档类型,在rtf里面嵌入了两个ole对象,而这两个ole对象分别会触发CVE-2017-11882、CVE-2018-0802漏洞。
CVE-2017-11882、CVE-2018-0802都属于栈溢出漏洞,都是对Equation Native 数据结构处理不当导致。【腾讯电脑管家】
此外,rft文档中还嵌入了一个package对象,通过package对象释放setup.zip到临时目录下,只要ole对象中两个漏洞利用只要触发其中一个,shellcode代码就会将setup.zip拷贝到C:\Users[username]\AppData\Roaming\Microsoft\Word\STARTUP\z.wll下,只要下次word启动的时候就会自动加载z.wll,从而实现自启动。
当我们拿到样本后,可以通过rtfobj.py获取样本的ole对象情况。如前面所说的rtf样本文档中嵌入了2个ole对象,此外还嵌入了一个package对象。详情如下:
---+----------+-------------------------------+-------------------------------
id |index |OLE Object |OLE Package
---+----------+-------------------------------+-------------------------------
0 |00089BB7h |format_id: 2 (Embedded) |Filename: ''
| |class name: 'Package' |Source path: ''
| |data size: 754732 |Temp path = ''
---+----------+-------------------------------+-------------------------------
1 |001FA4B0h |format_id: 2 (Embedded) |Not an OLE Package
| |class name: '\x00\x00\x00\x00\x|
| |00\x00\x00\x00\x00\x00' |
| |data size: 7680 |
---+----------+-------------------------------+-------------------------------
2 |001FF76Dh |format_id: 2 (Embedded) |Not an OLE Package
| |class name: '\x00\x00\x00\x00\x|
| |00\x00\x00\x00\x00\x00' |
| |data size: 7680 |
---+----------+-------------------------------+-------------------------------
将这2个ole对象和package对象dump出来,发现package对象是一个PE文件。而我看了下报告中基础知识介绍,对于rtf格式文档,如果用户单击文档内的对象,则WORD进程会将对象提取到用户的临时目录,并使用默认处理程序启动它们。
在文档关闭后,WORD进程会将用户的临时目录中提取的ole对象进行删除。也就是说恶意样本要进行恶意操作的话,需要在文档打开的时间段进行,因为在这时间段内释放出来的文件可以用系统上的其他进程。
关于OLE1 Packager格式,网上也做了总结:
通过{\object … {\objdata …}}定位Object部分,其中的objdata部分为编码成16进制的字符串。对于这部分16进制字符数据通过bytearray.fromhex(data)就能将其转换回来,从而进一步观察分析。
从Package结构十六进制视图中的红色框选区域看出对象为嵌入对象,嵌入数据的长度为0x000b8400(小端:高右低左)换算成十进制754688,跟我们dump出来的PE文件的大小754716基本吻合。从结构上没有看到原始路径的信息,但从dump出来的PE中我得知它的编译时间为2017-12-29,并且我们还提取到了PDB路径信息。
另外两个ole对象大小都为8k,其中包含的敏感字符串信息正是前面提及到的setup.zip和z.wll这两个文件。
我们调试word程序发现它在打开样本文档后,会将package对象那个PE写入setup.zip。我在看报告之前还以为word把packgae对象写zip压缩文件中,然后再解压出来拷贝到word启动目录下。结果到这里发现,它是直接把那个PE写成setup.zip。
接下来就是看漏洞利用的地方,也就是触发漏洞的EQNEDT32.EXE这个程序。我无法得知EQNEDT32.EXE这个程序是什么时候启动起来的,一开始我以为是word创建了它,后来发现没有成功断下来。
只好用附加的方法,而这里附加的方法是通过设置注册表KEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\EQNEDT32.EXE将Debugger设置成我们的调试器,当EQNEDT32.exe进程启动的时候我们就能够接管过来。
附加EQNEDT32.EXE程序后在关键API下断点,发现它将setup.zip拷贝到word启动目录下并命名为z.wll。
当word再次启动的时候,它会加载启动目录下的z.wll文件。接着创建"%ALLUSERSPROFILE%\NetWork\ 目录,写入数据到tmp.exe并将其执行。
-
tmp.exe
主要行为:
-
通过获取ComputerName拼接字符串,大概就是Global\\Net[ComputerName]_这样。随后,创建互斥体防止程序多次执行。
-
提升进程权限,这也算常见的提权。主要是通过获取了当前进程的id后,利用OpenProcessToken、LookupPrivilegeValueW、AdjustTokenPrivileges完成权限的提升。
-
通过创建线程执行接下来的恶意行为,但是线程代码未能够被IDA识别出来。而在程序跑起来后,它通过读取这线程代码进行XOR 0x6b进行解密。
- 检测窗口字符串是否匹配“检测到安全风险”、“Symantec Endpoint Protection”、“防火墙问题”、“防火墙警报”等,部分是情况是为了通过匹配窗口字符串成功,通过模拟键盘键值输入来进行对抗安全检测。
比如说当匹配到“检测到安全风险”后,模拟键盘输入顺序为 [TAB] [TAB] [TAB] [Enter]
而匹配到“防火墙警报”后,模拟键盘输入顺序为[TAB] [UP] [UP] [UP] [TAB] [TAB] [TAB] [TAB] [ENTER]
- 在C:\Documents and Settings\All Users\NetWork目录下创建servernet.exe
- 对路径进行比较,如果是当前运行的程序是servicenet.exe,则拷贝自身到servicenet.exe,通过cmd加载。随后通过批处理文件删除自身。
-
servicenet.exe
主要行为:
检测servicenet.exe目录是不是为C:\Users[username]\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup,这个目录是windows下的开机启动目录。
通过模拟鼠标操作对抗bkav、赛门铁克安全产品,以及通过模拟键盘输入来绕过防火墙检测,而这些操作都是程序通过创建线程来实现。
在线程中加载执行C:\Documents and Settings\All Users\NetWork目录下的servernet.exe
- 通过cmd命令关闭PcaSvc服务
"sc stop PcaSvc" 程序兼容性助手(PCA)提供支持
"sc config PcaSvc start= disabled"
判断系统是否为64位,根据系统版本位数拷贝数据大小也不一样,32位0x1E00u、64位0xFA00u。
检测程序是否存在于“「开始」菜单\程序\启动”、“AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup”下。
-
遍历进程列表,检测杀软。检测列表如下:
- avp.exe
- QQPCTray.exe
- TMBMSRV.exe
- ptSessionAgent.exe
- ccSvcHst.exe
- AvastSvc.exe
- egui.exe
- ekrn.exe
- Avira.ServiceHost.exe
- avguard.exe
- avgnt.exe
- 360sd.exe、360tray.exe、360rps.exe
- NS.exe
- kxetray.exe
- KSafeTray.exe
-
联网通信
- 83.166.242.122:443
- 109.237.110.10:81
-
根据检测不同的进程执行的对抗行为也不一样。
- 如果检测到进程中存在avp.exe、QQPCTray.exe,就会将servernet.exe拷贝到启动目录下。
- 如果检测到进程中存在TMBMSRV.exe、ptSessionAgent.exe、ccSvcHst.exe、360sd.exe、360tray.exe、360rps.exe等其中一款产品,且根据对应的系统版本的情况释放文件的同时再去执行不同的行为。
-
servernet.exe
-
Srvlic.dll / msTracer.dll
这两个文件的MD5是一样的,只是情况不同所以命名不一样。它们的主要功能也是为了加载执行执行servicenet.exe
-
MemRunExe
绕过系统的UAC账户控制
(腾讯分析报告有说,我:emmmmm 哈哈哈哈 我懒)
-
HookMessageBox.dll
MessageBoxA、MessageBoxW函数hook成空函数,这样做估计是为了反正一些敏感弹窗出现,暴露木马迹象被电脑使用的人察觉。
-
SandboxieBITS.exe \ sbiedll.dll
这两个文件使用的套路算是目前远控木马中比较主流的白加黑。SandboxieBITS.exe是一个白文件,但是它并没有对需要加载sbiedll.dll进行校验,导致被恶意利用。
通过PE工具就可以看到SandboxieBITS.exe导入表中存在sbiedll.dll。
在sbiedll.dll的SbieDll_Hook里我们可以看到它的主要行为有:
- 提升进程权限
- 加密字符串,通过 XOR 0x5u 可以解密出字符串;然后会检测系统进程列表中是否存在360tray.exe、360sd.exe。
解密前 | 解密后 |
---|---|
635qwd|+`}` | 360tray.exe |
635va+`}` | 360sd.exe |
360rps.exe | 635wuv+`}` |
第三个解密的字符串是反的,导致后门检测进程的时候检测的字符串是635wuv+`}`。
- 创建计划任务,在系统启动的时候加载执行servernet.exe,计划任务名称为task1。
- 加载HookMessageBox.dll,将MessageBoxA、MessageBoxW函数hook成空函数。
分析到这里我们得知,牧马人试图通过各种方式将servicenet.exe执行起来。而这个木马的功能模块和普通的木马基本相似,主要有文件操作、注册表操作、木马端更新\卸载、提取、清除日志、管道等功能。
最后
这个样本确实很有意思,分析下来能够了解到很多攻击者的攻击思路。
譬如:
- 像类似的doc样本,如果攻击目标比较明确的情况下,攻击前可能会为“水坑攻击”做些准备。
- 利用CVE-2017-11882、CVE-2018-0802漏洞,双漏洞“补位进攻”。
- “草丛三兄弟”潜伏加载,很多木马为了常驻目标设备,都想尽办法驻留。该样本也试图通过白加黑、windows启动目录、dll加载这些方式,试图潜伏在设备机器里。
- 对抗法师的“沉默”,HookMessageBox沉默了一些本该让木马暴露的弹窗。
参考链接
APT恶意软件分析系列之从WORD中提取EXE的分析技术
https://www.secpulse.com/archives/3792.html
剖析RTF文件中的Anti-Analysis技术
http://www.freebuf.com/articles/terminal/102018.html
NDAY漏洞CVE-2017-11882与0Day漏洞CVE-2018-0802漏洞组合传播远控木马分析
http://www.freebuf.com/vuls/160252.html
OLE工具套件分析OFFICE宏恶意样本
https://www.cnblogs.com/KevinGeorge/p/7868881.html
CVE-2015-1641浅析-word类型混淆漏洞
http://blog.csdn.net/qq_32400847/article/details/75196251