pfSense Plus MIM API toolkit b4acd7ca - Alta - Remoto - Privilegio residuo - GET /services/acme espone le chiavi
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · pfsense-api-acme-key-dump
Classe: Privilegio residuo Portata: Remota
pfSense Plus Nexus Multi-instance Management toolkit OpenAPI b4acd7ca - Netgate
GET /services/acme (GetACMEConfig) restituisce ACMEConfig senza alcun flag write-only o redacted. Lo schema 200 include la chiave privata dell'account ACME, ogni chiave privata foglia emessa, qualsiasi chiave foglia personalizzata e i token del provider DNS usati per la validazione. Il cert manager almeno ha un dedicato GET .../export-key. ACME non ne ha nessuno. La GET della configurazione è il dump.
Una sessione del controller che può eseguire GET su questo percorso copia ogni chiave hostname che il firewall registra, più le credenziali DNS che provano il controllo di quei nomi.
Questo albero è l'OpenAPI pubblico più un client Python generato. Non è il pacchetto CE REST. Il controller MIM è solo per Plus e non è nel repository GitHub. Non ho parlato con un controller live. plus-not-executed=1.
| ID | nessuna CVE al momento |
| Classe | Privilegio residuo (dump di segreti su GET della configurazione) |
| Portata | Remota (controller MIM autenticato; non provato non autenticato) |
| CWE | CWE-200 |
| CVSS | Alto: 6.5 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:N/A:N se un ruolo services-read riceve il body. Se solo il superuser può eseguire la GET, il dump ha comunque la forma sbagliata per un elenco di configurazione. |
| Prodotto | Netgate/pfsense-api OpenAPI per pfSense Plus Nexus MIM |
| Affetto | main pubblico b4acd7ca21dbca739a530403a1f62a7440f7726f (2026-05-25, Add Snort-3 API definitions). Nessun tag. |
| Auth | JWT del controller da POST /login. Gli esempi inviano Bearer. La specifica non ha securitySchemes. |
| Licenza | GNU Affero GPL v3.0 |
| Lab | solo 127.0.0.1:19151. Nessuna immagine Plus. |
Hub della serie: pfSense Plus MIM leftovers. Questa è la parte 5. Si concatena con G9 stolen JWT (gli esempi impostano verify_ssl=False) e G6 fleet token (un login Bearer viene riutilizzato per ogni device_id). Dump affine: G4 cert-manager export-key.
Richiede una sessione del controller che possa eseguire GET /services/acme. La documentazione lo mappa su mim_services_read / mim_services / mim_superuser. La specifica non associa quei ruoli al percorso. Il RBAC di Plus non è stato eseguito.
Un JWT rubato da G9 (MITM degli esempi ufficiali) o un fleet token dell'helpdesk da G6 è sufficiente per puntare questa GET su ogni box registrato. Questa catena è dedotta. Questo residuo è il body della GET.
| Metodo | Sink | Privilegio |
|---|---|---|
GET /services/acme | ACMEConfig.account_keys[].account_key (format: byte) | Dimostrato in laboratorio sulla specifica pubblicata e sul mock: lo schema 200 include account_key; il corpo del mock restituisce PFSENSE-API-ACME-KEY-DUMP-WITNESS. Inferito su Plus: copiare la chiave privata dell'account Let's Encrypt (o altro ACME). Comunicare con l'account ACME dall'esterno. |
| Stesso GET | certs[].issued_cert.privateKey (format: byte) | Dimostrato in laboratorio su specifica+mock. Inferito su Plus: copiare ogni chiave privata foglia emessa che il firewall ha registrato. Impersonificazione TLS off-box per quei nomi. |
| Stesso GET | certs[].custom_key (format: byte) | Dimostrato in laboratorio su specifica+mock. Inferito su Plus: copiare una chiave foglia personalizzata quando key_type=custom. |
| Stesso GET | certs[].domain_list[].config.credentials (additionalProperties: string) | Dimostrato in laboratorio su specifica+mock. Inferito su Plus: copiare i segreti di validazione DNS (token Cloudflare, chiavi AWS, segreti RFC2136). Questi provano il controllo dei nomi. |
| Stesso GET | email dell'account, URL di server personalizzati, action_list.command | Dimostrato in laboratorio che i campi sono presenti nello schema. L'esecuzione di hook è un percorso di modifica, non questo GET. |
Nessuna dal GET stesso. L'uso successivo di chiavi rubate e token DNS avviene off-box (emettere un certificato fraudolento, comunicare con l'account ACME, modificare il DNS). Non esercitato.
Nessuna. La lista di configurazione non revoca né riscrive certificati.
Richiede: accesso autenticato al controller MIM che è autorizzato a eseguire il GET del tag ACME. Non dimostrato non autenticato. Il _get_kwargs generato per questa operazione non aggiunge Authorization; gli esempi effettuano comunque il login e inviano Bearer.
| Superficie | Motivo |
|---|---|
| Controller pfSense Plus / Nexus live | Non eseguito. plus-not-executed=1. |
| Internet-to-8443 non autenticato | Gli esempi richiedono POST /login. La mancanza di security nell'OAS è una lacuna della specifica, non una prova di server 200-senza-JWT. |
POST /services/acme/cert/{name}/issue e .../renew | Modifica dei servizi prevista. |
POST /services/acme/genprivatekey | Generazione e restituzione previste di una nuova chiave account. Non questo residuo. |
POST /diag/cmd/php / POST /diag/cmd/shell | Console di amministrazione prevista. Superficie separata. Il vendor considera Diagnostics: Command come previsto (CVE-2025-69691 contestato). |
GET /system/certificates/{refid}/export-key | Residuo separato: esportazione dedicata della chiave sul cert manager. ACME non ha un'operazione di esportazione equivalente. |
GET /services/acme/validmethods | Catalogo dei metodi. Nessuna chiave. |
CE jaredhendrickson/pfsense-api | Prodotto diverso. |
Ho fissato il repository pubblico Netgate/pfsense-api b4acd7ca dopo l'ondata CE 2.9.0-DEVELOPMENT. Questo albero è OpenAPI 3.0.3 (pfapi_openapi.yml, 486 path, 755 op) più un client Python generato per il controller MIM Plus su :8443. Nessun tag. L'ultimo commit pubblico il giorno in cui ho clonato era 2026-05-25, "Add Snort-3 API definitions."
Dodici ricerche su login/JWT, diagnostica, enrollment MIM, TLS client, utenti/certificati, pacchetti, VPN/firewall, sicurezza OpenAPI, IDOR dispositivo, git/firmware/feeds, più un mock loopback di ogni operazione generata.
Prima la lista di esclusione: i cinque residui CE già segnalati (QinQ parent-if, OpenVPN wizard CRLF, CARP VHID, limiter number, IPsec login banner). Il pacchetto REST CE di terze parti. Diagnostics PHP/shell come RCE non pubblicato. securitySchemes mancante come non autenticato dimostrato. POST /system/firmware non ha URL. Ping/DNS/traceroute sono la diagnostica.