0%

House Of 系列(持续更新)

House Of Spirit

House Of Spirit 是一种 fastbin attack ,通过利用 free 函数来释放一个 fake chunk,将地址 free 到堆的 bin 链中,然后实现对栈地址的读写实现WAA

保护检查

  • fake chunk 的 ISMMAP 位不能为 1,因为 free 时,如果是 mmap 的 chunk,会单独处理
  • fake chunk 地址需要对齐, MALLOC_ALIGN_MASK
  • fake chunk 的 size 大小需要满足对应的 fastbin 的需求,同时也得对齐
  • fake chunk 的 next chunk 的大小不能小于 2 * SIZE_SZ,同时也不能大于av->system_mem
  • fake chunk 对应的 fastbin 链表头部不能是该 fake chunk,即不能构成 double free 的情况

主要是:当前chunk的size(chunk->size),和下一个chunk的size(nextchunk->size)

利用条件

  • 可以控制 free 的参数,把它改为 fake chunk data addr(House Of Spirit的核心)
  • 可以控制 fake chunk 的 size
  • 可以控制 next chunk 的 size(程序会根据 fake chunk->size 来获取 next chunk 的位置)

利用姿势

现成了两种风格:

  • 释放栈中的 fake chunk,劫持 ret 返回地址(利用栈溢出覆盖free的参数)
  • 释放堆中的 fake chunk,劫持控制模块实现WAA(需要注意chunk结构和off-by-one)

小技巧:

  • 一定要多多关注“可控区域”里的“数字”
  • 注意一些“计数器”

用这些现成的“数字”充当 nextchunk->size 或者 chunk->size

版本影响

libc-2.23:基础检查

libc-2.27:多了一个检查,nextchunk->presize 不为 0(注意 tcache 的影响)


House Of Force

house of force 是修改 top chunk size 的一种利用方法 ,利用 top chunk 分割中的漏洞来申请任意 chunk,再通过修改模块进行 GOT劫持,hook劫持

假设这个时候的 top_chunk=0x601200,然后 malloc(0xffe00020),然后对 malloc 申请的 size 进行检查,0xffe00030 < top_chunk_size ,所以可以成功malloc内存,然后计算top_chunk的新地址:0xffe00030+0x601200=0x100401230, 因为是x86环境,最高位溢出了,所以top_chunk=0x401230

然后下次我们再malloc的时候,返回的地址就是0x401238

保护检查

1
if ((unsigned long) (size) >= (unsigned long) (nb + MINSIZE)) 

只有 top chunk 的 size 大于等于申请的 size,才会有后续操作

利用条件

  • 用户能够篡改 top chunk 的 size 字段(篡改为负数或很大值)
  • 用户可以申请任意大小的堆内存(包括负数)
  • 堆溢出,用于修改 top chunk->size

利用姿势

  • 通过堆溢出将 top chunk 的 size 字段篡改成 -1(size 就变成了无符号整数中最大的值)
  • 计算偏移,申请大小为该偏移的chunk,把 top chunk 分割到可以修改的目标地址

以下公式可以用来计算偏移:(有时 offse 有偏差也可以进行修正)

1
2
3
offset = target_addr - (top_chunk_addr + 0x8) # 64位就改为"+0x10"
# target_addr:目标地址
# top_chunk_addr:top chunk起始地址

注意:offset 通常为负

版本影响

libc-2.23:基础检查,可以通过

libc-2.27:在检查中给chunk添加了一个“范围”(min_address & max_address),限制了申请chunk的地址范围,这样就导致 top chunk 无法分割到目标地址了,House Of Force 失效


House Of Einherjar

house of einherjar 跟 house of force 差不多,最终目的都是控制 top chunk 的值,该技术可以强制使得malloc返回一个几乎任意地址的 chunk

通过 off-by-one 把最后一个 chunk 的 pre_inuse 标志位置零,让 free 函数以为上一个 chunk 已经被 free,就会进行后向合并,根据 last chunk->fake presize 把 top chunk 合并到目标区域

