ms06-055漏洞-HeapSpray实战

ms06-055漏洞

漏洞介绍

微软的 IE5.0 以上的版本会支持一种向量标记语言(VML)来绘制图形。IE在解析畸形的VML 的时候会产生堆栈溢出的错误。如果利用者精心构造一个含有这样畸形的 VML 语句的网页,并骗取用户点击这样的网页,就可以利用 IE 在用户的机器上执行任意代码。

引起栈溢出的是 IE 的核心组件 vgx.dll。这个文件在 C:Program FilesCommonFilesMicrosoft SharedVGX 和 C:WINDOWSsystem32dllcache 两个目录下。

实战环境

windows 2000 sp4 + IE5.0

第一步 验证栈溢出漏洞

首先将ollydbg注册为及时调试器。
根据已有的漏洞信息,构造恶意HTML文件



双击html文件,由IE打开后,ollydbg被呼叫出来,说明IE已经崩溃



崩溃地址:0x659d7bc6
IDA中查看地址,位于函数_IE5_SHADETYPE_TEXT::Text



简单分析一下_IE5_SHADETYPE_TEXT::Text函数,下图为函数栈的内存分布。
进入_IE5_SHADETYPE_TEXT::Text函数后,首先将arg:buffer、arg:buff_len复制到新对象的this和this+4处,this+8(copyed_len)初始化为0,之后调用函数_IE5_SHADETYPE_TEXT::TOKENS::Ptok。
在_IE5_SHADETYPE_TEXT::TOKENS::Ptok函数中,将this(src_buff)指向的缓冲区内容复制到以this+c(dst_buff)为起始地址的栈缓冲区中,且没有对src_buff的长度src_len做任何限制,当src_buff长度达到208h时,_IE5_SHADETYPE_TEXT::Text的返回地址便会被覆盖。
复制的缓冲区内容就是上面构造的恶意HTML文件中<v:fill >method属性中的字符串。



崩溃地址处的指令为(mov [eax],edi),eax对应的地址为EBP-4(var_4)



ollydbg中可以看到,崩溃时eax = 0x0C0C0C0C,并且返回地址也被覆盖为0x0C0C0C0C。
到这里,便完成了栈溢出漏洞的验证,下一步使用HeapSpray技术利用漏洞。


第二步 使用Heapspray技术利用漏洞

Heapspray技术的思想是在堆中填充大量的数据块,数据块由大量的"nop指令"和shellcode组成,利用其它漏洞将EIP指向预计被填充了特殊数据块的地址,只要EIP落到了任意数据块的"nop指令"序列中,便会成功执行shellcode。
在IE浏览器中,一般使用JavaScript向堆中填充数据块。
JavaScript代码片段如下:



为了适应JavaScript的字符串存储方式,代码中的shellcode由一般的(xAAxBBxCCxDD...)格式转换为(%uBBAA%uDDCC...)
用于转换shellcode的python代码如下:


  1. def shellcode2js_string(shellcode):
  2. """"""
  3. new_shellcode =""
  4. code_list = shellcode.split("\x")
  5. for i in xrange(1,len(code_list),2):
  6. new_shellcode +="%u"+ code_list[i+1]+ code_list[i]
  7. return new_shellcode

将构造好的JavaScript代码片段嵌入到之前的html文件中



双击html文件用IE打开,成功弹出消息框(shellcode出自《0day安全》一书)


扩展知识

html编码问题,文中的&#x0c0c0c0c,参考 http://blog.csdn.net/wangqi0079/article/details/9983439
JavaScript的unescape方法,参考 http://www.w3school.com.cn/jsref/jsref_unescape.asp





原文地址:https://www.cnblogs.com/Wrong-Side/p/4364150.html