首页
社区
课程
招聘
[原创]CVE-2015-1641及利用样本分析
发表于: 2020-11-23 23:29 3365

[原创]CVE-2015-1641及利用样本分析

erfze 活跃值
12
2020-11-23 23:29
3365

漏洞成因:类型混淆漏洞。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

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

MD5:A69F778D1F511268019B1080F5E3B98B

OS版本:Windows 7 SP1(x86)

Word版本:2007

WWLIB.DLL版本:12.0.4518.1014

通过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 第四次写入

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

图片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

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

图片25 查找文件

映射到内存中:

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

图片27 判断

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

解密后续Shellcode:

图片28 解密

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

图片29 ANY.RUN

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

图片30 开辟空间

图片31 customXml标签处理流程

而在解析smartTag时:

图片32 smartTag标签处理流程

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

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

该文件本质为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

查看导入表:

图片54 MicroScMgmt.exe导入表

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

图片55 数字签名

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

MD5:051573B9173DE6886E0575F81778EA03

查看其导出函数:

图片56 导出函数

该文件带有无效签名:

图片57 无效签名

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


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 1
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//