CVE-2012-1889漏洞利用

本实验所需工具代码在我的GitHub上都能找到
GitHub : https://github.com/whu-enjoy/CVE-2012-1889

一 . 工具准备

这里写图片描述


二 . 实验环境搭建

实验系统 :
——Win7 SP1 专业版 (64位)
——IE 8.0.7601.17514
1. 从工具中将java6安装包解压出来,安装好java6,提供实验所需的未开启ASLR保护的DLL模块
2. 安装Windbg调试工具
3. 安装ImmunityDebugger,将mona插件复制到ImmunityDebugger的插件目录,我这里是
C:\Program Files (x86)\Immunity Inc\Immunity Debugger\PyCommands
4. 如果电脑上没有C语言编译器,可自行安装一种,因为安装包太大了,我的工具包里没提供.我用的是Visual C++ 6.0 Enterprise(这个软件与我win764位会提示不兼容,不过好像不影响使用)


三 . 漏洞检测与漏洞利用程序可行性测试

  1. 漏洞检测
    使用ie打开CVE-2012-1889-test-poc.html,网页提示
    这里写图片描述
    点击允许阻止的内容,过一会便可以看到程序出错,点击查看详情,可以看到是msxml3.dll这个模块出现的问题,异常偏移0x04e2d9,出现这个说明漏洞存在
    这里写图片描述

  2. 漏洞利用程序可行性检测
    使用ie打开CVE-2012-1889.html,网页提示
    这里写图片描述
    点击允许阻止的内容,过一会便可以看到成功弹出计算器,说明我们的shellcode被成功执行了,漏洞利用成功
    这里写图片描述


四 . 漏洞详情

  Microsoft XML Core Services (MSXML)是一组服务,可用JScript、VBScript、Microsoft开发工具编写的应用构建基于XML的Windows-native应用。
  Microsoft XML Core Services 3.0、4.0、5.0和6.0版本中存在漏洞,该漏洞源于访问未初始化内存位置。远程攻击者可利用该漏洞借助特制的web站点,执行任意代码或导致拒绝服务(内存破坏)。


五 . 漏洞触发过程

使用Windbg附加IE浏览器进程,注意,一般会有两个IE进程,一个是正打开CVE-2012-1889.html文件的进程,我们要附加的是另外一个IE进程,也就是图中下面那个进程
这里写图片描述

从前面的漏洞测试程序可以看到,异常是在msxml3.dll文件的偏移为0x04e2d9处,因为每次dll加载,基址都会变,所以每次下断点的地方都要随之改动.附加进程后,先使用bl看看断点信息,如果有断点,则先用bc+断点编号将所有断点清除,否则会显示断点所在的位置不存在..因为msxml3.dll,是在点击允许禁止的内容后加载的,所以使用sxe ld:msxml3.dll让程序在加载msxml3.dll的时候中断.然后g让ie正常运行
这里写图片描述

点击允许阻止的内容,可以看到程序中断在msxml3.dll加载时的地方.
这里写图片描述
可以看到msxml3.dll此时的模块基址是0x71ec0000,出现问题的偏移是0x04e2d9. 0x71ec0000+0x04e2d9 = 0x71f0e2d9处,使用u命令查看0x71f0e2d9附近的代码
这里写图片描述
可以看到在0x71f0e2cd处,程序将ebp-14h处的值赋值给eax,而在0x71f0e2d9处将eax的值所表示的地址的值赋值给ecx,因为ebp-14h处的值是没有初始化的,所以取值时会出错,报异常..
再继续往下看,在下面还有call dword ptr [ecx+18h] 和 call dword ptr [eax+8],也就是说,如果精心构造桟数据,那么将有可能在程序在执行到这两个call的时候控制程序的流程


六 . 漏洞利用实战

一 . 对于开启了ASLR的程序,模块在每次加载的时候,基址都会改变,所以针对地址随机化,一般采用以下几种攻击方式
1.基地址泄露漏洞,某个dll模块的某个内存地址的泄露,进而可以泄露该DLL的基地址,进而可以得到任意DLL的基地址

2.某些没有开启地址随机化的模块
当浏览器加载一个带try location.href = ‘ms-help://’ 语句的页面时,HXDS.DLL就会被加载,而该DLL并没有开启地址随机化
利用该方法的CVE-2013-3893, CVE2013-1347, CVE-2012-4969, CVE-2012-4792

3.堆喷射需要配合没有开启地址随机化的模块

4.覆盖部分返回地址
虽然模块加载基地址发生变化,但是各模块的入口点地址的低字节不变,只有高位变化
对于地址0×12345678,其中5678部分是固定的,如果存在缓冲区溢出,可以通过memcpy对后两个字节进行覆盖,可以将其设置为0×12340000 ~ 0x1234FFFF中的任意一个值。
如果通过strcpy进行覆盖,因为strcpy会复制末尾的结束符0×00,那么可以将0×12345678覆盖为0×12345600,或者0×12340001 ~ 0x123400FF。
部分返回地址覆盖,可以使得覆盖后的地址相对于基地址的距离是固定的,可以从基地址附近找可以利用的跳转指令。
这种方法的通用性不是很强,因为覆盖返回地址时栈上的Cookie会被破坏。不过具体问题具体分析,为了绕过操作系统的安全保护机制需要考虑各种各样的情况。

5.java Applet Spray:Java Applet中动态申请中动态申请的内存空间具有可执行属性,可在固定地址上分配滑板指令(如Nop和ShellCode),然后挑转到上面地址执行。和常规的HeapSpray不同,Applet申请空间的上限为100MB,而常规的HeapSpray可以达到1GB

6.just in Time Compliation(JIT)即时编译,也就是解释器(如python解释器),主要思

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值