然后下次我们再malloc的时候,返回的地址就是目标地址

保护检查

Unlink 的检测:检查 “fake chunk->size” (必须可以通过 size 索引到“last chunk”,并且P位为“0”,这样才会进行 unlink),因为“fake_size”(offset)很大,fake chunk 会被当做是 large chunk ,所以还会格外检查 FD,BK,FDsize,BKsize

利用条件

  • 用户能够篡改 top chunk 的 presize 字段(篡改为负数或很大值)
  • 有 off-by-one ,可以覆盖 last chunk 的P位为“\x00”(使其在和 top chunk 合并后还可以进行后向合并,通过“chunk->presize”索引到“fake chunk”把 top chunk 合并到“fake chunk”上)
  • 可以控制“fake chunk”

利用姿势

  • 已有两个 chunk(最后一个chunk,和倒数第二个chunk)
  • 在倒数第二个 chunk 的最后一片内存空间(lastchunk->presize)中写入 offset(可以索引到 fakechunk),同时溢出“\x00”覆盖 lastchunk 的P位(lastchunk->size)
  • 提前在 fake chunk 处伪造好数据:presize(offset),size,FD,BK,FDsize,BKsize
  • 释放 lastchunk,这样 top chunk 就会转移到该地址

以下公式可以用来计算偏移 presize:(有时 offse 有偏差也可以进行修正)

1
2
3
offset = lastchunk_addr - target_addr
# target_addr:目标地址
# lastchunk_addr:last chunk起始地址

小技巧:

  • 控制“fake chunk”,写入“fake_size”,在“FD,BK,FDsize,BKsize”中都写入“fake chunk addr”(target_addr)就可以通过检查(至少在 libc-2.23 是这样的)

版本影响

libc-2.23:基本没有影响,可以通过

libc-2.27:Unlink 对 presize 的检查更为严格了,导致 House Of Einherjar 失效


House Of Lore

House of Lore 攻击与 Glibc 堆管理中的 Small Bin 的机制紧密相关

它的利用面很小,很容易被其他攻击技术取代

  • House of Lore 可以实现 分配 任意指定位置的 chunk,从而修改任意地址的内存
  • House of Lore 利用的前提是需要控制 Small Bin Chunk 的bk指针,并且控制指定位置 chunk 的fd指针

保护检查

1
if (__glibc_unlikely (bck->fd != victim))

检查 fakechunk->FD 是不是 victim_chunk

利用条件

  • 可以构造 small bins(一般程序会用 fastbin,unsortedbin,tcache 很少用smallbin,largebin)
  • 程序可修改 small bins 中 free chunk 的 bk 指针
  • 对应伪造 fake chunk 的区域有一定控制权(可以伪造 fakechunk->FD 为 victim_chunk)

利用姿势

  • 首先申请了一个在 fastbin 范围内的 victim chunk,然后再在栈上构造了一个 fake chunk(fake chunk 为 stack_buffer_1,还需要一个 stack_buffer_2 来打掩护)
  • 为了绕过检测,设置 stack_buffer_1 的 BK 指针指向 stack_buffer_2,设置 stack_buffer_2 的 FD 指针指向 stack_buffer_1
  • 接下来先 malloc 一个chunk,防止 free 之后与 top chunk 合并,然后 free 掉 victim,这时候 victim 会被放到 fastbin 中
  • 接下来再去 malloc 一个 large chunk,会触发 fastbin 的合并,然后放到 unsorted bin 中,这样我们的 victim chunk 就放到了 unsorted bin 中,然后最终被 unsorted bin 分配到 small bin 中
  • 在 victim chunk 的BK指针中写入fake chunk(small bin是基于BK,从后向前申请的)
  • 再次申请 victim chunk(同时 fake chunk 进入small bin),最后申请 fake chunk

版本影响

libc-2.23:基础检查,可以通过

libc-2.27:基础检查,还需要绕过 cache

libc-2.31:House Of Lore 已经失效


House Of Orange

