CVE-2017-11882及利用样本分析

简介: Windows的公式编辑器EQNEDT32.EXE读入包含MathType的OLE数据,在拷贝公式字体名称时没有对名称长度进行校验,使得攻击者可以通过刻意构造的数据内容覆盖栈上的函数返回地址,从而劫持程序流程。

CVE-2017-11882及利用样本分析




1.本文由复眼小组ERFZE师傅原创2.本文略微偏向基础,首先介绍了该漏洞的成因,并且分析了该漏洞在蔓灵花,摩诃草,响尾蛇APT组织用于实际攻击活动中的详细调试过程3.本文全文字数共2234字,图片95张 预计阅读时间14分钟

0x01 漏洞描述

成因:Windows的公式编辑器EQNEDT32.EXE读入包含MathType的OLE数据,在拷贝公式字体名称时没有对名称长度进行校验,使得攻击者可以通过刻意构造的数据内容覆盖栈上的函数返回地址,从而劫持程序流程。影响版本:Microsoft Office 2007 Service Pack 3, Microsoft Office 2010 Service Pack 2, Microsoft Office 2013 Service Pack 1, Microsoft Office 2016POChttps://github.com/Ridter/CVE-2017-11882

0x02 漏洞分析

笔者复现及分析环境:Windows 7 Service Pack 1、Microsoft Office 2010、x32dbg、IDA 7.0

EQUATION.exe存在:


图片1 Equation.exe


设置注册表项HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\EQNEDT32.EXE


图片2 regedit.exe


Debugger键值为x32dbg路径。

生成POC:


图片3 POC


打开该文档,于WinExec()函数处设断:


图片4 WinExec


成功断下后,查看栈中返回地址:


图片5 ReturnAdd


继续向上查看栈,发现调用WinExec()的函数:


图片6 Stack


通过IDA分析sub_4115A7功能:


图片7 IDA


跟进sub_41160F查看:


图片8 sub41160F


未校验长度,直接使用strcpy()函数,此处应该就是漏洞触发位置。进一步确定具体位置:


图片9 strcpy


0x411658处设断,重新运行。第二次成功断下后,查看ESI寄存器指向内存内容:


图片10 ESI


此时ECX寄存器值为0xC,即复制48个字节到EDI寄存器指向内存,而var_28实际大小只有36个字节:


图片11 EDI


到达函数结束处:


图片12 FunEnd


leave指令执行完毕后,栈顶0x18F1D0处值为0x430C12,即调用WinExec()。而传递参数正是0x18F350指向内存中的cmd指令:


图片13 shellcode


成功弹出计算器:


图片14 calc.exe



下面对使用到的POC进行简要分析。各变量含义由命名可知,RTF文档格式并非本文重点,如读者此前对RTF文档格式没有了解,建议先阅读文末参考链接中有关RTF文档格式的文章后再看POC源码。


图片15 RTF


首先判断命令长度是否小于43,而43这个数字是因为:


图片16 CmdLen


上图选中部分是插入命令处,具体偏移由POC中COMMAND_OFFSET(0x949*2)变量给出。

将命令插入到构造数据中之后,函数返回拼接好的OLE。下面将OLE嵌入到RTF文档中:


图片17 OLE


0x03 摩诃草(APT-C-09)组织某样本分析

MD5:0D38ADC0B048BAB3BD91861D42CD39DF

0x411658处设断,在第二次断下时,各寄存器值如下:


图片18 register


继续执行到函数结束处leave指令:


图片19 leave


0x18F230地址处值0x430C47即覆盖后的函数返回地址:


图片20 FunReturn


而该地址处指令是ret,有些出乎意料。继续向下执行,来到0x18F3B0处,正是0x18F234地址处值:


图片21 ret


这方才是构造者意欲执行的指令。经过蓝色方框中的一系列运算后,EBX指向是真正的Shellcode:


图片22 shellcode


上述内容均可在OLE中查看(路径\xl\embeddings):


图片23 OLE




图片24 OLE


将OLE0x10000x1520中数据复制到一bin文件后,通过IDA查看。sub_247功能如下:


图片25 IDA


该函数接受的第二个参数即上文提到的EBX指向地址,于OLE中位置是0x1040,而0x1040+0x558处内容如下:


图片26 PE


故该函数第一个功能是修正PE文件头。第二个功能流程如下:


