首页
社区
课程
招聘
1
[原创]【暴雷漏洞】CVE-2012-1889个人漏洞分析报告
发表于: 2017-7-15 11:02 12071

[原创]【暴雷漏洞】CVE-2012-1889个人漏洞分析报告

2017-7-15 11:02
12071

http://bbs.pediy.com/thread-215974.htm

Microsoft XML Core Services缓冲区溢出漏洞

CVE-2012-1889

漏洞分析报告

软件名称Microsoft Internet Explorer

软件版本6.0\8.0

漏洞模块msxml3.dll

模块版本-

编译日期2008-04-14

操作系统Windows XP/7

漏洞编号CVE-2012-1889

危害等级:高危

漏洞类型:缓冲区溢出

威胁类型:远程

分析人:PineCone

2017712

Microsoft XML Core Services(MSXML)是一组用于用JscriptVBScriptMicrosoft开发工具编写构筑基于XMLWindows-native应用的服务。

Microsoft XML Core Services 3.0~6.0版本中存在漏洞,该漏洞源于访问未初始化内存的位置。远程攻击者可借助特制的web站点利用该漏洞执行任意代码或导致拒绝服务。

1.      运行收集到的PoC_1(见附件),在Windows XP+IE6的环境下用Windbg附加调试,程序运行至崩溃,中断处如图:

可见导致崩溃的[ecx+18h]中的ecx经过eax来自[ebp-14h]

推测问题由mov eax,dword ptr[ebp-14h]产生。

2.      运行收集到的PoC_2(见附件),在Windows XP+IE6的环境下用Windbg附加调试,程序运行至崩溃,中断处如图:

可见此时eax中为0x0c0c0c0c,ebp-14h中为0x0c0c0c0c

推测攻击数据被错误的当成了类对象

3.      结合PoC_1PoC_2代码可知PoC用作方法调用definition函数,而MSDNdefinition作为属性使用,作为属性的成员当作了方法使用因此触发了漏洞。因为PoC_2中提供了将eax变为0x0c0c0c0c的思路,确定可以使用堆喷射技术完成攻击。


4.      制作PoC利用漏洞。

       微软在IE8.0中使用了DEP保护的技术,我们需要使用精准堆喷射以及Ret2Libc技术来完成攻击,本实验中一些windbg的指令需要mona2插件。

数据执行保护(Data Execution Prevention,DEP)是微软从Windows XP SP2开始加入的一种非常强悍的安全保护技术,它通过设置内存页的NX/XD标志位,来防止堆控件、栈空间的代码执行。

由于IE 8.0对堆喷射做了一定的限制,采用直接字符串赋值方式会被禁止,因此我们要将堆喷射时的代码做一些修改。

 修改前


 修改后

本次使用Ret2Libc技术绕过DEP检测

由于绝大多数的x86系统中内存的分页都是4KB大小,假如知道了一个地址距离某个内存页的起始偏移,就可以构建多个完全相同的内存块,并且在偏移位置有关键数据,以此构成精准堆喷射。

每个子数据块分为4部分:PaddingRet2LibcPayloadFillData

Padding为衬垫部分,由大量的滑板指令组成,填充内存页起始到关键数据偏移,使用公式:相对偏移=(目标地址-UserPtr地址)%0x1000/2可得偏移为0x5F6,UserPtr可在windbg中如下图所示指令获得(需要加载符号)。

Ret2Libc为绕过DEP最主要的部分,我们将使用此技术修改0x0C0C0C0C处内存分页的属性为可执行从而让Payload顺利生效,具体详情见2.2.3

Payload部分略。

FillData为填充数据,由此部分将数据块填充到4KB,具体内容也是大量滑板指令。

根据前辈们的经验可知在XP SP3+IE8环境中,一个内存块大小为0x40000,并且有0x02的块启示与0x21的块结尾,故构造数据块时要在头尾预留出这两部分的大小。


2.2.3   Ret2Libc

       返回到库函数执行(Return to libc,Ret2Libc)是指利用系统自身存在的代码,来调用一些可以关闭DEP的函数,由于整个过程我们使用的全部都是系统自身的代码,因此不存在被DEP阻拦的情况,当我们的代码运行完毕后,DEP即失效,本例使用VirtualProtect函数修改内存页属性通过DEP

       首先我们需要一个可以将栈转移到我们可控内存空间的方法,我们将其称之为StackPivot的小构件(Gadgets),例如XCHG EAX,ESP指令,因为我们要利用的数据在上一步精准堆喷射被存放在0x0C0C0C0C,而EAX的值也是0x0C0C0C0CXCHG EAX,ESP后,ESP变为0X0C0C0C0C,即我们自己构筑了栈,后面的事就顺水推舟了。执行本处使用mona查找XCHG EAX,ESP;RETN,在windbg中输入!py mona find -s "\x94\xc3" -m msvcrt.dll

       

使用相同的方法在msvcrt.dll中找到RETNPOP XXX

RETN: 0x77C17A42

POP EBP0x77BF398F

       因为ECX=[ECX]=EAX=[EAX]=0C0C0C0C我们发现在溢出位置在这次构筑中无法完成攻击:


观察溢出点后发现幸好之后还有另一个可以利用的CALL

将栈溢出部分的数据由0C0C0C0Ch修改为0C0C0C08h使得EAXECX获得不同的值以避免RETN指令将0C0C0C0Ch作为返回地址。

       具体构建内容如下:

  

2.2.4  构筑执行链

VirtualProtect函数原型如下



[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
免费 1
支持
分享
赞赏记录
参与人
雪币
留言
时间
PLEBFE
为你点赞~
2022-7-27 02:16
打赏 + 5.00雪花
打赏次数 1 雪花 + 5.00
收起 
赞赏  CCkicker   +5.00 2017/07/18
最新回复 (6)
雪    币: 135
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
2017-7-15 11:09
0
雪    币: 2575
活跃值: (502)
能力值: ( LV6,RANK:85 )
在线值:
发帖
回帖
粉丝
3
文章不错的说
2017-7-15 12:29
0
雪    币: 292
活跃值: (850)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
4
感谢分享!
2017-7-16 19:37
0
雪    币: 2
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
不错的文章,谢谢分享
2017-7-17 11:26
0
雪    币: 6118
活跃值: (1217)
能力值: (RANK:30 )
在线值:
发帖
回帖
粉丝
6
  感谢分享
2017-7-25 10:00
0
雪    币: 7565
活跃值: (4917)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
感谢分享
2017-7-25 10:05
0
游客
登录 | 注册 方可回帖
返回

账号登录
验证码登录

忘记密码?
没有账号?立即免费注册