这算第二次复现 IOT 漏洞,第一次是很老的 DIR-815 ,第二次直接复现的是 winmt 师傅今年挖到的一个思科设备漏洞 CVE-2023-20073 。年份上跨越不算小,就导致了复现过程中屡屡遇到问题而没什么解决的办法,而网上除了 winmt 师傅本人做了漏洞的分析之外,也没有找到其他资料。这里发自内心的感谢 winmt 师傅给予我提供的指导和帮助,否则可能要走更多的弯路甚至会对很多地方一知半解的就完成了所谓的 “复现” ,写这篇文章的一个重要目的就是想帮助之后复现这个漏洞的师傅提供一些参考,毕竟不是每个人都能遇见一个万能的 winmt QAQ。本文对于 CVE-2023-20073 复现过程做了详尽的记录,其中包括了遇见过的各种坑和解决问题的方法及思路。再次对 winmt 师傅表示感谢!Cisco RV340,RV340W,RV345和 RV345P 四款型号的路由器中最新固件均存在一个未授权任意文件上传漏洞 (且目前尚未修复),攻击者可以在未授权的情况下将文件上传到 /tmp/upload 目录中,然后利用 upload.cgi 程序中存在的漏洞,最终造成存储型 XSS 攻击。近一年的 IP 数量在 2.8w 左右环境信息首先在 思科官网 中下载最新的 RV340 固件把固件拖到虚拟机里用 binwalk解压 ,执行 binwalk -Me RV34X-v1.0.03.29-2022-10-17-13-45-34-PM.img执行后发现没有找到解压出来的文件系统,然后看一下 binwalk 给的 warning (如下),说是执行失败 ubireader_extract_files 程序这是因为这里的文件系统是 ubi 格式的,我的 binwalk 当初是用 apt install binwalk 安装的,就导致少装一些东西(尽量通过源码安装 binwalk ),最终就没提取出来这个 ubi 格式的文件系统。可以看到下面这个路径的位置只有一个 0.ubi 的文件,确实是没提取出来文件系统的解决方法:安装 ubi_reader ( ubi_reader 工具中就包含了上面缺少的 ubireader_extract_files 脚本 ) ,命令如下安装成功后,重新执行 binwalk 提取文件系统,可以看到这次就成功将文件系统提取出来了(如下图)但是还没完,binwalk 还有 warning (如下图),说是原本文件中存在的软链接指向了提取目录之外,就比如当前的 var 目录,它指向的是我本机的 /tmp 目录,为了安全考虑 binwalk 将这种软链接都置成了 /dev/null 。这里放任不管的话,之后的仿真会失败,比如路由器的某个服务需要去访问 var 目录下的文件,但它如果是被置成 /dev/null 的话,目录自然是缺失的。其实这个 var -> /tmp 的本意是指向提取出来文件系统的 /tmp ,并非是我本机的 /tmp ,因此只要我能保留这个软链接,到时候用 chroot 创建一个隔离的文件系统就一切正常了 解决方法:通过上面报错的字符串找到是出现在 binwalk/build/lib/binwalk/modules/extractor.py 文件(如下图),将 if not ... 修改为 if 0 and not ... 然后回到 binwalk 主目录执行 sudo python3 setup.py install 重新安装一下,如此就不会再执行将软链接置成 /dev/null 的操作了对于解压 ubi 格式的文件系统补充两个方法,因为我们只是要文件系统,所以 binwalk 解压出来 0.ubi 文件后(用其他解压软件也能解出来 0.ubi,比如 7zip),可以直接用 ubireader_extract_files 0.ubi 命令来解压 0.ubi,这样不会出现那个软链接的问题,但得安装 ubi_reader。还可以使用 ubidump 对 ubi 文件系统进行提取,直接复制源码,然后执行 python3 ubidump.py -s . 0.ubi 进行提取,这两种方法都不会破坏其中的软链接。因为之后需要用 scp 传文件以及启动服务等操作肯定是需要配置 qemu 模拟环境网络的,大概原理就是设置一个网桥,然后开一个接口,把这个接口给 qemu ,然后流量的发送都通过这个网桥,画成图的话就是下面这个样子具体方法:创建一个 net.sh 脚本,我这里的网卡是 ens33 ,如果是 eth0 的话,就把出现的 ens33 换成 eth0 即可,chmod +x net.sh 给文件可执行权限,然后 ./net.sh 运行首先用 file 命令查看一下 busybox 的文件信息(如下),这里是 ARM 架构 小端序,因此我们要下载对应的内核映像还有磁盘映像等文件访问 网站 下载这三个文件使用 wget 来下载文件,命令如下启动脚本如下如果执行启动脚本的话,应该会报如下错误,这里说的是 SD card size 应该是 2 的幂,应该改成 32GB 解决方法是执行 qemu-img resize debian_wheezy_armhf_standard.qcow2 32G再次执行启动脚本,大概要等待两分钟左右就会让输入账号和密码(如下),账号密码都是 root进去后看到了 IP ,并且能正常与宿主机通信(如下图)就说明到这里都是操作正确的先把文件系统给压缩打包,然后用 scp 传到 qemu 中,再将文件系统解压(这里发送的时候要发压缩包,不然后续有可能会缺少文件,我最初因为传的是文件夹,导致出现了错误,就在这里浪费了很多时间)压缩命令 tar -czvf rootfs.tar.gz rootfs传输文件命令 sudo scp -r rootfs.tar.gz root@192.168.45.66:/root/rootfs.tar.gz (IP 、用户名和路径都换成自己的)解压命令 tar -xzvf rootfs.tar.gz接下来进行仿真时要先用 chroot 命令创建隔离的文件系统环境。但这会导致无法在隔离的文件系统中访问原本的 /proc和 /dev 目录,因为它们是特殊的虚拟文件夹(用于提供系统信息和设备的访问)为了让 qemu 环境正常运行,需将原本 qemu 的 /proc 和 /dev 目录挂载到新创建的隔离环境中。还记得上文提到的软链接的问题么,此时位于这个文件系统中,软链接就已经指向了正确的位置(如下)在 /etc/init.d 目录下存放了各种服务的启动和停止脚本,下面这里发现有 nginx 服务的脚本 然后尝试开启 nginx 服务,执行命令 /etc/init.d/nginx start ,访问一下 qemu 环境的 IP ,看服务是否启动(如下)没跑起来,然后看一下报错信息(如下)就这里有一个报错 FAILED: confd_load_schemas(addr, addrlen), Error: system call failed (24): Connection refused, in function ru
...(已截断)
---
来源: 看雪论坛
原文链接: https://bbs.kanxue.com/thread-278240.htm
[原创]从零开始复现 CVE-2023-20073
156 浏览
20 回复
这个固件web的登陆密码有吗
刚入职开始接触IOT方面的漏洞,之前都是以挖掘web漏洞为主,这篇文章写得太好了对我的帮助很大,谢谢师傅
这篇文章让我站在巨人的肩膀上复现这个漏洞
牛!
最后于 2024-9-27 16:57
被lenmon leng编辑
,原因: 问题已解决
最后于 2024-9-27 16:57
被lenmon leng编辑
,原因: 问题已解决
师傅牛逼
最后于 2024-9-2 15:58
被lenmon leng编辑
,原因:
最后于 2024-9-2 15:58
被lenmon leng编辑
,原因:
师傅牛逼
最后于 2024-7-14 18:27
被wx_黑土编辑
,原因:
最后于 2024-7-14 18:27
被wx_黑土编辑
,原因:
师傅你好,在仿真环境中,执行到chroot . /bin/sh 这一步, 提示chroot: failed to run command `/bin/sh': Exec format error,如何解决?顺便说一句,执行之前,pwd输出是/root,执行完chroot后,pwd输出是/root/rootfs,似乎chroot执行成功了
最后于 2024-4-12 09:28
被qiluword编辑
,原因:
最后于 2024-4-12 09:28
被qiluword编辑
,原因:
抱歉,纠正一下,是其它原因,我自己在测试的时候写的报文没有触发cgi,引用了师傅的poc后upload才被调用了,没有理解为什么
------------
Content-Disposition: form-data; name="what";filename="login.html";Content-Type: text/plain
<title>test</title>
<script>alert('debug')</script>
------------
会调用cgi但是
------------
Content-Disposition: form-data; name="what";filename="login.html";Content-Type: text/plain
<title>test</title>
------------
不会调用cgi呢?
------------
Content-Disposition: form-data; name="what";filename="login.html";Content-Type: text/plain
<title>test</title>
<script>alert('debug')</script>
------------
会调用cgi但是
------------
Content-Disposition: form-data; name="what";filename="login.html";Content-Type: text/plain
<title>test</title>
------------
不会调用cgi呢?
师傅您好,请问一下为什么请求(数据)里少了Content-Type就不会执行upload.cgi了呢
感谢分享:)
第一次有人这么夸我,感觉要飘了hhh来自中国的黑客ZIKH26师傅加油!
死循环最好能打到漏洞函数附近,如果一开始就打死循环的话容易卡奇怪的地方
mb_fqnuxmwx
师傅 我安装了 ubi_reader 还是没有解压成功为什么
具体回显是什么呢
师傅 我安装了 ubi_reader 还是没有解压成功为什么
具体回显是什么呢
师傅 我安装了 ubi_reader 还是没有解压成功为什么
刚准备从一个逆向分析菜鸟拐到漏洞挖掘方向,这篇文章写得真详细,思路也很清晰,非常感谢分享