
pfSense Plus MIM API toolkit b4acd7ca - उच्च - रिमोट - IDOR - ACB userkey क्षमता URL
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · pfsense-api-acb-userkey
वर्ग: IDOR पहुँच: रिमोट
pfSense Plus MIM API (Netgate/pfsense-api b4acd7ca) - Netgate
GET /services/acb और GET /services/acb/bkp userkey को एक अनियंत्रित क्वेरी पैरामीटर के रूप में लेते हैं। जनरेट किया गया Python क्लाइंट उस key को क्वेरी स्ट्रिंग पर रखता है। YAML में कोई securitySchemes नहीं है। Auto Config Backup डिवाइस key का होना ही जाँच है। वह एक capability URL है।
चोरी हुई या लीक हुई ACB userkey उस डिवाइस के होस्ट किए गए बैकअप की सूची बनाती है और एक रिवीज़न बॉडी प्राप्त करती है। पूरा config उन ब्लॉब्स में मौजूद रहता है। यदि key लीक हो जाए तो यह CE ACB key CVE-2024-57273 / SA-25_03 के समान वर्ग का है। वह CVE SSH-banner व्युत्पत्ति थी। यह बचा हुआ मामला Plus MIM API क्वेरी-पैराम का सहोदर है। मैं banner व्युत्पत्ति को दोबारा दर्ज नहीं कर रहा हूँ।
यह pfSense Plus Nexus Multi-instance Management (कंट्रोलर :8443 पर) के लिए सार्वजनिक OpenAPI + जनरेट किया गया क्लाइंट है। यह CE REST पैकेज (jaredhendrickson/pfsense-api / pfrest.org) नहीं है। सर्वर केवल Plus के लिए है (सशुल्क)। मैंने pfSense Plus को निष्पादित नहीं किया।
| ID | अभी तक कोई CVE नहीं |
| वर्ग | IDOR (capability URL) |
| पहुँच | रिमोट |
| CWE | CWE-639 |
| CVSS | उच्च: 7.5 CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N यदि वे GETs userkey का सम्मान करते हैं बिना किसी JWT को डिवाइस से बाँधे |
| उत्पाद | Netgate/pfsense-api (pfSense Plus MIM OpenAPI + जनरेट किया गया क्लाइंट) |
| प्रभावित | पिन b4acd7ca21dbca739a530403a1f62a7440f7726f (2026-05-25)। कोई टैग नहीं। |
| प्रमाणीकरण | स्पेक: कोई नहीं (securitySchemes अनुपस्थित)। userkey ही क्वेरी सीक्रेट है। Plus JWT/RBAC निष्पादित नहीं किया गया। |
| लाइसेंस | GNU Affero GPL v3.0 |
| लैब | केवल 127.0.0.1:19171। कोई Plus इमेज नहीं। |
सीरीज़ हब: pfsense-api-nexus-mim (यह भाग 7 है)।
चोरी हुई या लीक हुई ACB userkey की आवश्यकता है (स्पेक: "hexidecimal encoded 32-byte random bytes", 64 hex)। स्पेक उस key को किसी JWT या कॉलर के डिवाइस से नहीं बाँधता। G11-वर्ग का GET /services/acb/config लाइव userkey लौटाता है। G9 नमूने verify_ssl=False सेट करते हैं, इसलिए :8443 का MITM key को वायर पर देख सकता है। ये लीक पथ हैं। यह बचा हुआ मामला वही है जो key बाहर आ जाने पर खरीद लेती है।
| Method | Sink | Privilege |
|---|---|---|
GET /services/acb?userkey=<stolen> | GetACBList (pfapi_openapi.yml). Generated get_acb_list.py params["userkey"]. | Lab-proven (mock): उस डिवाइस के होस्ट किए गए बैकअप की सूची। backups[].reason में साक्ष्य। |
GET /services/acb/bkp?userkey=<stolen>&revision= | GetACB -> RetrievedBackup.backup. Generated get_acb.py params["userkey"] + params["revision"]. | Lab-proven (mock): रिवीज़न बॉडी प्राप्त करें। backup में साक्ष्य। |
| लाइव कंट्रोलर पर वही बैकअप स्ट्रिंग | होस्ट किया गया ACB ब्लॉब | Inferred: पढ़ने योग्य होने पर पूर्ण config.xml (उपयोगकर्ता, कुंजियाँ, पैकेज)। Mock ने plaintext witness XML लौटाया। मैंने acb.netgate.com से बात नहीं की और न ही लाइव ब्लॉब को डिक्रिप्ट किया। |
GET /services/acb/config | ACBConfigInfo.userkey, ACBConfig.encryption_password | Spec, not this lab: लाइव क्षमता सीक्रेट और डिक्रिप्ट पासवर्ड। G11 secrets-on-GET श्रेणी। परीक्षण नहीं किया गया। |
| Method | Sink | Privilege |
|---|---|---|
POST /services/acb/restore | RestoreACB body { timestamp } | Adjacent closed: नमूने अभी भी JWT भेजते हैं। यह शेष नहीं है। निष्पादित नहीं किया गया। |
POST /services/acb/config replace userkey | SaveACBConfig | Adjacent closed: यह GET क्षमता URL नहीं है। निष्पादित नहीं किया गया। |
GET list / GET bkp हटाते नहीं हैं। DELETE /services/acb/bkp/{timestamp} एक अलग ऑपरेशन है। परीक्षण नहीं किया गया।
गलत userkey और अनुपस्थित userkey ने कोई साक्ष्य नहीं लौटाया (lab-proven)।
Lab-proven vs inferred: चुराई गई कुंजी वाली list और bkp ने साक्ष्य लौटाया। गलत कुंजी और अनुपस्थित कुंजी ने नहीं लौटाया। Plus निष्पादित नहीं किया गया। लाइव config.xml सामग्री और डिक्रिप्ट सार्वजनिक स्कीमा से अनुमानित हैं (RetrievedBackup.backup एक स्ट्रिंग है; encryption_password ACBConfig पर स्थित है)।
Requires: MIM कंट्रोलर ACB GETs तक नेटवर्क पथ, साथ ही एक चुराई/लीक हुई userkey। CVSS 7.5 यदि वे GETs डिवाइस से JWT बाइंड किए बिना क्वेरी कुंजी का सम्मान करते हैं। ईमानदारी से: यह पैक साबित करता है कि सार्वजनिक स्पेक उस अनुबंध को मॉडल करता है, लूपबैक पर।
| Surface | Why |
|---|---|
| pfSense Plus controller | निष्पादित नहीं किया गया। इस पैक में कोई Plus इमेज नहीं है। |
| CE REST package | भिन्न सर्वर (jaredhendrickson/pfsense-api / pfrest.org)। |
| SSH-banner ACB key derivation | CVE-2024-57273 / SA-25_03। दोबारा फाइल न करें। |
POST /services/acb/restore as this finding | नमूने अभी भी JWT भेजते हैं। |
Unauth php/shell from omitted OAS security | docs शेष। Mock 200-without-JWT प्रमाण वाला सर्वर नहीं है। |
Missing userkey | lab 403, कोई साक्ष्य नहीं। |
Wrong userkey | lab list खाली / bkp 403, कोई साक्ष्य नहीं। |
Generated library verify_ssl | डिफ़ॉल्ट True। G9 नमूनों का इसे बंद करना है, पैकेज डिफ़ॉल्ट नहीं। |
मैंने Netgate/pfsense-api main b4acd7ca (2026-05-25, "Add Snort-3 API definitions") को पिन किया। login/JWT, diagnostics, MIM enrollment, client TLS, users/certs, packages, VPN/firewall, OpenAPI security, device IDOR, git/firmware/feeds, साथ ही हर जनरेट किए गए ऑपरेशन के लूपबैक mock पर बारह खोजें।
पहले स्किप सूची: CE WebGUI शेष पहले ही मेल किए गए (QinQ parent if, OpenVPN wizard CRLF, CARP VHID, limiter number, IPsec login banner)। Diagnostics PHP/shell इच्छित एडमिन शक्ति के रूप में। तृतीय-पक्ष CE REST पैकेज। CVE-2024-57273 banner derivation।
मैंने GetACBList और GetACB पढ़ा। userkey एक query parameter है, bound device id नहीं। Generated Python इसे query string पर copy करता है। YAML में कोई securitySchemes नहीं है। ACBConfigInfo.userkey "hexidecimal encoded 32-byte random bytes" है। GET /services/acb/config वह key लौटाता है। G9 samples TLS verify disable करते हैं, इसलिए एक MITM इसे leak कर सकता है। G11 GET dump है। यह leftover वह capability URL है जिसे यह dump feed करता है।