7.9 KiB
House of Orange
从零开始学习AWS黑客技术,成为专家 htARTE(HackTricks AWS Red Team Expert)!
支持HackTricks的其他方式:
- 如果您想看到您的公司在HackTricks中做广告或下载PDF格式的HackTricks,请查看订阅计划!
- 获取官方PEASS & HackTricks周边产品
- 探索PEASS家族,我们的独家NFTs
- 加入 💬 Discord群 或 电报群 或在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_list_all
的假_IO_FILE
结构,并导致malloc_printerr
运行。
然后它将执行我们在_IO_FILE
**结构的跳转表中存储的任何地址,我们将获得代码执行
攻击
攻击始于设法将顶部块置于未排序的块内。这是通过使用大于当前顶部块大小但小于**mmp_.mmap_threshold
(默认为128K)的大小调用malloc
来实现的,否则会触发mmap
分配。每当修改顶部块大小时,重要的是确保顶部块+其大小是页面对齐的,并且顶部块的prev_inuse**位始终设置。
要将顶部块置于未排序的块内,首先分配一个块以创建顶部块,然后更改顶部块大小(使用分配块中的溢出),使得顶部块+大小与页面对齐且prev_inuse位设置。然后分配一个大于新顶部块大小的块。请注意,永远不会调用free
以将顶部块放入未排序的块中。
现在旧的顶部块位于未排序的块中。假设我们可以从中读取数据(可能是由于导致溢出的漏洞),则可以从中泄漏libc地址并获取**_IO_list_all**的地址。
通过滥用溢出将topChunk->bk->fwd = _IO_list_all - 0x10
写入,执行未排序的块攻击。当分配新块时,旧的顶部块将被拆分,并且指针将被写入**_IO_list_all
**。
下一步涉及将旧的顶部块的大小缩小以适应小块,具体设置其大小为0x61。这有两个目的:
- 插入到Small Bin 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
从零开始学习 AWS 黑客技术,成为专家 htARTE(HackTricks AWS 红队专家)!
支持 HackTricks 的其他方式:
- 如果您想在 HackTricks 中看到您的 公司广告 或 下载 PDF 版本的 HackTricks,请查看 订阅计划!
- 获取 官方 PEASS & HackTricks 商品
- 探索 PEASS 家族,我们的独家 NFTs
- 加入 💬 Discord 群组 或 电报群组 或 关注 我们的 Twitter 🐦 @hacktricks_live。
- 通过向 HackTricks 和 HackTricks Cloud github 仓库提交 PR 来分享您的黑客技巧。