CVE-2015-1641及利用样本分析

发布者:Gcow安全团队
发布于:2020-11-29 14:56
1
2
3
4
5
1.本文一共1920个字 58张图 预计阅读时间12分钟
2.本文作者erfze 属于Gcow安全团队复眼小组 未经过许可禁止转载
3.本篇文章从CVE-2015-1641漏洞的分析入手 详细的阐述漏洞的成因再分析Patchwork APT组织使用的该漏洞的样本
4.本篇文章一栋 十分适合漏洞安全研究人员 以及威胁分析人员进行学习交流
5.若文章中存在说得不清楚或者错误的地方 欢迎师傅到公众号后台留言中指出 感激不尽

0x01 漏洞描述

  • 漏洞成因:类型混淆漏洞。Word在处理displacedByCustomXml属性时未对customXml标签对象进行有效性验证,可以通过传入其他标签对象,由类型混淆进而达到任意内存写。故可以借由精心构造的标签对象及对应属性值实现RCE。

  • 影响版本:Microsoft Word 2007 SP3, Office 2010 SP2, Word 2010 SP2, Word 2013 SP1, Word 2013 RT SP1, Word for Mac 2011, Office Compatibility Pack SP3, Word Automation Services on SharePoint Server 2010 SP2 & 2013 SP1, Office Web Apps Server 2010 SP2 & 2013 SP1

0x02 漏洞分析

样本信息及分析环境如下:

MD5:A69F778D1F511268019B1080F5E3B98B

OS版本:Windows 7 SP1(x86)

Word版本:2007

WWLIB.DLL版本:12.0.4518.1014

0x02.1 类型混淆—>任意地址写

通过rtfobj查看该文档的OLE对象:

 

图片1 rtfobj

 

手动提取出来2号对象存为一RTF文档,Windbg附加Word 2007并打开该文档,崩溃点如下:

 

图片2 崩溃点

 

之后将0号与2号对象提取出来存为一RTF文档:

 

 

设断bp wwlib!DllGetClassObject+0x50e6 ".if(ecx=7c38bd50){}.else{gc}"

 

图片4 断点

 

待执行call wwlib!DllGetClassObject+0x50fe前查看栈中参数如下:

 

图片5 栈中参数

 

通过rtfobj.py -s 2将2号对象存为一Word文档,查看其word目录下document.xml

 

图片6 smartTag标签

 

可以看到smartTag标签属性值与栈中参数对应关系。

 

根据微软文档,displacedByCustomXml属性指定替换标签应为customXml:

 

图片7 MicroSoft Docs

 

继续跟进分析,计算写入地址:

 

图片8 计算写入地址

 

计算公式为[[Parameter 1]+0x8]*[Parameter 2]+[[Parameter 1]+0xC]+[Parameter 1],具体参数值见图5。直接步过该函数,可以看到其结果与公式结果无异:

 

图片9 Result

 

跟进,查看其memcpy传递参数:

 

图片10 调用memcpy

 

图片11 memcpy传递参数

 

向0x7c38bd74地址处写入0xffffe696,该值用于第二次计算Dst Address。

 

重新设断bp wwlib!DllGetClassObject+0x50e6 ".if(ecx=7c38bd68){}.else{gc}",断下之后跟进到其计算Dst Address函数:

 

图片12 第二次计算Dst Address

 

可以看到[[Parameter 1]+0xC]为之前写入值。第二次写入覆盖MSVCR71.DLL虚函数表中函数调用地址:

 

图片13 MSVCR71.DLL vftable

 

第三次写入:

 

图片14 第三次写入

 

该值用于第四次计算Dst Address:

 

图片15 第四次计算Dst Address

 

第四次写入:

 

图片16 第四次写入

0x02.2 劫持执行流

继续向下执行,崩溃点如下:

 

图片17 MSVCR71崩溃点

 

重新载入RTF文档,于0x7c376fc4处设断:

 

图片18 崩溃点前指令

 

图片19 劫持执行流

 

由上图可知第二次内存写入——覆盖MSVCR71.DLL虚函数表中函数调用地址,第四次内存写入——覆盖传递参数。

 

将1号对象加入后存为RTF文档,重新载入分析,bp 0x7c376fc8设断:

 

图片20 堆喷

 

可以看到堆喷布局如上,该布局由1号对象\word\activeX目录中activeX1.bin完成:

 

图片21 activeX1.bin

 

根据其布局,不断执行ret,到0x7c3651EB处开始ROP链:

 

图片22 0x7c3651EB

 

执行VirtualProtect以绕过DEP保护:

 

图片23 更改内存属性

 

然后开始执行activeX1.bin内Shellcode部分:

 

图片24 Shellcode

