(一次大作业,比较啰嗦 ,见谅)
- 漏洞介绍
2017年11月14号,微软推送了常规的安全更新,其中就包括CVE-2017-11882的安全更新,当时还引起了不小的关注,之后Github上也公布了许多POC及对应的漏洞利用程序。
仅仅从CVE-2017-11882的漏洞利用效果来看,它可以通杀Office 2003到Office 2016的所有版本,并且整个攻击环境的构建非常简单,效果又非常的好。例如,有些攻击效果会出现弹框、CPU飙高、发生异常等等,而这个漏洞的利用效果,堪称“无色无味”,即整个过程几乎不会产生任何异常的情况。从时间上来看,这个漏洞曾经潜伏了17年之久,直到2017年才被发现并低调修复。
此漏洞是由Office软件里面的公式编辑器造成的,即EQNEDT32.EXE程序,这个程序运行的过程中,读入包含MathType的ole数据时,在拷贝公式字体名称时没有对名称长度进行校验,从而造成栈缓冲区溢出,是一个非常经典的栈溢出漏洞,攻击者通过构造特殊的字符,可以实现任意代码执行。真实操作环境中,如果黑客利用这个漏洞,构造带有shell后门的office文件,当普通用户打开这个office文件是,电脑就可以被黑客直接控制。
-
漏洞复现
- 环境和工具
我参考了许多的关于CVE-2017-11882的分析教程,选择了其中过程相对更详细的一个,使自己的环境和他的分析环境基本一样,仅仅是系统使用了64位,而不是教程作者所用的32位。最终漏洞复现过程的环境和使用的工具为:
- 操作系统:Window 7 专业版(64 位)
- office软件:office 2003 sp3 完整版
- 工具软件:VMware,软碟通,git
-
复现过程
- 环境准备
-
复现过程
系统方面,下载windows7专业版镜像文件,使用VMware软件,安装windows 7专业版虚拟机,由于我从睿思下载的镜像是GHO文件,虚拟机安装过程与一版情况不太一样,相对更繁琐一些,把具体参考教程附在文档末尾参考教程中。
文件传输方面,我在本机上开启ftp服务,以方便向虚拟机传输必要的文件,ftp服务的设置过程也附在文档末尾参考教程中。
Office软件方面,下载office2003完整版,通过ftp传给装好的虚拟机,下载安装过程中一定要注意以下几点:
- 软件包大小,网上轻松找到的100-200M的软件包大多是office2003的精简版,安装之后有可能会找不到公式编辑软件,真实的完整版软件包大概500M左右。
- 软件版本,下载时要注意,软件包的版本一定要是sp3,否者可能漏洞已经修复或者不存在(我自己没有试过,来自于一个漏洞分析教程的意见)。
- 完整安装,在下载好软件包安装软件的过程中,有自定义安装的选项,这里必须选择完整安装,否者之后步骤中将找不到需要的公式编辑软件。
-
- 漏洞复现
-
安装好系统和office软件之后,就可以下载CVE-2017-11882漏洞复现文件到ftp共享文件夹了。关于漏洞父复现文件Github上的例子很多,如图2-1所示,我随便使用了其中一个,即:https://github.com/embedi/CVE-2017-11882。
图2- 1 GitHub搜索结果
推荐使用git命令行下载,不推荐网站下载zip文件,因为会被windows安全中心拦截,当然可以选择关闭windows安全中心后再下载zip包。Git命令行下载的过程如图2-2所示,图中object文件夹是我ftp共享的文件夹。
图2- 2 git下载文件过程
下载好之后,提取example文件夹下的exploit.rtf文件,如图2-3所示,双击打开文件,教程显示,会直接弹出计算机,漏洞复现验证成功,但是我这里需要打开文件之后,再双击“111”公式,才会触发打开计算器,实现漏洞复现,结果如图2-4所示。
图2- 3 POC文件位置
图2- 4 漏洞复现
- 漏洞分析
这部分我的想法是,以弹出计器的过程为例子,来分析是如何实现打开计算器这个功能的,刚开始看了很多网上的教程,也踩了很多的坑,绕了很大的圈才终于实现了一个完整的过程。
所谓的完整过程就是,假设个人完全不知道漏洞位置和产生细节,仅仅有POC文件的情况下,分析出这个漏洞的详细信息,和POC文件攻击过程。
-
- 所用工具
- IDA Pro 7
交互式反汇编器专业版(Interactive Disassembler Professional),人们常称其为IDA Pro,或简称为IDA。是目前最棒的一个静态反编译软件,为众多0day世界的成员和ShellCode安全分析人士不可缺少的利器,IDA Pro是一款交互式的,可编程的,可扩展的,多处理器的,交叉Windows或Linux WinCE MacOS平台主机来分析程序,被公认为最好的****利器。IDA Pro已经成为事实上的分析敌意代码的标准并让其自身迅速成为攻击研究领域的重要工具。它支持数十种CPU指令集其中包括Intel x86,x64,MIPS,PowerPC,ARM,Z80,68000,c8051等等。
- Ollydbg
Ollydbg 通常称作OD,是反汇编工作的常用工具,OD附带了200脱壳脚本和各种插件,功能非常强大,可以避过SE,VMP3.0检测,深受逆向圈内人士的喜爱,这里我用的是我爱**网提供的一个强大的修改版本。
- Process Monitor
Process Monitor一款系统进程监视软件,总体来说,Process Monitor相当于Filemon+Regmon,其中的Filemon专门用来监视系统中的任何文件操作过程,而Regmon用来监视注册表的读写操作过程。有了Process Monitor,使用者就可以对系统中的任何文件和注册表操作同时进行监视和记录,通过注册表和文件读写的变化,对于帮助诊断系统故障或是发现恶意软件、病毒或木马来说,非常 有用。这是一个高级的 Windows 系统和应用程序监视工具,由优秀的 Sysinternals 开发,并且已并入微软旗下,可靠性自不用说。
-
-
详细分析过程
- 寻找漏洞程序
-
详细分析过程
首先需要锁定产生漏洞的位置,即确定漏洞位于哪个程序,是谁引起的。这里利用process Moniter工具来定位。
运行漏动文件,成功的弹出计算器之后,打开prosce Moniter,直接点击工具上的树形图的按钮,在如图3-1所示位置,弹出进程关系窗口中查看计算器是由谁的运行打开的,如图3-2所示,找到计算器所在的进程,发现是cmd启动的计算器,然后cmd和计算器都是被windows公式软件启动的。所以可以定位漏动的位置就是这个函数,名称为EQNEDT32.exe。
图3- 1 操作按钮位置
图3- 2 进程层级关系
如图3-3所示,在office安装目录中寻找公式编辑程序,即EQNEDT32.exe,确定程序路径为C:\Program Files\Common Files\microsoft shared\EQUATION。
图3- 3 查找EQNEDT函数
-
-
- 利用OD附加
-
然后分析计算器弹出的过程,这就需要用OD来监听弹出计算器的这个进程。需要使用OD的进程附加功能,如图3-4所示位置点击后弹出进程窗口,选择要附加的进程即可。
图3- 4 OD附加功能位置
由于自己对OD非常不熟悉,在实际的分析过程中,看了很多的教程,可是一众教程中基本都没有写明白具体应该怎么让OD监听触发漏洞的进程。刚开始仅仅是将公式程序直接用OD打开进行分析,妄图能与弹出计算器的进程有些联系,结果通过process Moniter查看,发现两者位于不同的进程,并没有任何联系。
好在有一个教程中提到了“附加”这个功能,通过查询该功能才得知可以先运行程序再进行监听,这时软件操作才走上正轨。然后很多教程中写到,在运行漏洞文件之前,需要先用一个正常的word文件添加一个正常的公式之后,再打来POC文件,一直很奇怪是为什么这么操作,自己尝试了一下,如图2-5所示。结果发现了突破口,先在word中打开公式程序,再触发漏洞的时候,会直接使用原来已经在word中启动的公式程序,不会新建一个进程,Process Moniter证明了这一点,如图3-6所示,这样OD的附加功能就可以用来监听漏洞触发进程了。
图3- 5 实际漏洞触发过程
图3- 6 进程层级关系
由上面的探究过程,我总结了成功附加到漏洞触发进程的一般步骤,之后的附加仅仅需要重复下面的步骤就可以了。
- 在正常的word文件中打开公式编辑窗口,保证公式进程正在系统中运行,如图3-5中,在名为漏洞的正常的word文档中打开的带有“ssss”字样的公式编辑窗口。
- 打来OD在附件进程窗口中找到公式编辑器进程,进行附加,如图3-7所示。
图3- 7 附加进程窗口
- 打开POC文件,双击公式(因为程序被OD截断,所以当时不会弹出计算器窗口,所以确认双击过就好了)。
-
- Int3断点分析
-
由于创建计算器,需要新建了一个进程,所以在程序中一定用到了创建进程的方法。利用OD常用API的插件,自动为运行中的程序添加断点,如图2-8所示,网上教程中显示,应该在CreateProcessA CreateProcesW WinExec等API下断点,经过我反复验证,对于这个程序漏洞,仅仅勾选最后一个CreateProcessA即可,如图3-9所示。
图3- 8 设置API断点过程
图3- 9 常用API断点设置
然后运行程序,发现API断点设置有效,程序成功断下,停断结果如图3-10所示。跟随图中箭头提示,断点处成功发现shellcode:cmd.exe /c calc.exe,而且从上面的分析就已经知道,实际运行过程中确实是通过cmd启动的计算器,符合实际情况。阅读图中的汇编代码,可以知道这段代码是在为执行kernel32.CreateProcessInternalA函数做准备。
图3- 10 初始函数停断位置
现在EBP的值为0018F1CC,还没有执行Push EBP,所以0018F1CC是上层函数的栈基址,查看地址0018F1CC的内容,如图3-11所示。
图3- 11 异常栈信息
发现栈中的内容已经被破坏,因为根据函数的调用过程可知,前一个函数的栈基址存放的内容是上一个函数“push EBP”产生的,也就是应该存放上一个函数的栈基址才对,现在已经是41414141。然后栈基址之后的内容应该是上一个函数的返回点,现在为00430C18,继续查看地址00430C18的内容,发现是函数kerne32.WinExec的返回点,如图3-12所示,在函数位置下断点。
图3- 12 函数返回点查看
另一方面,回到原断点处,如图3-13所示,栈中可知函数调用位置,转到75CC33A9查看他的上层函数调用,并且下断点,如图3-14所示。
图3- 13 函数调用位置信息
图3- 14 关键函数下断
重复附加过程,再运行,发现首先在kernel32.winExec停断。
图3- 15 程序停断位置
再次查看堆栈,发现这时栈也已经被破坏,如图3-16所示,所以应该继续向前找栈溢出点。
图3- 16 异常栈信息
栈溢出过程可能发生在当前函数执行过程中,所以尝试在这段代码头部下断点,如图3-17所示。
图3- 17 函数头下断点
再次附加执行,看能否找到导致栈溢出的代码,结果依然在00430C12的位置停下,函数头的断点并没有作用。
再向上阅读代码发现,图3-18所示的这句代码应该运行不通过才对,所以考虑程序是直接跳转到00430C12这个地址来执行函数的。
图3- 18 异常语句
通过看网上的教程得知,还可以看堆栈信息来找突破点,不是特别理解原理,询问教程博主,博主说是正常思路
图3- 21 目标函数头
查看栈信息,如图3-22所示,发现栈没有被覆盖,开始单独运行,查找栈溢出点,可以确定栈溢出代码就在这个函数里。
图3- 22 正常栈信息
很快发现函数溢出点,如图3-23箭头位置所示,函数返回位置被覆盖成00430c12正是kernel32.WinExec的位置。
图3- 23 栈溢出代码
由此,明白漏洞就在地址0041160F对应的函数里。利用ida打开EQNEDT32.exe,在函数窗口找到41160F对应函数如图3-24所示。
图3- 24 定位函数
F5查看C语言代码,代码如图3-25所示,发现有一个字符串拷贝函数没有判断长度,和下面的明显不一样,至此找到程序漏洞位置,漏洞分析到此处结束。
图3- 25 漏洞所在函数
- 修复方案
网上提供里很多修复方案,被反复提到的是下面的两个:
1.下载微软对此漏洞补丁,下载地址:https://portal.msrc.microsoft.com/en-US/security-guidance/advisory/CVE-2017-11882,并且开启自动更新功能。
2.在注册表中禁用该漏洞模块,运行shell:
reg add "HKLM\SOFTWARE\Microsoft\Office\XX.X\Common\COM Compatibility\{0002CE02-0000-0000-C000-000000000046}" /v "Compatibility Flags" /t REG_DWORD /d 0x400
reg add "HKLM\SOFTWARE\Wow6432Node\Microsoft\Office\XX.X\Common\COM Compatibility\{0002CE02-0000-0000-C000-000000000046}" /v "Compatibility Flags" /t REG_DWORD/d 0x400
- 漏洞利用
比较简单的漏洞利用方法是修改shellcode来改变漏洞触发操作。
-
- 操作分析
没有被覆盖之前的栈的样子如图5-1所示,其中,0018F210为上一个函数的栈底,004115D8为函数返回点。
图5- 1 栈溢出前
执行栈溢出语句的结果如图5-2所示,其中函数返回点被换成了00430c12,根据观察shellcode的长度也可以确定了,即:从地址0018F1A4到0018F1D0一共44字节,加上0018F1D0到0018F1D44四字节返回地址,一共使用了48字节,如图5-2所标注。
图5- 2 栈溢出
所以要利用这个漏洞,就要修改44字节的shellcode,保留末尾4字节的函数返回地址就可以达到漏洞利用的效果了。原来的shellcode为:“cmd.exe /c calc.exe AAAAAAAAAAAAAAAAAAAAAAAA”数一数正好44个字符。
-
- 漏洞利用
我这里使用网上教程提供的一个shellcode,即:“cmd.exe /c explorer.exe http://www.15pb.com&”。利用js工具将shellcode转换成ASCII码16进制形式,如图5-3所示。
图5- 3 ASCII码转换 http://www.ab126.com/system/2779.html
利用软件010 Editor可以很方便利用16进制ASCII码编辑文件。打开原来的POC文件,搜索“414141414”以找到shellcode位置,如图5-4所示。
图5- 4 定位shellcode
如图5-5所示,数出44+4的长度替换成上面的shellcode,即:“636d642e657865202f63206578706c6f7265722e65786520687474703a2f2f7777772e313570622e636f6d26120c4300”后面四字节保持不变,它们是函数返回地址,至关重要。
图5- 5 shellcode替换
保存文件,再用word打开文件,双击公式,发现成功的打开了网址,如图5-6所示,自此漏洞利用成功。
图5- 6 漏洞利用结果
参考教程
- Get_M. eCVE-2017-11882漏洞分析[DB/OL]. https://www.cnblogs.com/heixiang/p/10985091.html, 2019-06
- 360CERT安全通告. Microsoft Office内存损坏漏洞(CVE–2017–11882)分析[DB/OL]. https://www.anquanke.com/post/id/87284, 2017-11
- 鬼手56. CVE-2017-11882漏洞分析[DB/OL]. https://blog.csdn.net/qq_38474570/article/details/98513146, 2019-08
- 银雁冰. CVE-2017-11882漏洞分析、利用及动态检测[DB/OL]. https://www.anquanke.com/post/id/87311, 2017-11
- 黑箱. CVE-2017-11882漏洞分析[DB/OL]. https://www.cnblogs.com/heixiang/p/10985091.html, 2019-06
- 拼客学院陈鑫杰. CVE-2017-11882 通杀所有Office版本[DB/OL]. https://zhuanlan.zhihu.com/p/35248996, 2018-04
- Anonyomus. OD的附加先运行程序[DB/OL]. https://www.52pojie.cn/thread-560944-1-1.html, 2016-12
- 努力奋斗的小兵. VMware Workstation虚拟机怎么安装ghost系统[DB/OL]. https://blog.csdn.net/woaisia/article/details/46907179, 2015-07
- Zbored. Win10开启FTP与配置[DB/OL]. https://blog.csdn.net/qq_34610293/article/details/79210539, 2018-01