作者:failwest (failwest_at_gmail.com)
原文来源:安全焦点
把"Impossible"(不可能)变为"I’m possible"(我可以)仅仅只有一个符号的差别!
1.关于MS06-055被发现的简短历史
2006-09-19 CVE首先公布了这个0day并且命名为CVE-2006-4868.
网页中的内容也参考了一些其他著名安全站点的相关报告.
http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2006-4868
2006-09-19 11:14:35 美国计算机网络应急响应小组(US-CERT)首先公布了它,同时还给出了一些关于这个威胁的简短信息.
http://www.kb.cert.org/vuls/id/416092
http://www.us-cert.gov/cas/techalerts/TA06-262A.html
2006-09-19 NVD报告了它.
http://nvd.nist.gov/nvd.cfm?cvename=CVE-2006-4868
2006-09-20 第一个公开的0day利用程序(exploit)被来自XSEC组织的nop公布,并且迅速流传到互联网上.
http://www.xsec.org/index.php?module=releases&act=view&type=2&id=21
2006-09-20 中国安全公司--绿盟科技报告了这个威胁.
http://www.nsfocus.net/index.php?act=alert&do=view&aid=71
2006-09-22 中国计算机网络应急响应小组(CN-CERT)报告了这个0day.
http://www.cert.org.cn/articles/bulletin/common/2006092722944.shtml
2006-09-26 微软发布安全公告MS06-055(补丁编号为KB925486)
http://www.microsoft.com/technet/security/bulletin/ms06-055.mspx
2006-09-29 中国安全公司--启明星辰报告了这个威胁.
http://www.venustech.com.cn/tech/day/20060929/8369.htm
以上的简短历史向我们展示了计算机紧急响应的整个处理过程.我原来已听说
微软计划在2006年10月10日发布安全更新补丁.但随着0day在互联网上被公布,他们把这个时间在最后期限上提前了整整2周.
我们同时也能从这个简短历史中发现中国安全组织关注0day的速度,以及计算机紧急响应的速度并没有想象中那么快,除了绿盟科技.另外值得注意的是,中国教育和科研计算机网紧急响应组(CCERT:http://www.ccert.edu.cn)根本没有报告关于这个0day的任何信息!
2.威胁分析和利用
我们可以在美国计算机网络紧急响应小组或者微软技术站点上找到一些简短描述:
微软IE5.0及其以上版本支持矢量标记语言(VML),它是XML用于绘制矢量图形标签的一种设置.但IE不能很好的处理畸形VML标签,从而允许堆缓冲区溢出情况的发生.如果一个远程攻击者说服一个用户用IE去访问那个经过专门精心构造的网页,那么攻击者能够触发缓冲区溢出.此外,攻击者还可以发送一封HTML邮件或者引诱一个用户选择一个HTML文档.
根据简单的描述以及被来自xsec的nop公布的exploit,我亲自测试了这个漏洞.
问题出在vgx.dll,我们可以在这里找到它:C:/Program Files/Common Files/Microsoft Shared/VGX
或者C:/WINDOWS/system32/dllcache
如果你已经更新了系统中关于MS06-055的补丁,你将在这儿找到它:
C:/WINDOWS/$NtUninstallKB925486$
首先,我们可以用IDA打开它,溢出函数是:
_IE5_SHADETYPE_TEXT::Text(unsigned short const *, int)
在函数开始部分,“sub esp ,214h”, 创建了一个214H字节的堆缓冲区.当text()调用另一个函数ptok()时,一个缓冲区溢出可能被从HTML文件复制字符到堆缓冲区所触发.
我将给一个用于XP_SP2的存活期较长的调试例子.首先,你应该创建一个像这样的HTML文件:
然后另存为*.html,并且用IE打开它.这时,你就能看见你屏幕的一块被一个又大又黑的范围所覆盖.那就是被VML所绘制.
现在让我们来调试它.打开你的Ollydbg并选中IE,在函数text()的开始部分设置断点.在我的计算机中,函数内存地址显示的是0x6FF3ED46(具体情况可能会有所不同).我们可以用IDA得到函数地址并且按CTR+G即可到达那儿,然后按F2设置断点 :)
刷新页面,Ollydbg将在函数开头中断它.按F8继续单步执行,当执行到6FF3ED92时调用vgx.6FF3ECE6.
观察堆栈,一些Unicode字符 ‘Q’ 恰好在ESP后面被复制了进去!那就对了!函数
ptok()将在双引号之间以Unicode字符串形式复制字符.
在我的计算机中,堆栈结构是类似这样的:
0012BE70: 堆缓冲区中Unicode字符串的开始
0012C070: 安全Cookie
0012C074: EBP
0012C078: 返回地址
0012C084: 返回后的ESP
我们可以很容易的发现,用于放 Unicode字符串的实际缓冲区大小是0x200,也就是512字节,256个Unicode字符.但是ptok()函数要为Unicode字符串预留2字节空间,所以缓冲区最多只能容纳255个Unicode字符!
因此,出现了一个典型的堆溢出.我们可以在html中填充多于255个字符,字符将以Unicode形式被复制到堆栈中并且破坏返回地址.如果你有shellcode,你就能利用这个漏洞执行任何你想要IE执行的代码.
顺便说一下,如果你想开发你自己的shellcode,你得处理好一个问题,那就是如何通过ptok()函数把你的shellcode代码从ASCII单字节字符转换为Unicode双字节形式!为了开发它,ptok()会把像“邐”的字反转换为一个16进制数.比如:37008转换成16进制是0x9090,结果“邐”复制到堆栈后就变成了0x9090.
nop(人名)写了一个exploit,能成功运行在win2K平台,并且代码被公布在了互联网上.代码中的函数convert2ncr() 能帮你实现你自己的shellcode.
void convert2ncr(unsigned char * buf, int size)
{
int i=0;
unsigned int ncr = 0;
for(i=0; i<size; i+=2)//read a word
{
ncr = (buf[i+1] << 8) + buf[i];
fprintf(fp, "%d;", ncr);
}
}
3.XP-SP2系统中函数返回之前的Cookie安全
在Windows XP SP2系统上,危险组件(VGX.DLL)被缓冲区安全检测 (Buffer Security Check)位所编译.让我找出为什么XP SP2很难被攻击:
用IDA反汇编vgx.dll如下,我们检测这个函数
_IE5_SHADETYPE_TEXT::Text(unsigned short const *, int)
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
.text:6FF3ED46 ; _IE5_SHADETYPE_TEXT::Text(unsigned short const *, int)
.text:6FF3ED46 mov edi, edi
.text:6FF3ED48 push ebp
.text:6FF3ED49 mov ebp, esp
.text:6FF3ED4B sub esp, 214h
.text:6FF3ED51 mov eax, ___security_cookie
.text:6FF3ED56 and dword ptr [ecx], 0
.text:6FF3ED59 mov [ebp+4], eax
.text:6FF3ED5C mov eax, [ebp+arg_0]
………………..
.text:6FF3ED92 call _IE5_SHADETYPE_TEXT::TOKENS::Ptok
.text:6FF3ED97 test eax, eax
……………….
.text:6FF3EDB1 lea ecx, [ebp+var_210]
.text:6FF3EDB7 call _IE5_SHADETYPE_TEXT::TOKENS::Ptok
………………….
.text:6FF3EDDF mov ecx, [ebp+4]
.text:6FF3EDE2 call __security_check_cookie(x)
.text:6FF3EDE7 leave
.text:6FF3EDE8 retn 8
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
你可能发现,在函数开头出现一个存储器读取指令:
.text:6FF3ED51 mov eax, ___security_cookie
IDA把存储器地址0x6FF44160翻译为 “___security_cookie”. 在那之后值在.text:6FF3ED59 处被设置为[EBP+4] .函数.text:6FF3EDE2 的末尾,有一个检测EBP前的值是否改变的调用:
.text:6FF3EDE2 call __security_check_cookie(x)
如果EBP前的值与安全cookie的地址不同,则这个函数将会用一个错误来终止IE进程.只要IE启动,cookie地址.text:6FF3ED59 就被定位在vgx.dll数据节,并且每时每刻都在变化.要溢出返回值的话, [ebp+4]中的内容必须首先被重写.综上所述,XP SP2平台很难利用.
尽管如此,使用技巧绕过缓冲区安全检测的exploits也被公开可用.如果你有什么挑战XP SP2的独特见解,请联系我.与你讨论将使我倍感荣幸!