Tenda 路由器 CVE-2018-18708 漏洞复现
参考:Tenda CVE-2018-18708 漏洞复现 (z1r0.top)
固件下载:https://github.com/z1r00/IOT_Vul/blob/main/固件下载/US_AC15V1.0BR_V15.03.05.19_multi_TD01.zip
Start
该固件的 httpd
有一个栈溢出漏洞,在 post 请求处理函数 fromAddressNat()
中拼接 page
参数时使用了 sprintf
但没有做长度限制,导致此处变量 v6
可以造成栈溢出
直接 qemu 模拟:
1 | sudo chroot . ./qemu-arm-static /bin/httpd |
模拟的时候由于它带一些环境检查,所以会卡在一些地方,用 ida 简单处理下就行,最后会提示获取的 IP 地址为 255.255.255.255
为了解决 IP 地址的问题,需要创建一个网桥
1 | # 创建网桥 |
然后访问 web 页面,会提示 page not found,将 webroot_ro
的文件复制到 webroot
即可
通过抓包可以知道,不管是 get 还是 post 必须包括 cookie:password
1 | cookie = {"password" : "114514"} |
这样发包 httpd 的 log 会有反应,用 gdb 调试看看
1 | # 开启 gdb 调试端口 1234 |
1 | $ gdb-multiarch /bin/httpd |
在危险函数附近下个断点,看看能不能断下来,实际测试是能断下来,说明执行链过去了
然后可以传参 page 看看能不能溢出,答案是可以
1 | cookie = {"password" : "114514"} |
并且可以使用 cyclic_find("laac")
查找出 pc 偏移是 244,但是实际是还要 + 4,不太懂是为什么
既然可以控制 pc,那么可以考虑 ret2libc 执行 system,我没有真机,qemu user 模拟出来是没有随机化的,先打打看吧
1 | Arch: arm |
libc 的地址可以 gdb 里用 vmmap
看看,虽然它没显示 libc 的名字,但是 size 最大的那个地址一般就是 libc
于是得知 libcBase = 0x3fd9c000
rop 思路:gadget1 给寄存器 reg 赋值 system
地址,/bin/sh
可以写栈上,gadget2 找那种 mov r0, sp; blx reg,这里正好有一组适合的 gadget
1 | # 先找第二个,然后决定第一个用什么寄存器 |
1 | from pwn import * |
随后我尝试用 qemu system 模拟,但是 gdbserver 传上去,本地 gdb 连上会报错,查了下是个存在很久的 bug,后面没搞了
- 标题: Tenda 路由器 CVE-2018-18708 漏洞复现
- 作者: Hexrotor
- 创建于 : 2024-03-14 15:47:30
- 更新于 : 2024-10-23 22:07:49
- 链接: https://hexrotor.github.io/2024/03/14/Tenda-CVE-2018-18708/
- 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。