[原创]CVE-2012-0158 office缓冲区溢出漏洞报告【千字长文】
source link: https://bbs.pediy.com/thread-268068.htm
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
Microsoft Office(CVE-2012-0158)漏洞分析报告
| 软件名称:Microsoft Office 软件版本:2003
漏洞模块:MSCOMCTL.OCX 模块版本:2003
编译日期:2020-11-19 | 操作系统:Windows 7-x86
漏洞编号:CVE-2012-0158 危害等级:高危
漏洞类型:缓冲区溢出 威胁类型:本地 |
分析日期2021年6月10日
1. 软件简介
Microsoft Office2003是全球使用最广泛的办公软件,Microsoft Office 2003 SP3 五合一此版本包含 Word、Excel、Powerpoint、Outlook、Access 五个组件的全部功能!
2. 漏洞成因
文件字节的长度,和文件字节的限制的验证长度,都保存在文件中,导致可以很容易的修改这2个值.而导致栈中存储复制内容的目标数组溢出.
3. 利用过程 1
注意:有的win7-32位打了补丁,可能无法完美触发溢出攻击,xp系统下可能产生溢出的指令被截断。
1.设置OD
2.首先运行word.exe,然后用OD附加
3.OD按F9运行,用word程序,打开poc文档。
4.样本的获取:
4.1在kail中使用msfconsole命令,查找是否有改漏洞利用的程序
4.2查看漏洞信息
4.3根据信息准备环境
office2010上会使用ROP进行绕过DEP和ASLR,需要通过文件-打开的方式运行恶意样本
加入一个弹计算器的payloads,填写样本必要参数生成样本
5.将样本提取到虚拟机进行分析,点开完美触发。
6.查看样本,寻找特征jmp esp等
7.猜测样本所使用的API
7.1POC弹出了计算器,那么很可能调用的API是以下几个:
CreateProcess(参数多不是首选)
WinExec,导出模块是kernel32.dll,比较常用
system 导出模块是ucrtbase.dll,word不一定会加载1.先在WinExec设置断点,看看有没有调用
微软符号服务器: http://msdl.microsoft.com/download/symbols
断到WinExec
查看堆栈,发现栈破坏严重,无法得到有效信息(因为自己都看不懂)
正常的函数调用call 的地址距离 0FFA000(堆栈)很远
栈回溯看看调用处是否像是ShellCode
u 001217c6 l-20 含义:反汇编 地址001217c6 l(是list的意思) -20 是向上20条指令
有较多pop 还有popad 看着像是ShellCode(往上找,找到一些NOP)
查看nop之前的4个字节是什么指令是JMP ESP,那么应该就是溢出点的位置,后应该就是ShellCode了
查看样本中是否有这些OpCode
十六进制字节搜索未找到
其他方式搜索到了分析:因为此时调用堆栈窗口无有效信息,栈被破坏,而且存在jmp esp指令,那么这个是一个栈溢出漏洞
将jmp esp 后的shellCode删掉,最小样本法
无ShellCode的样本已经崩溃,异常偏移不一定就是出错的位置,调试看看
查看栈中数据
看到栈中有一些之前调用的信息
重新调试在MSCOMCTL!DllCanUnloadNow+0xc7d位置设置断点,查看
命令:
sxe ld:MSCOMCTL.OCX
/
/
断下后设置断点
bp MSCOMCTL!DllCanUnloadNow
+
0xc7d
发现异常,而且esp全为0, 看来在这个位置之前就已经被溢出了,需要继续向上查找
bp MSCOMCTL!DllGetClassObject
+
0x41cc6
暂时没看出问题,继续单步
没走几步就到了RET
继续挖信息
bp MSCOMCTL!DllGetClassObject+0x41abc
这个位置还没有溢出,可以继续跟
这个call F8跟进去
再按F8几次
调用栈信息由很多突然变了,减少了好几条.
转到OD中查看.
等到打开漏洞.doc文件时,设置事件.中断于新模块.
前面我们已经知道了模块和有问题的指令
下断点:
f7进入该函数,走到即将出错的那条函数查看堆栈信息.
结束OD,重新附加程序,运行到此位置.对比
15.将已知出问题的MSCOMCTL.OCX 模块,拖入到ida中分析定位.
比较基址是否一致
16.定位到问题函数
17.定位问题指令
18.同理溢出发现是在拷贝中溢出的,所以必然是destin参数溢出了,也就是lpMema参数,而该参数是sub_275c876D传入的,所以需要回溯这个参数.前边已经知道这个函数位置就是0x275c8A05了.直接定位.
显示dwBytes 是8282
19.返回ida中查找该函数位置:
20.小结:目前来看引起溢出的原因就是dwBytes,因为它决定了到底要复制大的数据.尝试在漏洞.doc寻找该数值.
4.漏洞成因:
文件字节的长度,和文件字节的限制的验证长度,都保存在文件中,导致可以很容易的修改这2个值.而导致栈中存储复制内容的目标数组溢出.
5.PoC
office有一些漏洞,都是此类溢出.此类的关键点,就在于将限制文档字节个数的值放在了文档中,导致不怀好意的人可以任意修改.而且加上,office未对读取到的漏洞.doc中限制字节的值做校验.导致溢出.
尽量不要点击来历不明的文档,比如.doc.pdf等.因为可能有病毒.
7.参考资料
\<15PB信息安全教育-漏洞利用\>---任晓辉
\<CVE-2012-0158\>\<暴雷漏洞利用之ByPassDEP >笔记---刘晨星
钢针:碎碎念——》
希望看雪论坛出一个直接上传.doc解析呀。把这篇分析报告粘贴进来,照片一张张复制进来,有点累呀~
上传的附件:
感觉挺好的,想学可以去试课你是在15pb培训,感觉如何?
嗯嗯,谢谢大佬指点呀这个洞我记得我在另一个帖子回复过,关于漏洞成因的问题很多人是认为没有校验长度,实际上是错误的校验长度,楼主可以关注一下你上传途中有一个地方检查了dwBytes,对比方式是dwBytes 8返回erro ...
嗯嗯,好的师傅有时间整理一下格式吧,格式有点混乱现在
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK