pfSense Plus MIM API toolkit b4acd7ca - عالي - عن بُعد - صلاحيات متبقية - example-add-devices.py JSON إلى SSH
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · pfsense-api-enroll-json-ssh
الفئة: صلاحية متبقية الوصول: عن بُعد
مجموعة أدوات pfSense Plus MIM API (b4acd7ca) - Netgate
example-add-devices.py هي الطريقة الموثّقة لتسجيل وحدة تحكم Nexus على كل جهاز pfSense Plus عبر SSH. تقوم بـ json.dumps لـ GET /mim/controller/identity، وتستبدل " فقط، ثم تستخدم .format على تلك الكتلة مرتين داخل سكربت POSIX بصيغة curl -d محاط بعلامات اقتباس مزدوجة. يشغّل Paramiko exec_command السكربت باسم SSHUSER (النموذج الافتراضي admin) على كل عنوان في pfsense_addresses.
json.dumps مع replace('"', '\\"') يُبقي علامات الاقتباس مغلقة. $()، والعلامات الخلفية، و${...} ليست محارف JSON خاصة. تبقى فعّالة داخل سلسلة -d المزدوجة الاقتباس التي لا تزال مفتوحة. exec في OpenSSH هو صدفة. تلك هي الصلاحية المتبقية.
هذه ليست حزمة REST CE الخاصة بطرف ثالث. إنها عميل OpenAPI الرسمي والنماذج الخاصة بوحدة تحكم pfSense Plus Nexus Multi-instance Management. لم أقم بتأليف Plus. المختبر هو الاستيفاء المثبّت بالإضافة إلى /var/run/pfnet-controller.sock وهمي.
| المعرّف | لا يوجد CVE بعد |
| الفئة | صلاحية متبقية (JSON وحدة التحكم داخل SSH التسجيل) |
| الوصول | عن بُعد (على المسار إلى CONTROLLER_URL بينما يضبط النموذج verify_ssl=False، أو كاتب لحقول سلسلة ControllerSummary) |
| CWE | CWE-78 |
| CVSS | مرتفع: 8.1 CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:H |
| المنتج | Netgate/pfsense-api (مجموعة أدوات Plus MIM) |
| المتأثر | main العام b4acd7ca21dbca739a530403a1f62a7440f7726f example-add-devices.py |
| المصادقة | يشغّل المشغّل النموذج الموثّق. المهاجم على المسار، أو يمكنه كتابة سلاسل الملخص. تسجيل الدخول إلى وحدة التحكم لا يزال يحدث أولاً. |
| الترخيص | GNU Affero GPL v3.0 |
| المختبر | 127.0.0.1:19101 فقط. لا توجد صورة Plus. |
الجزء 1 من سلسلة الصلاحيات المتبقية في Nexus MIM. الشقيقات: enroll-autoadd، unix-sock-noauth، example-ssl-verify (G9 هي كيفية تشكيل نظير على المسار لهذا JSON)، fleet-jwt، export-key-get.
الصلاحية المتبقية هي استبدال أوامر داخل سلسلة -d المزدوجة الاقتباس التي لا تزال مفتوحة. json.dumps مع تمرير علامات الاقتباس يُبقيان السلسلة مغلقة. $()، والعلامات الخلفية، و${...} تنجو وتُشغَّل باسم SSHUSER عندما ينفّذ OpenSSH السكربت عبر exec.
| الطريقة | نقطة الوصول | الصلاحية | مُثبت مختبريًا أو مُستنتج |
|---|---|---|---|
ضع $() (أو backticks / ${...}) في حقل نصي ControllerSummary، ثم دع المشغّل يشغّل example-add-devices.py | controller_info.replace('"', '\\"') ثم device_script.format(...) ثم sshclient.exec_command(device_script) (example-add-devices.py ~104-161) | Shell كـ SSHUSER (افتراضي العينة admin؛ عادةً ما يكون SSH الخاص بمسؤول pfSense مكافئًا لـ root) على كل عنوان في pfsense_addresses | مُثبت مختبريًا على الاستيفاء: INJECT vpn_listenaddr=$(printf %s PFSENSE-API-ENROLL-JSON-SSH-WITNESS >/oracle/witness) نجا من الهروب الخاص بالاقتباسات فقط (dollar-paren-survived=yes) وكتب الشاهد (inject-oracle=yes). Paramiko/SSH نفسه ليس في هذا الـ compose. |
TLS MITM لـ GET /api/mim/controller/identity بينما تستخدم العينة verify_ssl=False | نفس تحليل ControllerSummary ثم نفس السكربت | نفس الـ shell. جميع حقول ControllerSummary هي str أو Unset، لذا يكفي جسم JSON من MITM يُحلَّل نوعيًا. | مُستنتج من العينة (example-add-devices.py تسجيل الدخول Client و AuthenticatedClient كلاهما يضبط verify_ssl=False). المختبر ينشر كائن الملخص مباشرةً. شقيق: example-ssl-verify. |
اكتب أحرف استبدال في name أو vpn_listenaddr على المتحكم، وانتظر التسجيل التالي | نفس نقطة الوصول | نفس الـ shell عندما يشغّل المشغّل العينة لاحقًا | مُستنتج. يحتاج إلى كتابة مسبقة لتلك الحقول (بالفعل مسؤول متحكم، أو الشقيق unix-sock-noauth). |
نفس الـ shell، مفاتيح إضافية عبر ControllerSummary.additional_properties | نفس التفريغ يتضمن مفاتيح MITM إضافية (to_dict ينسخ المتبقي بعد from_dict) | حقول إضافية تنتقل إلى -d وإلى الـ shell | مُستنتج من to_dict. المختبر يحقن عبر vpn_listenaddr فقط. |
| الطريقة | نقطة الوصول | الصلاحية | مُثبت مختبريًا أو مُستنتج |
|---|---|---|---|
| اقرأ stdout لمحطة عمل التسجيل | print("CONTROLLER_SUMMARY:", controller_info) | هوية المتحكم key، Netgard vpn_pubkey / vpn_netkey / عناوين الاستماع | مُستنتج من طباعة العينة. المختبر لا يطبع كتلة متحكم حية. |
| تنصّت أو MITM على قناة تنفيذ SSH | حمولة exec_command(device_script) هي curl -d JSON | نفس هوية المتحكم على السلك إلى كل جهاز | مُستنتج. AutoAddPolicy على تلك القناة هو تقرير شقيق. |
| حالة CONTROL على الأداة | POST /case name=control | vpn_listenaddr الصادق يصل إلى unix socket دون تغيير | مُثبت مختبريًا. 192.0.2.10:51820 نُشر كما هو، بدون oracle (control-clean=yes). |
| الطريقة | نقطة الوصول | الصلاحية | مُثبت مختبريًا أو مُستنتج |
|---|---|---|---|
أمر محقون كـ SSHUSER | نفس exec_command | إيقاف pfnet-controller، محو التسجيل، إعادة التشغيل، أو إسقاط الجهاز من MIM بأي طريقة أخرى | مُستنتج كأثر جانبي للـ shell. المختبر يكتب ملف الشاهد فقط. |
يتطلب: مسار العينة الرسمي (تسجيل المشغّل). UI:N للنظير على المسار بمجرد تشغيل تلك العينة. تسجيل الدخول إلى المتحكم لا يزال يحدث أولاً.
Shell كـ admin على جهاز pfSense ليس "the JWT can php." إنها محطة عمل التسجيل تسلّم الجدار الناري كتلة متحكم عبر sh -c. من هناك، JSON المُشكَّل هو ما ينشره الجهاز إلى /var/run/pfnet-controller.sock بدون JWT (unix-sock-noauth). AutoAddPolicy يعني أن نظير SSH الذي يستقبل هذا السكربت غير مثبّت (enroll-autoadd). G9 verify_ssl=False هو كيف يكتب النظير على المسار JSON في المقام الأول.