我对于ActiveX控件漏洞久仰已久,今天终于腾出时间学习一下,看了《0day》和《软件漏洞发掘》关于ActiveX这部分内容的讲解,以及网上一些博客的讲解,有了一定的了解。
总结了ActiveX漏洞挖掘的步骤:
1).判断是否属于远程类型的ActiveX控件
2).获得该控件的唯一标识。
3).找出该控件的向外提供的所有接口。
ActiveX控件必须在被调用函数其接口的情况下才会接收外部传递给它的数据信息。
4).修改测试网页模板,加入想要测试的函数接口或属性接口。
5).使用OD和浏览器进行漏洞发掘工作。
当调用ActiveX控件的外部函数接口或属性接口时,都是通过DispCallFunc函数的帮助,才能成功调用,首先找到这个函数。
对于ActiveX漏洞的挖掘离不开ComRaider这个利器。去年寒假被西电第一届的一道ActiveX溢出的题给难住了,正好今天拿来练手。
1. 首先要注册这个ActiveX控件。Regsvr32 exploit.dll
这个cmd要用管理员权限打开,否则会注册失败。
2.
用ComRaider打开exploit.dll,在左侧栏的绿色图标就是函数接口,点击会显示函数及其参数,右键选择Fuzz member,就对该函数生成测试用例,如下图
2. 单击“next”
3. 直接点击begin fuzz,出现下图,开始进行FUZZ测试
4. 经过对每一个函数进行FUZZ测试,发现LoadPage处发生了溢出异常
双击下方这一列,会出现具体的分析
可以发现EIP被“AAAA”覆盖,查看测试用例的内容可以发现,”AAAA”为测试用例中构造的过长字符串。
5. 此时找到了问题所在,照下图操作
选择Launch in Olly,此时打开OD进行调试,我们已经知道“当调用ActiveX控件的外部函数接口或属性接口是,都是通过DispCallFunc函数的帮助,才能成功调用,首先找到这个函数。”,所以首先找到DispCallFunc函数,设断点。
6. F9运行到DispCallFunc函数后,F8单步走,当执行到call ecx后程序崩溃,于是在此处下断点。
7. 重新加载,直接运行到此处,然后F7进入,发现了一个函数WideCharToMultiByte,
执行这个函数后栈空间就被’41414141”覆盖了栈的许多空间,这个就是导致溢出函数。然后执行下一个call,程序就有崩溃了,于是在此处设断点,重载后直接进入该函数。又进入exploit.10012d10 ,再进exploit.10013dc0,终于到了溢出点ret 0x8处
经过计算该处到数据开始总共用256个字节,修改一下测试用例检测一下。
当执行到ret 0x8时的栈状态为
找到了eip的位置,剩下的就是布置shellcode的位置了。浏览器是典型的双字节处理软件,所有的网页代码都会被处理为双字节的格式,会造成普通的shellcode不能用,有时候也无法指向存放shellcode的地址,这就需要利用heapspray的方法实现对cpu的控制,这就不在本文的讨论范围了。