House Of Orange 核心就是通过漏洞利用获得 free 的效果

这种操作的原理简单来说是当前堆的 top chunk 尺寸不足以满足申请分配的大小的时候,原来的 top chunk 会被释放并被置入 unsorted bin 中,通过这一点可以在没有 free 函数情况下获取到 unsorted bins

后续可以配合 unsorted bin attack 和 FSOP 获取 shell

利用条件

  • 有堆溢出,可以修改 top chunk size
  • 可以申请较大的空间
  • 没有释放模块(看见程序没有 free,realloc等函数时,优先考虑打House Of Orange)

伪造的 top chunk size 的要求 :

  • 0x0fe1、0x1fe1、0x2fe1、0x3fe

利用姿势

  • 通过堆溢出修改 top chunk size为“0x0fe1”
  • 申请“0x2000”的空间

版本影响

libc-2.23:可用打通

libc-2.24:增加了 vtable check,但仍然可以绕过

libc-2.27:完全失效


House Of Rabbit

House Of Rabbit 是一种伪造堆块的技术,一般运用在 fastbin attack 中

  • 缺点:条件过多并且有替代选项(unlink攻击,Double free等等)
  • 优点:对 libc 版本的“抵抗力”很强,高 libc 版本也可以打

核心:利用 fastbin consolidate 使 fastbin 中的 fake chunk 合法化

利用条件

  • 修改fastbin chunk的大小(感觉和unlink条件差不多,效果也差不多)
    • 堆溢出(有时off-by-one也利用),可以覆盖 nextchunk->size
    • 可以申请足够大小的 chunk
    • 可以控制 free 的参数
  • 修改FD指针(这种情况不用考虑,因为可以打 Double free,除非特殊情况)
    • 有修改模块,并且有UAF(可以修改 free chunk)
    • 可以申请足够大小的 chunk
    • 可以控制 free 的参数

利用姿势

  • 修改fastbin chunk的大小:直接构造 overlap chunk,通过 fastbin consolidate 使其合法化
  • 修改FD指针:让 chunk->FD 指向一个 fake chunk,触发 fastbin consolidate 之后让这个 fake chunk 成为一个合法的 chunk(注意一下fake chunk的排列,不然会在consolidate时报错)

版本影响

经测试:libc-2.23 ~ libc-2.31 都可以打通


House Of Roman

House of Roman 的一个核心思路就是利用 局部写 减少随机化的程度,从而给出爆破的可能

这种利用手法的主要特点是不需要 leak libc的地址,用于 bypass ALSR,利用 12-bit 的爆破来达到获取 shell 的目的,且仅仅只需要一个 UAF 漏洞以及能创建任意大小的 chunk 的情况下,就能完成利用(当然也可以来绕 PIE)

当程序没法泄露 libc_base 时,就会优先考虑 House Of Roman

利用条件

  • UAF(对 fastbin 中的“main_arena+xx”进行修改,使其指向目标地址)
  • off-by-one(覆写“size”的大小,为了使保留有“main_arena+xx”进入fastbin)

利用姿势

  • 利用 off-by-one 把原本不可能进入 fastbin 的 unsorted chunk 进行修改(修改 size 到 fastbin 的范围),使遗留有“main_arena+xx”的chunk进入 fastbin
  • 利用 UAF 修改遗留在 fast chunk 中的“main_arena+xx”,使其指向目标地址

版本影响

House Of Roman 并不依赖于 libc 源码,它的思想完全可以独立使用(覆盖main_arena)

但是实现 House Of Roman 需要 fastbin attack,unsortedbin attack 等技术的配合,而它们会受 libc 版本影响:

libc-2.27:

  • fastbin attack 需要绕 tache(对chunk的数量有要求)
  • unsortedbin attack 可以直接打(只检查了“victim->size”,形同虚设)

libc-2.29:

  • fastbin attack 需要绕 tache(对chunk的数量有要求)
  • unsortedbin attack 失效(其实也有办法可以绕过,只是条件苛刻)