
pfSense Plus MIM API toolkit b4acd7ca - عالي - محلي - صلاحية متبقية - unix sock enroll no JWT
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · pfsense-api-unix-sock-noauth
الفئة: صلاحية متبقية الوصول: محلي
pfSense Plus MIM API b4acd7ca - Netgate
github.com/Netgate/pfsense-api هو OpenAPI العام بالإضافة إلى Python المولّد لـ pfSense Plus Nexus Multi-instance Management. وهو ليس حزمة CE REST. يسجّل نموذج التسجيل الرسمي الدخول إلى HTTPS :8443 باستخدام Bearer JWT، ثم ينفّذ SSH لنقل سكربت POSIX إلى كل جدار حماية. يتواصل ذلك السكربت مع /var/run/pfnet-controller.sock بدون Authorization.
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. لا يُطبَّق ذلك الرمز على مقبس الجهاز. هذه حدود ثقة منفصلة عن :8443 بالإضافة إلى مجموعات mim_*.
الجزء 3 من سلسلة Nexus MIM. بعد أن يستقر G1 / G2 على الجهاز، يصبح هذا المقبس هو المستوى المحلي.
عملية محلية قادرة على connect(2) إلى المقبس يمكنها تسجيل وحدة تحكم واستخراج هوية الجهاز دون JWT. كما لم يُنفَّذ Plus. وضع DAC الحقيقي للمقبس غير معروف.
| المعرّف | لا يوجد CVE بعد |
| الفئة | صلاحية متبقية |
| الوصول | محلي (connect(2) إلى /var/run/pfnet-controller.sock) |
| 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 إذا كان وضع المقبس يسمح لمستخدم محلي آخر بالاتصال. بصراحة: DAC غير معروف، ولم يُنفَّذ Plus. |
| المنتج | Netgate/pfsense-api (مجموعة أدوات Plus Nexus MIM) |
| المتأثر | main العام b4acd7ca21dbca739a530403a1f62a7440f7726f (2026-05-25) |
| المصادقة | لا شيء على طلبات curl الرسمية لتسجيل unix-socket |
| الترخيص | GNU Affero GPL v3.0 |
| المختبر | 127.0.0.1:19121 فقط. محاكاة Unix HTTP. لا توجد صورة Plus. |
الفاعل هو أي عملية على جهاز pfSense قادرة على connect(2) إلى /var/run/pfnet-controller.sock. ليس TCP عن بُعد في هذا المثال (curl --unix-socket فقط). لا ينطبق JWT الخاص بـ HTTPS :8443 ومجموعات mim_* على هذا الواصف.
| الطريقة | الهدف | الصلاحية |
|---|---|---|
POST الرسمي لـ device_script بدون Authorization | POST http://unix/api/mim/controllers | السلامة: قبلت المحاكاة JSON التسجيل. سجل الضربة authorization_present=false. |
GET الرسمي لـ device_script بدون Authorization | GET http://unix/api/mim/device/identity | استطلاع: أعادت المحاكاة JSON على شكل DeviceIdentity بما في ذلك PFSENSE-API-UNIX-SOCK-NOAUTH-WITNESS. |
نفس GET مع Authorization: Bearer lab-jwt | نفس مسار الهوية | ضبط مختبري: 401، الشاهد غير موجود في الجسم. يميّز بين الموجود والمفقود. ليس نتيجة Plus. |
هذه هي نفس عمليات OpenAPI التي يضعها النموذج الرسمي ووسم mim على الجهاز. مُثبَتة فقط كبروتوكول، وليس كنتيجة Plus 200.
| الطريقة | الهدف | الصلاحية |
|---|---|---|
POST /mim/controllers (البديل POST /api/system/controller) مع ControllerIdentity من المهاجم (key، vpn_pubkey، vpn_listenaddr، vpn_netkey، cert) | SetController | السلامة: تسجيل وحدة تحكم معادية. المواصفات: الجهاز "سيستمر في إصدار طلب اتصال كل 10 ثوانٍ" (Netgard VPN إلى المهاجم). |
GET /mim/device/identity (البديل GET /api/system/mim/devid) | GetDeviceIdentity | استطلاع: مفاتيح Noise/VPN العامة للجهاز، address، نص curl الخاص بـ controller_add. |
GET /mim/controllers | GetControllers | استطلاع: قائمة وحدات التحكم بالإضافة إلى معلومات الجهاز (ControllerInfo.noise_secret، المفاتيح). |
GET /mim/controllers/id/{key} | GetMIMController | استطلاع: سجل وحدة تحكم واحدة. |
DELETE /mim/controllers/id/{key} | DeleteMIMController | السلامة / التوافر: إلغاء تسجيل وحدة التحكم الحقيقية (مفتاح hex أو base64-URL). |
POST /mim/device/pubkey مع privkey / pubkey من المهاجم | SetDevicePublicKey (يتضمن DevicePublicKeyOption الحقل privkey) | السلامة: استبدال هوية ED25519 للجهاز. عندئذٍ تثق مصافحة وحدة التحكم بمفتاح المهاجم. |
لا يمنح بحد ذاته صدفة root على المضيف. يمنح مستوى MIM: من يثق به الجهاز كوحدة تحكم، ومفتاح Noise الخاص بالجهاز إذا تم احترام POST الخاص بـ pubkey.
يتطلب: connect(2) محلي إلى /var/run/pfnet-controller.sock. DAC (mode، owner، group، SO_PEERCRED) ليس في شجرة العميل العامة. إذا كان الـ daemon يربط 0600 root، فهذا بالفعل root محلي (confused deputy لـ helper أو package أو escape يمكنه رؤية /var/run). إذا كان الـ sock قابلاً للوصول من uid آخر، فـ CVSS 7.8 كما تم تقييمه.
/mim/controllers على Nexus HTTPS :8443. هذا المنفذ موثق كـ User Manager JWT. هذه البقايا هي الـ unix fd.POST /login لا يزال يصدر Bearer JWT. AuthenticatedClient لا يزال يرسله إلى CONTROLLER_URL+"/api".verify_ssl=True. معاملات المسار ترمّز ../ بنسبة مئوية.security: MISSING على جميع 755 عملية هو فجوة في المخطط، وليس تجاوز HTTPS غير مصادق عليه مُثبت.نفس pin، مستوى التسجيل عن بعد: pfsense-api-enroll-json-ssh وpfsense-api-enroll-autoadd. خريطة السلسلة: pfsense-api-nexus-mim.
قمت بتثبيت Netgate/pfsense-api b4acd7ca21dbca739a530403a1f62a7440f7726f وقرأت حلقة التسجيل الرسمية: login، GET /mim/controller/identity، stringify، SSH exec لـ unix-socket POST/GET، POST /mim/devices. HTTPS يستخدم AuthenticatedClient(token=...). الـ sock curls لا تفعل ذلك.
منعطفات خاطئة: التعامل مع securitySchemes المفقود كـ HTTPS غير مصادق عليه (login يفتقده أيضاً؛ الأمثلة دائماً Bearer أولاً). افتراض أن الـ sock قابل للكتابة عالمياً (mode ليس في هذا المستودع). ادعاء Plus 200. البقايا المُثبتة هنا هي بروتوكول التسجيل المنشور.
المسرح: reverse shell. الـ oracle هو شكل curl الرسمي بالإضافة إلى شاهد في جسم identity بالإضافة إلى تحكم Bearer 401.
python3 pfsense-api-unix-sock-noauth-Abraxas-Labs.py
أو
cd lab
./run.sh
Loopback فقط: 127.0.0.1:19121. مشروع Compose pfsense-api-unix-sock-noauth. محاكاة unix HTTP على /var/run/pfnet-controller.sock. الشاهد PFSENSE-API-UNIX-SOCK-NOAUTH-WITNESS. محاكاة Docker unix-socket. بدون صورة Plus.
السطر الأخير المتوقع:
SUCCESS PFSENSE-API-UNIX-SOCK-NOAUTH auth-absent=yes identity-witness=yes bearer-401=yes PFSENSE-API-UNIX-SOCK-NOAUTH-WITNESS