写在前面欢迎来到 Week12 的收官之战在过去四篇中我们分别精讲了 House of Botcake、House of Pig、House of Corrosion 以及 House of Apple/Tangerine。这些现代高阶技术如同散落的珍珠今天我们将用一根名为“实战”的线将它们串联起来。我们将模拟一道典型的 glibc 2.34 CTF PWN 题无 Hook、有 UAF完整复盘从漏洞触发到 Getshell 的全链路利用过程。此外我们还将简要探讨规划中提及的另一大重器——House of Cat。 目录实战背景glibc 2.34 下的“绝境”第一阶段破冰与信息泄露第二阶段伪造 IO 结构与劫持_IO_list_all第三阶段House of Apple 触发与 Getshell扩展精讲House of Cat——极致的 Largebin 级联利用Week 12 总结与展望1. 实战背景glibc 2.34 下的“绝境”题目模拟环境Glibc 版本2.34__free_hook和__malloc_hook已被彻底移除Tcache 引入 Safe-Linking 和 Key 校验。保护机制Full RELRO, PIE, NX, Stack Canary。漏洞点菜单题Add,Delete,Show,Edit。Delete函数存在UAF释放后未置空指针。限制只能Show一次Edit只能修改 allocated 状态的 chunk不能直接修改 free 状态的 chunk无法直接进行 Tcache Poisoning。在这个环境下传统的 Hook 劫持全部失效且由于不能直接编辑 free 块我们需要先制造堆重叠才能获得修改 Tcache 链表的能力。2. 第一阶段破冰与信息泄露面对无法直接修改 free 块的限制House of Botcake是获取原语的不二之选。步骤 1布置堆块与双重释放分配 9 个大小为0x100的 chunkA到II用于防合并。释放A到G填满 Tcache[0x100]。释放HH进入 Unsorted Bin。分配 7 次清空 Tcache。释放GG进入 Tcache。再次释放H。由于H在 Unsorted Bin 中没有 Tcache Key它绕过检查再次进入 Tcache。此时H同时存在于 Tcache 和 Unsorted Bin。步骤 2泄露 Libc 与堆地址7. 利用 UAF 漏洞Show(H)。由于H在 Unsorted Bin 中其fd指针指向main_arena96成功泄露 Libc 基址。8. 利用 UAF 漏洞Show(G)。由于G是 Tcache 链表尾其加密后的next指针为0 ^ (G_addr 12)成功泄露堆地址密钥用于绕过 Safe-Linking。3. 第二阶段伪造 IO 结构与劫持_IO_list_all现在我们拥有了 Libc 和堆地址且H在 Tcache 中。接下来的目标是劫持_IO_list_all并布置 FSOP 数据。步骤 3获取任意地址写原语由于H同时在 Unsorted Bin我们可以通过malloc(0xf8)将其从 Unsorted Bin 中取回此时它被标记为 allocated。现在可以使用Edit(H)修改其内容了。我们将H的 Tcachenext指针修改为加密后的_IO_list_all - 0x10假设我们打算用 fastbin 越界写或者直接利用 Tcache 将伪造结构分配过去。*更现代的做法*利用 Tcache Poisoning 直接分配到_IO_list_all所在的地址将其内容覆盖为指向我们伪造的IO_FILE_plus的堆地址。但这通常需要较大的写入空间。*结合 House of Corrosion*如果在 glibc 2.34 下我们可以先分配到global_max_fast将其改大然后利用 fastbin 越界将堆地址写入_IO_list_all。步骤 4布置伪造的 IO_FILE_plus假设我们利用上述手段成功让_IO_list_all指向了堆上的chunk_FakeIO。我们在chunk_FakeIO上布置House of Apple 2的结构_flags: 设置为0x800(包含/bin/sh\x00的一部分绕过检查)。_IO_write_base:0。_IO_write_ptr:0x1。_wide_data: 指向另一个堆块chunk_Wide。vtable: 指向_IO_wfile_jumps。在chunk_Wide上布置_IO_wide_data结构_IO_buf_base:0。_wide_vtable: 指向chunk_FakeVtable。在chunk_FakeVtable上偏移0x68处__doallocate位置写入system的真实地址。4. 第三阶段House of Apple 触发与 Getshell步骤 5触发 FSOP一切就绪此时程序的退出路径将决定我们的成败。调用程序的Exit功能或者直接让main函数return 0。glibc 执行exit()-_IO_flush_all_lockp()。遍历_IO_list_all遇到我们伪造的chunk_FakeIO。由于_IO_write_ptr _IO_write_base调用vtable-overflow即_IO_wfile_overflow。进入_IO_wfile_overflow后检查_wide_data-_IO_buf_base 0触发_IO_wdoallocbuf。在_IO_wdoallocbuf中调用_wide_data-_wide_vtable-__doallocate。最终执行system(chunk_FakeIO)。由于chunk_FakeIO的开头是_flags字段我们将其设置为包含sh或/bin/sh的字符串成功 GetshellUAF 漏洞House of Botcake 制造重叠H 同时在 Tcache 和 Unsorted Bin泄露 Libc 与堆地址利用 Tcache Poisoning / Corrosion劫持 _IO_list_all 指向堆块在堆上伪造 IO_FILE_plus布置 House of Apple 2 结构触发 exit / return调用 _IO_wfile_overflow -- _IO_wdoallocbuf执行 _wide_vtable[0x68] 即 systemGetshell5. 扩展精讲House of Cat——极致的 Largebin 级联利用在规划中我们还提到了House of Cat。这是 2023 年提出的一种基于 Largebin Attack 的全新 FSOP 变体常与 House of Apple 结合使用解决的是**“如何在没有 Tcache Poisoning 的情况下将伪造的堆地址写入_IO_list_all”**的问题。5.1 核心思想House of Cat 利用的是 glibc 在处理 Largebin 插入和切割时的指针解引用漏洞。当我们将一个 chunk 放入 Largebin 时如果通过漏洞修改了该 chunk 的fd_nextsize和bk_nextsize指针就可以在向 Largebin 插入新 chunk 时触发target_addr chunk_addr的任意地址写。5.2 与 Apple 的完美结合在 glibc 2.35 中Tcache 的检查极其严格有时候我们难以拿到修改 Tcachenext的机会。此时利用 Largebin Attack (House of Cat 的前置部分)直接将一个堆块地址写入_IO_list_all。这个被写入地址的堆块就是我们的伪造IO_FILE_plus结构体。随后直接调用exit触发 House of Apple 链。House of Cat 提供了一种比 Corrosion 更隐蔽的“装弹”方式成为了目前最高阶的堆利用组合拳之一。6. Week 12 总结与展望6.1 核心知识点总结本周我们深入现代堆利用的最前沿掌握了以下核心思维状态错位House of Botcake 利用 Tcache 和 Unsorted Bin 的机制差异在重重检查中撕开 Double Free 的口子是现代堆重叠的基石。越界涂鸦House of Corrosion 通过破坏global_max_fast将 fastbin 数组变成了覆盖 libc 数据段的画笔解决了全局指针劫持的难题。嵌套盲区House of Apple 发现了_wide_data内部虚表无校验的致命缺陷在 vtable 严格检查的时代重构了 FSOP 的执行路径。级联劫持House of Pig 和 House of Cat 展示了如何将不同机制TcacheIO_FILELargebinIO_FILE复合形成适应各种严苛环境的利用链。6.2 进阶展望堆漏洞利用的发展史就是一部攻防博弈史。从早期的直接覆盖指针到现代的复杂状态机劫持和结构体伪造防守方在增加检查攻击方在寻找未检查的角落。在接下来的学习中我们将暂时告别堆转向其他类型的漏洞利用如格式化字符串、内核 PWN 等。但请记住本周学到的“伪造结构体”和“寻找信任链断点”的思维将贯穿你整个安全研究的职业生涯。结语现代 CTF 堆题的解法往往不是单一的而是多种 House 技术的排列组合。理解每种技术的“前置条件”和“能提供的原语”你就能在面对未知题目时拼凑出属于自己的利用链。祝你在未来的 PWN 之路上无往不利
【学习记录】Week12(五):综合实战——从 UAF 到 House of Apple 的全链路破局
写在前面欢迎来到 Week12 的收官之战在过去四篇中我们分别精讲了 House of Botcake、House of Pig、House of Corrosion 以及 House of Apple/Tangerine。这些现代高阶技术如同散落的珍珠今天我们将用一根名为“实战”的线将它们串联起来。我们将模拟一道典型的 glibc 2.34 CTF PWN 题无 Hook、有 UAF完整复盘从漏洞触发到 Getshell 的全链路利用过程。此外我们还将简要探讨规划中提及的另一大重器——House of Cat。 目录实战背景glibc 2.34 下的“绝境”第一阶段破冰与信息泄露第二阶段伪造 IO 结构与劫持_IO_list_all第三阶段House of Apple 触发与 Getshell扩展精讲House of Cat——极致的 Largebin 级联利用Week 12 总结与展望1. 实战背景glibc 2.34 下的“绝境”题目模拟环境Glibc 版本2.34__free_hook和__malloc_hook已被彻底移除Tcache 引入 Safe-Linking 和 Key 校验。保护机制Full RELRO, PIE, NX, Stack Canary。漏洞点菜单题Add,Delete,Show,Edit。Delete函数存在UAF释放后未置空指针。限制只能Show一次Edit只能修改 allocated 状态的 chunk不能直接修改 free 状态的 chunk无法直接进行 Tcache Poisoning。在这个环境下传统的 Hook 劫持全部失效且由于不能直接编辑 free 块我们需要先制造堆重叠才能获得修改 Tcache 链表的能力。2. 第一阶段破冰与信息泄露面对无法直接修改 free 块的限制House of Botcake是获取原语的不二之选。步骤 1布置堆块与双重释放分配 9 个大小为0x100的 chunkA到II用于防合并。释放A到G填满 Tcache[0x100]。释放HH进入 Unsorted Bin。分配 7 次清空 Tcache。释放GG进入 Tcache。再次释放H。由于H在 Unsorted Bin 中没有 Tcache Key它绕过检查再次进入 Tcache。此时H同时存在于 Tcache 和 Unsorted Bin。步骤 2泄露 Libc 与堆地址7. 利用 UAF 漏洞Show(H)。由于H在 Unsorted Bin 中其fd指针指向main_arena96成功泄露 Libc 基址。8. 利用 UAF 漏洞Show(G)。由于G是 Tcache 链表尾其加密后的next指针为0 ^ (G_addr 12)成功泄露堆地址密钥用于绕过 Safe-Linking。3. 第二阶段伪造 IO 结构与劫持_IO_list_all现在我们拥有了 Libc 和堆地址且H在 Tcache 中。接下来的目标是劫持_IO_list_all并布置 FSOP 数据。步骤 3获取任意地址写原语由于H同时在 Unsorted Bin我们可以通过malloc(0xf8)将其从 Unsorted Bin 中取回此时它被标记为 allocated。现在可以使用Edit(H)修改其内容了。我们将H的 Tcachenext指针修改为加密后的_IO_list_all - 0x10假设我们打算用 fastbin 越界写或者直接利用 Tcache 将伪造结构分配过去。*更现代的做法*利用 Tcache Poisoning 直接分配到_IO_list_all所在的地址将其内容覆盖为指向我们伪造的IO_FILE_plus的堆地址。但这通常需要较大的写入空间。*结合 House of Corrosion*如果在 glibc 2.34 下我们可以先分配到global_max_fast将其改大然后利用 fastbin 越界将堆地址写入_IO_list_all。步骤 4布置伪造的 IO_FILE_plus假设我们利用上述手段成功让_IO_list_all指向了堆上的chunk_FakeIO。我们在chunk_FakeIO上布置House of Apple 2的结构_flags: 设置为0x800(包含/bin/sh\x00的一部分绕过检查)。_IO_write_base:0。_IO_write_ptr:0x1。_wide_data: 指向另一个堆块chunk_Wide。vtable: 指向_IO_wfile_jumps。在chunk_Wide上布置_IO_wide_data结构_IO_buf_base:0。_wide_vtable: 指向chunk_FakeVtable。在chunk_FakeVtable上偏移0x68处__doallocate位置写入system的真实地址。4. 第三阶段House of Apple 触发与 Getshell步骤 5触发 FSOP一切就绪此时程序的退出路径将决定我们的成败。调用程序的Exit功能或者直接让main函数return 0。glibc 执行exit()-_IO_flush_all_lockp()。遍历_IO_list_all遇到我们伪造的chunk_FakeIO。由于_IO_write_ptr _IO_write_base调用vtable-overflow即_IO_wfile_overflow。进入_IO_wfile_overflow后检查_wide_data-_IO_buf_base 0触发_IO_wdoallocbuf。在_IO_wdoallocbuf中调用_wide_data-_wide_vtable-__doallocate。最终执行system(chunk_FakeIO)。由于chunk_FakeIO的开头是_flags字段我们将其设置为包含sh或/bin/sh的字符串成功 GetshellUAF 漏洞House of Botcake 制造重叠H 同时在 Tcache 和 Unsorted Bin泄露 Libc 与堆地址利用 Tcache Poisoning / Corrosion劫持 _IO_list_all 指向堆块在堆上伪造 IO_FILE_plus布置 House of Apple 2 结构触发 exit / return调用 _IO_wfile_overflow -- _IO_wdoallocbuf执行 _wide_vtable[0x68] 即 systemGetshell5. 扩展精讲House of Cat——极致的 Largebin 级联利用在规划中我们还提到了House of Cat。这是 2023 年提出的一种基于 Largebin Attack 的全新 FSOP 变体常与 House of Apple 结合使用解决的是**“如何在没有 Tcache Poisoning 的情况下将伪造的堆地址写入_IO_list_all”**的问题。5.1 核心思想House of Cat 利用的是 glibc 在处理 Largebin 插入和切割时的指针解引用漏洞。当我们将一个 chunk 放入 Largebin 时如果通过漏洞修改了该 chunk 的fd_nextsize和bk_nextsize指针就可以在向 Largebin 插入新 chunk 时触发target_addr chunk_addr的任意地址写。5.2 与 Apple 的完美结合在 glibc 2.35 中Tcache 的检查极其严格有时候我们难以拿到修改 Tcachenext的机会。此时利用 Largebin Attack (House of Cat 的前置部分)直接将一个堆块地址写入_IO_list_all。这个被写入地址的堆块就是我们的伪造IO_FILE_plus结构体。随后直接调用exit触发 House of Apple 链。House of Cat 提供了一种比 Corrosion 更隐蔽的“装弹”方式成为了目前最高阶的堆利用组合拳之一。6. Week 12 总结与展望6.1 核心知识点总结本周我们深入现代堆利用的最前沿掌握了以下核心思维状态错位House of Botcake 利用 Tcache 和 Unsorted Bin 的机制差异在重重检查中撕开 Double Free 的口子是现代堆重叠的基石。越界涂鸦House of Corrosion 通过破坏global_max_fast将 fastbin 数组变成了覆盖 libc 数据段的画笔解决了全局指针劫持的难题。嵌套盲区House of Apple 发现了_wide_data内部虚表无校验的致命缺陷在 vtable 严格检查的时代重构了 FSOP 的执行路径。级联劫持House of Pig 和 House of Cat 展示了如何将不同机制TcacheIO_FILELargebinIO_FILE复合形成适应各种严苛环境的利用链。6.2 进阶展望堆漏洞利用的发展史就是一部攻防博弈史。从早期的直接覆盖指针到现代的复杂状态机劫持和结构体伪造防守方在增加检查攻击方在寻找未检查的角落。在接下来的学习中我们将暂时告别堆转向其他类型的漏洞利用如格式化字符串、内核 PWN 等。但请记住本周学到的“伪造结构体”和“寻找信任链断点”的思维将贯穿你整个安全研究的职业生涯。结语现代 CTF 堆题的解法往往不是单一的而是多种 House 技术的排列组合。理解每种技术的“前置条件”和“能提供的原语”你就能在面对未知题目时拼凑出属于自己的利用链。祝你在未来的 PWN 之路上无往不利