DIR-815溢出漏洞复现
hedwig.cgi中sprintf的溢出漏洞,对于uid长度没有进行检测
漏洞利用分析
据漏洞信息漏洞是出现在hedwig.cgi中,hedwig.cgi是指向./htdocs/cgibin的符号链接
漏洞点主要就是下图中的spriintf没有对string大小进行限制,而v27只有1024大小,所以会造成溢出漏洞
这里主要分析一下sess_get_uid函数干了什么
1 | while ( 1 ) |
首先会进入这里,遇到 = 前会把cookie的内容存到v2中,v6=1
然后继续下一位判断
遇到 = 后v6=2 进入到
直到 ; 会结束,在遇到;前将cookie存到v4中,直到遇到; v6=3
然后v6=0,会去判断v2 (等号前部分) 是不是uid,如果不是则继续判断剩下cookie部分;
是uid则获取地址给到string,再传给a1(sess_get_uid的参数)
sobj_get_strin
sobj_add_string
结束sess_get_uid(v4),可以发现没有对v4或string进行检测,也就造成了sprintf的溢出
漏洞测试
为了程序能够成功执行,还需要设定几个环境变量,这里暂时只考虑执行到sess_get_uid函数前的环境变量
这里也是根据网上其他师傅写的sh脚本,(sudo -E 就是执行时加环境变量)
1 |
|
执行后就可以发现成功溢出了,然后我们就需要确定偏移构造payload
通过测试的payload就可以测出溢出的偏移,并且可以发现我们不止可控制ra,还有s0~s7
构造payload
不知道为什么我vmmap看不到libc的基地址,可能没有载入qemu的内存映射?
将libuClibc文件拖入ida找到sprintf地址为0x0002DA70
在程序运行中找到sprintf地址为0x7f765a70,使用libc基地址为0x7f765a70-0x0002DA70=0x7f738000
然后就是去找可利用的gadget,可以使用ROPgadget,不过用起来体验不是很好,可以将找到的内容放入到文本中再去找相关寄存器
可以使用ida的mipsrop插件 mipsrop.find(“”) 来找需要的gadget
第一个gadget:为了执行system(‘/bin/sh’),需要控制第一个参数即a0,因为mips的分支延迟效应,所以跳转后的第一条指令也是会被执行的,sp+0x14c-0x13c和s0是我们可控的,利用这个gadget我们便可以控制a0,且继续控制程序流
第二个gadget:因为sprintf会被\x00截断,而system地址为libuc_base + 0x53200,所以这里我们输入system_adr-1,利用该gadget去+1,且s5也是可控
即ra=gadget2 —> 使s0 (system-1) +1 并ja到 gadget1 —> 使a0=/bin/sh,并ja到system
在执行时会报如下错,手动添加文件即可
可以看到我们成功执行到了system(/bin/sh),但是因为我们是qemu的用户模式模拟的,在system中的fork()函数会失败
quem系统模式:
https://bbs.kanxue.com/thread-272318.htm#msg_header_h2_4
- 本文作者: 1uckyc
- 本文链接: https://1uckyc.github.io/2024/02/25/Dlink-DIR815溢出漏洞复现/