
pfSense CE 2.9.0-DEVELOPMENT - Alta - Remota - RCE - CARP VHID residual
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · pfsense-carp-vhid
Clase: RCE Alcance: Remoto
pfSense CE 2.9.0-DEVELOPMENT (9363ac5) - pfsense.org
La edición de IP virtual almacena el VHID de CARP desde el POST sin ninguna comprobación de 1-255. Las opciones de Form_Select son solo HTML. La aplicación de CARP aplica escapeshellarg al VHID. La aplicación de IP Alias apilada interpola vhid {$carpvip['vhid']} fuera de escapeshellarg. El estado de CARP interpola el mismo VHID almacenado en una tubería grep entre comillas dobles; el punto y coma permanece entrecomillado, la sustitución de comandos aún se ejecuta bajo /bin/sh -c. El privilegio es edición de VIP + aplicar, 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) CARP VHID |
| Autenticación | Sesión WebGUI con edición de VIP + aplicar (el estado/widget es un disparador posterior) |
| 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 interface_carp_configure fijado, mwexec de ipalias apilado, y exec de estado. Loopback 127.0.0.1:18830.
| Método | Sink | Privilegio |
|---|---|---|
POST de carp VIP con un VHID no entero, luego aplicar un IP Alias apilado sobre ese padre _vip{uniqid} | mwexec ifconfig ... alias {$gateway} {$vhid} (interfaces.inc:3238) | Integridad (probado en laboratorio): shell root. Laboratorio: ipalias-unescaped escribió el testigo. La aplicación de CARP del mismo VHID no escribió ninguno (carp-escaped=yes). |
Mismo VHID almacenado, luego GET status_carp.php o renderizar carp_status.widget.php | tubería grep de exec (pfsense-utils.inc:794) | Integridad (probado en laboratorio): la sustitución de comandos dentro de las comillas dobles se ejecutó y escribió el testigo (status-sink=yes, status-subst=yes). El punto y coma permaneció entrecomillado. El disparador del widget puede ser otra sesión GUI. |
| Mismo shell root | sistema de archivos del host | Recon (inferido): config.xml, claves. |
Shell root o ifconfig roto | dispositivos CARP / alias | Disponibilidad (inferido): interrupción de interfaz / CARP / filtro. |
Probado en laboratorio vs inferido: carp-escaped, testigo ipalias-unescaped, y testigo de sustitución de comandos de estado están probados en laboratorio. El reconocimiento del sistema de archivos y la interrupción del filtro se infieren de PHP-FPM root.
Requiere: page-firewall-virtualipaddress-edit (guardar) y page-firewall-virtualipaddresses (aplicar). Sink de estado: page-status-carp o cualquier panel con el widget CARP. CSRF en POST.
| Superficie | Laboratorio |
|---|---|
| La propia aplicación de CARP | escapeshellarg en VHID, carp-escaped=yes |
| Contraseña CARP / advbase / advskew / subnet | is_ipaddr / escapado |
| Sin autenticación | cerrado |
| aplicación xmlrpc de los mismos objetos sin credenciales HA | lista de omisión SA-26_22 |
| Diagnostics: Command | permanece cerrado a menos que también se conceda |
cd lab
./run.sh
Loopback 127.0.0.1:18830. Proyecto compose pfsense-carp-vhid. Etiqueta de imagen pfsense-carp-vhid:2.9.0-dev. Testigo PFSENSE-CARP-VHID-WITNESS. Última línea:
SUCCESS PFSENSE-CARP-VHID carp-escaped=yes ipalias-unescaped=yes status-sink=yes PFSENSE-CARP-VHID-WITNESS
Limitar el VHID a un rango entero de 1-255 al guardar. Aplicar escapeshellarg al VHID en la aplicación de IP Alias apilada y en el grep de estado, de la misma manera que ya lo hace la aplicación de CARP.
9363ac5b8651a1c7a333180425ce7719070f95f9firewall_virtual_ip.inc saveVIPinterfaces.inc ipalias apilado mwexecpfsense-utils.inc grep de estado de CARP