pfSense Plus MIM API toolkit b4acd7ca - Hoch - Remote - Privilegien-Rest - GET /services/acme gibt Schlüssel preis
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · pfsense-api-acme-key-dump
Klasse: Privilegien-Überrest Reichweite: Remote
pfSense Plus Nexus Multi-instance Management OpenAPI-Toolkit b4acd7ca - Netgate
GET /services/acme (GetACMEConfig) liefert ACMEConfig ohne Write-only- oder Redacted-Flag zurück. Das 200-Schema enthält den privaten Schlüssel des ACME-Kontos, jeden ausgegebenen Leaf-Privatschlüssel, jeden benutzerdefinierten Leaf-Schlüssel und die zur Validierung verwendeten DNS-Provider-Tokens. Der Cert-Manager hat zumindest ein dediziertes GET .../export-key. ACME hat keines. Config GET ist der Dump.
Eine Controller-Session, die diesen Pfad per GET abrufen kann, kopiert jeden Hostnamen-Schlüssel, den die Firewall registriert, sowie die DNS-Anmeldedaten, die die Kontrolle über diese Namen belegen.
Dieser Baum ist die öffentliche OpenAPI plus ein generierter Python-Client. Es ist nicht das CE-REST-Paket. Der MIM-Controller ist Plus-only und nicht im GitHub-Repo enthalten. Ich habe nicht mit einem Live-Controller gesprochen. plus-not-executed=1.
| ID | noch keine CVE |
| Klasse | Privilegien-Überrest (Secret-Dump bei Config GET) |
| Reichweite | Remote (authentifizierter MIM-Controller; nicht als unauth nachgewiesen) |
| CWE | CWE-200 |
| CVSS | Hoch: 6.5 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:N/A:N, wenn eine Services-Read-Rolle den Body erhält. Wenn nur der Superuser ihn per GET abrufen kann, ist der Dump für ein Konfigurationslisting dennoch die falsche Form. |
| Produkt | Netgate/pfsense-api OpenAPI für pfSense Plus Nexus MIM |
| Betroffen | öffentliches main b4acd7ca21dbca739a530403a1f62a7440f7726f (2026-05-25, Add Snort-3 API definitions). Keine Tags. |
| Auth | Controller-JWT aus POST /login. Beispiele senden Bearer. Spec hat keine securitySchemes. |
| Lizenz | GNU Affero GPL v3.0 |
| Lab | nur 127.0.0.1:19151. Kein Plus-Image. |
Serien-Hub: pfSense Plus MIM leftovers. Dies ist Teil 5. Verkettet mit G9 stolen JWT (Beispiele setzen verify_ssl=False) und G6 fleet token (ein Login-Bearer wird für jede device_id wiederverwendet). Schwester-Dump: G4 cert-manager export-key.
Erfordert eine Controller-Session, die GET /services/acme ausführen kann. Die Dokumentation ordnet dies mim_services_read / mim_services / mim_superuser zu. Die Spec weist diese Rollen dem Pfad nicht zu. Plus RBAC wurde nicht ausgeführt.
Ein gestohlenes JWT aus G9 (MITM der offiziellen Beispiele) oder ein Helpdesk-Fleet-Token aus G6 reicht aus, um diesen GET auf jede registrierte Box zu richten. Diese Kette ist abgeleitet. Dieser Überrest ist der GET-Body.
| Methode | Sink | Berechtigung |
|---|---|---|
GET /services/acme | ACMEConfig.account_keys[].account_key (format: byte) | Im Labor anhand der veröffentlichten Spezifikation und des Mocks nachgewiesen: Das 200-Schema enthält account_key; der Mock-Body gibt PFSENSE-API-ACME-KEY-DUMP-WITNESS unverändert zurück. Für Plus abgeleitet: den privaten Schlüssel des Let's-Encrypt-Kontos (oder eines anderen ACME-Kontos) kopieren. Vom ACME-Konto aus dem Off-Box-Kontext kommunizieren. |
| Dasselbe GET | certs[].issued_cert.privateKey (format: byte) | Im Labor anhand von Spezifikation und Mock nachgewiesen. Für Plus abgeleitet: jeden privaten Schlüssel eines ausgestellten Leaf-Zertifikats kopieren, das die Firewall bezogen hat. TLS-Impersonation aus dem Off-Box-Kontext für diese Namen. |
| Dasselbe GET | certs[].custom_key (format: byte) | Im Labor anhand von Spezifikation und Mock nachgewiesen. Für Plus abgeleitet: einen benutzerdefinierten Leaf-Schlüssel kopieren, wenn key_type=custom. |
| Dasselbe GET | certs[].domain_list[].config.credentials (additionalProperties: string) | Im Labor anhand von Spezifikation und Mock nachgewiesen. Für Plus abgeleitet: DNS-Validierungsgeheimnisse kopieren (Cloudflare-Token, AWS-Schlüssel, RFC2136-Geheimnisse). Diese belegen die Kontrolle über die Namen. |
| Dasselbe GET | Konto-E-Mails, benutzerdefinierte Server-URLs, action_list.command | Im Labor nachgewiesen, dass die Felder im Schema vorhanden sind. Hook-Ausführung ist ein Änderungspfad, nicht dieses GET. |
Keine durch das GET selbst. Die spätere Nutzung gestohlener Schlüssel und DNS-Token erfolgt außerhalb der Box (ein betrügerisches Zertifikat ausstellen, mit dem ACME-Konto kommunizieren, DNS ändern). Nicht ausgeführt.
Keine. Das Auflisten der Konfiguration widerruft oder überschreibt keine Zertifikate.
Erfordert: authentifizierten MIM-Controller-Zugriff, der berechtigt ist, das ACME-Tag per GET abzurufen. Nicht als unauthentifiziert nachgewiesen. Das generierte _get_kwargs für diesen Vorgang fügt kein Authorization hinzu; die Beispiele melden sich weiterhin an und senden Bearer.
| Angriffsfläche | Grund |
|---|---|
| Live pfSense Plus / Nexus Controller | Nicht ausgeführt. plus-not-executed=1. |
| Unauthentifiziertes Internet-zu-8443 | Die Beispiele erfordern POST /login. Fehlende OAS-security ist eine Spezifikationslücke, kein Beweis für einen Server-200-ohne-JWT. |
POST /services/acme/cert/{name}/issue und .../renew | Beabsichtigte Dienständerung. |
POST /services/acme/genprivatekey | Beabsichtigtes Generieren und Zurückgeben eines neuen Kontoschlüssels. Nicht dieser Überrest. |
POST /diag/cmd/php / POST /diag/cmd/shell | Beabsichtigte Admin-Konsole. Separate Angriffsfläche. Der Hersteller betrachtet Diagnostics: Command als beabsichtigt (CVE-2025-69691 umstritten). |
GET /system/certificates/{refid}/export-key | Separater Überrest: dedizierter Schlüsselexport im Zertifikatsmanager. ACME hat keinen entsprechenden Export-Vorgang. |
GET /services/acme/validmethods | Methodenkatalog. Keine Schlüssel. |
CE jaredhendrickson/pfsense-api | Anderes Produkt. |
Ich habe das öffentliche Netgate/pfsense-api b4acd7ca nach der CE-2.9.0-DEVELOPMENT-Welle gepinnt. Dieser Tree ist OpenAPI 3.0.3 (pfapi_openapi.yml, 486 Pfade, 755 Ops) plus ein generierter Python-Client für den Plus-MIM-Controller auf :8443. Keine Tags. Der letzte öffentliche Commit an dem Tag, an dem ich geklont habe, war der 25.05.2026, „Add Snort-3 API definitions."
Zwölf Suchläufe über Login/JWT, Diagnostik, MIM-Enrollment, Client-TLS, Benutzer/Zertifikate, Pakete, VPN/Firewall, OpenAPI-Sicherheit, Geräte-IDOR, Git/Firmware/Feeds sowie einen Loopback-Mock jeder generierten Operation.