House of Orange
Last updated
Last updated
学习和实践AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) 学习和实践GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
此补丁中修复了利用技术,因此不再有效(适用于2.26之前的版本)
滥用 malloc_printerr
函数
覆盖顶部块大小
Libc 和堆泄漏
从此示例的评论中获取了一些必要的背景信息:
问题在于,在旧版本的 libc 中,当调用 malloc_printerr
函数时,它会遍历存储在 _IO_list_all
中的 _IO_FILE
结构的列表,并实际上在该结构中执行指令指针。
这种攻击将伪造一个我们将写入**_IO_list_all
** 的假 _IO_FILE
结构,并导致 malloc_printerr
运行。
然后它将执行我们在_IO_FILE
结构的跳转表中存储的任何地址,我们将获得代码执行
攻击始于设法将顶部块置于未排序的 bin 中。这是通过使用大于当前顶部块大小但小于**mmp_.mmap_threshold
(默认为 128K)的大小调用 malloc
来实现的,否则会触发 mmap
分配。每当修改顶部块大小时,重要的是确保顶部块 + 其大小是页面对齐的,并且顶部块的prev_inuse** 位始终设置。
要将顶部块置于未排序的 bin 中,首先分配一个块以创建顶部块,然后更改顶部块大小(使用分配块中的溢出),使得顶部块 + 大小与prev_inuse 位设置为页面对齐。然后分配一个大于新顶部块大小的块。请注意,永远不会调用 free
来将顶部块放入未排序的 bin 中。
旧的顶部块现在位于未排序的 bin 中。假设我们可以从中读取数据(可能是由于导致溢出的漏洞),则可以从中泄漏 libc 地址并获取**_IO_list_all** 的地址。
通过滥用溢出将 topChunk->bk->fwd = _IO_list_all - 0x10
写入,执行未排序的 bin 攻击。当分配新块时,旧的顶部块将被拆分,并且指针将被写入**_IO_list_all
**。
下一步涉及将旧的顶部块的大小缩小以适应小 bin,具体设置其大小为0x61。这有两个目的:
插入到 Small Bin 4:当 malloc
扫描未排序的 bin 并看到此块时,由于其较小的大小,它将尝试将其插入到小 bin 4 中。这使得该块最终位于小 bin 4 列表的头部,该位置是我们通过未排序的 bin 攻击在**_IO_list_all
** 的块的 FD 指针的位置,因为我们通过未排序的 bin 攻击在**_IO_list_all
** 中写入了一个接近的地址。
触发 Malloc 检查:此块大小调整将导致 malloc
执行内部检查。当它检查虚假前向块的大小时,该大小将为零,触发错误并调用 malloc_printerr
。
对小 bin 的操作将允许您控制块的前向指针。与**_IO_list_all** 的重叠用于伪造一个假的**_IO_FILE** 结构。该结构经过精心设计,包括将 _IO_write_base
和 _IO_write_ptr
设置为在 libc 中通过内部检查的值。此外,在假结构内创建了一个跳转表,其中将指令指针设置为可以执行任意代码(例如 system
函数)的地址。
总结该技术的其余部分:
缩小旧的顶部块:将旧的顶部块的大小调整为0x61,以适应小 bin。
设置假的 _IO_FILE
结构:将旧的顶部块与当前位于未排序的 bin 中的假**_IO_FILE** 结构重叠,并适当设置字段以劫持执行流。
下一步涉及伪造一个与当前位于未排序的 bin 中的旧顶部块重叠的假**_IO_FILE** 结构。该结构的前几个字节经过精心设计,包括指向将执行的命令(例如 "/bin/sh")的指针。
在假**_IO_FILE** 结构中的关键字段,如 _IO_write_base
和 _IO_write_ptr
,设置为通过 libc 中的内部检查的值。此外,在假结构内创建了一个跳转表,其中将指令指针设置为可以执行任意代码的地址。通常,这将是 system
函数的地址或其他可以执行 shell 命令的函数的地址。
当调用 malloc
时,通过操纵**_IO_FILE** 结构触发代码执行,攻击达到高潮。这有效地允许执行任意代码,通常导致生成 shell 或执行其他恶意载荷。
攻击摘要:
设置顶部块:分配一个块并修改顶部块大小。
强制顶部块进入未排序的 bin:分配一个更大的块。
泄漏 libc 地址:使用漏洞从未排序的 bin 中读取数据。
执行未排序的 bin 攻击:使用溢出写入**_IO_list_all**。
缩小旧的顶部块:调整其大小以适应小 bin。
设置一个假的 _IO_FILE 结构:伪造一个假文件结构以劫持控制流。
触发代码执行:分配一个块以执行攻击并运行任意代码。
该方法利用堆管理机制、libc 信息泄漏和堆溢出来实现代码执行,而无需直接调用 free
。通过精心设计假的**_IO_FILE** 结构并将其放置在正确位置,攻击可以在标准内存分配操作期间劫持控制流。这使得执行任意代码成为可能,可能导致生成 shell 或其他恶意活动。
学习并练习 AWS 黑客技术:HackTricks 培训 AWS 红队专家 (ARTE) 学习并练习 GCP 黑客技术:HackTricks 培训 GCP 红队专家 (GRTE)