小白分析office漏洞 CVE-2012-0158
2020-12-28 18:58:00 Author: mp.weixin.qq.com(查看原文) 阅读量:142 收藏

本文为看雪论优秀文章

看雪论坛作者ID:哦哈哈哈哈

一、软件简介

Microsoft Office是由Microsoft(微软)公司开发的一套基于 Windows 操作系统的办公软件套装。常用组件有 Word、Excel、PowerPoint等。最新版本为Microsoft 365(Office 2019)

二、漏洞成因

CVE-2012-0158漏洞是一个栈溢出漏洞,该漏洞的产生来自于微软Office办公软件中MSCOMCTL.ocx中的MSCOMCTL.ListView控件检查失误。在读取数据的时候,读取的长度和验证的长度都在文件中,且可以人为修改,进而触发缓冲区溢出,攻击者可以通过精心构造的数据修改EIP指向来实现任意代码的执行。


2.1 定位漏洞触发模块

用OllyDbg附加office,打开问题文档,发现弹出错误提示框,通过esp找到溢出点
分析溢出点附近堆栈,溢出点下面的堆栈一般是刚刚调用的函数的上一层函数堆栈,溢出后可能已经破坏,溢出点上面的堆栈─般是刚刚执行的函数堆栈,可以发现有一个地址275C8AOA,可以看出这个地址是MSCOMCTL模块中的地址,由此判断刚刚执行的函数中执行了MSCOMCTL模块中的代码。

2.2 定位漏洞函数

动态调试溢出点所在的函数,可以跟踪到是CALL275C876D时出的问题。

2.3 分析漏洞成因

重新动态调试观察CALL275C876D的参数。
函数275C876D内部
在文件中搜索定位长度,发现有两个长度,猜测一个是dwBytes,一个是v7。
在OllyDbg中单步调试以及修改8282为8283对比前后状态,发现两个长度确实一个是dwBytes,一个是v7。
函数275C876D内部

修改8282为8283
函数275C876D内部

用IDA继续分析,后面疑似有拷贝函数

用OllyDbg找到了执行拷贝的语句
在读取数据时,读取的长度和验证的长度都在文件中,所以可以自行构造,进而触发栈溢出,栈溢出即在拷贝时,多余的部分向栈地址增加的方向覆盖,当函数返回地址被覆盖的时候,函数返回时会读取被覆盖的数据作为即将执行代码的地址,进而产生未知的后果。

产生漏洞的根本原因是一个判断(即dwbytes>=8)。在函数sub_275c89c7中先后调用两次函数sub_275c876d,第一次调用该函数前分配了0x14字节的栈空间,第二次调用该函数前已使用0xc字节的空间(剩余0x8字节)。在函数内部会有拷贝数据这一行为,若拷贝数据量大于0x8字节就会引起栈溢出。
官方修改如下,判断v9(dwBytes)是否等于8,不为8则返回。

三、利用过程


3.1 分析和设计漏洞shellcode的结构

用010Editor打开问题文件,分析数据内容,其中8282为自定义的缓冲区长度。
拷贝来源值原本为436F626A6400000082820000,拷贝去向首地址如上图缓冲区起始位置,用OllyDbg验证。
即将拷贝(尚未拷贝)
即将进行第8次拷贝
RETN 0x8可以分解为两条语句 pop eip 与 ESP=ESP+0x8,将41414141替换为一个指向语句jmp esp的地址,在41414141后面16(16==0x8*2)个字节处是书写shellcode的起点。这样当执行RETN 0x8之后,eip会跳到栈顶esp指向的位置执行接下来的语句,而栈顶由于加了0x8,正好指向书写的shellcode。
 

3.2 在运行的程序中寻找跳板指令地址

1) 寻找Jmp esp(opecode为ffe4),用到了wimdbg+mona.py+pykd.pyd
2) 首先安装WDK,因为WDK自带windbg
3) 安装python2.7.2
4) 安装Visual C++ 2008运行库
5) 安装windbg的python插件pykd
6) 将mona.py与windbglib.py放到windbg.exe同目录下
7) 运行windbg开始调试后,输入以下命令即可开始使用mona
    .load pykd,pyd
    !py mona
8) 查找”jmp esp”,”push esp#ret”等指令
    !py mona jmp -r esp
 
查找结果如下图,因为0x729a0535 显示可读可执行(PAGE_EXECUTE_READ),故选择该地址替换41414141,由于是小端存储,记得倒序替换(即35059a72)。

3.3 编写shellcode,注入shellcode

Visual Studio2019 编写shellcode,这里最终目标只是弹窗一个HelloWorld:
1)获取Kernel32.dll基地址
2获取GetProcAddress函数地址
3获取LoadLibraryA地址
4获取user32基地址
5获取MessageBoxA地址
6调用MessageBoxA地址
7获取ExitProcess地址
8调用ExitProcess
注入shellcode:
将编写的程序(realease版)拖入OllyDbg,找到main函数,然后选中书写的汇编语句,按下shift+x复制这一部分opcode,粘贴到问题文件中。

四、POC

shellcode源码如下:
最终结果如下:

五、附加

1)office漏洞大多都是栈溢出,如CVE-2017-11882、CVE-2018-0802和CVE-2017-0199
2附件中为问题文件,即文中溢出点处的值为0x41414141的文件
3感谢Keoyo先生在评论区的建议,祝大家不忘初心,精益求精

- End -

看雪ID:哦哈哈哈哈

https://bbs.pediy.com/user-home-873637.htm

  *本文由看雪论坛 哦哈哈哈哈 原创,转载请注明来自看雪社区。


# 往期推荐

公众号ID:ikanxue
官方微博:看雪安全
商务合作:[email protected]

球分享

球点赞

球在看

点击“阅读原文”,了解更多!


文章来源: http://mp.weixin.qq.com/s?__biz=MjM5NTc2MDYxMw==&mid=2458378661&idx=1&sn=caa95223b11d35fa93d7d09f84ebb03f&chksm=b180d12f86f758390f69dda84c29bb61ad67ff0a6a872f1204db37224ca738b3200a79d2f972#rd
如有侵权请联系:admin#unsafe.sh