written by h4ckmp
http://t.qq.com/h4ckmp
欢迎讨论各种漏洞问题.
漏洞信息
Internet Explorer在打开攻击页面时,CMshtmlEd对象被删除并释放,且释放后的内存被重用,导致Use-After-Free.
受影响系统:
Microsoft Internet Explorer 9.x
Microsoft Internet Explorer 8.x
Microsoft Internet Explorer 7.x
发布时间:
2012-09-17
漏洞来源信息:
http://eromang.zataz.com/2012/09/16/zero-day-season-is-really-not-over-yet/
漏洞类型:
Use-After-Free
crash info
使用IE打开exploit.htm, 发生异常, 堆栈情况如下
漏洞分析
异常产生在CMshtmlEd::Exec(), 原因是由于objMshtmlEd被覆盖, 导致虚函数寻址调用时被控制
查看POC中代码, document.execCommand("SelectAll") 执行时会调用CBase::execCommand()函数, 第一个参数为要执行命令的字符串, 函数中会检查要执行的命令是否有效.
在mshtml!CEditRouter::ExecEditCommand.函数中会调用CEditRouter::SetInternalEditHandler来设置命令事件handler, 并创建一个MshtmlEd对象
mshtml!CEditRouter::SetInternalEditHandler函数内部调用mshtml!CDoc::GetHTMLEditor 获取页面中的Editor, 通过mshtml!CHTMLEditor::AddCommandTarget来创建并初始化一个命令事件.
int __stdcall CHTMLEditor::AddCommandTarget ( )
{
CMshtmlEd *pEd = new CMshtmlEd();
if ( (NULL != pEd) && pEd->Initialize() )
{
return CImplPtrAry::Append(pEd);
}
return 0x8007000E;
}
接着会执行事件Handler
在POC中 设置的selectAll的响应函数为 TestArray(), 且exeCommand执行的命令为selectAll
因此此处获取CSelectAllCommand对象, 并调用exec函数调用
TestArray()函数中的document.write("xxx") 会将document中vecObjMgr删除, 因此之前申请的CMshtmlEd 对象也会被删除.
当执行完selectAll命令时, objMshtmlEd的地址已被释放, 继续寻址导致程序异常. 且在TestArray()中parent.xxx.src = " AAAA\u0c08\u0c0cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA”, 刚好可以把Free掉的MshtmlEd对象地址占用, 以控制EIP执行任意代码.
漏洞利用
1、 利用msvcrt中的ROP Chain绕过DEP
2、 利用JRE中未开启ASLR的模块绕过DEP.
3、 利用JIT Spray喷射
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课
上传的附件: