abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · pfsense-api-enroll-autoadd
类别: 权限残留 可达性: 远程
pfSense Plus MIM API(Netgate/pfsense-api)b4acd7ca - Netgate
example-add-devices.py 是将 Nexus 控制器注册到每台 pfSense 设备的文档化方式。它从不调用 load_system_host_keys()。它设置 paramiko.AutoAddPolicy(),然后 connect,再 exec_command(device_script)。注释说当设备已在 known_hosts 中时应去掉 AutoAdd。出厂默认是 AutoAdd。
首次接触 SSH 到新设备时会接受任何应答的主机密钥。密码或密钥认证会被提交给该对端。stdout 被 json.loads 解析后 POST /mim/devices 到真正的控制器。
这不是第三方 CE REST 包。这是官方 OpenAPI 加上为 pfSense Plus Nexus 多实例管理 生成的 Python 客户端。服务器仅限 Plus。实验环境是一个 Paramiko SSH 小工具。我没有与真实的 Plus 控制器通信。
| ID | 暂无 CVE |
| 类别 | 权限残留(注册 SSH 上的 Paramiko AutoAddPolicy) |
| 可达性 | 远程(首次接触时位于设备 SSH 路径上) |
| CWE | CWE-322 |
| CVSS | 高危:8.1 CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:H |
| 产品 | Netgate/pfsense-api(Plus Nexus MIM 客户端工具包) |
| 受影响 | main b4acd7ca21dbca739a530403a1f62a7440f7726f example-add-devices.py |
| 认证 | 操作员运行官方示例;攻击者位于设备 SSH 路径上 |
| 许可证 | GNU Affero GPL v3.0 |
| 实验环境 | 仅 127.0.0.1:19111。无 Plus 镜像。 |
AC:H 是首次接触 / 路径上。一台工作站的 known_hosts 中已有真实设备密钥 且 已移除 AutoAdd 行的,不属于此残留。
同一 pin 的残留:将 ControllerSummary 的 JSON 插值到注册 shell(G1)以及 示例强制 verify_ssl=False(G9)。系列中心:pfsense-api-nexus-mim。
当操作员运行示例时,位于 pfsense_addresses 中首次接触 SSH 地址的路径上。AutoAdd 仍然开启。
| 方法 | 汇聚点 | 权限 |
|---|---|---|
在 pfsense_addresses 中首次接触的 SSH 地址上实施路径中间人攻击 | set_missing_host_key_policy(paramiko.AutoAddPolicy()) 然后 connect(example-add-devices.py:151-160) | 完整性(实验室验证): 未知主机密钥被接受。实验室:AutoAddPolicy 已连接(autoadd=yes)。RejectPolicy 失败(reject-control=yes)。 |
同一会话,应答 exec_command(device_script) | stdout 被解析为 DeviceIdentity(example-add-devices.py:161-187) | 完整性(实验室验证): exec 返回的身份 JSON 包含 PFSENSE-API-ENROLL-AUTOADD-WITNESS(identity-json=yes)。 |
| 同一 MITM,读取 exec 载荷 | device_script 是遗留的 G1 对 ControllerSummary 的 curl -d | 侦察(从源码推断): 控制器身份密钥、Netgard vpn_pubkey / vpn_netkey / 监听地址。本实验室未转储。 |
| 同一 MITM,密码或密钥认证 | SSHUSER / SSHPASS 或 agent/密钥(example-add-devices.py:156-160) | 侦察(推断): 凭据或密钥被提交给伪造主机。实验室仅使用密码认证作为示例 SSHPASS 路径。 |
同一 stdout JSON,add_controlled_device.sync | 在真实控制器上 POST /mim/devices | 完整性(推断): 注册攻击者的 Noise/VPN 密钥和 address。此外,本实验室未执行握手。 |
| MITM 作为 SSH 服务器 | 客户端发送的任何 exec,以 SSHUSER 身份 | 完整性 / 可用性(推断): 运行、丢弃或跳过注册脚本。只有在 MITM 转发时,才会在真实设备上发生 Unix 套接字调用。 |
实验室验证与推断: AutoAdd 连接、RejectPolicy 失败以及带见证的身份 JSON 是实验室验证的。控制器密钥转储、凭据窃取、伪造设备的 POST /mim/devices 以及运行真实的 Unix 套接字 curl 均从同一示例路径推断。
要求: 操作员针对主机密钥尚未固定的 SSH 地址运行官方示例,且 AutoAdd 保持开启。到该 SSH 的网络路径。AC:H 为首次接触 / 路径中间人。
| 攻击面 | 原因 |
|---|---|
对同一未知主机使用 RejectPolicy | 实验室:reject-control=yes。Paramiko 拒绝该密钥。 |
在 known_hosts 中拥有真实设备密钥且移除 AutoAdd 行的工作站 | 注释的预期模式。除非添加该调用,示例从不加载这些密钥。 |
| HTTPS 控制器登录 | verify_ssl=False 是同级示例遗留(G9),不是此汇聚点。 |
| 真实防火墙上的 Unix 套接字 MIM | 仅当 MITM 转发 exec 时。本实验室从未与 /var/run/pfnet-controller.sock 通信。 |
生成的 Client 默认 verify_ssl=True | 库默认值不是遗留。示例强制为 False。 |
加上 RBAC / 实时 :8443 | 本实验室是 Paramiko 小工具。我未与 Plus 控制器通信。 |
| 未认证的互联网到 8443 | 登录仍会签发 JWT。不是此发现。 |
| 诊断 PHP/shell | 对舰队 JWT 的预期管理员权限。不是此发现。 |
在 CE WebGUI 遗留之后,我固定了 github.com/Netgate/pfsense-api main b4acd7ca21dbca739a530403a1f62a7440f7726f。此树是 OpenAPI 加上为 Plus Nexus MIM 生成的 Python。我阅读了 example-add-devices.py 中的注册循环。主机密钥策略是 AutoAdd。密钥位于同一 exec 通道上。示例从未调用 load_system_host_keys()。
已记录的弯路:将 AutoAdd 视为仅限预期实验室(注释是选择退出,而非选择加入);假设 known_hosts 已加载;将此与 ControllerSummary shell 插值遗留混为一谈;实时实验室 Plus;声称这是对 :8443 的未认证 HTTPS。
Theatre:一个反向 shell。预言机是 RejectPolicy fail 加上 AutoAdd connect 加上带有 witness 的 identity JSON。
python3 pfsense-api-enroll-autoadd-Abraxas-Labs.py
或
cd lab
./run.sh
回环 SSH 127.0.0.1:19111。Compose 项目 pfsense-api-enroll-autoadd。CONTROL:RejectPolicy 拒绝未知主机。INJECT:官方示例 AutoAddPolicy、connect、注册脚本的 exec_command;stdout 是带有见证的 identity JSON。无实时 Plus 控制器。见证 PFSENSE-API-ENROLL-AUTOADD-WITNESS。运行后栈拆除。
SUCCESS PFSENSE-API-ENROLL-AUTOADD autoadd=yes reject-control=yes identity-json=yes PFSENSE-API-ENROLL-AUTOADD-WITNESS
使用 paramiko.RejectPolicy() 或固定 known_hosts。在连接前调用 load_system_host_keys()(以及专用的 known_hosts 文件)。不要在官方示例中提供 AutoAddPolicy()。那条写着“如果所有 pfsense 设备都在 known_hosts 中,请注释掉此行”的注释才是预期模式。将其设为默认。
b4acd7ca21dbca739a530403a1f62a7440f7726fexample-add-devices.pyGNU Affero GPL v3.0。参见 LICENSE。仅限回环实验环境。不提供任何担保。