
pfSense Plus MIM API toolkit b4acd7ca - Élevé - À distance - Reliquat de privilèges - GET export-key clés privées
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · pfsense-api-export-key-get
Classe : Privilège résiduel Portée : Distante
pfSense Plus MIM API (Netgate) épinglé b4acd7ca - OpenAPI public + client Python généré pour le contrôleur Nexus Multi-instance Management.
GET /system/certauth/{refid}/export-key est documenté comme « Download the CA certificate signing key ». GET /system/certificates/{refid}/export-key est « Download the certificate's private key ». GET /system/certificates/{refid}/export-p12 est un fichier PKCS12 unifié sans protection par mot de passe. La documentation associe GET sous /system à mim_system_read / mim_read_system. mim_view est documenté comme ne contenant aucune information confidentielle. La spécification n'a ni securitySchemes ni sécurité par opération. Le _get_kwargs généré est la méthode plus une URL entre guillemets. L'autorisation n'y est jamais ajoutée.
Ce n'est pas du php, ni du shell, ni du firmware POST. Un JWT volé depuis l'échantillon G9 TLS skip ou un jeton de flotte G6 suffit pour appeler ces GET. Savoir si un JWT MIM de forme lecture suffit sur Plus est le résidu. Je n'ai pas exécuté Plus. Le RBAC de Plus n'a pas été exécuté.
| ID | pas encore de CVE |
| Classe | Privilège résiduel |
| Portée | Distante (HTTP authentifié vers le contrôleur Nexus ; le labo est le contrat client public) |
| CWE | CWE-200, CWE-862 |
| CVSS | Élevé : 8.1 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:N si un JWT MIM de forme lecture peut appeler ces GET |
| Produit | Netgate/pfsense-api (contrôleur pfSense Plus Nexus MIM OpenAPI + client généré) |
| Affecté | épinglé b4acd7ca21dbca739a530403a1f62a7440f7726f (2026-05-25). OpenAPI 3.0.3 titre pfSense API version 1.0. Plus 25.11+. Pas le paquet REST CE. |
| Auth | JWT Nexus documenté (POST /login, Bearer). Le labo est l'OpenAPI public plus le contrat _get_kwargs généré. Le RBAC de Plus n'a pas été exécuté. |
| Licence | GNU Affero GPL v3.0 |
| Labo | 127.0.0.1:19141 uniquement. Pas d'image Plus. |
J'ai épinglé github.com/Netgate/pfsense-api b4acd7ca21dbca739a530403a1f62a7440f7726f. Pas master après ce jour. Pas le paquet CE tiers jaredhendrickson/pfsense-api.
Hub de la série : pfsense-api-nexus-mim. Ce pack est la Partie 4.
La documentation associe GET sous /system à mim_system_read / mim_read_system. mim_view est documenté comme ne contenant aucune information confidentielle. Le résidu est l'export de clé privée sur GET, avec PKCS12 documenté comme non protégé, et un _get_kwargs généré qui n'ajoute jamais l'Authorization.
| Méthode | Chemin | Privilège |
|---|---|---|
GET DownloadCAKey | /system/certauth/{refid}/export-key | Recon (prouvé en labo sur mock) : corps application/octet-stream contenant le PEM témoin. Inféré sur Plus : clé de signature de certificat CA si le RBAC autorise le GET. |
GET GetCertKey | /system/certificates/{refid}/export-key | Recon (prouvé en labo sur mock) : PEM témoin. Inféré sur Plus : clé privée feuille. |
GET GetCertP12 | /system/certificates/{refid}/export-p12 | Recon (prouvé en labo sur mock) : même corps témoin. Inféré sur Plus : certificat plus clé au format PKCS12 sans protection par mot de passe (résumé OpenAPI). |
_get_kwargs généré | les trois opérations | Recon (prouvé en labo) : les kwargs sont method plus url entre guillemets uniquement. Pas de headers, pas d'Authorization, pas de Bearer. |
Client (sans token) | les trois opérations | Recon (prouvé en labo) : trois hits mock avec has_authorization=false et corps témoin (client-no-auth=yes, witness-body=yes). |
AuthenticatedClient | les trois opérations | Recon (prouvé en labo) : trois hits mock avec Authorization: Bearer mock-token (authed-bearer=3). Bearer est une propriété du wrapper, pas de _get_kwargs. |
| JWT volé depuis G9 MITM, ou token de flotte G6 | les mêmes trois GET, plus /api/device/pfsense/{device_id}/api si le reliquat de flotte le permet | Recon (inféré, chaîné) : extraire les clés CA / feuille pour le contrôleur et chaque instance enrôlée que le token peut nommer. |
| Utiliser les clés CA / feuille volées | TLS, VPN, IPsec, certificats WebGUI | Intégrité (inféré, non testé en labo) : forger des certificats descendants en tant que CA ; usurper le nom TLS Nexus ; déchiffrer les tunnels qui utilisent ces certificats. Pas root Unix en soi. |
| GET de liste/détail associés | /system/certauth?withprivkey=true, champs prv / private_key des certificats | Recon (spec, pas ce labo) : extraction en masse des mêmes secrets. Non exercé ici. |
Disponibilité : aucune requise.
Prouvé en labo vs inféré : les trois chemins GET OpenAPI, la phrase PKCS12 « sans protection par mot de passe », _get_kwargs sans Authorization, les trois hits Client sans auth avec PEM témoin, les trois hits AuthenticatedClient avec Bearer, et le clone épinglé de pfapi_openapi.yml sont prouvés en labo. Les 200 de mim_system_read / mim_view sur Plus, la forge de certificats descendants et l'extraction de clés à l'échelle de la flotte sont inférés. De plus, le RBAC n'a pas été exécuté.
Nécessite (inféré, Plus non exécuté) : une connexion Nexus plus un groupe autorisé à faire GET sous /system/certauth et /system/certificates. Pas admins / mim_superuser si le reliquat est réel. Pas Diagnostics: Command. Un chemin réseau vers le contrôleur :8443 (ou le proxy de l'appareil) avec un JWT.
| Surface | Raison |
|---|---|
| RBAC Plus | Non exécuté. Ce pack ne revendique pas un 200 Plus en direct pour mim_system_read ou mim_view. |
POST /diag/cmd/php, POST /diag/cmd/shell, GET/POST /diag/cmd/download /upload /diag/editfile | Diagnostics: Command prévu. De forme superutilisateur. Pas ce reliquat. |
POST /system/firmware | Modification système / superutilisateur prévu. |
GET .../export-ca et GET .../export-cert | PEM de certificat public. Prévu. |
POST .../export-key et POST .../export-p12 avec un mot de passe en superutilisateur | Enveloppe prévue. Le GUI system_certmanager.php exporte déjà les clés de cette façon. |
| Internet vers 8443 non authentifié | Le login émet toujours un JWT. L'absence de securitySchemes dans l'OpenAPI est un piège de générateur, pas un serveur non authentifié prouvé. |
| Paquet CE jaredhendrickson/pfsense-api / pfrest.org | Produit différent. |
Défaut verify_ssl de la bibliothèque générée | True. Les exemples officiels mettent False. C'est G9, pas ce GET. |