pfSense Plus MIM API toolkit b4acd7ca - उच्च - रिमोट - विशेषाधिकार शेष - example-add-devices.py JSON से SSH में
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · pfsense-api-enroll-json-ssh
Class: Privilege leftover Reach: Remote
pfSense Plus MIM API toolkit (b4acd7ca) - Netgate
example-add-devices.py प्रत्येक pfSense Plus डिवाइस पर SSH के माध्यम से Nexus controller को रजिस्टर करने का प्रलेखित तरीका है। यह GET /mim/controller/identity को json.dumps करता है, केवल " को बदलता है, फिर उस blob को दो बार .format करके एक double-quoted curl -d POSIX स्क्रिप्ट में डालता है। Paramiko exec_command स्क्रिप्ट को pfsense_addresses में प्रत्येक पते पर SSHUSER (नमूना डिफ़ॉल्ट admin) के रूप में चलाता है।
json.dumps के साथ replace('"', '\\"') उद्धरणों को बंद रखता है। $(), backticks, और ${...} JSON मेटाकैरेक्टर नहीं हैं। वे अभी भी खुली double-quoted -d स्ट्रिंग के अंदर सक्रिय रहते हैं। OpenSSH exec एक शेल है। यही leftover है।
यह तृतीय-पक्ष CE REST पैकेज नहीं है। यह pfSense Plus Nexus Multi-instance Management controller के लिए आधिकारिक OpenAPI क्लाइंट और नमूने हैं। मैंने Plus नहीं लिखा। लैब में pinned interpolation और एक mock /var/run/pfnet-controller.sock है।
| ID | अभी तक कोई CVE नहीं |
| Class | Privilege leftover (controller JSON से enrollment SSH में) |
| Reach | Remote (CONTROLLER_URL तक on-path, जबकि नमूना verify_ssl=False सेट करता है, या ControllerSummary स्ट्रिंग फ़ील्ड का लेखक) |
| CWE | CWE-78 |
| CVSS | High: 8.1 CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:H |
| Product | Netgate/pfsense-api (Plus MIM toolkit) |
| Affected | सार्वजनिक main b4acd7ca21dbca739a530403a1f62a7440f7726f example-add-devices.py |
| Auth | ऑपरेटर प्रलेखित नमूना चलाता है। हमलावर on-path है, या summary स्ट्रिंग्स लिख सकता है। controller में लॉगिन अभी भी पहले होता है। |
| License | GNU Affero GPL v3.0 |
| Lab | केवल 127.0.0.1:19101। कोई Plus image नहीं। |
Nexus MIM leftover श्रृंखला का भाग 1। सहोदर: enroll-autoadd, unix-sock-noauth, example-ssl-verify (G9 यह है कि एक on-path peer इस JSON को कैसे आकार देता है), fleet-jwt, export-key-get।
leftover अभी भी खुली double-quoted -d स्ट्रिंग के अंदर command substitution है। json.dumps के साथ quote pass स्ट्रिंग को बंद रखता है। $(), backticks, और ${...} बच जाते हैं और तब SSHUSER के रूप में चलते हैं जब OpenSSH स्क्रिप्ट को exec करता है।
| विधि | सिंक | विशेषाधिकार | प्रयोगशाला-प्रमाणित या अनुमानित |
|---|---|---|---|
ControllerSummary स्ट्रिंग फ़ील्ड में $() (या बैकटिक्स / ${...}) डालें, फिर ऑपरेटर को example-add-devices.py चलाने दें | controller_info.replace('"', '\\"') फिर device_script.format(...) फिर sshclient.exec_command(device_script) (example-add-devices.py ~104-161) | pfsense_addresses में प्रत्येक पते पर SSHUSER के रूप में शेल (नमूना डिफ़ॉल्ट admin; pfSense admin SSH आमतौर पर root-समतुल्य होता है) | इंटरपोलेशन पर प्रयोगशाला-प्रमाणित: INJECT vpn_listenaddr=$(printf %s PFSENSE-API-ENROLL-JSON-SSH-WITNESS >/oracle/witness) केवल-कोट एस्केप से बच गया (dollar-paren-survived=yes) और witness लिखा (inject-oracle=yes)। Paramiko/SSH स्वयं इस compose में नहीं है। |
GET /api/mim/controller/identity का TLS MITM जबकि नमूना verify_ssl=False का उपयोग करता है | वही ControllerSummary पार्स फिर वही स्क्रिप्ट | वही शेल। सभी ControllerSummary फ़ील्ड str या Unset हैं, इसलिए एक MITM JSON बॉडी जो टाइप-पार्स होती है पर्याप्त है। | नमूने से अनुमानित (example-add-devices.py लॉगिन Client और AuthenticatedClient दोनों verify_ssl=False सेट करते हैं)। प्रयोगशाला सारांश ऑब्जेक्ट को सीधे पोस्ट करती है। सहोदर: example-ssl-verify। |
कंट्रोलर पर name या vpn_listenaddr में प्रतिस्थापन अक्षर लिखें, अगले enroll की प्रतीक्षा करें | वही सिंक | वही शेल जब ऑपरेटर अगली बार नमूना चलाता है | अनुमानित। उन फ़ील्ड्स का पूर्व लेखन आवश्यक है (पहले से कंट्रोलर-एडमिन, या unix-sock-noauth सहोदर)। |
वही शेल, ControllerSummary.additional_properties के माध्यम से अतिरिक्त कुंजियाँ | वही डंप में अतिरिक्त MITM कुंजियाँ शामिल हैं (to_dict from_dict के बाद बचे हुए को कॉपी करता है) | अतिरिक्त फ़ील्ड -d में और शेल में चले जाते हैं | to_dict से अनुमानित। प्रयोगशाला केवल vpn_listenaddr के माध्यम से इंजेक्ट करती है। |
| विधि | सिंक | विशेषाधिकार | प्रयोगशाला-प्रमाणित या अनुमानित |
|---|---|---|---|
| enrollment वर्कस्टेशन stdout पढ़ें | print("CONTROLLER_SUMMARY:", controller_info) | कंट्रोलर पहचान key, Netgard vpn_pubkey / vpn_netkey / listen पते | नमूना प्रिंट से अनुमानित। प्रयोगशाला लाइव कंट्रोलर ब्लॉब प्रिंट नहीं करती। |
| SSH exec चैनल को सूँघें या MITM करें | exec_command(device_script) पेलोड curl -d JSON है | प्रत्येक डिवाइस के लिए वायर पर वही कंट्रोलर पहचान | अनुमानित। उस चैनल पर AutoAddPolicy एक सहोदर रिपोर्ट है। |
| गैजेट पर CONTROL केस | POST /case name=control | ईमानदार vpn_listenaddr unix सॉकेट तक अपरिवर्तित पहुँचता है | प्रयोगशाला-प्रमाणित। 192.0.2.10:51820 यथावत पोस्ट किया गया, कोई oracle नहीं (control-clean=yes)। |
| विधि | सिंक | विशेषाधिकार | प्रयोगशाला-प्रमाणित या अनुमानित |
|---|---|---|---|
SSHUSER के रूप में इंजेक्ट किया गया कमांड | वही exec_command | pfnet-controller रोकें, enrollment मिटाएँ, रीबूट करें, या अन्यथा डिवाइस को MIM से हटा दें | शेल का अनुमानित दुष्प्रभाव। प्रयोगशाला केवल witness फ़ाइल लिखती है। |
आवश्यक: आधिकारिक नमूना पथ (ऑपरेटर enroll)। उस नमूने के चलने के बाद on-path पीयर के लिए UI:N। कंट्रोलर में लॉगिन अभी भी पहले होता है।
pfSense बॉक्स पर admin के रूप में शेल "JWT php कर सकता है" नहीं है। यह enrollment वर्कस्टेशन है जो sh -c के माध्यम से फ़ायरवॉल को कंट्रोलर ब्लॉब सौंपता है। वहाँ से आकार दिया गया JSON वही है जो डिवाइस बिना JWT के /var/run/pfnet-controller.sock पर POST करता है (unix-sock-noauth)। AutoAddPolicy का अर्थ है कि इस स्क्रिप्ट को प्राप्त करने वाला SSH पीयर पिन नहीं है (enroll-autoadd)। G9 verify_ssl=False वह तरीका है जिससे on-path पीयर पहले स्थान पर JSON लिखता है।