首页 > 其他分享 >Pwn2Own Austin 2021 Cisco RV34x RCE 漏洞链复现

Pwn2Own Austin 2021 Cisco RV34x RCE 漏洞链复现

时间:2023-03-07 12:11:06浏览次数:55  
标签:set Cisco form Pwn2Own upload field proxy file 2021

前言

这个RCE漏洞利用链的实现是由几个逻辑洞的结合而导致的,这几天我花了一些时间复现了一遍,在此记录一下。

固件解压

我下载的是RV345 v1.0.03.24,从官网下载到压缩包解压之后可以看到它的rootfsubi格式的img。之前我都是使用kali里的 binwalk 对其进行解压可以直接得到解压之后的文件系统。但是由于前几天我的虚拟机坏了,不得不进行重装,但是我还没有装 kali。故找了一下提取ubi格式的方式。在github上有一个项目:https://github.com/nlitsme/ubidump,通过里面的ubidump.py可以很轻松的提取出ubi格式的文件。命令如下:

python3 ubidump.py -s . 0.ubi

漏洞分析

CVE-2022-20705 Improper Session Management Vulnerability

CVE-2022-20705 Improper Session Management Vulnerability,是由于nginx的配置不当导致的。nginx的配置文件是/etc/nginx/nginx.conf,如下

user www-data;
worker_processes  4;

error_log /dev/null;

events {
    worker_connections  1024;
}

