
pfSense Plus MIM API toolkit b4acd7ca - मध्यम - रिमोट - विशेषाधिकार शेष - आधिकारिक नमूने verify_ssl=False
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · pfsense-api-example-ssl-verify
वर्ग: विशेषाधिकार अवशेष पहुंच: रिमोट
pfSense Plus MIM API (Netgate/pfsense-api b4acd7ca) - Netgate
जनरेट किए गए Client / AuthenticatedClient डिफ़ॉल्ट रूप से verify_ssl=True रखते हैं और उसे httpx में पास करते हैं। डॉक्स पहले से ही verify_ssl=False को सुरक्षा जोखिम बताते हैं और पहले PEM बंडल पथ दिखाते हैं। हर आधिकारिक Python नमूना और helper_funcs.py अभी भी उन्हें verify_ssl=False के साथ बनाते हैं। example.js NODE_TLS_REJECT_UNAUTHORIZED=0 सेट करता है, इसलिए पूरी Node प्रक्रिया सत्यापन छोड़ देती है। लॉगिन JSON उपयोगकर्ता नाम और पासवर्ड को base64 में रखता है। यह OpenAPI अनुबंध है, एन्क्रिप्शन नहीं। TLS गोपनीयता परत है।
:8443 का कोई ऑन-पाथ सहकर्मी कोई भी प्रमाणपत्र प्रस्तुत करता है। नमूना फिर भी /login पर POST करता है। स्थानापन्न base64 एडमिन लॉगिन को कैप्चर करता है और एक JWT बनाता है। वह टोकन श्रृंखला है: G4 export-key, G5 ACME dump, G6 fleet JWT, G7 ACB userkey, इच्छित php/shell, और वह JSON जिसे G1 SSH में इंटरपोलेट करता है।
यह pfSense Plus MIM API toolkit का भाग 9 है। इस अवशेष को पहले पढ़ें, भले ही यह मध्यम है। चुराया गया JWT वह तरीका है जिससे बाकी सब उस वर्कस्टेशन से पहुंच योग्य बनते हैं जिसने example.py कॉपी किया था।
| ID | अभी कोई CVE नहीं |
| वर्ग | विशेषाधिकार अवशेष (नमूना TLS सत्यापन बंद) |
| पहुंच | रिमोट (:8443 पर ऑन-पाथ) |
| CWE | CWE-295 |
| CVSS | मध्यम: 6.8 CVSS:3.1/AV:N/AC:H/PR:N/UI:R/S:U/C:H/I:H/A:N |
| उत्पाद | Netgate/pfsense-api (Plus Nexus MIM क्लाइंट; CE REST पैकेज नहीं) |
| प्रभावित | सार्वजनिक main b4acd7ca21dbca739a530403a1f62a7440f7726f (2026-05-25) आधिकारिक नमूने और helper_funcs.py |
| प्रमाणीकरण | ऑपरेटर नियंत्रक के विरुद्ध एक नमूना कॉपी करके चलाता है; कोई अतिरिक्त नियंत्रक भूमिका नहीं |
| लाइसेंस | GNU Affero GPL v3.0 |
| लैब | केवल 127.0.0.1:19191। pfSense Plus को कंपोज़ नहीं करता। |
AC:H ऑपरेटर वर्कस्टेशन और MIM नियंत्रक के बीच ऑन-पाथ है। UI:R नमूने को कॉपी/रन करना है।
पीड़ित: ऑपरेटर वर्कस्टेशन जो https://controller:8443 के विरुद्ध आधिकारिक नमूना या helper_funcs.py चला रहा है। हमलावर: उस HTTPS पर ऑन-पाथ (LAN, दुष्ट DHCP, समझौता किया गया VPN हॉप, ARP)। अनधिकृत इंटरनेट-से-फ़ायरवॉल नहीं।
| विधि | सिंक | विशेषाधिकार |
|---|---|---|
नमूना /login या /api/login को verify_ssl=False / NODE_TLS_REJECT_UNAUTHORIZED=0 के साथ POST करते समय कोई भी प्रमाणपत्र प्रस्तुत करें | httpx verify=False (Python नमूने) या Node TLS reject-unauthorized 0 | गोपनीयता (प्रयोगशाला-प्रमाणित): लॉगिन JSON पढ़ें। प्रयोगशाला: स्टैंड-इन ने base64 admin / lab-controller-secret कैप्चर किया (captured_b64_admin=yes)। डिकोड एक base64 -d है। |
वही MITM, 200 LoginResponse | नमूना किसी भी प्रमाणपत्र को स्वीकार करता है | गोपनीयता (प्रयोगशाला-प्रमाणित): एक्सेस JWT चुराएं। प्रयोगशाला: INJECT को एक टोकन मिला जो PFSENSE-API-EXAMPLE-SSL-VERIFY-WITNESS ले गया। |
वही MITM, लॉगिन पर Set-Cookie | नमूना client.get_httpx_client().cookies को AuthenticatedClient में कॉपी करता है | गोपनीयता (प्रयोगशाला-प्रमाणित कुकी, अनुमानित रीप्ले): 24-घंटे का रीफ्रेश JWT। उस कुकी और base64 उपयोगकर्ता नाम के साथ POST /login/refresh को रीफ्रेश TTL तक रीप्ले करें। प्रयोगशाला ने Set-Cookie: refresh=... कैप्चर किया। लाइव कंट्रोलर के विरुद्ध रीफ्रेश निष्पादित नहीं किया गया। |
| चुराए गए Bearer को वास्तविक कंट्रोलर पर रीप्ले करें (यदि हमलावर उस तक रूट भी कर सकता है) | साथ ही MIM /api और /api/device/pfsense/{device_id}/api | अखंडता (अनुमानित): इस API पर लॉग-इन उपयोगकर्ता के रूप में व्यवस्थापक-समकक्ष। स्कीमा में POST /diag/cmd/php, POST /diag/cmd/shell, POST /diag/editfile, POST /diag/backup/restore, POST /diag/control halt/reboot शामिल हैं। यहाँ अभ्यास नहीं किया गया। यह प्रयोगशाला एक कंट्रोलर स्टैंड-इन है, Plus नहीं। |
| चुराए गए Bearer को leftover 6 (फ्लीट टोकन) के रूप में रीप्ले करें | एक POST /login JWT हर device_id के लिए पुनः उपयोग किया गया | अखंडता (अनुमानित): फ़ायरवॉल A के लिए इच्छित उपयोगकर्ता के रूप में प्रमाणित करने के बाद फ़ायरवॉल B से बात करें। LoginResponse में कोई प्रति-डिवाइस allow-list नहीं है। पैक: pfsense-api-fleet-jwt। Plus RBAC निष्पादित नहीं किया गया। |
| चुराए गए Bearer को leftover 4 के रूप में रीप्ले करें | GET /system/certauth/{refid}/export-key, GET /system/certificates/{refid}/export-key, GET /system/certificates/{refid}/export-p12 | गोपनीयता (अनुमानित): CA और लीफ निजी कुंजियाँ निकालें, PKCS12 बिना पासवर्ड सुरक्षा के प्रलेखित, फिर VPN / WebGUI TLS / IPsec का प्रतिरूपण करें। पैक: pfsense-api-export-key-get। |
| चुराए गए Bearer को leftover 5 के रूप में रीप्ले करें | GET /services/acme | गोपनीयता (अनुमानित): Let's Encrypt खाता कुंजी और फ़ायरवॉल द्वारा नामांकित प्रत्येक होस्टनाम के लिए जारी प्रमाणपत्र कुंजियाँ चुराएं। पैक: pfsense-api-acme-key-dump। |
चुराए गए Bearer को रीप्ले करें, या ACB को GET करने वाले नमूने से userkey लीक करें, leftover 7 के रूप में | GET /services/acb?userkey= और GET /services/acb/bkp?userkey= | गोपनीयता (अनुमानित): Auto Config Backup ब्लॉब्स (पूर्ण कॉन्फ़िग) सूचीबद्ध और प्राप्त करें। पैक: pfsense-api-acb-userkey। |
ControllerSummary JSON को leftover 1 की ओर आकार दें | verify_ssl=False HTTPS का MITM वह JSON प्रदान करता है जिसे example-add-devices.py quote-escape करके SSH में .format करता है | अखंडता (अनुमानित): कंट्रोलर फ़ील्ड में $() / बैकटिक्स / न्यूलाइन्स pfsense_addresses में प्रत्येक पते पर SSHUSER के रूप में चलते हैं। पैक: pfsense-api-enroll-json-ssh। |
| क्लाइंट की ओर प्रतिक्रियाएँ इंजेक्ट करें | skip-verify किसी भी प्रमाणपत्र को स्वीकार करता है | अखंडता (प्रयोगशाला-प्रमाणित टोकन, अनुमानित फ्लीट): एक JWT बनाएं जिसे नमूना रखेगा। प्रयोगशाला: witness के साथ INJECT टोकन। लाइव नमूने के विरुद्ध नकली डिवाइस सूचियाँ / अपग्रेड प्रगति / लॉगिन सफलता वही गेट है। |
POST /diag/control, फर्मवेयर POST, टूटे बैकअप का पुनर्स्थापन (चुराए गए Bearer के बाद) | TLS हटने के बाद इच्छित व्यवस्थापक सतह | उपलब्धता (अनुमानित): halt / reboot / टूटी इमेज। वही Bearer। प्रयोगशाला में परीक्षण नहीं किया गया। |
प्रयोगशाला-प्रमाणित बनाम अनुमानित: CONTROL हैंडशेक विफलता, INJECT टोकन, और कैप्चर किया गया base64 व्यवस्थापक लॉगिन 127.0.0.1:19191 पर प्रयोगशाला-प्रमाणित हैं। उस Bearer का लाइव Plus कंट्रोलर पर रीप्ले, diag php/shell, G4-G7, G1 JSON शेपिंग, और नए एक्सेस JWT का रीफ्रेश-कुकी मिंट OpenAPI और नमूनों से अनुमानित हैं।
आवश्यक: ऑपरेटर example.py, example-add-devices.py, example-upgrade-devices.py, example-set-alias.py / example-upgrade-devices-async.py को helper_funcs.py के माध्यम से, या example.js को कॉपी और रन करता है। :8443 के पथ पर हमलावर।
आसन्न सतह जो बंद रहती है