pfSense Plus MIM API toolkit b4acd7ca - Hoch - Remote - Privilegien-Rest - Paramiko AutoAddPolicy enroll
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · pfsense-api-enroll-autoadd
Klasse: Privilegien-Überbleibsel Reichweite: Remote
pfSense Plus MIM API (Netgate/pfsense-api) b4acd7ca - Netgate
example-add-devices.py ist der dokumentierte Weg, den Nexus-Controller bei jedem pfSense-Gerät zu registrieren. Es wird nie load_system_host_keys() aufgerufen. Es wird paramiko.AutoAddPolicy() gesetzt, dann connect, dann exec_command(device_script). Der Kommentar besagt, AutoAdd zu entfernen, wenn Geräte bereits in known_hosts stehen. Standardmäßig wird AutoAdd ausgeliefert.
Erstkontakt-SSH zu einer neuen Box akzeptiert jeden Host-Key, der antwortet. Passwort- oder Key-Authentifizierung wird diesem Peer präsentiert. stdout wird json.loads'd und POST /mim/devices'd an den echten Controller.
Dies ist nicht das REST-Paket von Drittanbietern für CE. Dies ist das offizielle OpenAPI plus generierter Python-Client für pfSense Plus Nexus Multi-instance Management. Der Server ist nur für Plus. Das Lab ist ein Paramiko-SSH-Gadget. Ich habe nicht mit einem Live-Plus-Controller gesprochen.
| ID | noch keine CVE |
| Klasse | Privilegien-Überbleibsel (Paramiko AutoAddPolicy bei Enrollment-SSH) |
| Reichweite | Remote (On-Path zum Geräte-SSH beim Erstkontakt) |
| CWE | CWE-322 |
| CVSS | Hoch: 8.1 CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:H |
| Produkt | Netgate/pfsense-api (Plus Nexus MIM Client-Toolkit) |
| Betroffen | main b4acd7ca21dbca739a530403a1f62a7440f7726f example-add-devices.py |
| Auth | Operator führt das offizielle Beispiel aus; Angreifer ist On-Path zum Geräte-SSH |
| Lizenz | GNU Affero GPL v3.0 |
| Lab | nur 127.0.0.1:19111. Kein Plus-Image. |
AC:H ist Erstkontakt / On-Path. Eine Workstation, die bereits die echten Geräteschlüssel in known_hosts hat und bei der die AutoAdd-Zeile entfernt wurde, ist nicht dieses Überbleibsel.
Gleiche Pin-Überbleibsel: JSON-Interpolation von ControllerSummary in die Enrollment-Shell (G1) und Beispiele erzwingen verify_ssl=False (G9). Serien-Hub: pfsense-api-nexus-mim.
Sich On-Path zu einer Erstkontakt-SSH-Adresse in pfsense_addresses setzen, während der Operator das Beispiel ausführt. AutoAdd ist weiterhin aktiv.
| Methode | Sink | Berechtigung |
|---|---|---|
On-Path zu einer First-Contact-SSH-Adresse in pfsense_addresses sitzen | set_missing_host_key_policy(paramiko.AutoAddPolicy()) dann connect (example-add-devices.py:151-160) | Integrität (im Lab nachgewiesen): unbekannter Host-Key wird akzeptiert. Lab: AutoAddPolicy verbunden (autoadd=yes). RejectPolicy fehlgeschlagen (reject-control=yes). |
Dieselbe Sitzung, exec_command(device_script) beantworten | stdout als DeviceIdentity geparst (example-add-devices.py:161-187) | Integrität (im Lab nachgewiesen): exec lieferte Identitäts-JSON mit PFSENSE-API-ENROLL-AUTOADD-WITNESS (identity-json=yes). |
| Derselbe MITM, die exec-Nutzlast lesen | device_script ist der übrig gebliebene curl -d von ControllerSummary aus G1 | Recon (aus dem Quellcode abgeleitet): Controller-Identitätsschlüssel, Netgard vpn_pubkey / vpn_netkey / Listen-Adressen. Von diesem Lab nicht gedumpt. |
| Derselbe MITM, Passwort- oder Key-Auth | SSHUSER / SSHPASS oder Agent/Keys (example-add-devices.py:156-160) | Recon (abgeleitet): Credentials oder Keys, die dem Fake-Host präsentiert werden. Das Lab nutzte Passwort-Auth nur als Beispiel-SSHPASS-Pfad. |
Dasselbe stdout-JSON, add_controlled_device.sync | POST /mim/devices auf dem echten Controller | Integrität (abgeleitet): registriert Attacker-Noise/VPN-Keys und address. Plus-Handshake in diesem Lab nicht ausgeführt. |
| MITM ist der SSH-Server | was auch immer exec der Client gesendet hat, als SSHUSER | Integrität / Verfügbarkeit (abgeleitet): das Enrollment-Skript ausführen, verwerfen oder überspringen. Unix-Socket-Aufrufe auf dem echten Gerät erfolgen nur, wenn der MITM sie weiterleitet. |
Im Lab nachgewiesen vs. abgeleitet: AutoAdd-Connect, RejectPolicy-Fail und Identitäts-JSON mit dem Witness sind Lab. Controller-Key-Dump, Credential-Diebstahl, POST /mim/devices eines Fake-Geräts und das Ausführen der echten Unix-Socket-curls sind aus demselben Beispielpfad abgeleitet.
Voraussetzungen: Der Operator führt das offizielle Beispiel gegen eine SSH-Adresse aus, deren Host-Key noch nicht gepinnt ist, mit aktiviertem AutoAdd. Netzwerkpfad zu dieser SSH. AC:H ist First-Contact / On-Path.
| Angriffsfläche | Warum |
|---|---|
RejectPolicy auf demselben unbekannten Host | Lab: reject-control=yes. Paramiko lehnt den Key ab. |
Workstation mit echten Geräte-Keys in known_hosts und entfernter AutoAdd-Zeile | Der im Kommentar beabsichtigte Modus. Das Beispiel lädt diese Keys nie, es sei denn, man fügt den Aufruf hinzu. |
| HTTPS-Controller-Login | verify_ssl=False ist ein übrig gebliebenes Geschwister-Beispiel (G9), nicht dieser Sink. |
| Unix-Socket-MIM auf der echten Firewall | Nur wenn der MITM exec weiterleitet. Dieses Lab spricht nie mit /var/run/pfnet-controller.sock. |
Generierter Client-Standard verify_ssl=True | Der Library-Standard ist nicht das Überbleibsel. Beispiele erzwingen False. |
Plus RBAC / Live-:8443 | Dieses Lab ist ein Paramiko-Gadget. Ich habe nicht mit einem Plus-Controller gesprochen. |
| Unauthentifiziertes Internet-zu-8443 | Login stellt weiterhin ein JWT aus. Nicht dieser Befund. |
| Diagnostics PHP/Shell | Beabsichtigte Admin-Befugnis für ein Fleet-JWT. Nicht dieser Befund. |
Ich habe github.com/Netgate/pfsense-api main b4acd7ca21dbca739a530403a1f62a7440f7726f nach den CE-WebGUI-Überbleibseln gepinnt. Dieser Tree ist OpenAPI plus generiertes Python für Plus Nexus MIM. Ich habe die Enrollment-Schleife in example-add-devices.py gelesen. Die Host-Key-Policy ist AutoAdd. Secrets liegen auf demselben exec-Kanal. Das Beispiel ruft nie load_system_host_keys() auf.