pfSense Plus MIM API toolkit b4acd7ca - Alto - Remoto - Privilegio residuo - Paramiko AutoAddPolicy enroll
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · pfsense-api-enroll-autoadd
Classe: Privilegio residuo Portata: Remota
pfSense Plus MIM API (Netgate/pfsense-api) b4acd7ca - Netgate
example-add-devices.py è il modo documentato per registrare il controller Nexus su ciascun dispositivo pfSense. Non chiama mai load_system_host_keys(). Imposta paramiko.AutoAddPolicy(), poi connect, poi exec_command(device_script). Il commento dice di rimuovere AutoAdd quando i dispositivi sono già in known_hosts. Il default distribuito è AutoAdd.
Il primo contatto SSH verso una nuova macchina accetta qualunque chiave host risponda. L'autenticazione a password o a chiave viene presentata a quel peer. Lo stdout viene passato a json.loads e inviato con POST /mim/devices al controller reale.
Questo non è il pacchetto REST CE di terze parti. Questo è l'OpenAPI ufficiale più il client Python generato per pfSense Plus Nexus Multi-instance Management. Il server è solo Plus. Il lab è un gadget SSH Paramiko. Non ho comunicato con un controller Plus live.
| ID | nessuna CVE al momento |
| Classe | Privilegio residuo (Paramiko AutoAddPolicy sull'SSH di enrollment) |
| Portata | Remota (on-path verso l'SSH del dispositivo al primo contatto) |
| CWE | CWE-322 |
| CVSS | Alto: 8.1 CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:H |
| Prodotto | Netgate/pfsense-api (toolkit client Plus Nexus MIM) |
| Affetto | main b4acd7ca21dbca739a530403a1f62a7440f7726f example-add-devices.py |
| Auth | L'operatore esegue il sample ufficiale; l'attaccante è on-path verso l'SSH del dispositivo |
| Licenza | GNU Affero GPL v3.0 |
| Lab | solo 127.0.0.1:19111. Nessuna immagine Plus. |
AC:H indica primo contatto / on-path. Una workstation che ha già le chiavi reali del dispositivo in known_hosts e ha la riga AutoAdd rimossa non è questo residuo.
Stessi residui del pin: interpolazione JSON di ControllerSummary nella shell di enrollment (G1) e i sample forzano verify_ssl=False (G9). Hub della serie: pfsense-api-nexus-mim.
Posizionarsi on-path verso un indirizzo SSH di primo contatto in pfsense_addresses mentre l'operatore esegue il sample. AutoAdd è ancora attivo.
| Metodo | Sink | Privilegio |
|---|---|---|
Porsi on-path verso un indirizzo SSH di primo contatto in pfsense_addresses | set_missing_host_key_policy(paramiko.AutoAddPolicy()) poi connect (example-add-devices.py:151-160) | Integrità (dimostrato in laboratorio): la chiave host sconosciuta viene accettata. Lab: AutoAddPolicy connesso (autoadd=yes). RejectPolicy fallito (reject-control=yes). |
Stessa sessione, risposta exec_command(device_script) | stdout interpretato come DeviceIdentity (example-add-devices.py:161-187) | Integrità (dimostrato in laboratorio): exec ha restituito l'identità JSON contenente PFSENSE-API-ENROLL-AUTOADD-WITNESS (identity-json=yes). |
| Stesso MITM, lettura del payload exec | device_script è il curl -d residuo di G1 di ControllerSummary | Recon (inferito dal sorgente): chiave identità del controller, vpn_pubkey / vpn_netkey / indirizzi di ascolto di Netgard. Non dumpato da questo lab. |
| Stesso MITM, autenticazione con password o chiave | SSHUSER / SSHPASS o agent/chiavi (example-add-devices.py:156-160) | Recon (inferito): credenziali o chiavi presentate all'host falso. Il lab ha usato l'autenticazione con password solo come percorso campione SSHPASS. |
Stesso stdout JSON, add_controlled_device.sync | POST /mim/devices sul controller reale | Integrità (inferito): registra chiavi Noise/VPN dell'attaccante e address. Inoltre l'handshake non è stato eseguito in questo lab. |
| Il MITM è il server SSH | qualunque exec inviato dal client, come SSHUSER | Integrità / disponibilità (inferito): eseguire, scartare o saltare lo script di enrollment. Le chiamate al socket Unix sul dispositivo reale avvengono solo se il MITM le inoltra. |
Dimostrato in laboratorio vs inferito: la connessione AutoAdd, il fallimento di RejectPolicy e l'identità JSON con il witness sono dimostrati in laboratorio. Il dump della chiave del controller, il furto di credenziali, il POST /mim/devices di un dispositivo falso e l'esecuzione dei curl reali sul socket Unix sono inferiti dallo stesso percorso campione.
Richiede: l'operatore esegue il campione ufficiale verso un indirizzo SSH la cui chiave host non è già stata fissata, con AutoAdd lasciato attivo. Percorso di rete verso quell'SSH. AC:H è primo contatto / on-path.
| Superficie | Motivo |
|---|---|
RejectPolicy sullo stesso host sconosciuto | Lab: reject-control=yes. Paramiko rifiuta la chiave. |
Workstation con chiavi del dispositivo reale in known_hosts e riga AutoAdd rimossa | La modalità prevista dal commento. Il campione non carica mai quelle chiavi a meno che tu non aggiunga la chiamata. |
| Login HTTPS del controller | verify_ssl=False è un residuo di un campione affine (G9), non di questo sink. |
| MIM su socket Unix sul firewall reale | Solo se il MITM inoltra exec. Questo lab non comunica mai con /var/run/pfnet-controller.sock. |
Client generato con default verify_ssl=True | Il default della libreria non è il residuo. I campioni forzano False. |
Inoltre RBAC / :8443 live | Questo lab è un gadget Paramiko. Non ho comunicato con un controller Plus. |
| Internet non autenticato verso 8443 | Il login emette comunque un JWT. Non è questa la scoperta. |
| PHP/shell di diagnostica | Potere admin previsto per un JWT di flotta. Non è questa la scoperta. |
Ho fissato github.com/Netgate/pfsense-api main b4acd7ca21dbca739a530403a1f62a7440f7726f dopo i residui della WebGUI CE. Questo albero è OpenAPI più Python generato per Plus Nexus MIM. Ho letto il ciclo di enrollment in example-add-devices.py. La policy della chiave host è AutoAdd. I segreti si trovano sullo stesso canale exec. Il campione non chiama mai load_system_host_keys().