http {
	access_log off;
	#error_log /var/log/nginx/error.log  error;

	upstream jsonrpc {
		server 127.0.0.1:9000;
	}

	upstream rest {
		server 127.0.0.1:8008;
	}

	# For websocket proxy server
	include /var/nginx/conf.d/proxy.websocket.conf;
	include /var/nginx/sites-enabled/*;
}

可以发现它又加载了/var/nginx/conf.d/proxy.websocket.conf和/var/nginx/sites-enabled/,但是固件解压出来的rootfs里的var目录有些问题,所以笔者只能根据别人的文章找一下漏洞发生的配置文件。结合rest.url.confproxy.conf来看。

location /api/ {
        proxy_pass http://rest;
        include /var/nginx/conf.d/proxy.conf;
}

location /api/operations/ciscosb-file:file-copy {
	proxy_pass http://rest;
	include /var/nginx/conf.d/proxy.conf;
	proxy_read_timeout 3600;
	proxy_send_timeout 3600;
}

location /api/operations/ciscosb-file:form-file-upload {
	set $deny 1;
 
	if ($http_authorization != "") {
		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;
}

location /restconf/ {
        proxy_pass http://rest;
        include /var/nginx/conf.d/proxy.conf;
}

location /restconf/operations/ciscosb-file:file-copy {
        proxy_pass http://rest;
        include /var/nginx/conf.d/proxy.conf;
        proxy_read_timeout 3600;
        proxy_send_timeout 3600;
}
proxy_http_version 1.1;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Authorization $http_authorization;
proxy_set_header Accept-Encoding "";
proxy_set_header Connection "";
proxy_ssl_session_reuse off;
server_name_in_redirect off;

如果我们请求中Authorization不为空,此时set $deny "0",就可以向下调用upload模块。它会在调用/form-file-upload前,把文件上传到/tmp/upload下。并且由于没有设置level,它的存储格式类似/tmp/upload/0000000001。至此我们可以实现任意文件上传至/tmp/upload

我们接着向下分析,可以在rootfs/etc/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 $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;
}

我们可以发现其对/upload进行了$cookie_sessionid的检验,但是并没有对/form-file-upload进行检验。我们看一下/form-file-upload的后端处理程序。启动脚本(uwsgi-launcher)如下:

#!/bin/sh /etc/rc.common

export UWSGI_PLUGIN_DIR=/usr/lib/uwsgi/plugins

start() {
        uwsgi -m --ini /etc/uwsgi/jsonrpc.ini &
        uwsgi -m --ini /etc/uwsgi/blockpage.ini &
        uwsgi -m --ini /etc/uwsgi/upload.ini &
}

stop() {
        killall -9 uwsgi
}

我们再去找一下/etc/uwsgi/upload.ini

[uwsgi]
plugins = cgi
workers = 1
master = 1
uid = www-data
gid = www-data
socket=127.0.0.1:9003
buffer-size=4096
cgi = /www/cgi-bin/upload.cgi
cgi-allowed-ext = .cgi
cgi-allowed-ext = .pl
cgi-timeout = 300
ignore-sigpipe = true

从上述文件中我们可以知道/form-file-upload它对应的后端处理程序是/www/cgi-bin/upload.cgi。因此我们可以无条件访问upload.cgi

同时上述配置文件中我们可以看到检查了/tmp/websession/token/$cookie_sessionid文件是否存在。但是存在缺陷,就是这里的$cookie_sessionid是用户在http请求中传进去的一个值,它并没有检查是否存在../../,也就是说我们可以通过跨目录来导致授权绕过。如:我们可以传递../../../etc/firmware_version

同时也可以看到在upload.cgi里对sessionid=进行了检查,限制了它的字符,但是并没有考虑到传多个sessionid=的情况。因为这里的sessionid=是遍历HTTP_COOKIE并且取出它最后一个sessionid=作为实际的sessionid=使用,所以我们可以传两个sessionid=。前一个用来绕过web.upload.conf里的判断,后一个当作正常的数据用来通过upload.cgi的判断。这样也可以实现无条件访问upload.cgi

我们接着看upload.cgi

传入适当的参数可以使得我们有能力任意文件移动到/tmp/www下,通过这两个漏洞我们也可以伪造出一个session

CVE-2022-20707 Command Injection

我们继续查看upload.cgi

这个漏洞可以使得任意命令执行。

参考链接

https://bestwing.me/Pwning a Cisco RV340 漏洞分析(CVE-2022-20705 和 CVE-2022-20707.html

https://blog.relyze.com/2022/04/pwning-cisco-rv340-with-4-bug-chain.html

https://paper.seebug.org/1890/

https://onekey.com/blog/advisory-cisco-rv34x-authentication-bypass-remote-command-execution/

https://nosec.org/home/detail/4985.html

文章首发

https://mp.weixin.qq.com/s/2joZwexIdVdgc5NL8W3J-A

标签:set,Cisco,form,Pwn2Own,upload,field,proxy,file,2021
From: https://www.cnblogs.com/pwnfeifei/p/17174093.html

相关文章

  • idea2021通用配置
    1、设置入口目前使用的是新版本2021.2,所以全局配置的入口会跟之前旧版本的有些不同。打开idea,可以看到customize,然后点击allsettings,里面就是所有的全局配置选项,配......
  • Cisco-EIGRP的配置实例(Cisco的私有路由协议)
    什么时EIGRPEIGRP:EnhancedInteriorGatewayRoutingProtocol即增强内部网关路由协议。也翻译为加强型内部网关路由协议。EIGRP是Cisco公司的私有协议(2013年已经公有......
  • mac使用Openconnect代替Cisco Anyconnect
    2020-05-22CiscoAnyconnect这玩意感觉不好使,换掉它,换成开源的Openconnect。使用brew安装贼方便,先安装homebrew,参考知乎大神的脚本,已经替换为了国内地址。/bin/zsh-c......
  • 中国1990-2021连续30年土地利用数据CLCD介绍及下载
    CLCD数据介绍CLCD(ChinaLandCoverDataset)数据集由武汉大学黄昕老师公布,黄昕老师基于GoogleEarthEngine上335,709景Landsat数据,制作中国年度土地覆盖数据集(annualChin......
  • [SWPUCTF 2021 新生赛]sql
     前言思路:这个CTF题是一个SQL注入相关的题目,题中所含相关知识点:题目中过滤了空格、等于号,使用/**/替换空格符,使用like替换等于号,后面步骤均为常规sql注入;到最后显示......
  • Cisco ISR路由器与Hillstone 防火墙对接IPsec
    用户需求:公司总部有一台Hillstone防火墙,分公司有一台CiscoISR路由器,现在用户想在分公司访问总部的内网资源,于有就有了这一次的IPsec对接。配置过程:一、CiscoISR路由器cryp......
  • 河北工程806c/c++程序设计2013年-2021年编程题
    ps:都是自己练习写的,可能不是最好的写法,但是都运行过,能跑起来。2021年1.从键盘上输入一元二次方程(ax2+bx+c=0)的系数:a,b,c;计算并输出方程的根,如果没有实根则输出“No......
  • [JOISC 2021 Day3] ビーバーの会合 2
    前言:离联合省选还有28天,模拟赛40min把这题切了睡了一上午。来讲个有点异类,不用点分治的单\(\log\)做法。首先我们观察发现在奇数的时候答案是\(1\),偶数的时候答......
  • 2021年系统架构设计师论文---论微服务架构及其应用
    论微服务架构及其应用*忠旭(石家庄铁道大学河北省石家庄市长安区061600)摘要:随着互联网应用的发展,单体应用架构已经不能满足业务需求,微服务架构应运而生。微服务架构是......
  • 【题解】[GDKOI2021] 空中恋爱论
    一场比赛,一个学长,一段故事,一场大梦。折戟沉沙,壮志未酬。思路cdq分治+FFT。首先意识到对和满足要求的区间计数,可以先求前缀和,再转化成前缀和的端点对计数。令\(A_n......