图片27 PEWrite



图片28 PEWrite



图片29 PEWrite



图片30 PEWrite


0x1040+0x558后的PE文件数据写入到%APPDATA%\MSBuild.exe中。第三个功能流程如下:


图片31 RegeditWrite



图片32 RegeditWrite



图片33 RegeditWrite


%APPDATA%\MSBuild.exe写入注册表run项键值lollipop中。

0x04 响尾蛇(SideWinder)组织某样本分析

将文档拖进WinHex查看:


图片34 WinHex


可以看出该文档实质是一RTF格式文档。

rtfobj.py分析如下:


图片35 rtfobj


Package后文会提到,先来看其CVE-2017-11882利用部分。

同样是第二次断下时:


图片36 break


其后的执行流程与上一样本相似:


图片37 leave



图片38 ret


经过绿色方框中的一系列运算后,调用GlobalLock()函数,传递参数如下:


图片39 GlobalLock


接下来跳转到GlobalLock()函数返回内存区域中:


图片40 jmp


经过两次call调用:


图片41 call



图片42 call


修正内存中的字符串:


图片43 EditString


接下来寻址kernel32.dll


图片44 kernel32


其所调用的函数功能如下:


图片45 sub298


两次call调用之后:


图片46 call



图片47 call


其功能为返回某函数调用地址,此次是LoadLibrayW()


图片48 LoadLibrary



图片49 Loadlibrary


接下来,返回GetProcAddress()调用地址:


图片50 GetProcAddress



图片51 GetProcAddress


继续call调用:


图片52 call


其后流程如图所示:


图片53 GetCommandLine



图片54 GetCommandLine



图片55 call


下面将字符串解密,并覆盖原CommandLine内容:


图片56 DecryptStr



图片57 DecryptStr


执行完结果如下:


图片58 StrResult


最后实际执行部分:



javascript:eval("sa=ActiveXObject;ab=new sa(\"Scripting.FileSystemObject\");eval(ab.OpenTextFile(ab.GetSpecialFolder(2)+\"\\\\1.a\",1).ReadAll());windowclose()")

其后调用RunHTMLApplication()


图片59 RunHTMLApplicaton



图片60 RunHTMLApplicaton



图片61 RunHTMLApplicaton图片60 RunHTMLApplicaton图片60 RunHTMLApplicaton



图片62 RunHTMLApplicaton图片60 RunHTMLApplicaton



图片63 RunHTMLApplicaton


1.a就是之前提到RTF文档中的Package,其实质是一JS文件:


图片64 JS



图片65 JS


最后,其执行结果大体如下图所示:


图片66 result


0x05 蔓灵花(Bitter)组织某样本分析

通过远程模板注入的方式下载一RTF格式文档:


图片67 downloadRTF


拖进WinHex查看,可以确认其格式为RTF文档格式:


图片68 Winhex


添加文件扩展名后,打开该文档。同样是于于0x411658处第二次断下时:


图片69 breakpoint



图片70 ret



图片71 shellcode


跳转之后经过绿色方框中一系列计算,接着跳转:


图片72 jmp


fldpi将π的值加载到FPU堆栈:


图片73 fldpi


执行完后fpu_instruction_pointer指向fldpi指令,其后的fnstenv指令将FpuSaveState结构体保存到esp-0xC处:


图片74 fnstenv


如此一来,pop ebp后EBP寄存器的值是fpu_instruction_pointer——fldpi指令位置:


图片75 EBP


由EBP计算出需要解密的数据起始位置,EDX中存储的是数据长度(0x315):


图片76 Decrypt


接着执行解密后的指令:


图片77 Execute



图片78 Execute


跳转后,执行相应指令,接下来call调用:


图片79 call


sub_562B2F功能是获取指定的系统函数调用地址,此次是kernel32.VirtualAlloc()


图片80 ReturnVirtualAddr



图片81 ReturnVirtualAddr


之后调用VirtualAlloc()申请内存空间:


图片82 VirtualAlloc


向申请的内存空间中写入数据:


图片83 WriteMem


调用sub_562B2F获取kernel32.Wow64DisableWow64FsRedirection()调用地址:


图片84 ReturnWow64DisableWow64FsRedirectionAddr


LoadLibrary(shell32)


图片85 LoadLibrary(shell32)


传递参数给sub_562B2F,获取shell32.ShellExcute()调用地址:


