House of Orange
Reading time: 8 minutes
tip
学习和实践 AWS 黑客技术:HackTricks Training AWS Red Team Expert (ARTE)
学习和实践 GCP 黑客技术:HackTricks Training GCP Red Team Expert (GRTE)
支持 HackTricks
- 查看 订阅计划!
- 加入 💬 Discord 群组 或 Telegram 群组 或 在 Twitter 🐦 上关注我们 @hacktricks_live.
- 通过向 HackTricks 和 HackTricks Cloud GitHub 仓库提交 PR 来分享黑客技巧。
基本信息
代码
- 在 https://github.com/shellphish/how2heap/blob/master/glibc_2.23/house_of_orange.c 找到一个示例
- 该利用技术在这个 补丁 中被修复,因此现在不再有效(在 2.26 之前有效)
- 同样的示例 带有更多注释 在 https://guyinatuxedo.github.io/43-house_of_orange/house_orange_exp/index.html
目标
- 滥用
malloc_printerr
函数
要求
- 覆盖顶部块大小
- Libc 和堆泄漏
背景
一些来自 这个示例** 的必要背景:**
问题是,在旧版本的 libc 中,当调用 malloc_printerr
函数时,它会 遍历存储在 _IO_list_all
中的 _IO_FILE
结构的列表,并实际 执行 该结构中的指令指针。
这个攻击将伪造一个 假的 _IO_FILE
结构,我们将写入 _IO_list_all
,并导致 malloc_printerr
运行。
然后它将 执行我们在 _IO_FILE
结构跳转表中存储的任何地址,我们将获得代码执行。
攻击
攻击开始于成功获取 未排序的块 中的 顶部块。这是通过调用 malloc
,其大小大于当前顶部块大小但小于 mmp_.mmap_threshold
(默认是 128K)来实现的,否则会触发 mmap
分配。每当顶部块大小被修改时,确保 顶部块 + 其大小 是页面对齐的,并且顶部块的 prev_inuse 位始终被设置是很重要的。
为了获取未排序块中的顶部块,分配一个块以创建顶部块,改变顶部块大小(通过分配的块中的溢出),使得 顶部块 + 大小 与 prev_inuse 位设置为页面对齐。然后分配一个大于新顶部块大小的块。请注意,free
从未被调用以将顶部块放入未排序块中。
旧的顶部块现在在未排序块中。假设我们可以读取其中的数据(可能是由于导致溢出的漏洞),可以从中泄漏 libc 地址并获取 _IO_list_all 的地址。
通过滥用溢出写入 topChunk->bk->fwd = _IO_list_all - 0x10
来执行未排序块攻击。当分配一个新块时,旧的顶部块将被拆分,并且指向未排序块的指针将被写入 _IO_list_all
。
下一步是将旧顶部块的大小缩小以适应小块,特别是将其大小设置为 0x61。这有两个目的:
- 插入到小块 4:当
malloc
扫描未排序块并看到这个块时,由于其小尺寸,它将尝试将其插入到小块 4。这使得该块最终位于小块 4 列表的头部,这是我们通过未排序块攻击在_IO_list_all
中写入的块的 FD 指针的位置。 - 触发 malloc 检查:这个块大小的操作将导致
malloc
执行内部检查。当它检查虚假前向块的大小时,该大小将为零,触发错误并调用malloc_printerr
。
小块的操作将允许你控制块的前向指针。与 _IO_list_all 的重叠用于伪造一个假的 _IO_FILE 结构。该结构经过精心设计,以包含关键字段,如 _IO_write_base
和 _IO_write_ptr
,设置为通过 libc 内部检查的值。此外,在假结构中创建一个跳转表,其中指令指针设置为可以执行任意代码的地址(例如,system
函数)。
总结该技术的其余部分:
- 缩小旧顶部块:将旧顶部块的大小调整为 0x61 以适应小块。
- 设置假的
_IO_FILE
结构:将旧顶部块与假的 _IO_FILE 结构重叠,并适当地设置字段以劫持执行流。
下一步涉及伪造一个与当前在未排序块中的旧顶部块重叠的假 _IO_FILE 结构。该结构的前几个字节经过精心设计,以包含指向将被执行的命令(例如,"/bin/sh")的指针。
假 _IO_FILE 结构中的关键字段,如 _IO_write_base
和 _IO_write_ptr
,被设置为通过 libc 内部检查的值。此外,在假结构中创建一个跳转表,其中指令指针设置为可以执行任意代码的地址。通常,这将是 system
函数的地址或其他可以执行 shell 命令的函数。
当调用 malloc
触发通过操控的 _IO_FILE 结构执行代码时,攻击达到高潮。这有效地允许任意代码执行,通常导致生成一个 shell 或执行其他恶意负载。
攻击总结:
- 设置顶部块:分配一个块并修改顶部块大小。
- 强制顶部块进入未排序块:分配一个更大的块。
- 泄漏 libc 地址:利用漏洞从未排序块读取。
- 执行未排序块攻击:使用溢出写入 _IO_list_all。
- 缩小旧顶部块:调整其大小以适应小块。
- 设置假 _IO_FILE 结构:伪造假文件结构以劫持控制流。
- 触发代码执行:分配一个块以执行攻击并运行任意代码。
这种方法利用堆管理机制、libc 信息泄漏和堆溢出来实现代码执行,而无需直接调用 free
。通过精心构造假 _IO_FILE 结构并将其放置在正确的位置,攻击可以在标准内存分配操作期间劫持控制流。这使得执行任意代码成为可能,可能导致生成 shell 或其他恶意活动。
参考
- https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/house_of_orange/
- https://guyinatuxedo.github.io/43-house_of_orange/house_orange_exp/index.html
tip
学习和实践 AWS 黑客技术:HackTricks Training AWS Red Team Expert (ARTE)
学习和实践 GCP 黑客技术:HackTricks Training GCP Red Team Expert (GRTE)
支持 HackTricks
- 查看 订阅计划!
- 加入 💬 Discord 群组 或 Telegram 群组 或 在 Twitter 🐦 上关注我们 @hacktricks_live.
- 通过向 HackTricks 和 HackTricks Cloud GitHub 仓库提交 PR 来分享黑客技巧。