一个奇怪的CVE-2017-11882漏洞样本

 

一、静态分析

近期,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

(完)