★且听安全★-点关注,不迷路!
★漏洞空间站★-优质漏洞资源和小伙伴聚集地!
pfSense 是基于 FreeBSD 的、开源中最为可靠( World's Most Trusted Open Source Firewall )的、可与商业级防火墙一战(It has successfully replaced every big name commercial firewall youcan imagine in numerous installations around the world)的防火墙。
PfSense 防火墙存在命令执行漏洞,影响版本为 <=2.5.2。可借助 `diag_routes.php` 文件 `sed` 命令处理问题写入 Webshell。
从 PfSense 官网下载解压缩后使用 VMware 安装:
重启后配置系统,完成配置:
对比 2.5.2 和 2.6.0 版本代码,`diag_routes.php` 增加了 `Filter` 参数过滤:
再来看 2.5.2 版本代码,当 `isAjax` 和 `filter` 参数存在时,首先使用 `htmlspecialchars` 处理 `filter` ,然后执行 `escapeshellarg` :
由于使用的php版本为 `7.4.26` ,毋庸置疑基本不能绕过 `escapeshellarg` 和 `htmlspecialchars` 检查,所以问题应该不是出现在 PHP 代码本身上:
简单修改 `diag_route.php`,发送 `/diag_routes.php?isAjax=1&filter=abc` GET请求,打印 `netstat` 命令如下:
这里注意到使用了 `SED` 命令的 `-e` 选项,可以通过该参数执行脚本。`-w` 选项可以实现文件写入,以 `/::1/w /tmp/testsed.txt` 为例,其功能为将读入文件中包含 `::1` 字符串的行拷贝到 `/tmp/testsed.txt` :
在 payload 中进行测试,获得了一个写入指定文件的 payload :
执行的 `netstat` 命令如下,使用 `%0a%23` 转义得到 `回车+#`,正好可以将后续字符串注释,这里附上一个本地测试情况截图:
最后控制写入内容,通过 `s/Flags/VVV/g` 代码将 `Flags` 字符串替换:
`<>` 等特殊字符被转义,需要解决特殊编码写入问题:
最终通过编码处理成功写入:
访问 Webshell,连接为 `https://ip/shell.php?a=system(id);` :
由于缺乏 CSRF 防护,漏洞也可能被远程匿名利用。
在新版本中弃用 `sed` 处理 `netstat` 结果,转而使用 `egrep`:
有兴趣获取完整漏洞分析过程的小伙伴,请加入我们的漏洞空间站-致力于打造优质漏洞资源和小伙伴聚集地!
由于传播、利用此文档提供的信息而造成任何直接或间接的后果及损害,均由使用本人负责,且听安全团队及文章作者不为此承担任何责任。
★且听安全★-点关注,不迷路!
★漏洞空间站★-优质漏洞资源和小伙伴聚集地!
原文始发于微信公众号(且听安全):CVE-2021-41282 PfSense 防火墙命令执行漏洞 Getshell
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论