图片86 ReturnShellExcuteAddr



图片87 ReturnShellExcuteAddr


LoadLibrary(urlmon)


图片88 LoadLibrary(urlmon)


获取urlmon.URLDownloadToFile()调用地址:


图片89 ReturnURLDownloadToFileAddr

图片90 ReturnURLDownloadToFileAddr


调用URLDownloadToFile(),其传递参数如图:


图片91 URLDownloadToFile



图片92 URLDownloadToFile


读取文件:


图片93 CreateFile



图片94 ReadFile


由于没有获取到文件,计算出的EBX值错误:


图片95 End


故至此结束。

0x06 参考链接

Office恶意文件解析与混淆研究 -https://zhuanlan.zhihu.com/p/31345299https://github.com/Ridter/CVE-2017-11882Office文件格式基础知识 -https://www.anquanke.com/post/id/175548

相关文章
|
1月前
|
数据可视化 大数据 关系型数据库
基于python大数据技术的医疗数据分析与研究
在数字化时代,医疗数据呈爆炸式增长,涵盖患者信息、检查指标、生活方式等。大数据技术助力疾病预测、资源优化与智慧医疗发展,结合Python、MySQL与B/S架构,推动医疗系统高效实现。
|
JSON 安全 前端开发
浅析CORS跨域漏洞与JSONP劫持
浅析CORS跨域漏洞与JSONP劫持
662 3
|
7月前
|
数据采集 监控 网络协议
​MCP协议深度解析:原理、应用与物联网时代的机遇-优雅草卓伊凡
​MCP协议深度解析:原理、应用与物联网时代的机遇-优雅草卓伊凡
793 40
​MCP协议深度解析:原理、应用与物联网时代的机遇-优雅草卓伊凡
|
存储 编解码 文件存储
Windows 中的硬链接、目录联接(软链接)、符号链接、快捷方式
【10月更文挑战第5天】本文介绍了四种链接类型的概念及用途:硬链接允许通过多个入口访问同一文件内容,适用于不复制文件的情况下提供多处访问;软链接(目录联接)用于创建目录间的虚拟映射,可跨越文件系统;符号链接则更为灵活,可链接文件或目录并指向任意路径;快捷方式则是Windows中常用的一种特殊文件类型,便于快速访问程序、文件或网络资源。分别描述了它们的定义、工作原理、特点以及创建方法。
3303 10
|
API C# 开发者
WPF图形绘制大师指南:GDI+与Direct2D完美融合,带你玩转高性能图形处理秘籍!
【8月更文挑战第31天】GDI+与Direct2D的结合为WPF图形绘制提供了强大的工具集。通过合理地使用这两种技术,开发者可以创造出性能优异且视觉效果丰富的WPF应用程序。在实际应用中,开发者应根据项目需求和技术背景,权衡利弊,选择最合适的技术方案。
968 1
|
开发者 C# 容器
【独家揭秘】当WPF邂逅DirectX:看这两个技术如何联手打造令人惊艳的高性能图形渲染体验,从环境搭建到代码实践,一步步教你成为图形编程高手
【8月更文挑战第31天】本文通过代码示例详细介绍了如何在WPF应用中集成DirectX以实现高性能图形渲染。首先创建WPF项目并使用SharpDX作为桥梁,然后在XAML中定义承载DirectX内容的容器。接着,通过C#代码初始化DirectX环境,设置渲染逻辑,并在WPF窗口中绘制图形。此方法适用于从简单2D到复杂3D场景的各种图形处理需求,为WPF开发者提供了高性能图形渲染的技术支持和实践指导。
1143 0
|
Web App开发 测试技术 网络安全
Kali 测试:使用Burp Suite 对网络认证服务的攻击(一)
Kali 渗透测试:使用Burp Suite 对网络认证服务的攻击(一)
398 0
|
网络安全 数据安全/隐私保护 安全
Kali 测试:使用Burp Suite 对网络认证服务的攻击(二)
Kali 渗透测试:使用Burp Suite 对网络认证服务的攻击(二)
451 0
|
存储 安全 Java
【JAVA基础篇教学】第八篇:Java中List详解说明
【JAVA基础篇教学】第八篇:Java中List详解说明
|
存储
数据结构------------线性表之链表(详细讲解)
数据结构------------线性表之链表(详细讲解)
1215 0