CVE-2017-11882漏洞成因分析及白象样本分析

软件安全大作业2:CVE-2017-11882

0x00 介绍

CVE-2017-11882是一个广为人知的Microsoft Office漏洞,影响2000到2016版本。具体而言漏洞产生的原因是Equation Editor组件(EQNEDT32.EXE)读入包含MathType的OLE数据,在拷贝公式字体名称时没有对名称长度进行校验,进行了不安全的复制。攻击者可以利用这个漏洞,刻意构造的数据内容覆盖栈上的函数返回地址,造成栈缓冲区溢出,劫持程序执行流程,执行自己的恶意代码。该漏洞在实战中利用频繁,多次被蔓灵花、白象、摩诃草、响尾蛇等APT组织用于钓鱼文档(通常是Word文档或RFT)的投毒。

本篇文档的内容包括poc样本复现、漏洞成因分析、漏洞可利用性分析,最后会附上使用到的工具以及参考内容。

0x01 poc复现

这一部分说明漏洞触发环境,复现环境:win7 专业版 SP1+office cn_office_standard_2010_with_sp1_x86

poc样本来源于https://github.com/embedi/CVE-2017-11882exploit.rtf

在这里插入图片描述

双击之后会弹出来计算器。

在这里插入图片描述

使用processMonitor和PChunter来监控,看到cal.exe的父进程是cmd,cmd的父进程id是4732,正是EQNEDT32.EXE

在这里插入图片描述

啥是EQNEDT32.EXE呢?他是Microsoft Equation Editor 的执行文件名吗,允许用户通过Equation Editor 使用 OLE 技术在不同的 Microsoft Office 程序之间创建和共享复杂的数学方程对象。当用户在 Office 应用程序中插入一个方程时,Equation Editor 实际上是作为一个 OLE 对象被嵌入到文档中的。由于漏洞过多,在office2018之后被弃用了。他的路径在下图。

在这里插入图片描述

0x02漏洞成因分析

通过对poc样本的复现,了解到漏洞的产生是由于EQNEDT32.EXE产生的,下面对其进行分析。

动态分析

首先使用gflag(你可以在windbg中找到他),指定image为EQNEDT32.EXE,这样双击点rtf文档后,开后可以附加调试器,我这里用到x32dbg
在这里插入图片描述

直接在WinExec打断点,可以看到WinExec的返回地址是00430C18。此时的00430C12是用户态地址,按道理来讲,ebp应该存放了当前函数的返回地址,但是这里是41414141。ebp是已经发生缓冲区溢出的一部分,已经到达了缓冲区溢出的地址41414141,正处于执行代码的位置。

覆盖了ebp的地址是缓冲区溢出漏洞一个非常明显的特征。

在这里插入图片描述

参数为18f068,参数是“字体名称”,也就是攻击者的内容:通过cmd打开calc.exe。
在这里插入图片描述

是什么操作破坏了ebx的地址呢?在堆栈窗口,从WinExec的返回地址00430C18往上低地址里找,找最后一次看见41414141,最近的一个返回地址是在00411837
在这里插入图片描述

在汇编代码窗口往上翻,找00411837所在的函数,起始的地址是0041160f。

在这里插入图片描述

转到411650,这是一个28字节的缓冲区,下断点,他要复制“宋体”的长度到缓冲区,此时ecx是5字节(0x5),就是“宋体”的长度

在这里插入图片描述

f9,发现exc变了,是48字节(0x30),这48个字节里可以插入任意的内容到缓冲区里,比如shellcode。此时再查看edx的值,转到内存。

在这里插入图片描述

溢出漏洞具体发生在00411658的rep movsd指令上,该指令的功能是将esi的值传送到edi所指的位置。会覆盖ebp以及栈返回地址。EDI 为 ebp-28(40字节),复制内容大小为48字节,41414141覆盖ebp,剩余四字节覆盖返回地址

rep movs dword ptr es:[edi], dword ptr ds:[esi] 简写为: rep movsd

往下步进,可以看到这时候esi的值就是左下角的执行代码,edi所指的位置是0018F1A8,而ebp正是0018F1D0,是edi的下一个位置,那movsd 这行的意思就是把执行代码传送给ebp。

在这里插入图片描述

如果此时继续f9,会转回winexe,我们现在已经知道了溢出的范围是48字节,以及溢出的攻击代码是弹出计算器。winexe的参数是这些已经被送到堆栈的内容。

在这里插入图片描述
总结,当 EQNEDT32.EXE 尝试将字体名称复制到本地创建的缓冲区时,会出现此漏洞。缓冲区只有 40 (0x28) 字节,但是如果字体名称长于 40 字节,缓冲区将溢出,EBP 以及返回地址将被覆盖。当函数执行完毕后,控制流将被带到攻击者分配的地址。

contrl+f9,转到函数实际返回的位置,漏洞利用完成时显示的 Calc.exe弹出计算器
在这里插入图片描述

静态分析

EQNEDT32.exe

找到在动态分析里提到的41160f函数,发现里面是使用了不安全的复制,没有对参数长度进行限制

在这里插入图片描述

这是gpt4对这段代码是否可能含有漏洞的分析
在这里插入图片描述

0x03漏洞可利用性分析

这一部分是在实际中捕获到的API组织样本的分析,这里选择的是2022年09月,捕获白象组织的名为“重大项目领域建议.doc“的诱饵文档,md5值是1e788e54f67fa64af39005af106567b0

在这里插入图片描述

动态分析

将断点下在411658处,不断F9直到ecx为0xC,再往下步进就是执rep movsd指令

在这里插入图片描述

