
pfSense CE 2.9.0-DEVELOPMENT - Hoch - Remote - RCE - Limiter-Nummer dnctl
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · pfsense-limiter-number
Klasse: RCE Reichweite: Remote
pfSense CE 2.9.0-DEVELOPMENT (9363ac5) - pfsense.org
Traffic Shaper Limiters geben beim Bearbeiten ein verstecktes number-Feld aus. Create überschreibt diese Nummer mit dnpipe_find_nextnumber(). Edit nicht. validate_input prüft number nie. GetNumber() wird unquoted in dnctl pipe|sched|queue delete konkateniert. PHP mwexec ist /bin/sh -c. Die Berechtigung ist page-firewall-trafficshaper-limiter, nicht Diagnostics: Command.
| ID | noch keine CVE |
| Klasse | RCE |
| Reichweite | Remote (authentifiziertes WebGUI) |
| CWE | CWE-78 |
| CVSS | High: 8.8 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H |
| Produkt | pfSense CE |
| Betroffen | 2.9.0-DEVELOPMENT (9363ac5b8651a1c7a333180425ce7719070f95f9) Limiter number |
| Auth | WebGUI-Sitzung mit page-firewall-trafficshaper-limiter |
| Lizenz | GNU Affero GPL v3.0 |
| Lab | nur 127.0.0.1 |
Ich habe den öffentlichen Master 9363ac5 gepinnt. Das Lab ist ein PHP-Gadget aus gepinntem ReadConfig / SetNumber / delete_queue. Loopback 127.0.0.1:18840.
| Methode | Sink | Berechtigung |
|---|---|---|
Einen Limiter erstellen, POST save mit Angreifer-number, dann diesen Limiter löschen | mwexec("/sbin/dnctl pipe delete " . $this->GetNumber()) (shaper.inc:3820) | Integrität (im Lab bewiesen): Root-Shell. Lab: edit-delete schrieb den Witness (edit-delete-exec=yes). Create-Overwrite und Apply-File-Pfad schrieben keinen. |
| Dieselbe Root-Shell | Host-Dateisystem | Recon (abgeleitet): config.xml, Keys. |
Root-Shell oder dnctl mit Angreifer-Nummern | dummynet | Verfügbarkeit (abgeleitet): Limiter-/dummynet-Störung. |
Im Lab bewiesen vs. abgeleitet: Create-Overwrite (kein Witness), Apply-File-Pfad (dnctl einer Datei, kein Witness) und edit-delete exec (Witness) sind im Lab bewiesen. Dateisystem-Recon ist aus Root-PHP-FPM abgeleitet.
Erfordert: WebGUI-Sitzung mit page-firewall-trafficshaper-limiter. CSRF beim POST save. Delete ist GET action=delete.
| Angriffsfläche | Lab |
|---|---|
| Create-Pfad | dnpipe_find_nextnumber() überschreibt, create-overwrites=yes |
| Apply-Pfad | dnctl von /tmp/rules.limiter, Dateiname nicht benutzergesteuert, apply-file=yes |
| Limiter-Namenszeichensatz | ^[a-zA-Z0-9_-]+$ |
| Unauth | geschlossen |
| Diagnostics: Command | bleibt geschlossen, sofern nicht zusätzlich gewährt |
AQM-Parameter in /tmp/rules.limiter sind zusätzliche dummynet-Sprache, nicht dieser Überrest.
cd lab
./run.sh
Loopback 127.0.0.1:18840. Compose-Projekt pfsense-limiter-number. Image-Tag pfsense-limiter-number:2.9.0-dev. Witness PFSENSE-LIMITER-NUMBER-WITNESS. Letzte Zeile:
SUCCESS PFSENSE-LIMITER-NUMBER create-overwrites=yes apply-file=yes edit-delete-exec=yes PFSENSE-LIMITER-NUMBER-WITNESS
GetNumber() vor jedem dnctl in einen Int casten. POST-number beim Bearbeiten ignorieren oder gegen die Live-dummynet-ID bereichsprüfen. Create überschreibt bereits; Edit dasselbe tun lassen.
9363ac5b8651a1c7a333180425ce7719070f95f9shaper.inc delete_queue / GetNumberfirewall_shaper_vinterface.php