
pfSense CE 2.9.0-DEVELOPMENT - उच्च - रिमोट - RCE - limiter number dnctl
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · pfsense-limiter-number
Class: RCE Reach: Remote
pfSense CE 2.9.0-DEVELOPMENT (9363ac5) - pfsense.org
Traffic Shaper Limiters संपादन पर एक छिपा हुआ number फ़ील्ड उत्सर्जित करते हैं। Create उस संख्या को dnpipe_find_nextnumber() से अधिलेखित करता है। Edit नहीं करता। validate_input कभी number की जाँच नहीं करता। GetNumber() को बिना उद्धरण के dnctl pipe|sched|queue delete में जोड़ा जाता है। PHP mwexec /bin/sh -c है। विशेषाधिकार page-firewall-trafficshaper-limiter है, Diagnostics: Command नहीं।
| ID | अभी तक कोई CVE नहीं |
| Class | RCE |
| Reach | Remote (प्रमाणित 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 |
| Product | pfSense CE |
| Affected | 2.9.0-DEVELOPMENT (9363ac5b8651a1c7a333180425ce7719070f95f9) limiter number |
| Auth | page-firewall-trafficshaper-limiter के साथ WebGUI सत्र |
| License | GNU Affero GPL v3.0 |
| Lab | केवल 127.0.0.1 |
मैंने सार्वजनिक master 9363ac5 को पिन किया। लैब पिन किए गए ReadConfig / SetNumber / delete_queue का एक PHP गैजेट है। Loopback 127.0.0.1:18840।
| Method | Sink | Privilege |
|---|---|---|
एक limiter बनाएँ, हमलावर के number के साथ save POST करें, फिर उस limiter को हटाएँ | mwexec("/sbin/dnctl pipe delete " . $this->GetNumber()) (shaper.inc:3820) | Integrity (लैब-प्रमाणित): root shell। लैब: edit-delete ने witness लिखा (edit-delete-exec=yes)। Create overwrite और apply-file पथ ने कुछ नहीं लिखा। |
| वही root shell | host filesystem | Recon (अनुमानित): config.xml, keys। |
Root shell या हमलावर संख्याओं का dnctl | dummynet | Availability (अनुमानित): limiter / dummynet व्यवधान। |
लैब-प्रमाणित बनाम अनुमानित: create overwrite (कोई witness नहीं), apply-file पथ (एक फ़ाइल का dnctl, कोई witness नहीं), और edit-delete exec (witness) लैब-प्रमाणित हैं। Filesystem recon root PHP-FPM से अनुमानित है।
आवश्यक: page-firewall-trafficshaper-limiter के साथ WebGUI सत्र। POST save पर CSRF। Delete GET action=delete है।
| Surface | Lab |
|---|---|
| Create पथ | dnpipe_find_nextnumber() अधिलेखित करता है, create-overwrites=yes |
| Apply पथ | /tmp/rules.limiter का dnctl, फ़ाइलनाम उपयोगकर्ता-नियंत्रित नहीं, apply-file=yes |
| Limiter नाम charset | ^[a-zA-Z0-9_-]+$ |
| Unauth | बंद |
| Diagnostics: Command | बंद रहता है जब तक अतिरिक्त रूप से अनुदत्त न हो |
/tmp/rules.limiter में AQM पैरामीटर अतिरिक्त dummynet भाषा हैं, यह अवशेष नहीं।
cd lab
./run.sh
Loopback 127.0.0.1:18840। Compose प्रोजेक्ट pfsense-limiter-number। Image टैग pfsense-limiter-number:2.9.0-dev। Witness PFSENSE-LIMITER-NUMBER-WITNESS। अंतिम पंक्ति:
SUCCESS PFSENSE-LIMITER-NUMBER create-overwrites=yes apply-file=yes edit-delete-exec=yes PFSENSE-LIMITER-NUMBER-WITNESS
प्रत्येक dnctl से पहले GetNumber() को int-cast करें। संपादन पर POST number को अनदेखा करें, या इसे लाइव dummynet id के विरुद्ध रेंज-चेक करें। Create पहले से ही अधिलेखित करता है; edit को भी वही करने दें।
9363ac5b8651a1c7a333180425ce7719070f95f9shaper.inc delete_queue / GetNumberfirewall_shaper_vinterface.php