0x02.3 Shellcode of activeX1.bin

遍历当前进程中打开文件句柄,查找其Size符合如下条件的文件:

 

图片25 查找文件

 

映射到内存中:

 

 

通过文件头与FEFEFEFE FEFEFEFE FFFFFFFF判断是否为样本文件及Shellcode起始位置:

 

图片27 判断

 

复制Shellcode到VirtualAlloc开辟空间内,之后跳转到第二部分Shellcode执行。

0x02.4 Shellcode of RTF

解密后续Shellcode:

 

图片28 解密

 

由ANY.RUN可见其后续行为(有兴趣的读者请自行下载样本分析):

 

图片29 ANY.RUN

正常情况下,Word在解析customXml标签时会开辟一新空间:

 

图片30 开辟空间

 

图片31 customXml标签处理流程

 

而在解析smartTag时:

 

图片32 smartTag标签处理流程

 

故借此可以控制目标写入地址。

0x03 Patchwork组织某利用样本分析

0x03.1 RTF文档分析

MD5:2C22EA1CED258346351EAD09B1DC6074

 

查看OLE对象:

 

图片33 OLE对象

 

0号对象用以加载OTKLOADR.DLL以引入MSVCR71.DLL绕过ASLR;

 

1号对象用以完成堆喷及Shellcode布局;

 

2号对象用以触发CVE-2015-1641漏洞,触发点位于styles.xml中:

 

图片34 styles.xml

 

载入RTF文档,bp 0x7c376fc8设断,执行ROP链后调用VirtualProtect更改内存属性,跳转到Shellcode:

 

图片35 VirtualProtect

 

通过jmp+call+pop给传参,解密后续Shellcode:

 

图片36 传递参数

 

解密逻辑如下:

 

图片37 解密

 

开辟内存空间,复制加密Shellcode并解密:

 

图片38 开辟内存、复制、解密

 

通过call指令为函数传递参数:

 

图片39 传参

 

后续仍有数次解密Shellcode过程,不再一 一列出。于C:\Users\xxx\AppData\Roaming\Microsoft\Templates目录下创建文件:

 

图片40 Normal.domx

 

写入文件内容:
图片41 WriteFile

 

之后于相同目录下创建~$Normal.dat并写入内容:

 

 

图片43 WriteFile

 

该文件具有隐藏属性:

 

图片44 隐藏文件

 

HKEY_CURRENT_USER下创建注册表项:

 

图片45 RegCreateKey

 

设置注册表键值:

 

图片46 RegSetValue

 

删除注册表禁用项:

 

图片47 RegDeleteKey

 

后续将由wscript.exe执行C:\Users\xxx\AppData\Roaming\Microsoft\Templates\Normal.domx,该文件实际为VBE格式:

 

图片48 Normal.domx

 

可借由scrdec18工具解密:

 

图片49 Normal.vbs

0x03.2 Normal.domx分析

该文件本质为VBE格式,可由wscript.exe正常加载。分析时需通过工具解密出VBS脚本。

 

读取~$Normal.dat第一部分内容并解密,写入%USERPROFILE%\AppData\Local\Microsoft\Windows\Temporary Internet Files\Content.Word\PLAs_NEW_ORBAT.doc

 

图片50 释放PLAs_NEW_ORBAT.doc

 

该文档用于迷惑受害者:

 

图片51 PLAs_NEW_ORBAT.doc

 

之后释放三个PE文件并设置隐藏属性:

 

图片52 释放PE文件

 

执行MicroScMgmt.exe并删除自身以及~$Normal.dat

 

图片53 执行MicroScMgmt.exe

0x03.3 MicroScMgmt.exe分析

查看导入表:

 

图片54 MicroScMgmt.exe导入表

 

该文件为带有数字签名的白文件:

 

图片55 数字签名

 

其用于加载恶意DLL——jli.dll

0x03.4 jli.dll分析

MD5:051573B9173DE6886E0575F81778EA03

 

查看其导出函数:

 

图片56 导出函数

 

该文件带有无效签名:

 

图片57 无效签名

 

其与Patchwork组织之前使用过的BADNEWS木马存在相似性,此处暂不展开分析。完整攻击链如下:

 

图片58 攻击链

0x04 参阅链接

  • CVE-2015-1641 Word 利用样本分析(https://paper.seebug.org/351/)

  • Microsoft Docs——displacedByCustomXml(https://docs.microsoft.com/en-us/previous-versions/office/developer/office-2010/cc847826(v=office.14)?redirectedfrom=MSDN)

  • 手把手教你如何构造office漏洞EXP(第四期)(https://www.anquanke.com/post/id/85031)


声明:该文观点仅代表作者本人,转载请注明来自看雪