
pfSense Plus MIM API टूलकिट b4acd7ca - उच्च - स्थानीय - विशेषाधिकार शेष - unix sock enroll no JWT
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · pfsense-api-unix-sock-noauth
Class: Privilege leftover Reach: Local
pfSense Plus MIM API b4acd7ca - Netgate
github.com/Netgate/pfsense-api pfSense Plus Nexus Multi-instance Management के लिए सार्वजनिक OpenAPI और जनरेट किया गया Python है। यह CE REST पैकेज नहीं है। आधिकारिक enroll नमूना Bearer JWT के साथ HTTPS :8443 में लॉग इन करता है, फिर प्रत्येक फ़ायरवॉल पर एक POSIX स्क्रिप्ट को SSH करता है। वह स्क्रिप्ट बिना किसी Authorization के /var/run/pfnet-controller.sock से बात करती है।
curl --unix-socket /var/run/pfnet-controller.sock -H "Content-Type: application/json" -d "{controller JSON}" http://unix/api/mim/controllers
curl --unix-socket /var/run/pfnet-controller.sock http://unix/api/mim/device/identity
अप्रचलित फ़ॉलबैक /api/system/controller और /api/system/mim/devid समान हैं: कोई Bearer नहीं। HTTPS लॉगिन अभी भी एक JWT जारी करता है। वह टोकन ऑन-डिवाइस sock पर लागू नहीं होता। यह :8443 और mim_* समूहों से एक अलग ट्रस्ट बाउंड्री है।
Nexus MIM श्रृंखला का भाग 3। G1 / G2 बॉक्स पर लैंड होने के बाद, यह sock स्थानीय प्लेन है।
एक स्थानीय प्रक्रिया जो sock को connect(2) कर सकती है, बिना JWT के एक कंट्रोलर को एनरोल कर सकती है और डिवाइस पहचान डंप कर सकती है। Plus निष्पादित नहीं किया गया। वास्तविक sock DAC अज्ञात है।
| ID | अभी तक कोई CVE नहीं |
| Class | विशेषाधिकार अवशेष |
| Reach | स्थानीय (/var/run/pfnet-controller.sock पर connect(2)) |
| CWE | CWE-306 |
| CVSS | उच्च: 7.8 CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H यदि sock मोड किसी अन्य स्थानीय uid को कनेक्ट करने देता है। ईमानदारी से: DAC अज्ञात, Plus निष्पादित नहीं। |
| Product | Netgate/pfsense-api (Plus Nexus MIM टूलकिट) |
| Affected | सार्वजनिक main b4acd7ca21dbca739a530403a1f62a7440f7726f (2026-05-25) |
| Auth | आधिकारिक unix-socket enroll curls पर कोई नहीं |
| License | GNU Affero GPL v3.0 |
| Lab | केवल 127.0.0.1:19121। Unix HTTP mock। कोई Plus इमेज नहीं। |
अभिनेता pfSense डिवाइस पर कोई भी प्रक्रिया है जो /var/run/pfnet-controller.sock को connect(2) कर सकती है। इस उदाहरण द्वारा रिमोट TCP नहीं (केवल curl --unix-socket)। HTTPS :8443 JWT और mim_* समूह इस fd पर लागू नहीं होते।
| Method | Sink | Privilege |
|---|---|---|
आधिकारिक device_script POST बिना Authorization के | POST http://unix/api/mim/controllers | Integrity: mock ने enroll JSON स्वीकार किया। हिट लॉग authorization_present=false। |
आधिकारिक device_script GET बिना Authorization के | GET http://unix/api/mim/device/identity | Recon: mock ने DeviceIdentity-आकार का JSON लौटाया जिसमें PFSENSE-API-UNIX-SOCK-NOAUTH-WITNESS शामिल था। |
वही GET Authorization: Bearer lab-jwt के साथ | वही identity पथ | Lab control: 401, witness बॉडी में नहीं। उपस्थित बनाम अनुपस्थित को अलग करता है। Plus परिणाम नहीं। |
ये वही OpenAPI ops हैं जो आधिकारिक नमूना और mim टैग डिवाइस पर रखते हैं। केवल प्रोटोकॉल के रूप में प्रमाणित, Plus 200 के रूप में नहीं।
| Method | Sink | Privilege |
|---|---|---|
POST /mim/controllers (फ़ॉलबैक POST /api/system/controller) हमलावर ControllerIdentity (key, vpn_pubkey, vpn_listenaddr, vpn_netkey, cert) के साथ | SetController | Integrity: एक शत्रुतापूर्ण कंट्रोलर एनरोल करें। Spec: डिवाइस "हर 10 सेकंड में एक कनेक्शन अनुरोध जारी करता रहेगा" (हमलावर को Netgard VPN)। |
GET /mim/device/identity (फ़ॉलबैक GET /api/system/mim/devid) | GetDeviceIdentity | Recon: डिवाइस Noise/VPN सार्वजनिक कुंजियाँ, address, controller_add curl टेक्स्ट। |
GET /mim/controllers | GetControllers | Recon: कंट्रोलरों की सूची और डिवाइस जानकारी (ControllerInfo.noise_secret, कुंजियाँ)। |
GET /mim/controllers/id/{key} | GetMIMController | Recon: एक कंट्रोलर रिकॉर्ड। |
DELETE /mim/controllers/id/{key} | DeleteMIMController | Integrity / availability: वास्तविक कंट्रोलर को अनएनरोल करें (key hex या base64-URL)। |
POST /mim/device/pubkey हमलावर privkey / pubkey के साथ | SetDevicePublicKey (DevicePublicKeyOption में privkey शामिल है) | Integrity: डिवाइस ED25519 पहचान बदलें। कंट्रोलर हैंडशेक तब हमलावर कुंजी पर भरोसा करता है। |
अपने आप में होस्ट रूट शेल प्रदान नहीं करता। MIM प्लेन प्रदान करता है: डिवाइस किसे कंट्रोलर के रूप में भरोसा करता है, और डिवाइस Noise निजी कुंजी यदि pubkey POST का सम्मान किया जाता है।
आवश्यक: /var/run/pfnet-controller.sock के लिए स्थानीय connect(2)। DAC (mode, owner, group, SO_PEERCRED) सार्वजनिक क्लाइंट ट्री में नहीं है। यदि डेमन 0600 root को बाइंड करता है, तो यह पहले से ही root स्थानीय है (एक हेल्पर, पैकेज, या एस्केप के लिए भ्रमित डिप्टी जो /var/run देख सकता है)। यदि सॉक किसी अन्य uid के लिए पहुंच योग्य है, तो स्कोर किए अनुसार CVSS 7.8।
:8443 पर /mim/controllers के लिए अनधिकृत रिमोट TCP। वह पोर्ट User Manager JWT के रूप में प्रलेखित है। यह अवशेष unix fd है।POST /login अभी भी Bearer JWT जारी करता है। AuthenticatedClient अभी भी इसे CONTROLLER_URL+"/api" पर भेजता है।verify_ssl=True। पथ पैराम ../ को प्रतिशत-एनकोड करते हैं।security: MISSING एक स्कीमा अंतराल है, सिद्ध अनधिकृत HTTPS स्किप नहीं।समान पिन, रिमोट नामांकन प्लेन: pfsense-api-enroll-json-ssh और pfsense-api-enroll-autoadd। श्रृंखला मानचित्र: pfsense-api-nexus-mim।
मैंने Netgate/pfsense-api b4acd7ca21dbca739a530403a1f62a7440f7726f को पिन किया और आधिकारिक नामांकन लूप पढ़ा: login, GET /mim/controller/identity, stringify, unix-socket POST/GET का SSH exec, POST /mim/devices। HTTPS AuthenticatedClient(token=...) का उपयोग करता है। सॉक curls नहीं करते।
गलत मोड़: अनुपस्थित securitySchemes को अनधिकृत HTTPS मानना (login में भी यह अनुपस्थित है; उदाहरण हमेशा Bearer पहले)। यह मानना कि सॉक विश्व-लेखन योग्य है (mode इस रेपो में नहीं है)। Plus 200 का दावा करना। यहाँ सिद्ध अवशेष प्रकाशित enroll प्रोटोकॉल है।
थिएटर: एक रिवर्स शेल। ओरेकल आधिकारिक curl आकार प्लस identity बॉडी में एक गवाह प्लस एक Bearer 401 नियंत्रण है।
python3 pfsense-api-unix-sock-noauth-Abraxas-Labs.py
या
cd lab
./run.sh
केवल लूपबैक: 127.0.0.1:19121। Compose प्रोजेक्ट pfsense-api-unix-sock-noauth। /var/run/pfnet-controller.sock पर मॉक unix HTTP। Witness PFSENSE-API-UNIX-SOCK-NOAUTH-WITNESS। Docker unix-socket मॉक। कोई Plus इमेज नहीं।
अपेक्षित अंतिम पंक्ति: