pfSense Plus MIM API toolkit b4acd7ca - عالي - عن بُعد - صلاحيات متبقية - Paramiko AutoAddPolicy enroll
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · pfsense-api-enroll-autoadd
الفئة: صلاحية متبقية الوصول: عن بُعد
pfSense Plus MIM API (Netgate/pfsense-api) b4acd7ca - Netgate
example-add-devices.py هو الطريقة الموثّقة لتسجيل وحدة تحكم Nexus لدى كل جهاز pfSense. وهو لا يستدعي load_system_host_keys() أبدًا. بل يضبط paramiko.AutoAddPolicy() ثم connect ثم exec_command(device_script). ويشير التعليق إلى إزالة AutoAdd عندما تكون الأجهزة موجودة بالفعل في known_hosts. أما الإعداد الافتراضي عند الشحن فهو AutoAdd.
أول اتصال SSH بجهاز جديد يقبل أي مفتاح مضيف يجيب. تُقدَّم مصادقة كلمة المرور أو المفتاح لذلك الطرف المقابل. ويُمرَّر stdout عبر json.loads ثم يُرسَل بـ POST /mim/devices إلى وحدة التحكم الحقيقية.
هذه ليست حزمة REST الخاصة بـ CE من طرف ثالث. هذه هي OpenAPI الرسمية بالإضافة إلى عميل Python المولَّد لـ pfSense Plus Nexus Multi-instance Management. الخادم مخصص لـ Plus فقط. المختبر عبارة عن أداة Paramiko SSH. لم أتحدث إلى وحدة تحكم Plus حقيقية.
| المعرّف | لا يوجد CVE بعد |
| الفئة | صلاحية متبقية (Paramiko AutoAddPolicy عند تسجيل SSH) |
| الوصول | عن بُعد (على المسار إلى SSH الخاص بالجهاز عند أول اتصال) |
| CWE | CWE-322 |
| 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 Nexus MIM) |
| المتأثر | main b4acd7ca21dbca739a530403a1f62a7440f7726f example-add-devices.py |
| المصادقة | يشغّل المشغّل النموذج الرسمي؛ والمهاجم على المسار إلى SSH الخاص بالجهاز |
| الترخيص | GNU Affero GPL v3.0 |
| المختبر | 127.0.0.1:19111 فقط. لا توجد صورة Plus. |
AC:H يعني أول اتصال / على المسار. محطة عمل تحتوي بالفعل على مفاتيح الجهاز الحقيقية في known_hosts و أُزيل منها سطر AutoAdd ليست هذا الخلل المتبقي.
نفس بقايا التثبيت: JSON interpolation of ControllerSummary into the enrollment shell (G1) والعينات تفرض verify_ssl=False (G9). مركز السلسلة: pfsense-api-nexus-mim.
الجلوس على المسار إلى عنوان SSH لأول اتصال في pfsense_addresses أثناء تشغيل المشغّل للعينة. لا يزال AutoAdd مفعّلًا.
| الطريقة | الحوض | الصلاحية |
|---|---|---|
الجلوس على المسار إلى عنوان SSH للاتصال الأول في pfsense_addresses | set_missing_host_key_policy(paramiko.AutoAddPolicy()) ثم connect (example-add-devices.py:151-160) | السلامة (مُثبتة مختبرياً): يتم قبول مفتاح المضيف المجهول. المختبر: AutoAddPolicy اتصل (autoadd=yes). فشل RejectPolicy (reject-control=yes). |
نفس الجلسة، الرد على exec_command(device_script) | يتم تحليل stdout كـ DeviceIdentity (example-add-devices.py:161-187) | السلامة (مُثبتة مختبرياً): أعاد exec هوية JSON تحتوي على PFSENSE-API-ENROLL-AUTOADD-WITNESS (identity-json=yes). |
| نفس MITM، قراءة حمولة exec | device_script هو بقايا curl -d من G1 الخاص بـ ControllerSummary | استطلاع (مُستنتج من المصدر): مفتاح هوية المتحكم، Netgard vpn_pubkey / vpn_netkey / عناوين الاستماع. لم يتم تفريغها بواسطة هذا المختبر. |
| نفس MITM، مصادقة كلمة المرور أو المفتاح | SSHUSER / SSHPASS أو agent/keys (example-add-devices.py:156-160) | استطلاع (مُستنتج): بيانات الاعتماد أو المفاتيح المقدمة إلى المضيف المزيف. استخدم المختبر مصادقة كلمة المرور فقط كمسار SSHPASS النموذجي. |
نفس stdout JSON، add_controlled_device.sync | POST /mim/devices على المتحكم الحقيقي | السلامة (مُستنتج): يسجل مفاتيح Noise/VPN الخاصة بالمهاجم و address. بالإضافة إلى المصافحة لم تُنفذ في هذا المختبر. |
| MITM هو خادم SSH | أي exec أرسله العميل، كـ SSHUSER | السلامة / التوفر (مُستنتج): تشغيل أو إسقاط أو تخطي سكربت التسجيل. تحدث استدعاءات Unix-socket على الجهاز الحقيقي فقط إذا قام MITM بإعادة توجيهها. |
مُثبت مختبرياً مقابل مُستنتج: اتصال AutoAdd، فشل RejectPolicy، وهوية JSON مع الشاهد هي مخبرية. تفريغ مفتاح المتحكم، سرقة بيانات الاعتماد، POST /mim/devices لجهاز مزيف، وتشغيل curls الحقيقية لـ unix-socket كلها مُستنتجة من نفس مسار العينة.
يتطلب: تشغيل المشغل للعينة الرسمية ضد عنوان SSH لم يتم تثبيت مفتاح المضيف الخاص به مسبقاً، مع ترك AutoAdd مفعلاً. مسار الشبكة إلى ذلك SSH. AC:H هو الاتصال الأول / على المسار.
| السطح | السبب |
|---|---|
RejectPolicy على نفس المضيف المجهول | المختبر: reject-control=yes. يرفض Paramiko المفتاح. |
محطة عمل بمفاتيح جهاز حقيقية في known_hosts و سطر AutoAdd مُزال | الوضع المقصود في التعليق. لا تحمّل العينة تلك المفاتيح إلا إذا أضفت الاستدعاء. |
| تسجيل دخول متحكم HTTPS | verify_ssl=False هو بقايا عينة شقيقة (G9)، وليس هذا الحوض. |
| Unix-socket MIM على الجدار الناري الحقيقي | فقط إذا قام MITM بإعادة توجيه exec. لا يتحدث هذا المختبر أبداً إلى /var/run/pfnet-controller.sock. |
Client المُنشأ الافتراضي verify_ssl=True | الافتراضي في المكتبة ليس البقايا. العينات تفرض False. |
بالإضافة إلى RBAC / :8443 المباشر | هذا المختبر هو أداة Paramiko. لم أتحدث إلى متحكم Plus. |
| الإنترنت غير المصادق إلى 8443 | تسجيل الدخول لا يزال يصدر JWT. ليس هذا الاكتشاف. |
| Diagnostics PHP/shell | صلاحية المسؤول المقصودة لـ fleet JWT. ليس هذا الاكتشاف. |
ثبّتت github.com/Netgate/pfsense-api main b4acd7ca21dbca739a530403a1f62a7440f7726f بعد بقايا CE WebGUI. هذه الشجرة هي OpenAPI بالإضافة إلى Python المُنشأ لـ Plus Nexus MIM. قرأت حلقة التسجيل في example-add-devices.py. سياسة مفتاح المضيف هي AutoAdd. الأسرار تجلس على نفس قناة exec. لا تستدعي العينة أبداً load_system_host_keys().
المنعطفات الخاطئة المسجلة بالفعل: التعامل مع AutoAdd كأنه للمختبر فقط (التعليق هو إلغاء اشتراك، وليس اشتراكاً)؛ افتراض تحميل known_hosts؛ دمج هذا في بقايا استيفاء shell الخاص بـ ControllerSummary؛ اختبار Plus مباشرة؛ الادعاء بأن هذا HTTPS غير مصادق إلى :8443.
المسرح: صدفة عكسية. الوحي هو RejectPolicy fail بالإضافة إلى AutoAdd connect بالإضافة إلى هوية JSON مع الشاهد.
python3 pfsense-api-enroll-autoadd-Abraxas-Labs.py
أو
cd lab
./run.sh
Loopback SSH 127.0.0.1:19111. مشروع Compose pfsense-api-enroll-autoadd. CONTROL: RejectPolicy يفشل عند المضيف غير المعروف. INJECT: AutoAddPolicy من العينة الرسمية، connect، exec_command لسكربت التسجيل؛ stdout هو JSON الهوية مع الشاهد. لا يوجد متحكم Plus مباشر. الشاهد PFSENSE-API-ENROLL-AUTOADD-WITNESS. يتم تفكيك الحزمة بعد التشغيل.
SUCCESS PFSENSE-API-ENROLL-AUTOADD autoadd=yes reject-control=yes identity-json=yes PFSENSE-API-ENROLL-AUTOADD-WITNESS