abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · pfsense-wireless-clone
类别: RCE 可达性: 远程
pfSense CE 2.9.0-DEVELOPMENT (9363ac5) - pfsense.org
interfaces_wireless_edit.php 存储 $_POST['if'] 时没有使用允许列表。interface_wireless_clone 将 interface_get_wireless_base($wlcfg['if']) 插值到 exec("/sbin/ifconfig wlan create wlandev {$baseif} {$mode} bssid 2>&1") 中。_wlan 后缀会被去除;其前面的分号则会保留下来。Mode 是一个常量。隐藏的 cloneif 是生成的,并非来自 POST。
| ID | 暂无 CVE |
| 类别 | RCE |
| 可达性 | 远程(除非另有说明,否则为已认证的 WebGUI) |
| CWE | CWE-78 |
| CVSS | 高危:8.8 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H |
| 产品 | pfSense CE |
| 受影响版本 | 2.9.0-DEVELOPMENT (9363ac5b8651a1c7a333180425ce7719070f95f9) |
| 认证 | 具有 page-interfaces-wireless-edit 权限的 WebGUI 会话 |
| 许可证 | GNU Affero GPL v3.0 |
| 实验环境 | 仅 127.0.0.1 |
我固定了公共 master 分支 9363ac5。该实验环境是固定 sink 的 PHP gadget,在 127.0.0.1:18910 上使用回环 HTTP。
系列文章:https://abraxaslabs.tech/research/pfsense-ce-leftovers
| 方法 | Sink | 权限 |
|---|---|---|
| POST interfaces_wireless_edit.php if | interfaces.inc interface_wireless_clone exec ifconfig wlan create wlandev {$baseif} | 完整性: 实验环境已证实:POST if=ath0;w 通过 /bin/sh -c 运行了额外的 w,并写入了见证文件。仅从 wireless-edit 即可执行 root 主机命令。 |
| 同一遗留问题 | 同一 sink | 侦察: 推断:同一 root shell 可以读取 config.xml 和密钥。此页面不会打印 exec 输出。 |
| 同一遗留问题 | 同一 sink | 可用性: 推断:对无线克隆执行恶意的 ifconfig。 |
需要: page-interfaces-wireless-edit。除非另有说明,否则 POST 受 CSRF-magic 保护。WebGUI PHP-FPM 以 root 运行。
需要: page-interfaces-wireless-edit。除非另有说明,否则 POST 受 CSRF-magic 保护。WebGUI PHP-FPM 以 root 运行。除非另有说明,否则 POST 受 CSRF-magic 保护。WebGUI PHP-FPM 以 root 运行。
Mode 不是注入点。隐藏的 cloneif 并非从 POST 复制。未认证不适用。诊断:Command 并非必需,也未授予。
除非该页面也被授予,否则没有 Diagnostics: Command。
cd lab
./run.sh
回环 127.0.0.1:18910。Compose 项目 pfsense-wireless-clone。见证文件 PFSENSE-WIRELESS-CLONE-WITNESS。仅回环:127.0.0.1:18910。Compose 项目 pfsense-wireless-clone。见证文件 PFSENSE-WIRELESS-CLONE-WITNESS。固定代码行的 PHP gadget。运行后栈会被拆除。
最后一行:
SUCCESS PFSENSE-WIRELESS-CLONE control-wlandev=yes trigger-exec=yes hidden-cloneif-copied=no PFSENSE-WIRELESS-CLONE-WITNESS
针对活动无线父接口对 POST if 使用允许列表。在 ifconfig 之前对 $baseif 使用 escapeshellarg。
9363ac5b8651a1c7a333180425ce7719070f95f9