f8,此时ebp是0018F194,返回地址被覆盖为0048C7C2。

在这里插入图片描述

0048C7C2下断点,f9跳转到ret指令,将栈顶的返回地址弹出到EIP,然后按照EIP此时指示的指令地址继续执行程序。(注意堆栈有0018F318,可知是41160F函数的参数)

在这里插入图片描述

f8后跳转到0018F318,接下来往后步进需要绕过反调试。具体而言,对于32位程序就是把PEB(FS:[30])+2的BeingDubgged修改为0。获取第二段shellcode地址跳转执行

在这里插入图片描述

在内存布局中可以找到PEB的基地址

在这里插入图片描述

之后不断f8步进,可以看到获取pe写入"C:\ProgramData\Microsoft\DeviceSync\mcods.exe”

在这里插入图片描述

继续步进,修改注册表

在这里插入图片描述

继续步进,调用ShellExecuteA函数执行命令“forfiles.exe /p c:\windows /m twain_32.dll /c c:\windowsuser…\programdata\microsoft\deviceSynC\mcods.exe”

运行的装载流程是forfiles→twain_32.dll→mcods.exe

在这里插入图片描述

漏洞利用:在钓鱼攻击中被广泛使用的Microsoft RTF格式文件和OLE漏洞

Microsoft RTF格式文件在钓鱼攻击中被广泛使用的原因是它具有包含多类漏洞且可以嵌入各种形式的对象类型。具体来讲,攻击者利用RTF格式文件的OLE特性,以明文或加密的形式嵌入诱饵文件或其他资源,在RTF文档末尾的附加数据,将RTF文档链接到外部恶意代码,或是将其他文件格式的漏洞嵌入自身,将其用作漏洞容器。

将RTF链接到外部资源,需要搜寻修饰符控制字是否为“object”,RTF控制字“objdata”的参数的对象数据是OLESaveToStream格式的OLE1.0NativeStream,其后是NativeDataSize,

一种生成的RTF文件充当下载器的方式是:打开带有外部对象链接的RTF文档,将弹出一个对话框,要求更新链接对象中的数据,但这样恶意用途太明显了,所以攻击者还会使用控制词“objupdate”,在内部调用链接对象的IOleObject::Update方法来更新链接的源,codeshell一般就在objdata之后。

搜寻object关键字,看到rtf文档嵌入的ole对象调用公式编辑器组件对应的CLSID,见图1

在这里插入图片描述

作者在这里利用了RFT公式编辑器允许存在远程代码执行漏洞。包括CVE-2018-0802和CVE-2017-11882,是**Microsoft Office 内存损坏漏洞类似的攻击利用可以看这篇。**成功利用该漏洞的攻击者可以在当前用户的上下文中运行任意代码。这次行动在2022年,主要攻击没有为Microsoft Office 安装补丁的系统。

提取shellcode和静态分析

将objdata后的16进制数据提取出来,去询问3.5,回答指出这里是有两段shellcode,见图2.

在这里插入图片描述

第一段从31c0起,没有什么实际payload,应该是为了跳转到第二段,第二段从5589起,比较长,chatgpt没有给出回答,需要提取出shellcode保存为16进制(不同控制字后会有不同的16进制数据,我不知道该从哪里截断,于是提取了全部),见图2,用winhex的功能(编辑→选块转换→转化为二进制),然后扔进ida就可以逆向了。

在这里插入图片描述

将核心代码交给3.5分析
在这里插入图片描述

第二阶段的shellcode可以理解为3个核心操作:

1.文件操作和执行:打诱饵文件后,就会在恶意文件路径为C:\ProgramData\Microsoft\DeviceSync\mcods.exe下执行恶意程序mcods.exe

在这里插入图片描述

2.恶意程序自启动:通过修改注册表,恶意程序试图隐藏自身,伪装成OneDrive 相关的进程或文件名,实现攻击的持久化

在这里插入图片描述

  1. 运行流程:forfiles→twain_32.dll→mcods.exe

在这里插入图片描述

mcods.exe静态分析

木马窃密功能分析

在main中可以转到窃密功能的函数sub_408E80

在这里插入图片描述
针对中国时区
在这里插入图片描述
隐藏窗口

在这里插入图片描述
木马版本号和收集用户信息

木马C2控制能力分析

在窃密功能的函数sub_408E80可以转到木马控制的核心代码函数sub_407BD0,但是我看不懂,下图是参考的安天的原分析报告后给出的说明,我拿ida逆向后的代码去问了3.5,但是效果不好。对关键字edg499.dat、kpro98.dat、TPX499.dat有操作

简言之这部分实现的功能就是攻击者在窃取受害者信息后,还可以通过多种指令对受害者机器进行控制。

在这里插入图片描述
在这里插入图片描述

使用到的工具和环境配置

poc脚本和rtf样本:https://github.com/Ridter/CVE-2017-11882

白象样本:https://s.threatbook.com/report/file/13dc5f0d69122067d1c00a507d41cf694ad2802000d85faf8e34f03d7ebef30d

office2010(密钥和kms可用,不可激活,不影响复现):http://www.wps-office.net/office2010.html

windbg for win7(gflag):http://download.microsoft.com/download/A/6/A/A6AC035D-DA3F-4F0C-ADA4-37C8E5D34E3D/setup/WinSDKDebuggingTools_amd64/dbg_amd64.msi

PChunter:https://www.majorgeeks.com/files/details/pc_hunter.html

process monitor(Procmon.exe win7可用):https://web.archive.org/web/20190220013755/https://download.sysinternals.com/files/ProcessMonitor.zip

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值