-
-
[原创]Microsoft RTF栈溢出漏洞分析(CVE-2010-3333)
-
发表于: 2019-4-15 20:27 6473
-
每当出现一些热点事件,黑客总会借此当做诱饵,将一些包含热点新闻的恶意文档通过邮件等方式发送给受害者,用户在未知情况下,打开恶意文档就会执行恶意文档中的恶意代码,在受害者主机上植入恶意木马,并借此监视受害者,控制受害者计算机,甚至窃取受害者资料。
在“林疯狂”时期,趋势科技公司捕获到APT文档,该恶意文档主要利用CVE-2010-3333漏洞,通过邮件以附件形式发送给受害者打开附件,在受害者者计算机上植入恶意程序,然后通过C&C服务器进行通信和控制,并将窃取的敏感信息回传到C&C服务器上。
Microsoft Office XP SP3,Office 2003 SP3,Office 2007 SP2,Office 2010等多个版本的Office软件中的Open XML文件格式转换器存在栈溢出漏洞,主要是在处理RTF中的“pFragments”属性时存在栈溢出,导致远程攻击者可以借助特制的RTF数据执行任意代码,因此又称之为“RTF栈缓冲区溢出漏洞”。
操作系统:Windows XP SP3
调试器:Windbg
反汇编器:IDA Pro
漏洞软件:Microsoft Office Word(2003 SP3)
RTF(Rich Text Format)格式是Microsoft公司为进行文本和图像信息格式的交换而制定的一种文件格式,它适用于不同的设备和操作系统,RTF文件的基本元素是正文(Text),控制字(Control Word),控制符号(Control Symbol)和群组(Group)
第一行
首先通过Metasploit生成可触发漏洞的POC样本,特别是一些经典漏洞,Metasploit上会提供利用代码,通过它可以直接生成样本以供分析漏洞,通过Metasploit获取样本一直是漏洞分析人员的不二选择。
利用search搜索cve-2010-3333相关的的漏洞利用代码
这是mso.dll上的一处栈溢出漏洞,由于在循环复制内存数据到栈空间时,未检测复制的内存大小,导致覆盖到edi(0x00130000)这个只读内存地址,最后造成访问违例。
触发异常的指令地址0x30e9eb88位于函数sub_30ED4406中,暂且标记为CrashFun函数,用Windbg重新加载程序运行,在0x30e9eb88上下断点,然后打开rtf文件运行后断下:
由于msf.rtf中复制的内存数据较大,导致复制的过程中覆盖到不可写的内存地址而触发异常,因此没有去执行覆盖到的返回地址或者SEH中的异常处理函数
总结上面的分析过程,由于Word中的RTF分析器在解析pFragment属性值时,没有正确计算属性值所占用的空间大小,只要复制的数据大小超过0x14字节即可覆盖到返回地址,若继续覆盖下去还可以覆盖到SEH结构,进而控制程序的执行流程,用于执行任意代码。
将漏洞成因分析清楚后,利用该漏洞还是比较容易的,只需将返回地址用jmp esp指令地址覆盖,也就是复制数据的大小的值之后再偏移0x14字节,就可以覆盖到返回地址;然后将shellcode放置到后面,就可以执行任意代码。
由于在漏洞函数的结尾处,它在返回时会弹出0x14大小的栈空间,因此我们在jmp esp中填充一些垃圾字节以此来填充这一空缺
某个实际病毒样本的分析情况:
当漏洞函数返回后,会先从栈顶弹出0x14字节空间,然后执行0x7d1f5fb7处的JMP ESP指令,进而跳入shellcode的起始地址,导致执行任意代码
除了利用jmp esp覆盖返回地址的方法,还可以利用jmp 06+ pop pop ret指令地址覆盖SEH结构,也同样可以达到溢出利用的目的。
上面例子中的0x7d1f5fb7指令地址并不稳定,这种硬编码地址可能受到软件和系统版本影响,较难实现通用性利用,为了实现Office 2003和Office 2007的通用性利用,我们可以在返回地址上用0x0026762f覆盖,它在Office 2003上相当于call esp指令:
该地址适用于Office 2003 SP0和SP3等各个子版本,属于稳定的跳转地址,对于Office 2007,0x0026762f上已经不再是call/jmp es等类似指令,当我们用0x0026762f这个地址覆盖Office 2007上的返回地址,只要能够让它触发异常,就可以执行SEH结构。
这样的话,只需要加大内存拷贝的大小,使其覆盖醉经的SEH结构就可以劫持EIP,也就是说,我们需要同时覆盖返回地址和SEH结构
构造覆盖栈的数据如下,长度为0x2a18:
关于SEH结构地址的定位,可以使用MSF上的两个工具:pattern_create和pattern_offset定位偏移量
下载补丁后,提取安装后的mso.dll文件和未打补丁之前的mso.dll进行补丁比较,就可以找到针对漏洞的修复方法,首先用ID分别加载上面两个dll文件,点击保存按钮就会在当前目录下生成相应的idb文件,然后用BinDiff插件比对这两个idb文件,然后打开其中一个idb文件(直接拖入IDA),按“ctrl+6”单击“Diff Database”按钮,在弹出的对话框中选择另一个idb文件,之后BinDiff就会对这两个Dll进行补丁比较:
选择“Matched Functions”匹配函数进行对比,其中“similarity”一列代表函数的相似度,通常漏洞函数修改不会太大,多数在0.7~0.9之间,而且在“change”一列中大多数带有G标志,也就是图表视图发生了改变
之前已经分析过漏洞成因,漏洞函数位于unpatch_mso.dll中的0x30f0b5c2,因此直接定位此函数和patch_mso.dll中的匹配函数0x30f39832的对比情况:
红色部分就是微软在漏洞函数中加入的内容, 但是上面补丁后的代码并没有看到有检测复制内存大小的行为,因此我们可以认为检测内存大小的函数位于上面某个调用函数中,但是里面调用的函数都是通过eax偏移来索引的,不便于静态分析,要动态调试来分析
用Windbg加载打补丁后的WINWORD.exe,在漏洞修函数0x30f39832上下断点,先用未打补丁的WINWORD.exe看一下:
单步跟下去,直到call dword ptr [eax+30h],然后跟入:
获取复制内存大小
样本中代表复制内存大小的0xc8ac,若size>4则跳转,并清零后返回
微软在修复CVE-2010-3333漏洞时,主要通过检测RTF文件中的pFragments属性值的大小是否大于4字节,若大于则跳走并且返回,不再进行内存复制,从而解决了栈溢出问题
参考信息:泉哥《漏洞战争》
1.{\rtf1\ansi\ansicpg936\deff0\deflang1033\deflangfe2052{\fonttbl{\f0\fnil\fcharset134 \'cb\'ce\'cc\'e5;}} 2.{\colortbl ;\red255\green255\blue0;\red255\green0\blue0;\red0\green0\blue255;} 3.{\viewkind4\uc1\pard\cf1\lang2052\f0\fs20 Osamu\cf2 Naga\cf0 y\cf3 am\cf0 a,\par was unable to pinpoint.//PRD# \cf1 OQS\par it \cf0 signed a \cf1 definitive\cf0 agreement\par \par }
fcd格式说明
第一行
{\rtf1\ansi\ansicpg936\deff0\deflang1033\deflangfe2052{\fonttbl{\f0\fnil\fcharset134 \'cb\'ce\'cc\'e5;}}
{\rtf1\ansi\ansicpg936\deff0\deflang1033\deflangfe2052{\fonttbl{\f0\fnil\fcharset134 \'cb\'ce\'cc\'e5;}}
‘;;’rtf1–>RTF版本 ansi–> 字符集 ansicpg936–>简体中文 deff0–>默认字体0 deflang1033–>美国英语 deflangfe2052–>中国汉语 fonttb–>字体列表 f0->字体0 fcharset134 ->GB2312国标码 ‘cb\’ce\’cc\’e5–>宋体 引用方式 f0
‘;;’rtf1–>RTF版本 ansi–> 字符集 ansicpg936–>简体中文 deff0–>默认字体0 deflang1033–>美国英语 deflangfe2052–>中国汉语 fonttb–>字体列表 f0->字体0 fcharset134 ->GB2312国标码 ‘cb\’ce\’cc\’e5–>宋体 引用方式 f0
{\colortbl ;\red255\green255\blue0;\red255\green0\blue0;\red0\green0\blue255;} \colortbl 颜色表 ;颜色1;颜色2;颜色3; 引用方式 cf1 cf2 cf3
{\colortbl ;\red255\green255\blue0;\red255\green0\blue0;\red0\green0\blue255;} \colortbl 颜色表 ;颜色1;颜色2;颜色3; 引用方式 cf1 cf2 cf3
\viewkind4\uc1\pard\cf1\lang2052\f0\fs20 Osamu\cf2 Naga\cf0 y\cf3 am\cf0 a,\par \viewkind4正常视图 uc1->单字节 pard->默认段落属性 cf1->颜色1 lang->2052中国汉语 f0->字体0 fs20->字体大小20磅 Osamu Naga 原文 \cf0 默认颜色 y \cf2 颜色2 am\ \cf0默认颜色 a, \par换行
\viewkind4\uc1\pard\cf1\lang2052\f0\fs20 Osamu\cf2 Naga\cf0 y\cf3 am\cf0 a,\par \viewkind4正常视图 uc1->单字节 pard->默认段落属性 cf1->颜色1 lang->2052中国汉语 f0->字体0 fs20->字体大小20磅 Osamu Naga 原文 \cf0 默认颜色 y \cf2 颜色2 am\ \cf0默认颜色 a, \par换行
5.基于栈回溯的漏洞分析方法
首先通过Metasploit生成可触发漏洞的POC样本,特别是一些经典漏洞,Metasploit上会提供利用代码,通过它可以直接生成样本以供分析漏洞,通过Metasploit获取样本一直是漏洞分析人员的不二选择。
利用search搜索cve-2010-3333相关的的漏洞利用代码
(ee0.e34): Access violation - code c0000005 (first chance) First chance exceptions are reported before any exception handling. This exception may be expected and handled. eax=0000c8ac ebx=05000000 ecx=0000019b edx=00000000 esi=1104c24c edi=00130000 eip=30e9eb88 esp=00123d98 ebp=00123dd0 iopl=0 nv up ei pl nz na pe nc cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 efl=00010206 *** ERROR: Symbol file could not be found. Defaulted to export symbols for C:\Program Files\Common Files\Microsoft Shared\office11\mso.dll - mso!Ordinal6426+0x64d: 30e9eb88 f3a5 rep movs dword ptr es:[edi],dword ptr [esi]
(ee0.e34): Access violation - code c0000005 (first chance) First chance exceptions are reported before any exception handling. This exception may be expected and handled. eax=0000c8ac ebx=05000000 ecx=0000019b edx=00000000 esi=1104c24c edi=00130000 eip=30e9eb88 esp=00123d98 ebp=00123dd0 iopl=0 nv up ei pl nz na pe nc cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 efl=00010206 *** ERROR: Symbol file could not be found. Defaulted to export symbols for C:\Program Files\Common Files\Microsoft Shared\office11\mso.dll - mso!Ordinal6426+0x64d: 30e9eb88 f3a5 rep movs dword ptr es:[edi],dword ptr [esi]
0:000> db esi 1104c24c 4c 74 36 4c 74 37 4c 74-38 4c 74 39 4c 75 30 4c Lt6Lt7Lt8Lt9Lu0L 1104c25c 75 31 4c 75 32 4c 75 33-4c 75 34 4c 75 35 4c 75 u1Lu2Lu3Lu4Lu5Lu 1104c26c 36 4c 75 37 4c 75 38 4c-75 39 4c 76 30 4c 76 31 6Lu7Lu8Lu9Lv0Lv1 1104c27c 4c 76 32 4c 76 33 4c 76-34 4c 76 35 4c 76 36 4c Lv2Lv3Lv4Lv5Lv6L 1104c28c 76 37 4c 76 38 4c 76 39-4c 77 30 4c 77 31 4c 77 v7Lv8Lv9Lw0Lw1Lw 1104c29c 32 4c 77 33 4c 77 34 4c-77 35 4c 77 36 4c 77 37 2Lw3Lw4Lw5Lw6Lw7 1104c2ac 4c 77 38 4c 77 39 4c 78-30 4c 78 31 4c 78 32 4c Lw8Lw9Lx0Lx1Lx2L 1104c2bc 78 33 4c 78 34 4c 78 35-4c 78 36 4c 78 37 4c 78 x3Lx4Lx5Lx6Lx7Lx
0:000> db esi 1104c24c 4c 74 36 4c 74 37 4c 74-38 4c 74 39 4c 75 30 4c Lt6Lt7Lt8Lt9Lu0L 1104c25c 75 31 4c 75 32 4c 75 33-4c 75 34 4c 75 35 4c 75 u1Lu2Lu3Lu4Lu5Lu 1104c26c 36 4c 75 37 4c 75 38 4c-75 39 4c 76 30 4c 76 31 6Lu7Lu8Lu9Lv0Lv1 1104c27c 4c 76 32 4c 76 33 4c 76-34 4c 76 35 4c 76 36 4c Lv2Lv3Lv4Lv5Lv6L 1104c28c 76 37 4c 76 38 4c 76 39-4c 77 30 4c 77 31 4c 77 v7Lv8Lv9Lw0Lw1Lw 1104c29c 32 4c 77 33 4c 77 34 4c-77 35 4c 77 36 4c 77 37 2Lw3Lw4Lw5Lw6Lw7 1104c2ac 4c 77 38 4c 77 39 4c 78-30 4c 78 31 4c 78 32 4c Lw8Lw9Lx0Lx1Lx2L 1104c2bc 78 33 4c 78 34 4c 78 35-4c 78 36 4c 78 37 4c 78 x3Lx4Lx5Lx6Lx7Lx
0:000> db esp 00123d98 f0 10 4d 01 88 3f 12 00-96 cc f4 30 f0 10 4d 01 ..M..?.....0..M. 00123da8 c0 3d 12 00 00 00 00 00-00 00 00 00 00 00 00 00 .=.............. 00123db8 00 00 00 00 78 a8 5c 59-41 61 30 41 61 31 41 61 ....x.\YAa0Aa1Aa 00123dc8 32 41 61 33 41 61 34 41-61 35 41 61 36 41 61 37 2Aa3Aa4Aa5Aa6Aa7 00123dd8 41 61 38 41 61 39 41 62-30 41 62 31 41 62 32 41 Aa8Aa9Ab0Ab1Ab2A 00123de8 62 33 41 62 34 41 62 35-41 62 36 41 62 37 41 62 b3Ab4Ab5Ab6Ab7Ab 00123df8 38 41 62 39 41 63 30 41-63 31 41 63 32 41 63 33 8Ab9Ac0Ac1Ac2Ac3 00123e08 41 63 34 41 63 35 41 63-36 41 63 37 41 63 38 41 Ac4Ac5Ac6Ac7Ac8A
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!