House of Roman
Last updated
Last updated
学习并练习AWS黑客技术:HackTricks培训AWS红队专家(ARTE) 学习并练习GCP黑客技术:HackTricks培训GCP红队专家(GRTE)
这是一种非常有趣的技术,通过伪造的fastbins、unsorted_bin攻击和相对覆写实现RCE而不泄漏信息。然而,这已经被修复。
通过滥用相对指针实现RCE
编辑fastbin和unsorted bin指针
必须暴力破解12位随机数(0.02%的成功几率)
创建几个块:
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
。
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:
**的块。
有关更多信息,请查看:
但基本上它允许通过在chunk->bk
中指定的位置写入main_arena + 0x68
。对于攻击,我们选择__malloc_hook
。然后,在覆盖它之后,我们将使用相对覆盖来指向一个one_gadget
。
为此,我们开始获取一个块并将其放入未排序块中:
利用此块中的UAF指向unsorted_bin_ptr->bk
到__malloc_hook
的地址(我们之前进行了暴力破解)。
请注意,此攻击会破坏未排序的 bin(因此也会影响 small 和 large)。因此,我们现在只能使用来自 fast bin 的分配(更复杂的程序可能会进行其他分配并崩溃),要触发此操作,我们必须分配相同大小,否则程序会崩溃。
因此,要触发在 __malloc_hook
中执行 main_arena + 0x68
的写入,我们在将 __malloc_hook
设置为 unsorted_bin_ptr->bk
后,只需要执行:malloc(0x80)
在第一步中,我们控制了一个包含 __malloc_hook
的块(在变量 malloc_hook_chunk
中),在第二步中,我们成功将 main_arena + 0x68
写入其中。
现在,我们利用 malloc_hook_chunk
中的部分覆盖,使用我们在那里写入的 libc 地址(main_arena + 0x68
)来指向一个 one_gadget
地址。
这就是需要暴力破解 12 位随机性(更多信息请参考 how2heap 的示例)。
最后,一旦正确的地址被覆盖,调用 malloc
并触发 one_gadget
。
学习并练习 AWS 黑客技术:HackTricks 培训 AWS 红队专家 (ARTE) 学习并练习 GCP 黑客技术:HackTricks 培训 GCP 红队专家 (GRTE)