pfSense CE 2.9.0-DEVELOPMENT - Élevé - À distance - RCE - IPsec login_banner start-scripts
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · pfsense-ipsec-login-banner
Classe : RCE Portée : Distante
pfSense CE 2.9.0-DEVELOPMENT (9363ac5) - pfsense.org
La bannière de connexion IPsec Mobile est stockée avec une simple vérification de longueur, puis injectée sans guillemets dans strongswan.conf en tant que charon.plugins.attr.28672. strongSwan termine une valeur non quotée sur }. Une bannière compatible Form_Input (sans retours à la ligne) peut fermer attr / plugins et ouvrir charon.start-scripts. L'application sur cette page est strongswanrc restart. charon exécute popen sur les chemins start-scripts à son démarrage. Le privilège est page-vpn-ipsec-mobile, et non IPsec avancé / Diagnostics : Command.
| ID | pas encore de CVE |
| Classe | RCE |
| Portée | Distante (WebGUI authentifiée) |
| CWE | CWE-74 |
| CVSS | Élevé : 8.8 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H |
| Produit | pfSense CE |
| Affecté | 2.9.0-DEVELOPMENT (9363ac5b8651a1c7a333180425ce7719070f95f9) IPsec login_banner |
| Auth | Session WebGUI avec page-vpn-ipsec-mobile |
| Licence | GNU Affero GPL v3.0 |
| Lab | 127.0.0.1 uniquement |
J'ai épinglé le master public 9363ac5. Le lab est épinglé sur ipsec_strongswan_confgen plus le vrai /usr/lib/ipsec/charon. Loopback 127.0.0.1:18850. Le préfixe include n'a pas été utilisé.
| Méthode | Point de sortie | Privilège |
|---|---|---|
POST vpn_ipsec_mobile.php save avec login_banner_enable + une bannière qui ferme attr/plugins et ouvre charon.start-scripts, puis POST apply | ipsec_strongswan_confgen non quoté key = {$value} (ipsec.inc:1378-1384) ; charon popen des start-scripts | Intégrité (prouvé en lab) : le vrai charon a chargé la conf générée et a exécuté popen sur le chemin start-scripts (charon=yes). La bannière de contrôle Welcome est restée à l'intérieur de attr (control-no-scripts=yes). |
| Même popen | système de fichiers de l'hôte | Recon (déduit) : config.xml, clés. |
strongswan.conf invalide ou redémarrage IPsec | charon | Disponibilité (déduit) : les tunnels IPsec tombent ou échouent au démarrage. Apply redémarre déjà IPsec. |
Prouvé en lab vs déduit : control-no-scripts, start-scripts dans la conf générée, et le vrai charon popen sont prouvés en lab. La reconnaissance du système de fichiers est déduite de ce popen. Des sections factices après le bloc injecté absorbent les trois fermetures de confgen afin que le fichier reste un arbre de paramètres valide.
Nécessite : une session WebGUI avec page-vpn-ipsec-mobile. Un jeton CSRF. Save puis Apply sur la même page. Ne nécessite pas page-all, page-vpn-ipsec-editphase1, ni une zone de texte de configuration brute IPsec.
| Surface | Lab |
|---|---|
Bannière de contrôle Welcome | reste à l'intérieur de attr, pas de start-scripts |
| Non authentifié / CSRF sans jeton | fermé |
OpenVPN config.ovpn | autre résidu (G2) |
| XSS HTML P1 | SA-26_14 skip-list |
page-vpn-ipsec-editphase1 | non requis |
| Diagnostics : Command | reste fermé sauf si également accordé |
Le dns_domain d'IPsec mobile sur cette page utilise déjà is_domain().
cd lab
./run.sh
Loopback 127.0.0.1:18850. Projet Compose pfsense-ipsec-login-banner. Tag d'image pfsense-ipsec-login-banner:2.9.0-dev. Témoin PFSENSE-IPSEC-LOGIN-BANNER-WITNESS. Dernière ligne :
SUCCESS PFSENSE-IPSEC-LOGIN-BANNER control-no-scripts=yes start-scripts=yes charon=yes PFSENSE-IPSEC-LOGIN-BANNER-WITNESS
Quoter / échapper login_banner dans ipsec_strongswan_confgen. Rejeter } # et les retours à la ligne à l'enregistrement (le widget HTML est déjà un Form_Input sur une seule ligne). is_domain() existe déjà sur cette page pour le domaine DNS ; la bannière a besoin du même type de vérification.
9363ac5b8651a1c7a333180425ce7719070f95f9vpn_ipsec_mobile.phpipsec.inc ipsec_strongswan_confgen / ipsec_setup_strongswancharon.start-scripts