
pfSense Plus MIM API toolkit b4acd7ca - عالي - عن بُعد - IDOR - وحدة تحكم واحدة JWT هي رمز أسطول
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · pfsense-api-fleet-jwt
الفئة: IDOR الوصول: عن بُعد
pfSense Plus MIM API (Netgate) عند الالتزام b4acd7ca - github.com/Netgate/pfsense-api
يُعاد استخدام Bearer واحد من POST /login لكل device_id مُسجَّل. تنسخ الأمثلة الرسمية ذلك الرمز إلى /api/device/pfsense/{device_id}/api لكل معرّف من GET /mim/devices. حقول LoginResponse هي فقط token وuser وversion وalerts. أدوار LDAP MIM عالمية. وهي غير مرتبطة بجهاز. تسجيل دخول وحدة تحكم يمكنه سرد الأجهزة يتحدث إلى الجدار الناري B برمز صادر لمستخدم كان المقصود منه الجدار الناري A.
هذا مستأجر عميل واحد، وليس بقايا عبور مستأجرين في SaaS. تبقى الاستدعاءات غير الموثّقة 401. ولم يُنفَّذ Plus RBAC. مركز السلسلة: pfsense-api-nexus-mim (هذه هي البقايا 6). الـ JWT المسروق من البقايا 9 (عينات verify_ssl=False) هو رمز الأسطول هذا.
| المعرّف | لا يوجد CVE بعد |
| الفئة | IDOR |
| الوصول | عن بُعد (JWT وحدة تحكم موثّق) |
| CWE | CWE-639 |
| CVSS | مرتفع: 8.1 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:N |
| المنتج | Netgate/pfsense-api (pfSense Plus Nexus Multi-instance Management controller OpenAPI + العميل المُولَّد) |
| المتأثر | الالتزام b4acd7ca21dbca739a530403a1f62a7440f7726f (2026-05-25). لا توجد وسوم. الخادم خاص بـ Plus فقط (مدفوع). وليس حزمة CE REST. |
| المصادقة | JWT وحدة التحكم من POST /login. تخمين device_id غير مطلوب إذا كان GET /mim/devices مسموحًا. |
| الترخيص | GNU Affero GPL v3.0 |
| المختبر | 127.0.0.1:19161 فقط. محاكاة Python لعقد العميل المنشور. لا توجد صورة Plus. |
ثبّتُّ github.com/Netgate/pfsense-api على main عند b4acd7ca21dbca739a530403a1f62a7440f7726f (2026-05-25، Add Snort-3 API definitions). هذا ليس jaredhendrickson/pfsense-api / pfrest.org.
تسجيل دخول وحدة تحكم يمكنه سرد الأجهزة يتحدث إلى كل نسخة مُسجَّلة بنفس الـ JWT. CSRF ليس في اللعبة (Bearer API). PHP / shell / export-key على كل صندوق هو صلاحية مسؤول مقصودة بمجرد أن يقبل الوسيط رمز الأسطول. البقايا هي الربط المفقود لكل جهاز، وليس Diagnostics: Command.
| الصلاحية | الطريقة / المسار | مُثبت مختبريًا أو مُستنتج |
|---|---|---|
سرد كل device_id مُسجَّل (الاسم، العنوان، الحالة) | GET /mim/devices مع Bearer الخاص بتسجيل الدخول | استطلاع (مُثبت مختبريًا). أعاد الـ Mock كلاً من site-a و site-b. بدون مصادقة يُرجع 401. |
| قراءة حالة النظام لكل من firewall A و firewall B برمز واحد | GET /api/device/pfsense/{device_id}/api/system | استطلاع (مُثبت مختبريًا). device-a=200، device-b=200. الشاهد على B فقط. |
| إرسال POST إلى غلاف PHP التشخيصي على كلا المعرّفين | POST /api/device/pfsense/{device_id}/api/diag/cmd/php | سلامة (مختبريًا على الـ mock فقط). كلاهما 200. كما لم يُنفَّذ RBAC، لذا فإن بوابة الدور الحية غير مُثبتة. |
تشغيل PHP / shell / تحرير الملفات على كل جهاز مُسجَّل إذا تضمّن تسجيل الدخول console أو system | POST /diag/cmd/php، POST /diag/cmd/shell، GET/POST /diag/editfile، تنزيل/رفع | سلامة (مُستنتج من OAS + الأمثلة). صلاحية المسؤول المقصودة بمجرد أن يقبل الوكيل رمز الأسطول. عادةً ما يعمل pfSense PHP-FPM بصلاحية root. |
| تصدير مفاتيح CA / leaf الخاصة و PKCS12 على كل نسخة مُدرجة | GET /system/certificates/{refid}/export-key، GET /system/certauth/{refid}/export-key، GET /system/certificates/{refid}/export-p12 | استطلاع (مُستنتج). نفس JWT، نفس المخطط كما في leftover 4. إضافةً إلى أن RBAC لم يُنفَّذ. |
| استخراج حساب ACME والمفاتيح الصادرة على كل نسخة مُدرجة | GET /services/acme وعمليات GET ذات الصلة بالحساب/الشهادة | استطلاع (مُستنتج). نفس JWT، مخطط leftover 5. |
| تغيير aliases، firewall، interfaces، VPN، services على كل نسخة مُدرجة | نفس البادئة لكل جهاز، أكثر من 700 عملية متبقية | سلامة (مُستنتج). نفس JWT، نفس المخطط كما في النسخة المحلية. |
| إعادة التشغيل / الإيقاف / استعادة الإعدادات على كل نسخة مُدرجة | POST /diag/control، POST /diag/backup/restore | توافر + سلامة (مُستنتج). نفس الوكيل. لم يُجرَّب. |
| IDOR عبر عملاء SaaS | لا ينطبق | مُغلق. مستأجر عميل واحد. Netgate تشغّل المتحكم في ذلك المستأجر. |
| من الإنترنت إلى :8443 بدون مصادقة | GET /mim/devices بدون Bearer | مُغلق في هذا المختبر. 401. Bearer خاطئ يُرجع أيضًا 401. |
| الأجهزة غير المتصلة | تتخطى العينات state != online | مُغلق بواسطة العينات. ليس حدًا للمصادقة. |
المسح الرقمي الأعمى لـ device_id | GET /api/device/pfsense/1/api/system | مُغلق كشرط تخمين. المعرّفات سلاسل طويلة (على شكل ED25519). السرد يزيل الحاجة للتخمين. |
يتطلب: تسجيل دخول للمتحكم مسموح له بالوصول إلى وكيل الجهاز. مسار شبكي إلى متحكم MIM (:8443 في المنتج، loopback :19161 في هذا المختبر). ليس بدون مصادقة. ليس CSRF.
| السطح | السبب |
|---|---|
| السرد / php / shell بدون مصادقة | الـ Mock يُرجع 401 بدون Bearer ومع Bearer خاطئ. صمت المواصفة حول securitySchemes ليس استجابة 200 من الخادم. |
| SaaS عبر المستأجرين | مستأجر عميل واحد. كانت مجموعات المستأجرين لا تزال مخططة على صفحة التسويق. |
mim_user / بدون مجموعة Nexus | موثّق كمُغلق إذا صمدت بوابة تسجيل الدخول. |
أسماء أدوار mim_* الوظيفية | إنها موجودة (view، logs، usermgmt، services، firewall، interfaces، devices، system، superuser). إنها عامة، وليست لكل device_id. لم تُنفَّذ فحوصات Plus الحية (plus-rbac=not-executed). |
| استيفاء JSON عبر SSH للتسجيل | leftover 1. حزمة مختلفة. |
AutoAddPolicy للتسجيل | leftover 2. حزمة مختلفة. |
| مقبس unix للجهاز بدون JWT | leftover 3. محلي، حزمة مختلفة. |
| حزمة CE REST | jaredhendrickson/pfsense-api خادم مختلف. |
| CE WebGUI QinQ / معالج OpenVPN / CARP / limiter / لافتة IPsec | أُرسلت بالفعل كبقايا CE. أسماء الحقول في هذا OAS هي نفس المصارف، وليست ثغرات CVE جديدة. |
وحدة تحكم الأسطول المقصودة admins / mim_superuser | نموذج المنتج لمالك المتحكم. الـ leftover هو ACL الكائن المفقود لكل الآخرين. |
ثبّتُّ b4acd7ca وقرأت الأمثلة الرسمية مقابل OpenAPI. كل عيّنة تتحدث إلى جدران حماية مُدارة تفعل هذا:
devApi = AuthenticatedClient(
base_url=CONTROLLER_URL+"/api/device/pfsense/{}/api".format(device.device_id),
verify_ssl=False,
headers={"Content-Type": "application/json"},
cookies=cookies,
token=token,
)
helper_funcs.py createDeviceApiChild يأخذ سلسلة device_id عشوائية وينسخ self.token. example.js يقوم بـ newClient("device/pfsense/" + device.device_id + "/api") ثم setBearer(client.getBearer()). example-upgrade-devices.py newDevApiClient هو نفس النسخ. GET /mim/devices هو أوراكل السرد (مرشح الوسوم فقط).