
pfSense CE 2.9.0-DEVELOPMENT - Alto - Remoto - RCE - limiter number dnctl
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · pfsense-limiter-number
Classe: RCE Portata: Remota
pfSense CE 2.9.0-DEVELOPMENT (9363ac5) - pfsense.org
I Traffic Shaper Limiters emettono un campo number nascosto in fase di modifica. La creazione sovrascrive quel numero con dnpipe_find_nextnumber(). La modifica no. validate_input non controlla mai number. GetNumber() viene concatenato senza virgolette in dnctl pipe|sched|queue delete. Il PHP mwexec è /bin/sh -c. Il privilegio è page-firewall-trafficshaper-limiter, non Diagnostics: Command.
| ID | nessuna CVE al momento |
| Classe | RCE |
| Portata | Remota (WebGUI autenticata) |
| 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 |
| Prodotto | pfSense CE |
| Affetto | 2.9.0-DEVELOPMENT (9363ac5b8651a1c7a333180425ce7719070f95f9) limiter number |
| Auth | Sessione WebGUI con page-firewall-trafficshaper-limiter |
| Licenza | GNU Affero GPL v3.0 |
| Lab | solo 127.0.0.1 |
Ho fissato il master pubblico 9363ac5. Il lab è un gadget PHP di ReadConfig / SetNumber / delete_queue fissati. Loopback 127.0.0.1:18840.
| Metodo | Sink | Privilegio |
|---|---|---|
Creare un limiter, POST save con number dell'attaccante, poi eliminare quel limiter | mwexec("/sbin/dnctl pipe delete " . $this->GetNumber()) (shaper.inc:3820) | Integrità (dimostrata in lab): root shell. Lab: edit-delete ha scritto il witness (edit-delete-exec=yes). La sovrascrittura in creazione e il percorso apply-file non hanno scritto nulla. |
| Stessa root shell | filesystem host | Recon (inferito): config.xml, chiavi. |
Root shell o dnctl di numeri dell'attaccante | dummynet | Disponibilità (inferita): interruzione di limiter / dummynet. |
Dimostrato in lab vs inferito: la sovrascrittura in creazione (nessun witness), il percorso apply-file (dnctl di un file, nessun witness) e l'exec edit-delete (witness) sono dimostrati in lab. Il recon del filesystem è inferito da root PHP-FPM.
Richiede: sessione WebGUI con page-firewall-trafficshaper-limiter. CSRF sul POST save. La delete è GET action=delete.
| Superficie | Lab |
|---|---|
| Percorso di creazione | dnpipe_find_nextnumber() sovrascrive, create-overwrites=yes |
| Percorso di apply | dnctl di /tmp/rules.limiter, nome file non controllato dall'utente, apply-file=yes |
| Charset del nome limiter | ^[a-zA-Z0-9_-]+$ |
| Non autenticato | chiuso |
| Diagnostics: Command | resta chiuso a meno che non sia concesso anche quello |
I parametri AQM in /tmp/rules.limiter sono linguaggio dummynet aggiuntivo, non questo residuo.
cd lab
./run.sh
Loopback 127.0.0.1:18840. Progetto Compose pfsense-limiter-number. Tag immagine pfsense-limiter-number:2.9.0-dev. Witness PFSENSE-LIMITER-NUMBER-WITNESS. Ultima riga:
SUCCESS PFSENSE-LIMITER-NUMBER create-overwrites=yes apply-file=yes edit-delete-exec=yes PFSENSE-LIMITER-NUMBER-WITNESS
Cast a int di GetNumber() prima di ogni dnctl. Ignorare il number del POST in fase di modifica, oppure verificarne il range rispetto all'id dummynet attivo. La creazione già sovrascrive; far fare lo stesso alla modifica.
9363ac5b8651a1c7a333180425ce7719070f95f9shaper.inc delete_queue / GetNumberfirewall_shaper_vinterface.php