【漏洞复现】Moniker禁用绕过漏洞|ole逻辑漏洞(CVE-2017-8570)

 

>> 在上一篇文章中提到了由于注册表项关于 ActiveX 控件功能的设置,导致 0199 的威胁并没有想象中的广泛,然而衍生漏洞 8570 的威胁却要比 0199 大得多:

微软修复 CVE-2017-0199 实际上是在 Office 中禁用了 htafile 对象和 script 对象,而没有禁用 ScriptletFile 对象,由于通过Composite Moniker 的方式可以执行 ScriptletFile(.sct)脚本,相当于绕过了 CVE-2017-0199 的补丁修复,所以在针对 CVE-2017-8570 的补丁修复中,微软禁用了 ScriptletFile 对象。对象实际可以通过 CLSID 在注册表中查询找到。

 

一、CVE-2017-8570 类型:OLE对象中的逻辑漏洞

该漏洞利用复合 Moniker 绕过了 CVE-2017-0199 的补丁针对 Script Moniker 和 URL Moniker 相关 classid 的拦截。CVE-2017-0199 和 CVE-2017-8570 复杂在 Composite Moniker。Moniker 绑定指定的对象时,必须要为调用者提供指向所标识对象指定接口的指针。这个过程是通过 IMoniker::BindToObject() 方法实现的:

绑定“新”Moniker 时,通过“pmkToLeft”参数获得 Left 名字。在这种情况下,mk 是 File Moniker。之前针对 0199 是封锁了“htafile”对象和“script”对象,而 CVE-2017-8570 利用了一个其他的对象:“scriptletfile”,CLSID 是“{06290BD2-48AA-11D2-8432-006008C3FBFC}”,从而绕过了 CVE-2017-0199 的补丁。

关于 CVE-2017-0199 请移步:https://blog.csdn.net/Cody_Ren/article/details/103857646

 

二、准备

攻击机:kali-2019    192.168.75.146

靶机:win7_x86(关闭防火墙)    192.168.75.139

ppsx 格式是 Office 2007 中 PowerPoint 的一种文件格式,始终在幻灯片放映视图打开的演示文稿。(在本漏洞复现中采用ppsx有利于确保目标机用户只要一打开该文件,就会出现播放动画状态,从而激活该对象执行 sct 脚本)

 

三、复现过程(注意 postgresql 数据库的开启以及初始化)

1、下载 exp,创建 template 目录,生成 Invoice.ppsx

2、生成用来反弹 shell 的 shell.exe,生成时间有点长,耐心等,靶机为 32 位的话,需要将 /x64 去掉

3、打开 msf ,开启 msf 监听,同样靶机为 32 位的话将 /x64 去掉

4、生成监听模式,监听来自 ppsx 执行反弹 shell(这里会自动启动 80 端口)

5、在靶机中打开 Invoice.ppsx 文件,可以看到一闪而过的 powershell.exe 窗口,攻击机窗口中可以看到接收到了消息返回。然而 msf 并未 getshell ,wtf ??

6、重新做了几遍,尝试了下在进行第 4 步之前,首先将postgresql 数据库开启,然后将数据库初始化一下,再次在靶机中运行 ppsx,发现 getshell 成功。

 

>> 有时候 getshell 速度比较慢,可以尝试多执行几次 msfdb init ,再一个 getshell 时由于向靶机发送的数据包比较大,根据网络延迟情况,需要耐心等等。

 

四、技术细节

1、关于本地调用的利用方式:https://paper.seebug.org/520/

配合 https://blog.csdn.net/Cody_Ren/article/details/103886098 

 

2、对 8570 的继续思考

如下插入对象,这里的 Package 表示我们在文档内插入Package对象,打开文档时,Package对象会自动释放一个.sct文件到 %TMP目录%,并自动开 notepad.exe,释放的 .sct文件的功能可以自己定义,释放 .sct的行为也可以抓取到。

>> 那么是如何实现的呢?

这需要来分析一下生成 RTF 文件的 exp.py 脚本,分析脚本之前先说明一点,其实,OLE 文档中插入的对象可以通过工具提取出来!!!!!!看这个https://www.cnblogs.com/KevinGeorge/p/7868881.html,导出命令: rtfobj 文件名 -s all -d 导出路径 

导出了一个 .bin 文件,一个会被释放出来的 .sct 文件:

其中 .sct 文件内容如下,这个文件是插入的一个 package对象,可以看到会自动打开 notepad.exe:

如果 .sct文件不存在则弹出警告框。

在提取出来的 .bin 文件中能够找到如下 3个Moniker 对象:

如下为 CompositeMoniker(混合对象),可以在二进制数据中找到,对应在注册表中也能找到,该项上下都是各种 Moniker 对象。

该漏洞利用 OLE 中的Composite Moniker对象,将 FileMoniker 指定的 W6WH4FKEW04AKW7.sct 脚本文件定义成一个 New Moniker,由于在初始化文件的过程中,发现文件为 .sct 格式,因此会在注册表中找到处理该文件的接口:

然后关联 scriptletfile 的 CLSID:

再找到对应的CLSID,定位到处理 .sct 格式文件的 DLL

过程如下

最终,通过 scrobj.dll 执行 .sct 文件成功。

而一个正常的 rtf 打开是不用加载 scrobj.dll 模块的

 

>> 现在来看 exp 脚本的内容 AchieveMyself.py

其实对其中的二进制代码进行十六进制转换就能看明白这个 py 文件的实际功能了,是比较简单的。

 

 

六、恶意 rtf 文件制作复现

双击 exp.rtf 后可以直接弹出 notepad.exe,W6WH4FKEW04AKW7.sct 脚本作为 package 对象插入 exp.rtf 文件。

 

原理小结:

实际上是利用了 Office OLE 中的 Composite Moniker 对象在组合 File Moniker 对象的过程中,未做安全性检测,将 File Moniker 对象指定的远程/本地的 ScriptletFile(.sct)脚本文件在 Office 中直接执行。

 

 

 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值