7.6 KiB
Roman之家
{% hint style="success" %}
学习并练习AWS黑客技术:HackTricks培训AWS红队专家(ARTE)
学习并练习GCP黑客技术:HackTricks培训GCP红队专家(GRTE)
支持HackTricks
- 查看订阅计划!
- 加入 💬 Discord群组 或 电报群组 或 关注我们的 Twitter 🐦 @hacktricks_live.
- 通过向HackTricks和HackTricks Cloud github仓库提交PR来分享黑客技巧。
基本信息
这是一种非常有趣的技术,通过伪造的fastbins、unsorted_bin攻击和相对覆写实现RCE而不泄漏信息。然而,这已经被修复。
代码
目标
- 通过滥用相对指针实现RCE
要求
- 编辑fastbin和unsorted bin指针
- 必须暴力破解12位随机数(0.02%的成功几率)
攻击步骤
第一部分:Fastbin块指向__malloc_hook
创建几个块:
fastbin_victim
(0x60,偏移0):稍后用于编辑堆指针,使其指向LibC值。chunk2
(0x80,偏移0x70):用于良好的对齐main_arena_use
(0x80,偏移0x100)relative_offset_heap
(0x60,偏移0x190):在'main_arena_use'块上的相对偏移
然后释放main_arena_use
,这将将此块放入未排序列表,并在fd
和bk
指针中获取指向main_arena + 0x68
的指针。
现在分配一个新的块fake_libc_chunk(0x60)
,因为它将包含fd
和bk
中指向main_arena + 0x68
的指针。
然后释放relative_offset_heap
和fastbin_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_victim
的fd
指针。
然后,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
。
参考资料
- https://github.com/shellphish/how2heap
- https://github.com/shellphish/how2heap/blob/master/glibc_2.23/house_of_roman.c
- https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/house_of_roman/
{% hint style="success" %}
学习并练习 AWS 黑客技术:HackTricks 培训 AWS 红队专家 (ARTE)
学习并练习 GCP 黑客技术:HackTricks 培训 GCP 红队专家 (GRTE)
支持 HackTricks
- 查看 订阅计划!
- 加入 💬 Discord 群组 或 电报群组 或 关注 我们的 Twitter 🐦 @hacktricks_live。
- 通过向 HackTricks 和 HackTricks Cloud github 仓库提交 PR 来分享黑客技巧。