【漏洞复现】RTF URL Moniker 的逻辑漏洞 | OLE2Link 漏洞(CVE-2017-0199)

 

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

漏洞利用 OFFICEOLE 对象链接技术,将恶意链接对象嵌入在文档中,之后调用 URLMoniker 将恶意链接中的 HTA 文件下载到本地,URLMoniker 通过识别响应头中 content-type 的字段,最终调用 mshta.exe 执行 HTA 文件中的攻击代码。攻击者通过该漏洞可以控制受影响的系统,对受害者系统进行安装后门,查看、修改或删除数据,或者创建新用户。

URL Moniker 是一个 COM  对象,可以在注册表中找到其具体位置。

 

二、准备(复现过程中恢复了几次虚拟机快照,所以 IP发生了改变)

攻击机:kali-2019    192.168.75.138

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

 

三、受影响版本

Microsoft office 2016;Microsoft office 2013;

Microsoft office 2010;Microsoft office 2007;

 

四、复现过程

1、新建一个 poc.hta 文件,一个 docx 文档,poc.hta代码如下可以打开计算器

2、将 test.docx 放到 kali 网站目录下并重命名为 test.rtf,也就是放到攻击者的服务器上,或者是肉鸡服务器,都行啦。

3、攻击者设置服务器 Apache 开启 DAV 支持,Web Dav 完全可以当成一个网络共享的文件服务器使用

4、新建一个 testyeah.docx 作为攻击文档,插入文件链接对象,链接到服务器中的 test.rtf,点击确定耐心等待

链接成功显示服务器中的 test.rtf 的内容

将 testyeah.docx 重命名为 testyeah.rtf 格式文件,攻击文档制作完毕,将其发送给受害人让受害人打开即可,在这里就是在靶机中打开。

5、将被链接的恶意功能脚本 poc.hta 文件复制到服务器目录下重命名为 test.rtf

6、修改 Apache 配置文件如下,并重启 Apache,开启 Dav 服务,由于设置了响应头中的 Content-type 为 application/hta,所以服务器返回对应文件后,word 将返回对象以 hta 脚本的方式执行——关键点

7、理论上打开 testyeah.rtf ,双击其中的对象就可以弹出计算器,然而无效,艹

8、别急嘛,其实是需要对攻击机的注册表进行如下修改

如下为解释:

再次运行 testyeah.rtf ,成功弹出计算器,注册表的这个属性导致了0199这个漏洞的危害在现实中并没有太大。。

>> 做过几遍用过各种系统各种版本的 office 最终都未能成功弹出计算器,就是注册表的问题,这一点大部分的复现博文都没提到,希望同行注意。

