
pfSense Plus MIM API toolkit b4acd7ca - Alta - Remota - IDOR - un JWT de controlador es un token de flota
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · pfsense-api-fleet-jwt
Clase: IDOR Alcance: Remoto
pfSense Plus MIM API (Netgate) pin b4acd7ca - github.com/Netgate/pfsense-api
Un Bearer de POST /login se reutiliza para cada device_id inscrito. Los ejemplos oficiales copian ese token en /api/device/pfsense/{device_id}/api para cada id de GET /mim/devices. Los campos de LoginResponse son solo token, user, version y alerts. Los roles LDAP MIM son globales. No están vinculados a un dispositivo. Un login de controlador que puede listar dispositivos habla con el firewall B con un token emitido para un usuario que estaba destinado al firewall A.
Esto es una única tenencia de cliente, no un remanente cross-tenant de SaaS. Las llamadas no autenticadas siguen siendo 401. Además, el RBAC no se ejecutó. Hub de la serie: pfsense-api-nexus-mim (este es el remanente 6). El JWT robado del remanente 9 (muestras con verify_ssl=False) es este token de flota.
| ID | sin CVE todavía |
| Clase | IDOR |
| Alcance | Remoto (JWT de controlador autenticado) |
| CWE | CWE-639 |
| CVSS | Alto: 8.1 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:N |
| Producto | Netgate/pfsense-api (controlador OpenAPI de gestión multi-instancia pfSense Plus Nexus + cliente generado) |
| Afectado | pin b4acd7ca21dbca739a530403a1f62a7440f7726f (2026-05-25). Sin tags. El servidor es solo Plus (de pago). No es el paquete REST de CE. |
| Auth | JWT de controlador de POST /login. Adivinar device_id no es necesario si GET /mim/devices está permitido. |
| Licencia | GNU Affero GPL v3.0 |
| Lab | solo 127.0.0.1:19161. Mock en Python del contrato del cliente publicado. Sin imagen Plus. |
Fijé github.com/Netgate/pfsense-api main b4acd7ca21dbca739a530403a1f62a7440f7726f (2026-05-25, Add Snort-3 API definitions). Este no es jaredhendrickson/pfsense-api / pfrest.org.
Un login de controlador que puede listar dispositivos habla con cada instancia inscrita con el mismo JWT. CSRF no entra en juego (API con Bearer). PHP / shell / export-key en cada máquina es poder de administrador previsto una vez que el proxy acepta el token de flota. El remanente es la falta de vinculación por dispositivo, no Diagnostics: Command.
| Privilegio | Método / ruta | Demostrado en laboratorio o inferido |
|---|---|---|
Listar cada device_id inscrito (nombre, dirección, estado) | GET /mim/devices con el Bearer de inicio de sesión | Recon (demostrado en laboratorio). El mock devolvió tanto site-a como site-b. Sin autenticación es 401. |
| Leer el estado del sistema del firewall A y del firewall B con un solo token | GET /api/device/pfsense/{device_id}/api/system | Recon (demostrado en laboratorio). device-a=200, device-b=200. Witness solo en B. |
| Enviar por POST el wrapper PHP de diagnóstico en ambos ids | POST /api/device/pfsense/{device_id}/api/diag/cmd/php | Integridad (laboratorio solo en mock). Ambos 200. Además, RBAC no se ejecutó, por lo que una puerta de rol en vivo no está demostrada. |
Ejecutar PHP / shell / edición de archivos en cada máquina inscrita si el inicio de sesión incluye consola o system | POST /diag/cmd/php, POST /diag/cmd/shell, GET/POST /diag/editfile, download/upload | Integridad (inferido de OAS + ejemplos). Poder de administrador previsto una vez que el proxy acepta el token de flota. El PHP-FPM típico de pfSense es root. |
| Exportar CA / claves privadas de hoja y PKCS12 en cada instancia listada | GET /system/certificates/{refid}/export-key, GET /system/certauth/{refid}/export-key, GET /system/certificates/{refid}/export-p12 | Recon (inferido). Mismo JWT, mismo esquema que el leftover 4. Además, RBAC no se ejecutó. |
| Volcar la cuenta ACME y las claves emitidas en cada instancia listada | GET /services/acme y los GET relacionados de cuenta/certificado | Recon (inferido). Mismo JWT, esquema del leftover 5. |
| Cambiar alias, firewall, interfaces, VPN, servicios en cada instancia listada | mismo prefijo por dispositivo, las 700+ operaciones restantes | Integridad (inferido). Mismo JWT, mismo esquema que la instancia local. |
| Reiniciar / detener / restaurar configuración en cada instancia listada | POST /diag/control, POST /diag/backup/restore | Disponibilidad + integridad (inferido). Mismo proxy. No ejercitado. |
| IDOR de SaaS entre clientes | n/a | Cerrado. Una sola tenencia de cliente. Netgate ejecuta el controlador en esa tenencia. |
| Internet-a-:8443 sin autenticación | GET /mim/devices sin Bearer | Cerrado en este laboratorio. 401. Un Bearer incorrecto también es 401. |
| Dispositivos offline | las muestras omiten state != online | Cerrado por las muestras. No es una frontera de autenticación. |
Recorrido numérico ciego de device_id | GET /api/device/pfsense/1/api/system | Cerrado como requisito de adivinación. Los ids son cadenas largas (con forma de ED25519). El listado elimina la adivinación. |
Requiere: un inicio de sesión en el controlador que esté permitido en el proxy del dispositivo. Ruta de red al controlador MIM (:8443 en el producto, loopback :19161 en este laboratorio). No sin autenticación. No CSRF.
| Superficie | Por qué |
|---|---|
| Listado / php / shell sin autenticación | Mock 401 sin Bearer y con un Bearer incorrecto. El silencio de la especificación sobre securitySchemes no es un 200 del servidor. |
| SaaS entre inquilinos | Una sola tenencia de cliente. Los clústeres de tenencia seguían planificados en la página de marketing. |
mim_user / sin grupo Nexus | Documentado como cerrado si la puerta de inicio de sesión se mantiene. |
Nombres de roles mim_* funcionales | Existen (view, logs, usermgmt, services, firewall, interfaces, devices, system, superuser). Son globales, no por device_id. Las comprobaciones en vivo de Plus no se ejecutaron (plus-rbac=not-executed). |
| Interpolación JSON de SSH en la inscripción | Leftover 1. Paquete diferente. |
AutoAddPolicy en la inscripción | Leftover 2. Paquete diferente. |
| Socket unix del dispositivo sin JWT | Leftover 3. Local, paquete diferente. |
| Paquete REST de CE | jaredhendrickson/pfsense-api es un servidor diferente. |
| QinQ / asistente OpenVPN / CARP / limitador / banner IPsec de la WebGUI de CE | Ya enviados por correo como leftovers de CE. Los nombres de campo en este OAS son los mismos sumideros, no nuevas CVE. |
Consola de flota admins / mim_superuser prevista | Modelo de producto para el propietario del controlador. El leftover es la ACL de objeto faltante para todos los demás. |
Fijé b4acd7ca y leí los ejemplos oficiales contra el OpenAPI. Cada muestra que se comunica con firewalls gestionados hace esto: