ms06-055漏洞-HeapSpray实战
ms06-055漏洞
漏洞介绍
微软的 IE5.0 以上的版本会支持一种向量标记语言(VML)来绘制图形。IE在解析畸形的VML 的时候会产生堆栈溢出的错误。如果利用者精心构造一个含有这样畸形的 VML 语句的网页,并骗取用户点击这样的网页,就可以利用 IE 在用户的机器上执行任意代码。
引起栈溢出的是 IE 的核心组件 vgx.dll。这个文件在 C:\Program Files\CommonFiles\Microsoft Shared\VGX 和 C:\WINDOWS\system32\dllcache 两个目录下。
实战环境
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由一般的(\xAA\xBB\xCC\xDD...)格式转换为(%uBBAA%uDDCC...)
用于转换shellcode的python代码如下:
def shellcode2js_string(shellcode):
""""""
new_shellcode =""
code_list = shellcode.split("\\x")
for i in xrange(1,len(code_list),2):
new_shellcode +="%u"+ code_list[i+1]+ code_list[i]
return new_shellcode
将构造好的JavaScript代码片段嵌入到之前的html文件中
双击html文件用IE打开,成功弹出消息框(shellcode出自《0day安全》一书)
扩展知识
html编码问题,文中的�,参考 http://blog.csdn.net/wangqi0079/article/details/9983439
JavaScript的unescape方法,参考 http://www.w3school.com.cn/jsref/jsref_unescape.asp