hacktricks/binary-exploitation/libc-heap/house-of-roman.md

7.6 KiB
Raw Permalink Blame History

Roman之家

{% hint style="success" %} 学习并练习AWS黑客技术HackTricks培训AWS红队专家ARTE
学习并练习GCP黑客技术HackTricks培训GCP红队专家GRTE

支持HackTricks
{% endhint %}

基本信息

这是一种非常有趣的技术通过伪造的fastbins、unsorted_bin攻击和相对覆写实现RCE而不泄漏信息。然而这已经被修复

代码

目标

  • 通过滥用相对指针实现RCE

要求

  • 编辑fastbin和unsorted bin指针
  • 必须暴力破解12位随机数0.02%的成功几率)

攻击步骤

第一部分Fastbin块指向__malloc_hook

创建几个块:

  • fastbin_victim0x60偏移0稍后用于编辑堆指针使其指向LibC值。
  • chunk20x80偏移0x70用于良好的对齐
  • main_arena_use0x80偏移0x100
  • relative_offset_heap0x60偏移0x190在'main_arena_use'块上的相对偏移

然后释放main_arena_use,这将将此块放入未排序列表,并在fdbk指针中获取指向main_arena + 0x68的指针。

现在分配一个新的块fake_libc_chunk(0x60),因为它将包含fdbk中指向main_arena + 0x68的指针。

然后释放relative_offset_heapfastbin_victim

/*
Current heap layout:
0x0:   fastbin_victim       - size 0x70
0x70:  alignment_filler     - size 0x90
0x100: fake_libc_chunk      - size 0x70 (contains a fd ptr to main_arena + 0x68)
0x170: leftover_main        - size 0x20
0x190: relative_offset_heap - size 0x70

bin layout:
fastbin:  fastbin_victim -> relative_offset_heap
unsorted: leftover_main
*/
  • fastbin_victim有一个fd指向relative_offset_heap
  • relative_offset_heap是从fake_libc_chunk的距离偏移量,其中包含一个指向main_arena + 0x68的指针
  • 只需更改fastbin_victim.fd的最后一个字节,就可以使fastbin_victim指向main_arena + 0x68

对于前面的操作,攻击者需要能够修改fastbin_victimfd指针。

然后,main_arena + 0x68并不那么有趣,所以让我们修改它,使指针指向**__malloc_hook**。

请注意,__memalign_hook通常以0x7f开头,然后是零,因此可以将其伪装成0x70快速分配块中的一个值。由于地址的最后4位是随机的,有2^4=16种可能性使得值最终指向我们感兴趣的位置。因此在这里执行BF攻击使得块最终如下0x70: fastbin_victim -> fake_libc_chunk -> (__malloc_hook - 0x23)

(有关其余字节的更多信息,请查看how2heap中的解释。如果BF攻击不起作用程序将崩溃因此请重新开始直到成功

然后执行2次malloc以移除前两个初始快速分配块然后分配第三个以获得一个位于**__malloc_hook:**的块。

malloc(0x60);
malloc(0x60);
uint8_t* malloc_hook_chunk = malloc(0x60);

第2部分未排序块攻击

有关更多信息,请查看:

{% content-ref url="unsorted-bin-attack.md" %} unsorted-bin-attack.md {% endcontent-ref %}

但基本上它允许通过在chunk->bk中指定的位置写入main_arena + 0x68。对于攻击,我们选择__malloc_hook。然后,在覆盖它之后,我们将使用相对覆盖来指向一个one_gadget

为此,我们开始获取一个块并将其放入未排序块中:

uint8_t* unsorted_bin_ptr = malloc(0x80);
malloc(0x30); // Don't want to consolidate

puts("Put chunk into unsorted_bin\n");
// Free the chunk to create the UAF
free(unsorted_bin_ptr);

利用此块中的UAF指向unsorted_bin_ptr->bk__malloc_hook的地址(我们之前进行了暴力破解)。

{% hint style="danger" %} 请注意,此攻击会破坏未排序的 bin因此也会影响 small 和 large。因此我们现在只能使用来自 fast bin 的分配(更复杂的程序可能会进行其他分配并崩溃),要触发此操作,我们必须分配相同大小,否则程序会崩溃。 {% endhint %}

因此,要触发在 __malloc_hook 中执行 main_arena + 0x68 的写入,我们在将 __malloc_hook 设置为 unsorted_bin_ptr->bk 后,只需要执行:malloc(0x80)

步骤 3将 __malloc_hook 设置为 system

在第一步中,我们控制了一个包含 __malloc_hook 的块(在变量 malloc_hook_chunk 中),在第二步中,我们成功将 main_arena + 0x68 写入其中。

现在,我们利用 malloc_hook_chunk 中的部分覆盖,使用我们在那里写入的 libc 地址(main_arena + 0x68)来指向一个 one_gadget 地址

这就是需要暴力破解 12 位随机性(更多信息请参考 how2heap示例)。

最后,一旦正确的地址被覆盖,调用 malloc 并触发 one_gadget

参考资料

{% hint style="success" %} 学习并练习 AWS 黑客技术:HackTricks 培训 AWS 红队专家 (ARTE)
学习并练习 GCP 黑客技术:HackTricks 培训 GCP 红队专家 (GRTE)

支持 HackTricks
{% endhint %}