pfSense Plus MIM API 工具包 b4acd7ca - 高危 - 远程 - IDOR - ACB userkey 能力 URL
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · pfsense-api-acb-userkey
类别: IDOR 可达性: 远程
pfSense Plus MIM API(Netgate/pfsense-api b4acd7ca)- Netgate
GET /services/acb 和 GET /services/acb/bkp 将 userkey 作为无约束的查询参数。生成的 Python 客户端将该密钥放在查询字符串上。YAML 中没有 securitySchemes。持有 Auto Config Backup 设备密钥即为校验。那是一个能力 URL。
被盗或泄露的 ACB userkey 会列出该设备托管的备份并获取修订版本正文。完整配置就在那些 blob 中。 如果密钥泄露,与 CE ACB 密钥 CVE-2024-57273 / SA-25_03 属于同一类别。那个 CVE 是 SSH-banner 派生。这个遗留问题是 Plus MIM API 查询参数的同类问题。我不会重新提交 banner 派生问题。
这是 pfSense Plus Nexus 多实例管理(控制器在 :8443)的公开 OpenAPI + 生成客户端。它不是 CE REST 包(jaredhendrickson/pfsense-api / pfrest.org)。服务器仅限 Plus(付费)。我没有执行 pfSense Plus。
| ID | 暂无 CVE |
| 类别 | IDOR(能力 URL) |
| 可达性 | 远程 |
| CWE | CWE-639 |
| CVSS | 高:7.5 CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N,如果那些 GET 请求在不将 JWT 绑定到设备的情况下接受 userkey |
| 产品 | Netgate/pfsense-api(pfSense Plus MIM OpenAPI + 生成客户端) |
| 受影响 | 固定 b4acd7ca21dbca739a530403a1f62a7440f7726f(2026-05-25)。无标签。 |
| 认证 | 规范:无(securitySchemes 缺失)。userkey 是查询密钥。Plus JWT/RBAC 未执行。 |
| 许可证 | GNU Affero GPL v3.0 |
| 实验环境 | 仅 127.0.0.1:19171。无 Plus 镜像。 |
系列中心:pfsense-api-nexus-mim(这是第 7 部分)。
需要被盗或泄露的 ACB userkey(规范:“十六进制编码的 32 字节随机字节”,64 个十六进制字符)。规范未将该密钥绑定到 JWT 或调用者的设备。G11 类 GET /services/acb/config 返回实时的 userkey。G9 示例设置 verify_ssl=False,因此对 :8443 的 MITM 可以在线路上看到该密钥。这些是泄露路径。这个遗留问题就是密钥一旦泄露后所能换取的东西。
| 方法 | 汇聚点 | 权限 |
|---|---|---|
GET /services/acb?userkey=<stolen> | GetACBList(pfapi_openapi.yml)。生成的 get_acb_list.py params["userkey"]。 | 实验室验证(模拟): 列出该设备托管的备份。见证位于 backups[].reason。 |
GET /services/acb/bkp?userkey=<stolen>&revision= | GetACB -> RetrievedBackup.backup。生成的 get_acb.py params["userkey"] + params["revision"]。 | 实验室验证(模拟): 获取修订版本正文。见证位于 backup。 |
| 在实时控制器上使用相同的备份字符串 | 托管的 ACB blob | 推断: 一旦可读,即可获取完整的 config.xml(用户、密钥、软件包)。模拟返回了明文见证 XML。我并未与 acb.netgate.com 通信,也未解密实时 blob。 |
GET /services/acb/config | ACBConfigInfo.userkey、ACBConfig.encryption_password | 规范,非本实验室: 实时能力密钥和解密密码。G11 的 GET 上暴露机密类。未实际测试。 |
| 方法 | 汇聚点 | 权限 |
|---|---|---|
POST /services/acb/restore | RestoreACB 正文 { timestamp } | 相邻已关闭: 样本仍发送 JWT。非此遗留问题。未执行。 |
POST /services/acb/config 替换 userkey | SaveACBConfig | 相邻已关闭: 不是 GET 能力 URL。未执行。 |
GET list / GET bkp 不会删除。DELETE /services/acb/bkp/{timestamp} 是另一个操作。未实际测试。
错误的 userkey 和缺失的 userkey 未返回见证(实验室验证)。
实验室验证 vs 推断: 窃取的密钥 list 和 bkp 返回了见证。错误密钥和缺失密钥则没有。Plus 未执行。实时 config.xml 内容和解密是从公开 schema 推断的(RetrievedBackup.backup 是字符串;encryption_password 位于 ACBConfig 上)。
前提条件: 到 MIM 控制器 ACB GET 的网络路径,以及窃取/泄露的 userkey。如果这些 GET 在不将 JWT 绑定到设备的情况下认可查询密钥,则 CVSS 7.5。诚实地说:此包在回环上证明了公开规范对该契约的建模。
| 攻击面 | 原因 |
|---|---|
| pfSense Plus 控制器 | 未执行。此包中没有 Plus 镜像。 |
| CE REST 包 | 不同的服务器(jaredhendrickson/pfsense-api / pfrest.org)。 |
| SSH-banner ACB 密钥派生 | CVE-2024-57273 / SA-25_03。请勿重复提交。 |
POST /services/acb/restore 作为此发现 | 样本仍发送 JWT。 |
来自省略的 OAS security 的未认证 php/shell | 文档遗留问题。模拟并非无 JWT 返回 200 的服务器证明。 |
缺失 userkey | 实验室 403,无见证。 |
错误 userkey | 实验室 list 为空 / bkp 403,无见证。 |
生成的库 verify_ssl | 默认为 True。G9 是样本将其关闭,而非包默认值。 |
我固定了 Netgate/pfsense-api main b4acd7ca(2026-05-25,“Add Snort-3 API definitions”)。围绕登录/JWT、诊断、MIM 注册、客户端 TLS、用户/证书、软件包、VPN/防火墙、OpenAPI 安全、设备 IDOR、git/固件/源,以及每个生成操作的环回模拟,进行了十二次搜寻。
先列跳过清单:CE WebGUI 遗留问题已邮件报告(QinQ 父接口、OpenVPN 向导 CRLF、CARP VHID、限制器编号、IPsec 登录横幅)。诊断 PHP/shell 属于预期的管理员权限。第三方 CE REST 包。CVE-2024-57273 横幅派生。
我阅读了 GetACBList 和 GetACB。userkey 是一个查询参数,而不是绑定的设备 ID。生成的 Python 将其复制到查询字符串上。YAML 中没有 securitySchemes。ACBConfigInfo.userkey 是“十六进制编码的 32 字节随机字节”。GET /services/acb/config 返回该密钥。G9 样本禁用了 TLS 验证,因此中间人攻击者可以泄露它。G11 是 GET 转储。这个遗留物就是该转储所提供的能力 URL。
错误方向:将缺失的 OAS 安全机制视为未认证的 php/shell;重新提交 CVE-2024-57273;声称存在实时 Plus 转储。表演:一个 Plus 控制器。预言机是公开规范加上回环模拟。
python3 pfsense-api-acb-userkey-Abraxas-Labs.py
或
cd lab
./run.sh
仅回环:http://127.0.0.1:19171。Compose 项目 pfsense-api-acb-userkey。见证 PFSENSE-API-ACB-USERKEY-WITNESS。Docker。无 Plus 镜像。
预期最后一行:
SUCCESS pfsense-api-acb-userkey capability-url stolen-key-returns-witness wrong-key-does-not plus-not-executed public-spec-models-acb-userkey-capability-url PFSENSE-API-ACB-USERKEY-WITNESS
诚实:Plus 未执行。被盗密钥返回了见证。错误密钥没有。公开规范将 ACB userkey 建模为能力 URL。
在 ACB GET 上要求 JWT。不要将 userkey 视为能力 URL。将列表和检索绑定到已认证设备的密钥。不要接受来自外部调用者的另一台设备的密钥。停止向任何非设备所有者的角色在 GET 配置时返回实时 userkey 和 encryption_password。
b4acd7ca21dbca739a530403a1f62a7440f7726fpfapi_openapi.yml GetACBList / GetACBget_acb_list.py · get_acb.pyGNU Affero GPL v3.0。参见 LICENSE。仅限回环实验室。无担保。