一、静态分析
近期,CVE-2017-11882漏洞攻击还是很多,各种变异样本层出不穷。近发现又一个CVE-2017-11882文档,为RTF格式文件,通过分析其shellcode,发现作者还是很用心的。
文档打开后,显示的是乱码,如下图所示:
其中,在乱码下面包含三个对象,从左到右分别是Package对象、公式对象和图片。
1、Package对象
最左边对象为Package对象,如下图所示:
查看Package对象属性,其释放到临时目录下,文件名为e.m。
查看%temp%目录,发现下面确实生成一个e.m文件。
查看e.m文件,大小为94720,内容是一堆乱码。
2、公式对象
中间对象是一个windows公式对象,如下图所示:
3、图片
最右边的显示“0”的其实是一个图片,如下图所示:
4、RTFOBJ分析
利用RTFOBJ工具分析RTF文件,发现无法顺利解析该格式,显然作者经过了特殊处理,结果如下图:
二、动态分析
利用Process Monitor监控doc文档打开的动作,如下图所示:
具体如下:
1、DOC文档打开后,winword.exe调用EQNEDT32.EXE执行。
2、EQNEDT32.EXE调用运行cmd.exe,具体为: cmd.exe /c %windir%\System32\WindowsPowerShell\v1.0\powershell.exe -ExecutionPolicy Bypass -File X7jnZ.ps1。
3、Powershell.exe执行后,复制InstallUtil.exe和wscript.exe两个文件到临时目录下,并分别保存为mscorsw.exe和winwsh.exe。
"C:\Windows\system32\cmd.exe" /c copy /y C:\Windows\Microsoft.NET\Framework\v2.0.50727\InstallUtil.exe C:\Users\admin\AppData\Local\Temp\mscorsw.exe
"C:\Windows\system32\cmd.exe" /c copy /y C:\Windows\system32\wscript.exe C:\Users\admin\AppData\Local\Temp\winwsh.exe
4、Powershell.exe创建任务,任务如下:
C:\Windows\system32\schtasks.exe" /create /sc minute /mo 3 /tn "Security Script kb00588535" /tr "C:\Users\admin\AppData\Local\Temp\winwsh.exe //Nologo //E:vbscript //B C:\Users\admin\AppData\Local\Temp\Win836896.txt" /F
CreateObject(chr(87)&chr(115)&chr(99)&chr(114)&chr(105)&chr(112)&chr(116)&chr(46)&chr(83)&chr(104)&chr(101)&chr(108)&chr(108)).Run """C:\Users\admin\AppData\Local\Temp\mscorsw.exe"" /logfile= /u /LogToConsole=false ""C:\Users\admin\AppData\Local\Temp\tmp_Kquxaf.dat""", 0
创建的任务名为:“Security Script kb00588535”,时间间隔为:3分钟,可执行路径为临时目录下winwsh.exe(其实为wscript.exe),运行的vbs脚本为临时目录下Win836896.txt,文件内容如下:
5、VBS运行
VBS运行后,实际运行的mscorsw.exe(其实为InstallUtil.exe),调用的具体命令如下:
"C:\Users\admin\AppData\Local\Temp\mscorsw.exe" /logfile= /u /LogToConsole=false "C:\Users\admin\AppData\Local\Temp\tmp_Kquxaf.dat"
其中, tmp_Kquxaf.dat是一个PE文件。修改为EXE文件后,其属性如下图所示:
InstallUtil.exe安装程序工具是一个命令行实用工具,你可以通过此工具执行指定程序集中的安装程序组件,从而安装和卸载服务器资源。程序运行语法如下:
C:\Windows\Microsoft.NET\Framework\v4.0.30319>InstallUtil.exe
Microsoft (R) .NET Framework 安装实用工具版本 4.7.3056.0
版权所有 (C) Microsoft Corporation。保留所有权利。
用法: InstallUtil [/u | /uninstall] [option [...]] assembly [[[option [...]] assembly] [...]]
InstallUtil 执行每个给定程序集中的安装程序。
如果指定 /u 或 /uninstall 开关,则它卸载
程序集;反之,则安装它们。与其他
选项不同,/u 应用于所有的程序集,而不管它出现在命令行上
的位置。
安装程序以事务处理的方式完成: 如果其中的一个
程序集安装失败,则其他的所有安装程序集的安装
都会被回滚。卸载不是按事务处理的。
选项的格式为 /switch=[value]。出现在程序集名称之前的
任何选项都将应用到该程序集的安装。
选项是累积的但可以重写 - 为一个程序集指定的选项
将应用到下一个程序集,
除非为该选项指定一个新值。所有选项的默认设置是空的或为 False,
除非另行指定。
识别的选项:
用于安装任何程序集的选项:
/AssemblyName
程序集参数将被解释为程序集名称(Name,
Locale, PublicKeyToken, Version)。
默认情况下,将程序集参数解释为磁盘上的程序集的文件名。
/LogFile=[filename]
向其中写入进度的文件。如果为空,则不写入日志。默认为
<assemblyname>.InstallLog
/LogToConsole={true|false}
如果为 false,则不向控制台输出。
/ShowCallStack
如果在安装过程中的任何时候发生异常,则将
调用堆栈输出到日志。
/InstallStateDir=[directoryname]
要在其中存储 .InstallState 文件的目录。默认为
程序集的目录。
在程序集中使用的各个安装程序可以识别其他
选项。若要了解这些选项,请在命令行上运行 InstallUtil,并在该命令后面带上
程序集的路径和 /? 或 /help 选项。
因此,上面VBS运行后,其用途竟然是卸载tmp_Kquxaf.dat,好奇怪。这个是什么操作?
把InstallUtil.exe的参数修改为显示控制台,并且保存日志,运行后如下图所示:
我们再来看,如果不加/u参数,也就是非卸载操作,而是安装操作,会如何?运行结果如下图所示:
三、网络连接
利用wireshark抓包,发现文档打开后有发起DNS请求www.norejike.com,该域名目前无法解析:
查询域名:
由于无法判断是哪个进程发起的连接请求,于是修改本地hosts文件,让其ip解析为5.5.5.5
接着查看网络连接,发现PID为2532的进程发出了443连接请求,对应的进程是mscorsw.exe进程
根据前面的介绍,其实是tmp_Kquxaf.dat发出的网络操作。
"C:\Users\admin\AppData\Local\Temp\mscorsw.exe" /logfile= /u /LogToConsole=false "C:\Users\admin\AppData\Local\Temp\tmp_Kquxaf.dat"
四、漏洞调试
根据cve-2017-11882漏洞特点,我们直接调试,断点中断在00411658位置,如下图所示:
经过多次的复制操作后,栈溢出被覆盖,此时ESP位置内容为:
其中0x0045159B是返回后的EIP地址,我们查看该处值为0xC3,正式汇编指令retn。
本漏洞是典型的栈溢出漏洞,retn返回后,执行第一段shellcode指令。我们接着查看该shellcode在RTF文档中的位置,在位置在0x000427EB处,如下图所示:
接下来,进行shellcode的解密操作:
循环解密指令的长度为0x16CB,shellcode的密码位置在RTF文档的0x4287B处,如下图所示:
经过xor 0Xb6解密操作后的shellcode如下图所示:
该段shellcode执行后,动态获取需要调用的函数。接下来是获取e.m(Package对象)在临时目录的全路径:
然后是对e.m文件进行解密操作,大小为0x17200,如下图所示:
e.m解密后是一个PE文件,如下图所示:
接着判断解密后的内容是否为合法的PE文件,如下图所示:
然后在内存中运行该PE文件。
我们直接从内存中把解密后的PE文件导出到本地文件,并保存为mem.pe.exe,其属性如下:
该PE文件其实是一个标准的windows系统CAB自解压安装文件,在文件中找到自安装运行的可执行路径为:cmd.exe /c %windir%\System32\WindowsPowerShell\v1.0\powershell.exe -ExecutionPolicy Bypass -File X7jnZ.ps1,如下图所示:
我们用winrar解压缩,发现文件里面就包含一个X7jnZ.ps1文件,是Powershell运行脚本。
终于X7jnZ.ps1文件发现了,我们来看其具体内容:
直接利用powershell执行该脚本,结果如下:
powershell.exe -ExecutionPolicy Bypass -File X7jnZ.ps1
已复制 1 个文件。
powershell.exe : Get-Process : 找不到名为“avp”的进程。请验证该进程名称,然后再次调用 cmdlet。
所在位置 行:1 字符: 15
+ powershell.exe <<<< -ExecutionPolicy Bypass -File X7jnZ.ps1
+ CategoryInfo : NotSpecified: (Get-Process : 找...,然后再次调用 cmdlet。:String) [], RemoteException
+ FullyQualifiedErrorId : NativeCommandError
所在位置 行:53 字符: 20
+ $avp = Get-Process <<<< -Name avp
+ CategoryInfo : ObjectNotFound: (avp:String) [Get-Process], Proc
essCommandException
+ FullyQualifiedErrorId : NoProcessFoundForGivenName,Microsoft.PowerShell.
Commands.GetProcessCommand
Get-Process : 找不到名为“avpui”的进程。请验证该进程名称,然后再次调用 cmdlet
。
所在位置 行:54 字符: 22
+ $avpui = Get-Process <<<< -Name avpui
+ CategoryInfo : ObjectNotFound: (avpui:String) [Get-Process], Pr
ocessCommandException
+ FullyQualifiedErrorId : NoProcessFoundForGivenName,Microsoft.PowerShell.
Commands.GetProcessCommand
已复制 1 个文件。
成功: 成功创建计划任务 "Security Script kb00588535"。
成功: 尝试运行 "Security Script kb00588535"。
再次调用,会报错说tmp_Kquxaf.dat被占用,无法写入文件,因此,tmp_Kquxaf.dat文件也是X7jnZ.ps1脚本运行后释放出来的。此外,X7jnZ.ps1脚本还复制InstallUtil.exe和wscript.exe两个文件到临时目录下,并分别保存为mscorsw.exe和winwsh.exe,之后创建计划任务并启动,动作和动态分析一致。
至此,样本执行后的动作基本分析完毕。
五、tmp_Kquxaf.dat初步分析
上文说到VBS脚本用途竟然是卸载tmp_Kquxaf.dat很奇怪。接下来分析一下tmp_Kquxaf.dat的作用。tmp_Kquxaf.dat是.net程序,当调用-u卸载的时候调用Uninstall函数,该函数的作用是创建互斥变量,并调用并运行函数GoCode.Exec(),如下图所示:
我们来看GoCode类,根据其函数名和相关的变量,看出该类功能应该是内存执行shellcode。
在IDA中查看EXEC函数,该函数先对shellcode字符串进行处理,shellcode字符串如下图所示:
然后对上述字符串进行base64解码,再利用CreateRemote创建线程执行,如下图所示:
六、结语
本文主要分析了一个CVE-2017-11882样本,该样本总结起来有以下几个特点:
1、样本自身包含恶意代码,没有利用远程下载的方式,避免winword打开后直接访问网络。
2、样本shellcode功能较为复杂,包含API地址获取、解密、内存加载运行等。
3、奇怪的一些点是,创建的任务每隔3分钟运行,有点太频繁;访问的域名目前未启用,该样本难道是测试作用?
IOCS:
Virus.doc:4a639d907a9e5401c3f7b26d65ca4b4ca5e8feb3406739afd9d7bcb126c50467(virustotal:19 engines detected this file)
tmp_Kquxaf.dat:c2e92ca88cac02a17232006b869a44d8b1686c8955cdb4ff7e7c717d3aa20a09(virustotal:26 engines detected this file)
X7jnZ.ps1:140bd1c5b0162b359db20eaef888ceb106cdca0fab234999aae1ce99f18d5800(virustotal:No matches found)
Pe.mem.exe:0be1b9ec479ddd3be6ef6b76068100ec3c00d2a4148d6dab402af88489b75aee(virustotal:No matches found)
domain:www.norejike.com