
pfSense Plus MIM API toolkit b4acd7ca - Alto - Remoto - IDOR - un JWT del controller è un token di flotta
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · pfsense-api-fleet-jwt
Class: IDOR Reach: Remote
pfSense Plus MIM API (Netgate) pin b4acd7ca - github.com/Netgate/pfsense-api
Un Bearer ottenuto da POST /login viene riutilizzato per ogni device_id registrato. Gli esempi ufficiali copiano quel token su /api/device/pfsense/{device_id}/api per ogni id restituito da GET /mim/devices. I campi di LoginResponse sono solo token, user, version e alerts. I ruoli LDAP MIM sono globali. Non sono vincolati a un dispositivo. Un login controller che può elencare i dispositivi comunica con il firewall B usando un token emesso per un utente destinato al firewall A.
Si tratta di un singolo tenant cliente, non di un residuo cross-tenant SaaS. Le chiamate non autenticate restano 401. Inoltre il RBAC non è stato eseguito. Hub della serie: pfsense-api-nexus-mim (questo è il residuo 6). Il JWT rubato dal residuo 9 (campioni verify_ssl=False) è questo token di flotta.
| ID | nessuna CVE al momento |
| Class | IDOR |
| Reach | Remote (JWT controller autenticato) |
| CWE | CWE-639 |
| CVSS | High: 8.1 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:N |
| Product | Netgate/pfsense-api (pfSense Plus Nexus Multi-instance Management controller OpenAPI + client generato) |
| Affected | pin b4acd7ca21dbca739a530403a1f62a7440f7726f (2026-05-25). Nessun tag. Il server è solo Plus (a pagamento). Non è il pacchetto REST CE. |
| Auth | JWT controller da POST /login. Indovinare device_id non è necessario se GET /mim/devices è consentito. |
| License | GNU Affero GPL v3.0 |
| Lab | solo 127.0.0.1:19161. Mock Python del contratto client pubblicato. Nessuna immagine Plus. |
Ho fissato github.com/Netgate/pfsense-api main b4acd7ca21dbca739a530403a1f62a7440f7726f (2026-05-25, Add Snort-3 API definitions). Non è jaredhendrickson/pfsense-api / pfrest.org.
Un login controller che può elencare i dispositivi comunica con ogni istanza registrata usando lo stesso JWT. Il CSRF non è in gioco (API Bearer). PHP / shell / export-key su ogni box è il potere admin previsto una volta che il proxy accetta il token di flotta. Il residuo è il binding per-dispositivo mancante, non Diagnostics: Command.
| Privilegio | Metodo / percorso | Provato in laboratorio o dedotto |
|---|---|---|
Elenca ogni device_id registrato (nome, indirizzo, stato) | GET /mim/devices con il Bearer di login | Ricognizione (provata in laboratorio). Il mock ha restituito sia site-a che site-b. Senza autenticazione è 401. |
| Leggi lo stato di sistema di firewall A e firewall B con un solo token | GET /api/device/pfsense/{device_id}/api/system | Ricognizione (provata in laboratorio). device-a=200, device-b=200. Witness solo su B. |
| Esegui il POST del wrapper PHP di diagnostica su entrambi gli id | POST /api/device/pfsense/{device_id}/api/diag/cmd/php | Integrità (solo lab su mock). Entrambi 200. Inoltre RBAC non è stato eseguito, quindi un gate di ruolo live non è provato. |
Esegui PHP / shell / modifica file su ogni box registrato se il login include console o system | POST /diag/cmd/php, POST /diag/cmd/shell, GET/POST /diag/editfile, download/upload | Integrità (dedotta da OAS + esempi). Potere admin previsto una volta che il proxy accetta il token della flotta. Il tipico pfSense PHP-FPM è root. |
| Esporta chiavi private CA / leaf e PKCS12 su ogni istanza elencata | GET /system/certificates/{refid}/export-key, GET /system/certauth/{refid}/export-key, GET /system/certificates/{refid}/export-p12 | Ricognizione (dedotta). Stesso JWT, stesso schema del leftover 4. Inoltre RBAC non eseguito. |
| Estrai account ACME e chiavi emesse su ogni istanza elencata | GET /services/acme e relative GET di account/certificati | Ricognizione (dedotta). Stesso JWT, schema del leftover 5. |
| Modifica alias, firewall, interfacce, VPN, servizi su ogni istanza elencata | stesso prefisso per dispositivo, oltre 700 operazioni rimanenti | Integrità (dedotta). Stesso JWT, stesso schema dell'istanza locale. |
| Riavvia / arresta / ripristina configurazione su ogni istanza elencata | POST /diag/control, POST /diag/backup/restore | Disponibilità + integrità (dedotta). Stesso proxy. Non esercitato. |
| IDOR SaaS cross-customer | n/a | Chiuso. Un solo tenant cliente. Netgate esegue il controller in quel tenant. |
| Internet-to-:8443 non autenticato | GET /mim/devices senza Bearer | Chiuso in questo laboratorio. 401. Anche un Bearer errato è 401. |
| Dispositivi offline | i campioni saltano state != online | Chiuso dai campioni. Non è un confine di autenticazione. |
Scansione numerica cieca di device_id | GET /api/device/pfsense/1/api/system | Chiuso come requisito di indovinare. Gli id sono stringhe lunghe (a forma di ED25519). L'elenco elimina la necessità di indovinare. |
Richiede: un login al controller autorizzato ad accedere al proxy del dispositivo. Percorso di rete verso il controller MIM (:8443 in prodotto, loopback :19161 in questo laboratorio). Non non autenticato. Non CSRF.
| Superficie | Perché |
|---|---|
| Elenco / php / shell non autenticati | Mock 401 senza Bearer e con un Bearer errato. Il silenzio della specifica su securitySchemes non è un 200 del server. |
| SaaS cross-tenant | Un solo tenant cliente. I cluster di tenancy erano comunque pianificati nella pagina di marketing. |
mim_user / nessun gruppo Nexus | Documentato come chiuso se il gate di login regge. |
Nomi di ruolo mim_* funzionali | Esistono (view, logs, usermgmt, services, firewall, interfaces, devices, system, superuser). Sono globali, non per device_id. I controlli live di Plus non sono stati eseguiti (plus-rbac=not-executed). |
| Interpolazione JSON SSH di enrollment | Leftover 1. Pacchetto diverso. |
AutoAddPolicy di enrollment | Leftover 2. Pacchetto diverso. |
| Socket unix del dispositivo senza JWT | Leftover 3. Locale, pacchetto diverso. |
| Pacchetto REST CE | jaredhendrickson/pfsense-api è un server diverso. |
| CE WebGUI QinQ / procedura guidata OpenVPN / CARP / limiter / banner IPsec | Già segnalati come leftover CE. I nomi dei campi in questo OAS sono gli stessi sink, non nuove CVE. |
Console flotta admins / mim_superuser prevista | Modello di prodotto per il proprietario del controller. Il leftover è l'ACL oggetto mancante per tutti gli altri. |
Ho fissato b4acd7ca e letto gli esempi ufficiali rispetto all'OpenAPI. Ogni campione che comunica con firewall gestiti fa questo: