House Of Cat
House of emma 是 glibc-2.34 下常用的攻击手法之一,其利用条件只需任意写一个可控地址就可以控制程序执行流,攻击威力十分强大,但是需要攻击位于 TLS 的 _pointer_chk_guard
,并且远程可能需要爆破 TLS 偏移
House of cat 使用了一种新的 IO 链,目前适用于任何版本(包括 glibc-2.35)
House Of Cat 原理
在 libc-2.34 版本中,常用的 hook 都被 ban 掉了(malloc_hook,free_hook 等),我们要尝试通过控制 IO 来获取 shell
House of cat 利用了 House of emma 的虚表偏移修改思想,通过修改虚表指针的偏移,避免了对需要绕过 TLS 上 _pointer_chk_guard
的检测相关的IO函数的调用,转而调用 _IO_wfile_jumps
中的 _IO_wfile_seekoff
函数,然后进入到 _IO_switch_to_wget_mode
函数中来攻击
应用场景是:
- 能够任意写一个可控地址
- 能够泄露堆地址和 libc 基址
- 能够触发 IO 流(FSOP 或触发
__malloc_assert
),执行 IO 相关函数
我们跟进 _IO_wfile_seekoff
:
1 | off64_t |
核心调用函数 _IO_switch_to_wget_mode
如下:
1 |
|
- 由于 FP_err 可以被我们控制,所以可以利用宏函数
_IO_WOVERFLOW
完成任意代码执行
House Of Cat 利用姿势
利用 largebin attack 劫持 stderr
控制为已知 heap 地址,伪造 FILE 结构体,然后使 top chunk 不足以申请从而调用 sysmalloc
其中在 stderr
中的 fake_IO_FILE 如下:
1 | next_chain = 0 |
- 在 vtable 的检测中对具体位置的检测还是比较宽松的,这使得我们可以在一定的范围内对 vtable 表的起始位置进行偏移,使其我们可以通过偏移来调用在 vtable 表中的任意函数
- 这里对 vtable 进行偏移,使其可以调用
_IO_wfile_seekoff
函数
1 | pwndbg> p*(struct _IO_FILE_plus*)0x55e88c680b00 |
接下来我们来跟进一下 House Of Cat 的触发流程:
1 | __fxprintf -> locked_vfxprintf -> __vfprintf_internal -> _IO_wfile_seekoff |
1 | ► 0x7fa0ae8d17d0 <_IO_wfile_seekoff> endbr64 |
- 进入
_IO_wfile_seekoff
,然后调用_IO_switch_to_wget_mode
:
1 | ► 0x7fa0ae8d1838 <_IO_wfile_seekoff+104> call _IO_switch_to_wget_mode <_IO_switch_to_wget_mode> |
- 在这里会
call [rax+0x18]
而rax
是我们可以控制的(就是FILE->_IO_buf_end
,是我们人为伪造的)
1 | RAX 0x5620ac902b40 ◂— 0xffff |
- 把这里修改为
setcontext+61
进行栈迁移(rdx
也是可以控制的)
1 | pwndbg> telescope 0x5620ac902b40+0x18 |
- 最后利用 House Of Kiwi 中的方式 get shell
House Of Cat 还有另一条调用链:
1 | __GI_exit -> __run_exit_handlers -> _IO_cleanup -> _IO_flush_all_lockp -> _IO_wfile_seekoff |
- 直接执行
exit
就可以触发,不用破坏堆结构