欢迎来到 黑吧安全网 聚焦网络安全前沿资讯,精华内容,交流技术心得!

CVE-2017-0199:深入分析 Microsoft Office RTF 漏洞

来源:本站整理 作者:佚名 时间:2017-06-07 TAG: 我要投稿

近日,研究人员又发现了数款CVE-2017-0199漏洞的样本。虽然微软在今年4月份已经发布了针对该漏洞的补丁,但由于其利用方式相对简单,全世界的使用率仍然很高,这里分享了一些钓鱼邮件样本的分析报告。目前大部分关于CVE-2017-0199漏洞的文章都将讨论的焦点放在如何构建POC上,本文另辟蹊径,从分析漏洞补丁出发,以一个较高层次的视角来解析漏洞原理,最后分享了一些分析样本的经验。
0x01 漏洞补丁分析
分析人员通常会构建一个黑盒测试环境来观察一个恶意代码样本的行为。这一思路同样可以用在漏洞补丁功能测试上,比如针对CVE-2017-0199漏洞,研究人员使用最新的Microsoft Office套件,运行一些样本,观察补丁程序的工作模式。在测试时,研究人员在发现样本仍然能够成功地从远程服务器上下载payload并保存在Internet Explorer的临时文件夹中,最后由于补丁的原因,payload并没有运行。
经过分析,发现漏洞补丁主要包括两个组件:
OLE32.dll:6.1.7601.23714 on Windows 7 x86
MSO.dll:14.0.7180.5002 on Microsoft Office 2010 on x86
首先对打过补丁和未打补丁的OLE32.dll文件做个对比分析:

图 1:OLE32.dll 6.1.7601.23714 (左) 和 6.1.7601. 23392 (右)
从图1中高亮部分可以看到函数的名称已经改变,推测可能是补丁新增的函数,接着使用IDA-Pro做进一步的分析:

图2:使用IDA交叉引用找到FilterActivation函数
通过交叉引用找到其调用函数FilerActivation,并发现其能被两个内部组件函数ICoGetClassObject和ICoCreateInstance调用,而这两个函数又被上层用于COM对象实例化的API如CoCreateInstance和CoGetClassObject封装。
对这些COM函数做对比分析,可以初步假设这个FilterActivation函数是一个用于应对CVE-2017-0199漏洞的一个新增函数。

图 3:ICoCreateInstance函数的比较结果
下面开始论证这一假设。
首先查看FilterActivation函数的伪代码:

图 4:FilterActivation伪代码
FilterActivation函数首先获取cisid参数的值,并将其传递给一个定义在全局变量g_ActvationFilter中的处理函数,而g_ActvationFilter是在COM初始化过程中被MSO.dll通过CoRegisterActivationFilter函数初始化的,同时MSO.dll也包含在漏洞补丁中。
下面再看一下MSO.dll的初始化过程,首先从OLE32.dll得到CoRegisterActivationFilter的API地址,然后使用g_pActivationFilter作为参数调用它:

图 5:MSO.dll初始化过程
我们知道g_pActivationFilter是一个指向IActivationFilter类型的指针,同时也保存在全局变量g_ActvationFilter中,最终通过静态分析和交叉引用找到其调用函数:mso_IActivationFilterHandleActivation():

图 6:通过静态分析和交叉引用找到调用函数
通过查看该函数还可以发现一些与访问拒绝相关的代码:
CLSID_SCRIPTLET = {06290bd3-48aa-11d2-8432-006008c3fbfc}
CLSID_HTA = {3050f4d8-98b5-11cf-bb82-00aa00bdce0b}
CLSID_HTA是一个表示Microsoft HTML Application(文件后缀.hta)的全局唯一标识符,由32个16进制字符组成,攻击者可以利用其结构达到远程代码执行的目的。例如,一个Microsoft Office文档可以指定URL Moniker从远程服务器上下载该文档的嵌入式资源。
通过解读MSDN对MIME的定义描述,如果远程服务器提供了“application/hta”的MIME类型,那么下载的文件就会被mshta.exe装载执行,在后台,HTA COM对象的实例会在绑定操作过程中被创建,之后URLMON.dll会调用CoCreateInstance函数,后者初始化URL Moniker。但是在最新版本的OLE32.dll中,FIlterActivation函数会在在COM对象被初始化之前对其CLSID值进行过滤检测,若值为CLSID_HTA则无法通过(见图7)。

图 7: 过滤检测
但从代码可看到,CLSID_SCRIPTLET值同样也无法通过。这里提供了一个能够初始化scriptlet COM对象的POC,但是需要用户交互,如点击文档中的带“script:”或者“scriptlet:”的超链接。不过,就算是需要用户交互,“一个包含超链接内容的文档将导致代码执行”这一事实听起来仍然有点匪夷所思。
下面的栈结构反映了文档中的超链接被点击后的执行过程:
//
// Parse the moniker name "script:xxxxxx OR scriptlet:xxxxxx"
//
0:000> kb
ChildEBP RetAddr  Args to Child            

[1] [2] [3]  下一页

【声明】:黑吧安全网(http://www.myhack58.com)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们,联系邮箱admin@myhack58.com,我们会在最短的时间内进行处理。
  • 最新更新
    • 相关阅读
      • 本类热门
        • 最近下载