
pfSense CE 2.9.0-DEVELOPMENT - Alta - Remota - RCE - QinQ parent-if ifconfig
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · pfsense-qinq-parent-if
Clase: RCE Alcance: Remoto
pfSense CE 2.9.0-DEVELOPMENT (9363ac5) - pfsense.org
La edición de QinQ almacena un nombre de interfaz padre sin ninguna comprobación does_interface_exist. La edición de VLAN ya rechaza un padre que no es una iface activa. Form_Select no revalida el POST. Los write_config de creación se ejecutan incluso cuando interface_qinq_configure retorna de forma temprana. La adición/eliminación de miembros entonces interpola el vlanif almacenado en un ifconfig sin escapar. El exec de PHP es /bin/sh -c. El PHP-FPM del WebGUI es root. El privilegio es page-interfaces-qinq-edit, no Diagnostics: Command.
| ID | sin CVE todavía |
| Clase | RCE |
| Alcance | Remoto (WebGUI autenticado) |
| CWE | CWE-78 |
| CVSS | Alto: 8.8 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H |
| Producto | pfSense CE |
| Afectado | 2.9.0-DEVELOPMENT (9363ac5b8651a1c7a333180425ce7719070f95f9) edición de QinQ |
| Autenticación | Sesión de WebGUI con page-interfaces-qinq-edit |
| Licencia | GNU Affero GPL v3.0 |
| Laboratorio | solo 127.0.0.1 |
Fijé el master público 9363ac5. El laboratorio es un gadget PHP de las líneas fijadas de vlan_interface / interface_qinq_configure / exec de miembro, con HTTP en loopback sobre 127.0.0.1:18810.
| Método | Sink | Privilegio |
|---|---|---|
| POST de creación de QinQ con un padre que no es una iface activa, luego POST de edición añadiendo un miembro | interface_qinq2_configure exec ifconfig vlan create ... (interfaces.inc:620) | Integridad (probado en laboratorio): shell root vía /bin/sh -c. Laboratorio: la adición de miembro qinq2 escribió el testigo (member-sink=yes). |
Mismo vlanif almacenado, POST de edición eliminando un miembro | exec("/sbin/ifconfig {$parent}.{$tag} destroy") (interfaces_qinq_edit.php:212) | Integridad (probado en laboratorio): mismo exec root. Destroy no tiene límite IF_NAMESIZE. |
| Mismo shell root | sistema de archivos del host | Recon (inferido): config.xml, claves, otros inquilinos. Esta página no imprime la salida de exec. |
Shell root o ifconfig roto | dispositivos vlan | Disponibilidad (inferido): crear/destruir dispositivos vlan; el plano de datos está en juego. |
Probado en laboratorio vs inferido: el rechazo de VLAN, la creación sin exec, el bloqueo de IF_NAMESIZE con longitud 16 y el testigo de adición de miembro qinq2 están probados en laboratorio. El reconocimiento del sistema de archivos y la interrupción del plano de datos se infieren del PHP-FPM root.
Requiere: sesión de WebGUI con page-interfaces-qinq-edit. Token CSRF. Dos POSTs (creación, luego edición de miembro). El admin por defecto tiene la página. A un usuario limitado se le puede conceder solo esta página.
| Superficie | Laboratorio |
|---|---|
| Comprobación de existencia del padre de VLAN | vlan-rejected=yes |
| QinQ solo creación (padre ausente) | almacena config, create-no-exec=yes |
| Longitud de nombre qinq2 16 | if-namesize-block=yes antes de exec |
| Sin autenticación / CSRF sin token | guiconfig + CSRF-magic |
Regex de nombre GIF/GRE, miembros LAGG does_interface_exist + escapeshellarg | otras páginas |
| Eliminación en la lista QinQ de un padre nunca creado | does_interface_exist($vlanif) |
| Diagnostics: Command | permanece cerrado a menos que también se conceda |
Sin Diagnostics: Command. Sin acceso no autenticado. La clase histórica es CVE-2023-42326 GIF/GRE, página diferente.
cd lab
./run.sh
Loopback 127.0.0.1:18810. Proyecto de Compose pfsense-qinq-parent-if. Etiqueta de imagen pfsense-qinq-parent-if:2.9.0-dev. Testigo PFSENSE-QINQ-PARENT-IF-WITNESS. Última línea:
SUCCESS PFSENSE-QINQ-PARENT-IF vlan-rejected=yes create-no-exec=yes member-sink=yes if-namesize-block=yes PFSENSE-QINQ-PARENT-IF-WITNESS
Edición de QinQ: rechazar un padre que no es una interfaz activa, igual que la edición de VLAN. Las comprobaciones de enteros de las etiquetas de miembro ya existen; aun así, aplicar escapeshellarg al vlanif almacenado antes de cada ifconfig. Limitar el destroy de eliminación de miembro de la misma forma en que interface_qinq2_configure limita IF_NAMESIZE.
9363ac5b8651a1c7a333180425ce7719070f95f9interfaces_qinq_edit.phpinterfaces.inc interface_qinq2_configureinterfaces_vlan_edit.php