小白分析office漏洞 CVE-2012-0158

  • A+
所属分类:安全文章

小白分析office漏洞 CVE-2012-0158

本文为看雪论优秀文章

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



小白分析office漏洞 CVE-2012-0158


小白分析office漏洞 CVE-2012-0158

一、软件简介

小白分析office漏洞 CVE-2012-0158


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



小白分析office漏洞 CVE-2012-0158

二、漏洞成因

小白分析office漏洞 CVE-2012-0158


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


2.1 定位漏洞触发模块


用OllyDbg附加office,打开问题文档,发现弹出错误提示框,通过esp找到溢出点

小白分析office漏洞 CVE-2012-0158

分析溢出点附近堆栈,溢出点下面的堆栈一般是刚刚调用的函数的上一层函数堆栈,溢出后可能已经破坏,溢出点上面的堆栈─般是刚刚执行的函数堆栈,可以发现有一个地址275C8AOA,可以看出这个地址是MSCOMCTL模块中的地址,由此判断刚刚执行的函数中执行了MSCOMCTL模块中的代码。

小白分析office漏洞 CVE-2012-0158

2.2 定位漏洞函数


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

小白分析office漏洞 CVE-2012-0158

2.3 分析漏洞成因


重新动态调试观察CALL275C876D的参数。

小白分析office漏洞 CVE-2012-0158

函数275C876D内部

小白分析office漏洞 CVE-2012-0158

在文件中搜索定位长度,发现有两个长度,猜测一个是dwBytes,一个是v7。

小白分析office漏洞 CVE-2012-0158

在OllyDbg中单步调试以及修改8282为8283对比前后状态,发现两个长度确实一个是dwBytes,一个是v7。

小白分析office漏洞 CVE-2012-0158

函数275C876D内部

小白分析office漏洞 CVE-2012-0158

修改8282为8283

小白分析office漏洞 CVE-2012-0158

小白分析office漏洞 CVE-2012-0158

函数275C876D内部

小白分析office漏洞 CVE-2012-0158

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

小白分析office漏洞 CVE-2012-0158

用OllyDbg找到了执行拷贝的语句

小白分析office漏洞 CVE-2012-0158

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

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

小白分析office漏洞 CVE-2012-0158

官方修改如下,判断v9(dwBytes)是否等于8,不为8则返回。

小白分析office漏洞 CVE-2012-0158


小白分析office漏洞 CVE-2012-0158

三、利用过程

小白分析office漏洞 CVE-2012-0158


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


用010Editor打开问题文件,分析数据内容,其中8282为自定义的缓冲区长度。

小白分析office漏洞 CVE-2012-0158

拷贝来源值原本为436F626A6400000082820000,拷贝去向首地址如上图缓冲区起始位置,用OllyDbg验证。

即将拷贝(尚未拷贝)

小白分析office漏洞 CVE-2012-0158

即将进行第8次拷贝

小白分析office漏洞 CVE-2012-0158

RETN 0x8可以分解为两条语句 pop eip 与 ESP=ESP+0x8,将41414141替换为一个指向语句jmp esp的地址,在41414141后面16(16==0x8*2)个字节处是书写shellcode的起点。这样当执行RETN 0x8之后,eip会跳到栈顶esp指向的位置执行接下来的语句,而栈顶由于加了0x8,正好指向书写的shellcode。
 
小白分析office漏洞 CVE-2012-0158

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)。

小白分析office漏洞 CVE-2012-0158

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,粘贴到问题文件中。



小白分析office漏洞 CVE-2012-0158

四、POC

小白分析office漏洞 CVE-2012-0158


shellcode源码如下:

最终结果如下:

小白分析office漏洞 CVE-2012-0158



小白分析office漏洞 CVE-2012-0158

五、附加

小白分析office漏洞 CVE-2012-0158


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




小白分析office漏洞 CVE-2012-0158

- End -


小白分析office漏洞 CVE-2012-0158


看雪ID:哦哈哈哈哈

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

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




# 往期推荐





小白分析office漏洞 CVE-2012-0158
公众号ID:ikanxue
官方微博:看雪安全
商务合作:[email protected]



小白分析office漏洞 CVE-2012-0158

球分享

小白分析office漏洞 CVE-2012-0158

球点赞

小白分析office漏洞 CVE-2012-0158

球在看



小白分析office漏洞 CVE-2012-0158

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

本文始发于微信公众号(看雪学院):小白分析office漏洞 CVE-2012-0158

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: