*本文作者:kczwa1,本文属 FreeBuf 原创奖励计划,未经许可禁止转载。
此前我们分析了四种路由器漏洞,现在终于写到 PWN 类的漏洞了。
传送门:
通过CVE-2017-17215学习路由器漏洞分析,从入坑到放弃 路由器漏洞复现分析第二弹:CNVD-2018-01084 路由器漏洞复现分析第三弹:DVRF INTRO题目分析 路由器漏洞复现分析第四弹:CVE-2018-7034
CVE-2018-5767 TENDA AC15路由器权远程代码执行
参考信息:https://www.fidusinfosec.com/remote-code-execution-cve-2018-5767/
漏洞固件版本:
Tenda cn Ac15_firmware:15.03.1.16
漏洞文件是bin/httpd
此处会将cookie中的password后面的值拷贝到变量var_1c0,造成栈溢出
Arm 小端结构.
先把arm架构的qemu拷贝过来
cp $(which qemu-arm-static) ./qemu
使用如下脚本调试:
此处会需要将connectcfm的返回值patch为1:
推荐一下keypatch 插件,可以在IDA中直接修改指令, https://github.com/keystone-engine/keypatch
之后http服务就可以运行起来了:
在R7WebsSecurityHandler中下好断点,
Exploit.py运行,断下来:
LR 存放返回值,地址为FECDC,var_1c0是要存放可控输入变量的地方FEB1C,所以我们的palyload为A*(FECDC-FEB1C)+BBBB(需要覆盖的返回地址)+ccccdddd。跑一波,发现没有断到pc=42424242的地方,而是[R3] 出错。
在拷贝完password后,还会看字符串里是否含有”.”且”.”之后三位为”gif”,如果有的话就会直接跳到结尾,而不会去到需要读取[R3]的地方,在payload里面加上.gif, pc到42424242处crash了
有nx,栈里的代码不能直接执行,因此必须ROP了。
查找libc 基址:
Libc=0x409c7000
但是此处有个坑,libc的地址并不正确,rop链会跳到错误的地方,
看一下puts函数的地址:
Puts在libc中的地址:
那么libc=409dccd4-35cd4=409A7000
Libc中有system函数,那么需要找一个pop r0,sp类似的代码把sp中的参数放到r0去
ROPgadget—binary=./lib/libc.so.0 | grep”mov r0, sp”
或者 –only “pop”| grep“r0”,但是pop {r0 pc} 这条命令无法使用,因为r0的参数太长,所以需要放到pc后面, 找到如下两个godget:
先将system pop到r3,再将 sp中的command参数放到r0,
构造如下exploit.py :
在覆盖pc后,返回之前的栈的结构如下,6669672e为”.gif”,后面为布好的rop链
运行完后,通过-strace参数可以看到httpd在模拟环境中执行了我们想要执行的命令:
*本文作者:kczwa1,本文属 FreeBuf 原创奖励计划,未经许可禁止转载。