作者:黑蛋
一、漏洞简介 本次漏洞还是一个office溢出漏洞,漏洞编号cve-2017-11882。该漏洞是office一个组件EQNEDT32.EXE引起的栈溢出,通杀office版本2007-2016。
二、复现环境 系统版本
目标程序
调试工具
辅助工具
win7 sp1 x86
office2007
olldbg
Process-Monitor
三、漏洞复现 在这里呢,我是使用了Ridter师傅的exp进行分析的,网址:https://github.com/Ridter/CVE-2017-11882/ 之后我们安装office2007,然后双击EXP,弹出计算器:
证明漏洞存在。
四、漏洞分析 首先我们需要找到溢出点,既然他弹出一个计算器,那么我们可以对CreateProcess函数或者WinExec下断点,尝试找到关键地方,用windbg附加office 2007,然后在CreateProcess函数和WinExec函数下断点:
然后g起来,用word打开exp:
结果发现并没有断下来,思考许久,猜测计算器不是word弹出来的,我们打开PCHunter查看进程:
可以看到计算器的父进程是cmd,但是cmd的父进程存在PID,但是在列表中却找不到PID为1404的进程,卡顿许久,猜测或许是cmd父进程隐藏了自己或者启动时间太短,启动完自己结束。想起了一个老软件Process-Monitor,使用Process-Monitor查看进程:
同样没有,这里我们需要开启Process-Monitor,然后再次用word打开exp:
现在可以很清晰看到cmd父进程是EQNEDT32.exe,以及他的路径。所以我们需要在EQNEDT32.exe中下断点,而不是word里面下断点。在这里我们需要设置一下注册表,因为EQNEDT32.exe这个程序是被word带起来的,而他又会很快的结束,所以需要设置此程序启动就被附加:
HKEY_LOCAL_MACHINE\SOFTWARE\MICROSOFT\WINDOWS NT\CURRENTVERSION\IMAGE FILE EXECUTION OPTIONS
这样,我们就完成了EQNEDT32.exe这个程序启动附加。接下来我们双击exp,olldbg成功附加EQNEDT32.exe,首先在对WinExce下断点,Ctrl+g(WinExec),然后在首部下断点:
go起来,成功停在断点处,说明计算器就是通过WinExce启动的,F8单步走过函数初始化过程,开辟栈空间等步骤,然后我们观察堆栈EBP+4的位置,就是函数返回地址:
跟进返回地址,可以看到这里调用了WinExec函数:
我们在call WinExec函数前面一句,以及call这条语句下断点:
然后关闭word,重新双击exp,然后在OD中运行起来:
可以看到他停在了call这条语句,并没有执行push eax,在这里我们可以判断出应该是上个函数返回值直接跳到了WinExec上,我们查找堆栈,向高地址查找,可以看到上个函数返回地址:
在堆栈+40的位置回车跟到上一层函数:
在此地点上方call函数下断点,然后重新运行,卡在断点处:
我们F7跟进去单步调试,看看哪里覆盖了返回地址,我们注意F7进去的第一个call:
首先给他下个断点,预防他是关键函数,然后再F8:
可以看到这里就是关键函数,刚走过这个函数就断在了WinExec函数上,我们重新调试,让断在刚才下的断点上,F7跟进去调试:
首先锁定堆栈返回地址,看看什么时候会被淹没,在这里我们已经找到关键地方,一串cmd字符,以及拷贝代码:
我们执行到返回,可以看到cmd这一串的地址正好是WinExec函数第一个参数:
也就是这里是通过淹没返回地址到WinExec上,然后通过修改字符串控制WinExec的参数,启动cmd打开计算器实现。通过启动cmd,打开了计算器,而之后的的AAAA等都是传给计算器参数,是无效的。我们可以在cmd测试一下:
五、exp简单生成
我们修改一下exp:
然后用010Editor打exp,找到cmd这串字符,修改为弹出截屏框:
接下来我们取消断点测试一下:
弹出了剪切屏,漏洞复现利用成功。!