
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · pfsense-api-unix-sock-noauth
类别: 权限残留 可达性: 本地
pfSense Plus MIM API b4acd7ca - Netgate
github.com/Netgate/pfsense-api 是面向 pfSense Plus Nexus 多实例管理的公开 OpenAPI 及生成的 Python 代码。它不是 CE REST 软件包。官方注册示例使用 Bearer JWT 登录 HTTPS :8443,然后通过 SSH 将 POSIX 脚本推送到每台防火墙。该脚本与 /var/run/pfnet-controller.sock 通信时不带 Authorization。
curl --unix-socket /var/run/pfnet-controller.sock -H "Content-Type: application/json" -d "{controller JSON}" http://unix/api/mim/controllers
curl --unix-socket /var/run/pfnet-controller.sock http://unix/api/mim/device/identity
已弃用的回退端点 /api/system/controller 和 /api/system/mim/devid 相同:无 Bearer。HTTPS 登录仍会签发 JWT。该令牌不会应用于设备上的 sock。这是与 :8443 加 mim_* 组不同的信任边界。
Nexus MIM 系列的第 3 部分。在 G1 / G2 落地到设备后,此 sock 即为本地平面。
能够 connect(2) 该 sock 的本地进程可以在没有 JWT 的情况下注册控制器并导出设备身份。Plus 未被执行。真实 sock DAC 未知。
| ID | 暂无 CVE |
| 类别 | 权限残留 |
| 可达性 | 本地(connect(2) 到 /var/run/pfnet-controller.sock) |
| CWE | CWE-306 |
| CVSS | 高:7.8 CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H 如果 sock 模式允许另一个本地 uid 连接。诚实地说:DAC 未知,Plus 未被执行。 |
| 产品 | Netgate/pfsense-api(Plus Nexus MIM 工具包) |
| 受影响 | 公开 main b4acd7ca21dbca739a530403a1f62a7440f7726f(2026-05-25) |
| 认证 | 官方 unix-socket 注册 curl 上无认证 |
| 许可证 | GNU Affero GPL v3.0 |
| 实验环境 | 仅 127.0.0.1:19121。Unix HTTP mock。无 Plus 镜像。 |
攻击者是 pfSense 设备上任何能够 connect(2) 到 /var/run/pfnet-controller.sock 的进程。此示例中不是远程 TCP(仅 curl --unix-socket)。HTTPS :8443 JWT 和 mim_* 组不适用于此 fd。
| 方法 | 接收点 | 权限 |
|---|---|---|
官方 device_script POST 无 Authorization | POST http://unix/api/mim/controllers | 完整性: mock 接受了注册 JSON。命中日志 authorization_present=false。 |
官方 device_script GET 无 Authorization | GET http://unix/api/mim/device/identity | 侦察: mock 返回了 DeviceIdentity 形状的 JSON,包括 PFSENSE-API-UNIX-SOCK-NOAUTH-WITNESS。 |
相同 GET 带 Authorization: Bearer lab-jwt | 相同身份路径 | 实验环境对照: 401,witness 不在响应体中。区分存在与不存在。不是 Plus 结果。 |
这些是官方示例和 mim 标签放置在设备上的相同 OpenAPI 操作。仅作为协议验证,而非 Plus 200。
| 方法 | 接收点 | 权限 |
|---|---|---|
POST /mim/controllers(回退 POST /api/system/controller)带攻击者 ControllerIdentity(key、vpn_pubkey、vpn_listenaddr、vpn_netkey、cert) | SetController | 完整性: 注册恶意控制器。规范:设备"将每 10 秒继续发出一次连接请求"(Netgard VPN 连接到攻击者)。 |
GET /mim/device/identity(回退 GET /api/system/mim/devid) | GetDeviceIdentity | 侦察: 设备 Noise/VPN 公钥、address、controller_add curl 文本。 |
GET /mim/controllers | GetControllers | 侦察: 列出控制器及设备信息(ControllerInfo.noise_secret、密钥)。 |
GET /mim/controllers/id/{key} | GetMIMController | 侦察: 单条控制器记录。 |
DELETE /mim/controllers/id/{key} | DeleteMIMController | 完整性 / 可用性: 注销真实控制器(key 十六进制或 base64-URL)。 |
POST /mim/device/pubkey 带攻击者 privkey / pubkey | SetDevicePublicKey(DevicePublicKeyOption 包含 privkey) | 完整性: 替换设备 ED25519 身份。控制器握手随后信任攻击者密钥。 |
本身不会授予主机 root shell。授予 MIM 平面:设备信任谁作为控制器,以及如果 pubkey POST 被接受,则授予设备 Noise 私钥。
要求: 本地 connect(2) 到 /var/run/pfnet-controller.sock。DAC(mode、owner、group、SO_PEERCRED)不在公开客户端树中。如果守护进程绑定 0600 root,这已经是 root 本地(对能够看到 /var/run 的 helper、package 或 escape 而言是 confused deputy)。如果该 sock 可被其他 uid 访问,则按评分计为 CVSS 7.8。
:8443 上的 /mim/controllers。该端口被记录为 User Manager JWT。这个遗留物是 unix fd。POST /login 仍然签发 Bearer JWT。AuthenticatedClient 仍然将其发送到 CONTROLLER_URL+"/api"。verify_ssl=True。路径参数对 ../ 进行百分号编码。security: MISSING 是 schema 缺口,而非已证实的未认证 HTTPS 跳过。同一 pin,远程注册平面:pfsense-api-enroll-json-ssh 和 pfsense-api-enroll-autoadd。系列地图:pfsense-api-nexus-mim。
我固定了 Netgate/pfsense-api b4acd7ca21dbca739a530403a1f62a7440f7726f 并阅读了官方注册循环:login、GET /mim/controller/identity、stringify、unix-socket POST/GET 的 SSH exec、POST /mim/devices。HTTPS 使用 AuthenticatedClient(token=...)。sock curl 不使用。
错误方向:将缺失的 securitySchemes 视为未认证 HTTPS(login 也缺失它;示例总是先 Bearer)。假设 sock 是全局可写的(mode 不在此仓库中)。声称 Plus 200。此处证明的遗留物是已发布的注册协议。
表演:反向 shell。预言机是官方 curl 形态加上 identity body 中的见证者加上 Bearer 401 对照。
python3 pfsense-api-unix-sock-noauth-Abraxas-Labs.py
或
cd lab
./run.sh
仅回环:127.0.0.1:19121。Compose 项目 pfsense-api-unix-sock-noauth。在 /var/run/pfnet-controller.sock 模拟 unix HTTP。见证 PFSENSE-API-UNIX-SOCK-NOAUTH-WITNESS。Docker unix-socket 模拟。无 Plus 镜像。
预期最后一行:
SUCCESS PFSENSE-API-UNIX-SOCK-NOAUTH auth-absent=yes identity-witness=yes bearer-401=yes PFSENSE-API-UNIX-SOCK-NOAUTH-WITNESS
在 /var/run/pfnet-controller.sock 上要求设备 JWT 或 SO_PEERCRED。将套接字绑定为 0600 root。不得从未经身份验证的 unix 对端接受 POST /mim/controllers、POST /mim/device/pubkey 或身份 GET 请求。
b4acd7ca21dbca739a530403a1f62a7440f7726fexample-add-devices.py device_script(unix curl,无 Authorization)pfapi_openapi.yml /mim/controllers、/mim/device/identity、/mim/device/pubkeyGNU Affero GPL v3.0。参见 LICENSE。仅限回环实验环境。不提供任何担保。