pfSense Plus MIM API toolkit b4acd7ca – Hoch – Remote – Privilegien-Rest – example-add-devices.py JSON in SSH
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · pfsense-api-enroll-json-ssh
Klasse: Privilegien-Überbleibsel Reichweite: Remote
pfSense Plus MIM API Toolkit (b4acd7ca) - Netgate
example-add-devices.py ist der dokumentierte Weg, um den Nexus-Controller auf jedem pfSense Plus-Gerät über SSH zu registrieren. Es json.dumpst GET /mim/controller/identity, ersetzt nur " und .formattet diesen Blob zweimal in ein doppelt gequotetes curl -d POSIX-Skript. Paramiko exec_command führt das Skript als SSHUSER (Beispiel-Standard admin) auf jeder Adresse in pfsense_addresses aus.
json.dumps plus replace('"', '\\"') hält die Anführungszeichen geschlossen. $(), Backticks und ${...} sind keine JSON-Metazeichen. Sie bleiben aktiv innerhalb des noch offenen doppelt gequoteten -d-Strings. OpenSSH exec ist eine Shell. Das ist das Überbleibsel.
Dies ist nicht das Drittanbieter-CE-REST-Paket. Es ist der offizielle OpenAPI-Client und die Beispiele für den pfSense Plus Nexus Multi-instance Management-Controller. Ich habe Plus nicht zusammengestellt. Das Lab ist die gepinnte Interpolation plus ein Mock /var/run/pfnet-controller.sock.
| ID | noch keine CVE |
| Klasse | Privilegien-Überbleibsel (Controller-JSON in Enrollment-SSH) |
| Reichweite | Remote (On-Path zu CONTROLLER_URL, während das Beispiel verify_ssl=False setzt, oder ein Schreiber von ControllerSummary-String-Feldern) |
| CWE | CWE-78 |
| 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 MIM Toolkit) |
| Betroffen | öffentliches main b4acd7ca21dbca739a530403a1f62a7440f7726f example-add-devices.py |
| Auth | Operator führt das dokumentierte Beispiel aus. Angreifer ist On-Path oder kann Summary-Strings schreiben. Login am Controller erfolgt weiterhin zuerst. |
| Lizenz | GNU Affero GPL v3.0 |
| Lab | nur 127.0.0.1:19101. Kein Plus-Image. |
Teil 1 der Nexus MIM-Überbleibsel-Serie. Verwandte: enroll-autoadd, unix-sock-noauth, example-ssl-verify (G9 ist, wie ein On-Path-Peer dieses JSON formt), fleet-jwt, export-key-get.
Das Überbleibsel ist Kommandosubstitution innerhalb des noch offenen doppelt gequoteten -d-Strings. json.dumps plus der Quote-Pass halten den String geschlossen. $(), Backticks und ${...} überleben und werden als SSHUSER ausgeführt, wenn OpenSSH das Skript exect.
| Methode | Sink | Berechtigung | Im Labor nachgewiesen oder abgeleitet |
|---|---|---|---|
$() (oder Backticks / ${...}) in ein ControllerSummary-String-Feld einfügen und dann den Operator example-add-devices.py ausführen lassen | controller_info.replace('"', '\\"') dann device_script.format(...) dann sshclient.exec_command(device_script) (example-add-devices.py ~104-161) | Shell als SSHUSER (Beispiel-Standard admin; pfSense-Admin-SSH ist typischerweise root-äquivalent) auf jeder Adresse in pfsense_addresses | Im Labor nachgewiesen bei der Interpolation: INJECT vpn_listenaddr=$(printf %s PFSENSE-API-ENROLL-JSON-SSH-WITNESS >/oracle/witness) überlebte die reine Quote-Escape (dollar-paren-survived=yes) und schrieb den Witness (inject-oracle=yes). Paramiko/SSH selbst ist nicht in diesem Compose enthalten. |
TLS-MITM von GET /api/mim/controller/identity, während das Beispiel verify_ssl=False verwendet | Derselbe ControllerSummary-Parse, dann dasselbe Skript | Dieselbe Shell. Alle ControllerSummary-Felder sind str oder Unset, daher genügt ein MITM-JSON-Body, der typkonform parst. | Abgeleitet aus dem Beispiel (example-add-devices.py Login Client und AuthenticatedClient setzen beide verify_ssl=False). Das Labor postet das Summary-Objekt direkt. Verwandt: example-ssl-verify. |
Substitutionszeichen in name oder vpn_listenaddr auf dem Controller schreiben, auf das nächste Enroll warten | Derselbe Sink | Dieselbe Shell, wenn ein Operator als Nächstes das Beispiel ausführt | Abgeleitet. Erfordert ein vorheriges Schreiben dieser Felder (bereits Controller-Admin, oder das unix-sock-noauth-Sibling). |
Dieselbe Shell, zusätzliche Keys über ControllerSummary.additional_properties | Derselbe Dump enthält zusätzliche MITM-Keys (to_dict kopiert Reste nach from_dict) | Zusätzliche Felder gelangen in -d und in die Shell | Abgeleitet aus to_dict. Das Labor injiziert nur über vpn_listenaddr. |
| Methode | Sink | Berechtigung | Im Labor nachgewiesen oder abgeleitet |
|---|---|---|---|
| stdout der Enrollment-Workstation lesen | print("CONTROLLER_SUMMARY:", controller_info) | Controller-Identität key, Netgard vpn_pubkey / vpn_netkey / Listen-Adressen | Abgeleitet aus dem Beispiel-Print. Das Labor gibt keinen Live-Controller-Blob aus. |
| Den SSH-Exec-Kanal sniffen oder MITM'en | exec_command(device_script)-Payload ist das curl--d-JSON | Dieselbe Controller-Identität auf dem Draht zu jedem Gerät | Abgeleitet. AutoAddPolicy auf diesem Kanal ist ein verwandter Bericht. |
| CONTROL-Fall auf dem Gadget | POST /case name=control | Ehrliche vpn_listenaddr erreicht den Unix-Socket unverändert | Im Labor nachgewiesen. 192.0.2.10:51820 unverändert gepostet, kein Oracle (control-clean=yes). |
| Methode | Sink | Berechtigung | Im Labor nachgewiesen oder abgeleitet |
|---|---|---|---|
Injizierter Befehl als SSHUSER | Derselbe exec_command | pfnet-controller stoppen, Enrollment löschen, neu starten oder das Gerät anderweitig von MIM trennen | Abgeleitet als Seiteneffekt der Shell. Das Labor schreibt nur die Witness-Datei. |
Erfordert: den offiziellen Beispielpfad (Operator-Enroll). UI:N für den On-Path-Peer, sobald dieses Beispiel läuft. Der Login am Controller erfolgt weiterhin zuerst.