
pfSense CE 2.9.0-DEVELOPMENT - Alta - Remota - RCE - número de limitador dnctl
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · pfsense-limiter-number
Clase: RCE Alcance: Remoto
pfSense CE 2.9.0-DEVELOPMENT (9363ac5) - pfsense.org
Los Limitadores del Traffic Shaper emiten un campo number oculto al editar. Create sobrescribe ese número con dnpipe_find_nextnumber(). Edit no lo hace. validate_input nunca verifica number. GetNumber() se concatena sin comillas en dnctl pipe|sched|queue delete. El mwexec de PHP es /bin/sh -c. El privilegio es page-firewall-trafficshaper-limiter, no Diagnostics: Command.
| ID | sin CVE todavía |
| Clase | RCE |
| Alcance | Remoto (WebGUI autenticada) |
| 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) limiter number |
| Autenticación | Sesión WebGUI con page-firewall-trafficshaper-limiter |
| 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 ReadConfig / SetNumber / delete_queue fijados. Loopback 127.0.0.1:18840.
| Método | Sink | Privilegio |
|---|---|---|
Crear un limiter, POST save con number del atacante, luego eliminar ese limiter | mwexec("/sbin/dnctl pipe delete " . $this->GetNumber()) (shaper.inc:3820) | Integridad (probado en laboratorio): shell root. Laboratorio: edit-delete escribió el testigo (edit-delete-exec=yes). La sobrescritura de Create y la ruta apply-file no escribieron ninguno. |
| Mismo shell root | sistema de archivos del host | Recon (inferido): config.xml, claves. |
Shell root o dnctl de números del atacante | dummynet | Disponibilidad (inferida): interrupción del limiter / dummynet. |
Probado en laboratorio vs inferido: la sobrescritura de create (sin testigo), la ruta apply-file (dnctl de un archivo, sin testigo) y la ejecución de edit-delete (testigo) están probadas en laboratorio. El reconocimiento del sistema de archivos se infiere de PHP-FPM como root.
Requiere: sesión WebGUI con page-firewall-trafficshaper-limiter. CSRF en POST save. Delete es GET action=delete.
| Superficie | Laboratorio |
|---|---|
| Ruta Create | dnpipe_find_nextnumber() sobrescribe, create-overwrites=yes |
| Ruta Apply | dnctl de /tmp/rules.limiter, nombre de archivo no controlado por el usuario, apply-file=yes |
| Conjunto de caracteres del nombre del limiter | ^[a-zA-Z0-9_-]+$ |
| Sin autenticación | cerrado |
| Diagnostics: Command | permanece cerrado a menos que también se otorgue |
Los parámetros AQM en /tmp/rules.limiter son lenguaje dummynet adicional, no este remanente.
cd lab
./run.sh
Loopback 127.0.0.1:18840. Proyecto Compose pfsense-limiter-number. Etiqueta de imagen pfsense-limiter-number:2.9.0-dev. Testigo PFSENSE-LIMITER-NUMBER-WITNESS. Última línea:
SUCCESS PFSENSE-LIMITER-NUMBER create-overwrites=yes apply-file=yes edit-delete-exec=yes PFSENSE-LIMITER-NUMBER-WITNESS
Convertir a int GetNumber() antes de cada dnctl. Ignorar el number del POST al editar, o verificar su rango contra el id de dummynet activo. Create ya sobrescribe; hacer que edit haga lo mismo.
9363ac5b8651a1c7a333180425ce7719070f95f9shaper.inc delete_queue / GetNumberfirewall_shaper_vinterface.php