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

APT攻击利器-Word漏洞CVE-2016-7193原理揭秘

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

 作者: 百度安全实验室

一、概述

近期,百度安全实验室反高级威胁团队截获多封利用Microsoft Office Word漏洞进行攻击的恶意邮件。

通过对邮件附件样本进一步分析发现,其利用的漏洞为澳洲国防部计算机应急响应中心提交的CVE-2016-7193。该漏洞为RTF文件解析漏洞,成功利用该漏洞可以远程执行任意代码。我们拦截的样本双击打开后会在本地释放后门程序,从而完全控制目标主机。

微软已经于2016年10月11日发布了该漏洞的相关补丁(参见微软安全公告 MS16-121)。公告显示,该漏洞影响的Office版本非常广泛,几乎全版本Word都会受到该漏洞影响,包括最新的Word 2016。可以预见的将来,本漏洞将和CVE-2012-0158、CVE-2015-1641等经典Word内存破坏型漏洞一起,作为黑客进行APT渗透的标准工具包核心成员。虽然微软已经针对该漏洞发布了补丁,但由于多数用户安全意识薄弱,不倾向于打Office补丁,导致此类漏洞会长期威胁这批用户。通过进一步样本筛选以及情报确认,黑色产业地下市场已经有很成熟的利用该漏洞生成Exploit的工具在售(见附录参考链接)。

从2017年3月份开始,该漏洞利用样本首次在VirusTotal上出现。如下图所示,多家安全厂商虽然可以识别该样本,但命名均不准确,显然并未深入了解该漏洞的本质,可能误导用户对于漏洞针对性地防范。通过百度安全实验室数据监测显示,利用该漏洞进行的远程攻击事件数量正在不断增长,广大网民和安全从业者要提高警惕,做好相应的防范措施。

受影响的 Word 版本:

Microsoft Word 2007 Service Pack 3  
Microsoft Word 2010 Service Pack 2  
Microsoft Word 2013 Service Pack 1  
Microsoft Word 2013 RT Service Pack 1  
Microsoft Word 2016  
Microsoft Word for Mac 2011  
Microsoft Word 2016 for Mac  
Microsoft Office 兼容包 Pack Service Pack 3  
Microsoft Word Viewer  
Microsoft SharePoint Server 2010 Service  Pack 2 上的 Word Automation Services  
Microsoft SharePoint Server 2013 Service  Pack 1 上的 Word Automation Services  
Microsoft Office Web Apps 2010 Service  Pack 2  
Microsoft Office Web Apps Server 2013  Service Pack 1

二、漏洞成因分析

  1. 分析环境 
    文件信息:wwlibversion:12.0.4518.1014
  2. 分析过程 
    经测试发现,该样本在一些特定的操作步骤下打开会利用失败,我们在这种情形下得到了如下的崩溃现场:

可见崩溃点位于 wwlib.dll 中,而负责 RTF 解析的逻辑正是位于该模块。通过进一步回溯,edi 的值来源于 [obj_xx+0x761c],相关的调用点如下:

关于这里用到的ROP链及shellcode本文最后将单独说明。这里继续查找地址edi+0x761c中0x09c00c0c的来源。我们定位到了如下关键代码:

很显然,关键代码位于一个大的switch结构中。应该是解析某种“bytecode”对应的handler部分。从这段代码来看,eax+0x75f8开始是一个字节数组(不是数组指针),而位于eax+0x7618处是当前数组元素个数。每解析对应的“bytecode”时,该数组附加一个字节。数组最大长度被限制为0x40字节。按代码逻辑来看,数组起始于eax+0x75f8,终止于eax+0x7638。而表示数组当前元素个数的变量位于该数组范围内,即eax+0x7618。

这似乎很不科学!

在wwlib的反汇编中搜索所有对75f8的引用代码,也就是对该数组的引用。结果有些意外,只有一处有效的。关键代码如图:

可以看出这个代码是复制该数组数据的逻辑,从拷贝大小参数来看该数组实际分配的大小为0x20字节。而在为该数组附加字节的逻辑中限制写成了0x40字节,发生数组越界写入,进而导致数组之后的类成员变量被改写。

重新加载样本,仔细观察该数组的数据赋值过程:

