
pfSense CE 2.9.0-DEVELOPMENT - उच्च - रिमोट - RCE - limiter number dnctl
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · pfsense-limiter-number
राइट-अप: https://abraxaslabs.tech/research/pfsense-limiter-number
वर्ग: RCE पहुँच: रिमोट
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 नहीं |
| वर्ग | RCE |
| पहुँच | रिमोट (प्रमाणित WebGUI) |
| CWE | CWE-78 |
| CVSS | उच्च: 8.8 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H |
| उत्पाद | pfSense CE |
| प्रभावित | 2.9.0-DEVELOPMENT (9363ac5b8651a1c7a333180425ce7719070f95f9) limiter number |
| प्रमाणीकरण | page-firewall-trafficshaper-limiter वाला WebGUI सत्र |
| लाइसेंस | GNU Affero GPL v3.0 |
| लैब | केवल 127.0.0.1 |
मैंने सार्वजनिक master 9363ac5 को पिन किया। लैब पिन किए गए ReadConfig / SetNumber / delete_queue का एक PHP गैजेट है। लूपबैक 127.0.0.1:18840।
| विधि | सिंक | विशेषाधिकार |
|---|---|---|
एक limiter बनाएँ, हमलावर के number के साथ save POST करें, फिर उस limiter को हटाएँ | mwexec("/sbin/dnctl pipe delete " . $this->GetNumber()) (shaper.inc:3820) | अखंडता (लैब-प्रमाणित): root शेल। लैब: edit-delete ने witness लिखा (edit-delete-exec=yes)। Create overwrite और apply-file पथ ने कुछ नहीं लिखा। |
| वही root शेल | होस्ट फ़ाइलसिस्टम | रीकॉन (अनुमानित): config.xml, कुंजियाँ। |
Root शेल या हमलावर संख्याओं का dnctl | dummynet | उपलब्धता (अनुमानित): limiter / dummynet व्यवधान। |
लैब-प्रमाणित बनाम अनुमानित: create overwrite (कोई witness नहीं), apply-file पथ (किसी फ़ाइल का dnctl, कोई witness नहीं), और edit-delete exec (witness) लैब-प्रमाणित हैं। फ़ाइलसिस्टम रीकॉन root PHP-FPM से अनुमानित है।
आवश्यक: page-firewall-trafficshaper-limiter वाला WebGUI सत्र। POST save पर CSRF। Delete GET action=delete है।
| सतह | लैब |
|---|---|
| Create पथ | dnpipe_find_nextnumber() अधिलेखित करता है, create-overwrites=yes |
| Apply पथ | /tmp/rules.limiter का dnctl, फ़ाइलनाम उपयोगकर्ता-नियंत्रित नहीं, apply-file=yes |
| Limiter नाम charset | ^[a-zA-Z0-9_-]+$ |
| अनधिकृत | बंद |
| Diagnostics: Command | बंद रहता है जब तक अलग से अनुदान न मिले |
/tmp/rules.limiter में AQM पैरामीटर अतिरिक्त dummynet भाषा हैं, यह अवशेष नहीं।
cd lab
./run.sh
Loopback 127.0.0.1:18840. Compose प्रोजेक्ट pfsense-limiter-number. इमेज टैग pfsense-limiter-number:2.9.0-dev. विटनेस 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