9、打开 testyeah.rtf 时的弹框如何消除呢?用记事本打开刚刚rtf文件,找到 object 标签所在的地方,把 {\object\objautlink\rsltpict 修改成:{\object\objautlink\objupdate\rsltpict ,然后再次打开 testyeah.rtf ,发现会直接弹出计算器(通过测试发现修改一次只能生效一次,关闭文档后再次打开,被修改的内容会被自动改回去 =_=)。

取消弹窗的关键点在于 objupdate,这个标签的作用是可以自动更新对象,因此无需用户交互。此时已经可以达到通过 poc.hta 脚本执行任意代码的目的,至于 hta 脚本的恶意功能就是八仙过海各显神通了~

 

五、技术细节

复现完毕后再来看实现的原理:漏洞利用 OFFICEOLE 对象链接技术,将恶意链接对象嵌入在文档中,之后调用 URLMoniker 将恶意链接中的 HTA 文件下载到本地,URLMoniker 通过识别响应头中 content-type 的字段,最终调用 mshta.exe 执行 HTA 文件中的攻击代码。

用 010editor 打开 testyeah.rtf 文档,找到关键字段 objautlink

该漏洞的关键点为插入的对象被定义成一个 OLE“链接”对象,继续向下看找到 Object Data对象,从“\objdata”控制字开始:“01050000”表示版本信息,“000a0000”表示数据长度,“d0cf11e0”表明这是一个 OLE 结构的流,并且是一个“链接”对象。Moniker 是一个特殊的 COM 对象,可以通过该对象寻找另外一个对象。Windows 操作系统上存在的 Moniker 有 File Moniker、Item Moniker、URL Moniker、Script Moniker等。0199 利用的漏洞为 URL Moniker 上出现的漏洞。

URL Moniker 开放了 IPersistStream 接 口,IPersistStream 中的 Load() 方法可以加载“StreamData”,URL Moniker 的StdOleLink 结构会使其调用“IMoniker::BindToObject()”方法。该方法会使得进程去寻找目标对象,让它处在运行状态,提供一个该对象的特定接口指针来调用它。如果 URL 是以“http”开头,那么 URL Moniker 就会尝试从指定 URL 的服务器上下载资源,当“资源”是一个 HTA 文件时(通过响应头来判断),会通过 “mshta.exe”加载运行。这也是为什么 testyeah.rtf 连接要以 "http" 开头,并且将服务器 Apache 的配置文件中,html 目录下的文件默认识别为 hta 文件。

恶意样本为了避免和用户交互,会使用 objupdate 字段来自动更新对象,当打开恶意文档时,会自动加载远程 URL 的对象,攻击者的服务器会针对受害者客户端的 HTTP 请求返回 Content-type 为 application/hta 响应,并下发 HTA 脚本(见上图修改)。

这个漏洞是由于 URL Moniker 可以通过 OLE 执行危险的 HTA 所造成的。URL Moniker 无法直接运行脚本,但是它可以找到一个 OLE 对象并使用这个对象来处理内容,当内容为 HTA 时,"htafile" OLE 对象被启动,HTA 内容里的脚本得到运行。

 

小结:

该漏洞利用 OFFICE OLE 对象链接技术,将包裹的恶意链接对象嵌在文档中,OFFICE 调用 URL Moniker(COM对象)将恶意链接指向的 HTA 文件下载到本地。

>> 具体过程是当用户打开包含嵌入式漏洞的文档时,winword.exe 会向远程服务器发出 HTTP 请求,以检索恶意 HTA 文件(因为插入的链接对象是 http://),服务器返回的文件时一个带有嵌入式恶意脚本的假 RTF 文件(已被更换),而且响应头中的 Content-Type 字段改为了 hta ,因此 winword.exe 会通过 COM 对象查找针对 application/hta 的文件处理程序,这会导致 Microsoft HTA 应用程序(mshta.exe)被自动调用,来下载并执行包含 PowerShell 命令的 Visual Basic 脚本。盗个图如下:

 

六、微软针对此漏洞所进行的修复是有缺陷的

对 CVE-2017-0199,微软采用了一种“COM Activation Filter” 的机制,过程简单粗暴,修补程序封锁了两个危险的CLSID,{3050F4D8-98B5-11CF-BB82-00AA00BDCE0B}(“htafile” 对 象 ) {06290BD3-48AA-11D2-8432-006008C3FBFC}(“script” 对象)。这也导致了后续 CVE-2017-8570 的产生,具体将在另外一篇帖子中分析。

被称为“逻辑漏洞”的关键点在于可以修改服务器配置文件,让返回的消息头将返回的恶意文件表示为 hta 文件,从而让客户端调用 mshta.exe 去执行其中的代码。

 

 

 

 

 

参考:

https://www.cnblogs.com/nayu/p/6799912.html

https://zerokeeper.com/penetration/cve20170199-office-rtf-replication-process.html

https://www.jianshu.com/p/850d1363abc5

《360——2017年度安全报告》

https://blog.csdn.net/qq_37672864/article/details/89353787

https://www.fireeye.com/blog/threat-research/2017/04/cve-2017-0199-hta-handler.html

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
要使用DirectShowLib-2005打开USB摄像头,可以按照以下步骤进行操作: 1. 首先,你需要下载和安装DirectShowLib-2005。可以在官方网站或其他可靠来源下载安装程序。 2. 安装完成后,打开你要编写代码的开发环境,例如Visual Studio。 3. 在项目中添加对DirectShowLib-2005的引用。这通常可以在项目设置或引用管理器中完成。选择DirectShowLib-2005的DLL文件进行引用。 4. 开始编写代码。首先,在代码的开头添加引用行来使用DirectShowLib-2005: using DirectShowLib; 5. 通过创建一个FilterGraph对象,来创建一个用于渲染和控制视频流的图形: FilterGraph graph = new FilterGraph(); 6. 查找并添加USB摄像头的视频源过滤器。通过使用Moniker来表示供应商和设备ID来定位摄像头。例如: string cameraMoniker = @"@device:sw:{860BB310-5D01-11D0-BD3B-00A0C911CE86}\{860BB310-5D01-11D0-BD3B-00A0C911CE86}:<vendor-id>=<your-vendor-id>;<prod-id>=<your-product-id>"; graph.AddSourceFilterForMoniker(cameraMoniker, null, "CameraSource"); 7. 创建一个VideoRenderer对象,并将其与图形关联。这是为了将视频渲染到你的应用程序窗口中: VideoRenderer renderer = new VideoRenderer(null); graph.AddFilter(renderer, "VideoRenderer"); 8. 通过连接视频源过滤器和渲染器来建立连接: graph.ConnectDirect(GetPin(graph, "CameraSource", "Output"), GetPin(graph, "VideoRenderer", "Input"), null); 9. 最后,可以使用图形对象的Run和Stop方法来控制视频的开始和停止: graph.Run(); // 当需要停止视频时 graph.Stop(); 这就是使用DirectShowLib-2005打开USB摄像头的大致步骤。你可以根据自己的需求对代码进行进一步的调整和扩展。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值