0:000> bp 315EB380 "db @edi+75f8;"  
*** ERROR: Symbol  file could not be found.  Defaulted to  export symbols for C:\Program Files\Microsoft Office\Office12\wwlib.dll -
0:000> g  
//第1次附加字节
(1e0.610):  Unknown exception - code e0000002 (first chance)
03bb75f8  09 00 00 00  00 00 00 00-00 00 00 00 00 00 00 00   ................  
03bb7608  00 00 00 00 00 00 00 00-00 00 00 00 00 00  00 00  ................  
03bb7618  01 00 00 00 60 59 57 01-00 00 00 00 00 00 00 00   ....`YW.........  
03bb7628  00 00 00 00 00 00 00 00-00 00 00 00 00 00  00 00  ................  
03bb7638  00 00 00 00 00 00 00 00-00 00 00 00 00 00  00 00  ................  
03bb7648  00 00 00 00 60 59 57 01-00 00 00 00 00 00  00 00  ....`YW.........  
03bb7658  01 00 00 00 00 00 00 00-00 00 00 00 00 00  00 00  ................  
03bb7668  ff ff ff ff ff ff ff ff-00 00 00 00 00 00  00 00  ................  
eax=03bb0000  ebx=00000009  ecx=00000000  edx=02000000  esi=03bb0948  edi=03bb0000  
eip=315eb380   esp=00127b9c  ebp=00128124  iopl=0  nv up ei pl nz na po cy  
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000  efl=00000203  
wwlib!wdGetApplicationObject+0x2977a:  
315eb380  e968c8a500  jmp  wwlib!DllCanUnloadNow+0x5598ab  (32047bed)  
0:000> g  
//第2次附加字节
03bb75f8  09 c0 00 00  00 00 00 00-00 00 00 00 00 00 00 00   ................  
03bb7608  00 00 00 00 00 00 00 00-00 00 00 00 00 00  00 00  ................  
03bb7618  02 00 00 00 60 59 57 01-00 00 00 00 00 00 00 00   ....`YW.........  
03bb7628  00 00 00 00 00 00 00 00-00 00 00 00 00 00  00 00  ................  
03bb7638  00 00 00 00 00 00 00 00-00 00 00 00 00 00  00 00  ................  
03bb7648  00 00 00 00 60 59 57 01-00 00 00 00 00 00  00 00  ....`YW.........  
03bb7658  01 00 00 00 00 00 00 00-00 00 00 00 00 00  00 00  ................  
03bb7668  ff ff ff ff ff ff ff ff-00 00 00 00 00 00  00 00  ................  
eax=03bb0000  ebx=000000c0 ecx=00000001 edx=02000000 esi=03bb0948 edi=03bb0000  
eip=315eb380  esp=00127b9c ebp=00128124 iopl=0   nv up ei pl nz na po cy  
cs=001b  ss=0023   ds=0023  es=0023  fs=003b   gs=0000    efl=00000203  
wwlib!wdGetApplicationObject+0x2977a:  
315eb380  e968c8a500  jmp  wwlib!DllCanUnloadNow+0x5598ab  (32047bed)  
0:000> g  
……略
0:000> g  
//第0x20次附加字节
03bb75f8  09 c0 0c 0c 0c c0  09 0c-0c c0 09 0c 0d c0 09 0c   ................  
03bb7608  0c 09 c0 0b 18 20  17 15-0c 0c c0 09 c0 09 0c 20   ..... .........  
03bb7618  20 00 00 00  60 59 57 01-00 00 00 00 00 00 00 00    ...`YW.........  
03bb7628  00 00 00 00 00 00 00 00-00 00 00 00 00 00  00 00  ................  
03bb7638  00 00 00 00 00 00 00 00-00 00 00 00 00 00  00 00  ................  
03bb7648  00 00 00 00 60 59 57 01-00 00 00 00 00 00  00 00  ....`YW.........  
03bb7658  01 00 00 00 00 00 00 00-00 00 00 00 00 00  00 00  ................  
03bb7668  ff ff ff ff ff ff ff ff-00 00 00 00 00 00  00 00  ................  
eax=03bb0000  ebx=00000020 ecx=0000001f  edx=02000000  esi=03bb0948 edi=03bb0000  
eip=315eb380  esp=00127b9c  ebp=00128124  iopl=0  nv up ei pl nz ac po cy  
cs=001b  ss=0023   ds=0023  es=0023  fs=003b  gs=0000  efl=00000213  
wwlib!wdGetApplicationObject+0x2977a:  
315eb380  e968c8a500  jmp  wwlib!DllCanUnloadNow+0x5598ab  (32047bed)

0:000> g  
//第0x21次附加字节,注意,该次要正确覆盖偏移为7618处的变量(计数器变量,表示当前字节数组的字符个数),不然之后会无法覆盖到目标指针,恶意代码作者提供的数据为0x23,计数器加1后恰好为0x24,这个可以保证后续正确覆盖对象指针!

03bb75f8  09 c0 0c 0c 0c c0  09 0c-0c c0 09 0c 0d c0 09 0c   ................  
03bb7608  0c 09 c0 0b 18 20  17 15-0c 0c c0 09 c0 09 0c 20   ..... .........  
03bb7618  24 00 00 00 60 59 57 01-00  00 00 00 00 00 00 00  $...`YW.........  
03bb7628  00 00 00 00 00 00 00 00-00 00 00 00 00 00  00 00  ................  
03bb7638  00 00 00 00 00 00 00 00-00 00 00 00 00 00  00 00  ................  
03bb7648  00 00 00 00 60 59 57 01-00 00 00 00 00 00  00 00  ....`YW.........  
03bb7658  01 00 00 00 00 00 00 00-00 00 00 00 00 00  00 00  ................  
03bb7668  ff ff ff ff ff ff ff ff-00 00 00 00 00 00  00 00  ................  
eax=03bb0000  ebx=00000023ecx=00000020 edx=02000000  esi=03bb0948 edi=03bb0000  
eip=315eb380  esp=00127b9c ebp=00128124 iopl=0  nv up ei pl nz na pe cy  
cs=001b  ss=0023   ds=0023  es=0023  fs=003b   gs=0000   efl=00000207  
wwlib!wdGetApplicationObject+0x2977a:  
315eb380  e968c8a500  jmp  wwlib!DllCanUnloadNow+0x5598ab  (32047bed)  
0:000> dps  1575960

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

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