笔者本来想用fap等工具模拟这台机器进行复现的。但是苦于一直模拟失败,只好买了一台真机进行复现,不过还是要多说一句,真机就不用担心模拟会出现的各种问题了,可以直接开搞,真香。
题目提供的路由器固件版本为RV110W-1.2.2.5,可以在思科官网下载。
我们首先进入cisco路由器管理后台。默认后台ip为192.168.1.1,默认用户名和密码为cisco: cisco。
这里可以大致浏览后台提供的功能。 我们可以在固件更新界面刷写路由器。我们需要cisco版本为1.2.2.5,若不符合,直接在官网上下载固件,更新即可。
到了这里,我们就可以开始了。
使用nmap扫描开放的端口。
nmap -Pn 192.168.1.1
搜索固件历史漏洞,看有没有能用的。
这里看xuanxuan师傅的博客,可以了解到,CVE-2020-3330与CVE-2020-3331对我们来说是有价值的。其中,CVE-2020-3330是telnet密码泄露bug,可以通过该漏洞获取路由器shell,方便我们调试。CVE-2020-3331是栈溢出漏洞,是我们控制该路由器的关键。
对固件进行binwalk解压,获取固件文件系统。
通过在文件系统全局搜索telnet,获取到关键信息。
这里查看**/sbin/rc** 文件。
在IDA中直接搜索telnet字符串,然后交叉引用,可以定位到关键位置。
可以拿到路由器telnet用户密码。
我们直接使用网站或者john解密即可。
john
需要注意的是,这里使用john解密时需要把密码写入到文件中。
可以得到用户名和密码为admin:Admin123。
admin:Admin123
在主机上下载海特实验室编译好的gdbserver,下载完整版的busybox。
在windows本地起一个http文件服务器。
在路由器**/tmp**文件下使用wget下载本地文件。
wget
在cisco路由器官网上下载1.2.2.8版本的固件,然后使用bindiff对比,寻找漏洞点。
根据漏洞描述,大致可以确定是guest_logout_cgi函数的问题。
guest_logout_cgi
双击,打开反编译对比窗口。
很容易可以看到sscanf这种容易造成溢出的函数。
sscanf
接下来,使用IDA分析该函数。
可以看到,sscanf函数将submit_button(可控)格式化输出到v28,v29变量中,并没有检查长度,容易造成栈溢出。
这里我们关注格式化字符串%[^;];%*[^=]=%[^\n]的含义。通过gpt分析,可以得到如下输入格式,
%[^;];%*[^=]=%[^\n]
通过对guset_logout_cgi交叉引用,可以找到sub_431EEC函数。
guset_logout_cgi
sub_431EEC
该函数判断是否为post请求(猜测),若是,即调用guest_logout_cgi函数。
该函数没有调用点,猜测用户可以直接发生请求。
这里使用post请求,使用超长的submit_button参数,测试该服务是否down掉。
在路由器中使用netstat -pantu查看服务,可以看到服务的pid为356。因为我们使用的是https请求,也即443端口。
netstat -pantu
使用ps查看对于服务运行的命令。
ps
当我们发送完请求后,再次使用ps,可以看到httpd -S服务已经down掉了。
注意,我们每次尝试都会把该服务打崩,需要重新启动。
这里,我们使用 gdbserver attach服务进程。
然后,使用gdb-multiarch远程连接。
测试偏移
同时,该路由器没有开pie,可以直接泄露libc基地址,从而调用libc的函数。
剩下的就是栈溢出的利用了,可以参考笔者这篇文章。
对于路由器而言,我们的目标一般就是执行shellcode,从而实现反弹shell的效果。基于mips架构缓冲区的特殊性,我们需要执行的rop链大概为sleep(1) + shellcode这种方式。
shellcode可以从这里找到:c57K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4y4Z5k6h3I4D9i4K6u0V1M7%4c8G2M7X3#2Q4x3X3g2G2M7X3N6Q4x3V1k6K6K9r3g2D9L8r3y4G2k6r3g2Q4x3V1k6X3K9h3I4W2M7#2)9J5c8Y4y4Z5k6h3I4D9j5$3!0V1k6g2)9J5k6o6R3$3x3q4)9J5k6h3S2@1L8h3H3`.
需要的gadget如下图所示,均可以使用IDA通过mipsrop找到。
其执行顺序大致也如下图顺序所示,
最终wp如下:
ok,成功反弹shell。
这里需要注意的一点是,由于笔者是虚拟机网络是Net模式,没办法跟路由器在同一个网段下(可以使用桥接使路由器与虚拟机在统一网段下),路由器访问不到虚拟机,这里笔者在windows下监听并成功反弹shell。
通过这次强网杯赛题漏洞的复现分析,学到了很多知识。当然,这只是我iot学习路上的一小步,未来还有很长的路要走,继续加油。
e2cK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6^5N6h3q4F1P5s2g2S2L8X3u0D9K9h3&6Y4j5X3I4A6L8X3N6Q4x3X3g2Y4K9i4c8Z5N6h3u0Q4x3X3g2A6L8#2)9J5c8X3W2G2N6q4)9J5c8U0t1H3x3U0m8Q4x3V1j5I4x3q4)9J5c8U0t1$3i4K6u0r3M7Y4j5I4x3e0m8%4i4K6u0r3
dbcK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6*7P5h3g2F1x3e0t1I4x3K6S2Q4x3X3g2Y4K9i4c8Z5N6h3u0Q4x3X3g2A6L8#2)9J5c8U0t1H3x3U0q4Q4x3V1j5I4x3q4)9J5c8U0l9#2i4K6u0r3f1W2j5I4x3e0m8i4i4K6t1#2c8e0S2Q4x3U0g2n7y4#2)9J5y4f1q4r3i4K6t1#2c8e0N6Q4x3U0f1&6y4q4)9J5y4f1t1I4i4K6t1#2c8e0g2Q4x3U0f1&6z5g2)9J5y4f1p5^5i4K6t1#2c8e0k6Q4x3U0g2n7b7#2)9J5y4e0S2r3i4K6t1#2c8e0k6Q4x3U0g2n7y4q4)9J5y4e0W2q4i4K6t1#2c8e0g2Q4x3U0g2m8y4q4)9J5y4e0S2p5i4K6t1#2c8e0N6Q4x3U0f1^5c8g2)9J5y4f1t1H3i4K6u0V1x3U0l9J5x3q4)9J5y4f1f1#2i4K6t1#2b7U0W2Q4x3U0g2n7y4q4)9J5y4f1f1#2i4K6t1#2b7V1y4Q4x3U0g2n7b7g2)9J5y4f1f1%4i4K6t1#2b7V1c8Q4x3U0f1&6x3g2)9J5y4f1f1$3i4K6t1#2z5f1c8Q4x3U0g2m8c8W2)9J5y4f1f1^5i4K6t1#2b7U0g2Q4x3U0f1&6b7W2)9J5y4f1f1&6i4K6t1#2b7e0u0Q4x3U0f1&6z5q4)9J5c8R3`.`.
796K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1j5%4k6h3f1I4L8W2)9J5k6h3N6A6N6r3S2#2j5W2)9J5k6h3W2G2i4K6u0r3x3U0l9J5x3g2)9J5c8U0l9&6i4K6u0r3x3U0g2Q4x3V1k6U0K9i4y4U0L8#2u0h3x3e0p5H3N6#2)9J5k6p5y4h3c8g2)9J5k6o6t1H3x3U0m8Q4x3X3b7K6x3K6x3I4i4K6u0r3
c9bK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6%4P5Y4c8Q4x3X3g2S2j5#2)9J5k6h3y4F1i4K6u0r3x3U0l9J5x3q4)9J5c8U0p5I4i4K6u0r3x3e0m8Q4x3V1k6U0K9i4y4U0L8#2)9J5k6s2u0$3x3e0p5H3N6#2)9J5k6r3u0#2k6%4y4Q4x3V1j5`.
admin:$
1
$aUzX1IiE$x2rSbqyggRaYAJgSRJ9uC.:
15880
:
0
99999
7
:::
python -m http.server 8000
<部分1>;<跳过等号部分>=<部分2>\n
import
requests
url
=
"b48K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1j5I4z5e0u0Q4x3X3f1I4y4U0S2Q4x3X3f1I4i4K6u0W2x3g2)9J5c8X3N6#2k6i4y4@1i4K6g2X3L8r3!0Y4L8%4g2@1i4K6u0W2j5$3N6A6"
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)
(response.text)
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课