
pfSense CE 2.9.0-DEVELOPMENT - Élevé - À distance - RCE - timezone php.ini prepend
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · pfsense-timezone-phpini
Classe : RCE Portée : Distante
pfSense CE 2.9.0-DEVELOPMENT (9363ac5) - pfsense.org
system.php écrit $_POST['timezone'] sans in_array par rapport à system_get_timezone_list(). is_timezone() ne rejette qu'un slash final. system_timezone_configure écrit /var/db/zoneinfo. rc.php_ini_setup interpole date.timezone="${TIMEZONE}" dans php.ini. Un guillemet suivi d'un saut de ligne ajoute auto_prepend_file.
| ID | pas encore de CVE |
| Classe | RCE |
| Portée | Distante (WebGUI authentifié sauf indication contraire) |
| CWE | CWE-94 |
| 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) |
| Auth | Session WebGUI avec page-system-generalsetup |
| Licence | GNU Affero GPL v3.0 |
| Lab | 127.0.0.1 uniquement |
J'ai épinglé le master public 9363ac5. Le lab est un gadget PHP du sink épinglé, HTTP en loopback sur 127.0.0.1:18940.
Article de la série : https://abraxaslabs.tech/research/pfsense-ce-leftovers
| Méthode | Sink | Privilège |
|---|---|---|
| POST system.php timezone | rc.php_ini_setup date.timezone="${TIMEZONE}" | Intégrité : Prouvé en lab : le php.ini généré a accepté auto_prepend_file ; php -c plus un script analogue à php-fpm a exécuté le prepend et écrit le témoin. |
| même reliquat | même sink | Reconnaissance : Déduit : le prepend s'exécute en tant que PHP root après reconstruction de php.ini / redémarrage de php-fpm. |
| même reliquat | même sink | Disponibilité : Déduit : un php.ini cassé peut mettre la GUI hors service jusqu'à réparation. |
Nécessite : page-system-generalsetup. CSRF-magic sur POST sauf indication contraire. Le PHP-FPM du WebGUI est root.
Nécessite : page-system-generalsetup. CSRF-magic sur POST sauf indication contraire. Le PHP-FPM du WebGUI est root. CSRF-magic sur POST sauf indication contraire. Le PHP-FPM du WebGUI est root.
Form_Select est uniquement UI. hostname/domain ont leurs propres vérifications de jeu de caractères. Non authentifié : N/A.
Pas de Diagnostics : Command sauf si cette page est également accordée.
cd lab
./run.sh
Loopback 127.0.0.1:18940. Projet Compose pfsense-timezone-phpini. Témoin PFSENSE-TIMEZONE-PHPINI-WITNESS. Loopback uniquement : 127.0.0.1:18940. Projet Compose pfsense-timezone-phpini. Témoin PFSENSE-TIMEZONE-PHPINI-WITNESS. Gadget PHP des lignes épinglées. La stack est démontée après l'exécution.
Dernière ligne :
SUCCESS PFSENSE-TIMEZONE-PHPINI control-clean=yes trigger-prepend=yes is-timezone-accepts=yes not-allowlisted=yes PFSENSE-TIMEZONE-PHPINI-WITNESS
in_array timezone par rapport à system_get_timezone_list(). Échapper les guillemets dans l'interpolation de rc.php_ini_setup.
9363ac5b8651a1c7a333180425ce7719070f95f9