pfSense Plus MIM API toolkit b4acd7ca - عالي - عن بُعد - صلاحيات متبقية - GET /services/acme يكشف المفاتيح
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · pfsense-api-acme-key-dump
الفئة: صلاحية متبقية الوصول: عن بُعد
pfSense Plus Nexus Multi-instance Management مجموعة أدوات OpenAPI b4acd7ca - Netgate
GET /services/acme (GetACMEConfig) يُرجع ACMEConfig بدون علامة write-only أو redacted. يتضمن مخطط 200 المفتاح الخاص لحساب ACME، وكل مفتاح خاص لشهادة نهائية صادرة، وأي مفتاح نهائي مخصص، ورموز مزوّد DNS المستخدمة للتحقق. مدير الشهادات على الأقل لديه GET .../export-key مخصص. أما ACME فلا يملك شيئًا. GET الخاص بالإعدادات هو التفريغ.
جلسة تحكم قادرة على تنفيذ GET على هذا المسار تنسخ كل مفتاح اسم مضيف يسجّله الجدار الناري، بالإضافة إلى بيانات اعتماد DNS التي تُثبت السيطرة على تلك الأسماء.
هذه الشجرة هي OpenAPI العام بالإضافة إلى عميل Python مُولَّد. وهي ليست حزمة CE REST. وحدة تحكم MIM متاحة لـ Plus فقط وليست في مستودع GitHub. لم أتحدث إلى وحدة تحكم حية. plus-not-executed=1.
| المعرّف | لا يوجد CVE بعد |
| الفئة | صلاحية متبقية (تفريغ أسرار عند GET للإعدادات) |
| الوصول | عن بُعد (وحدة تحكم MIM موثّقة؛ لم يُثبت بدون مصادقة) |
| CWE | CWE-200 |
| CVSS | مرتفع: 6.5 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:N/A:N إذا كان دور services-read يتلقى الاستجابة. وإذا كان بإمكان المستخدم الخارق فقط تنفيذ GET عليه، فإن التفريغ لا يزال بالشكل الخاطئ لقائمة إعدادات. |
| المنتج | Netgate/pfsense-api OpenAPI لـ pfSense Plus Nexus MIM |
| المتأثر | main العام b4acd7ca21dbca739a530403a1f62a7440f7726f (2026-05-25، Add Snort-3 API definitions). لا توجد وسوم. |
| المصادقة | JWT الخاص بوحدة التحكم من POST /login. الأمثلة ترسل Bearer. المواصفة لا تحتوي على securitySchemes. |
| الترخيص | GNU Affero GPL v3.0 |
| المختبر | 127.0.0.1:19151 فقط. لا توجد صورة Plus. |
مركز السلسلة: pfSense Plus MIM leftovers. هذا الجزء 5. يتسلسل مع G9 stolen JWT (العينات تضبط verify_ssl=False) وG6 fleet token (تسجيل دخول Bearer واحد يُعاد استخدامه لكل device_id). تفريغ شقيق: G4 cert-manager export-key.
يتطلب جلسة تحكم قادرة على GET /services/acme. الوثائق تربط ذلك بـ mim_services_read / mim_services / mim_superuser. المواصفة لا تربط تلك الأدوار بالمسار. لم يُنفَّذ RBAC الخاص بـ Plus.
JWT مسروق من G9 (اعتراض وسيط للعينات الرسمية) أو رمز أسطول من G6 لمكتب المساعدة يكفي لتوجيه هذا GET إلى كل صندوق مسجَّل. تلك السلسلة مُستنتجة. هذه الصلاحية المتبقية هي جسم GET.
| الطريقة | الحوض | الصلاحية |
|---|---|---|
GET /services/acme | ACMEConfig.account_keys[].account_key (format: byte) | مُثبت مختبرياً على المواصفة المنشورة والمحاكاة: مخطط 200 يتضمن account_key؛ جسم المحاكاة يعيد PFSENSE-API-ACME-KEY-DUMP-WITNESS. مُستنتج على Plus: انسخ المفتاح الخاص لحساب Let's Encrypt (أو أي حساب ACME آخر). تواصل مع حساب ACME من خارج الجهاز. |
| نفس GET | certs[].issued_cert.privateKey (format: byte) | مُثبت مختبرياً على المواصفة والمحاكاة. مُستنتج على Plus: انسخ كل مفتاح خاص لشهادة نهائية سجّلها الجدار الناري. انتحال TLS من خارج الجهاز لتلك الأسماء. |
| نفس GET | certs[].custom_key (format: byte) | مُثبت مختبرياً على المواصفة والمحاكاة. مُستنتج على Plus: انسخ مفتاح شهادة نهائية مخصصة عندما يكون key_type=custom. |
| نفس GET | certs[].domain_list[].config.credentials (additionalProperties: string) | مُثبت مختبرياً على المواصفة والمحاكاة. مُستنتج على Plus: انسخ أسرار التحقق عبر DNS (رموز Cloudflare، مفاتيح AWS، أسرار RFC2136). تلك تُثبت السيطرة على الأسماء. |
| نفس GET | رسائل البريد الإلكتروني للحساب، عناوين URL لخوادم مخصصة، action_list.command | مُثبت مختبرياً أن الحقول موجودة على المخطط. تنفيذ الخطاف مسار تعديل، وليس هذا الـ GET. |
لا شيء من الـ GET نفسه. الاستخدام اللاحق للمفاتيح المسروقة ورموز DNS يتم خارج الجهاز (إصدار شهادة مارقة، التواصل مع حساب ACME، تغيير DNS). لم يُختبر.
لا شيء. سرد الإعدادات لا يُبطل أو يعيد كتابة الشهادات.
يتطلب: وصول مصادق عليه إلى وحدة تحكم MIM مسموح له بتنفيذ GET على وسم ACME. لم يُثبت بدون مصادقة. _get_kwargs المُولّد لهذه العملية لا يضيف Authorization؛ الأمثلة لا تزال تسجل الدخول وترسل Bearer.
| السطح | السبب |
|---|---|
| وحدة تحكم pfSense Plus / Nexus الحية | لم تُنفذ. plus-not-executed=1. |
| من الإنترنت غير المصادق إلى 8443 | الأمثلة تتطلب POST /login. غياب security في OAS هو ثغرة في المواصفة، وليس دليلاً على استجابة خادم 200 بدون JWT. |
POST /services/acme/cert/{name}/issue و .../renew | تعديل خدمات مقصود. |
POST /services/acme/genprivatekey | توليد وإرجاع مفتاح حساب جديد بشكل مقصود. ليس هذا المتبقي. |
POST /diag/cmd/php / POST /diag/cmd/shell | وحدة تحكم إدارية مقصودة. سطح منفصل. البائع يعتبر Diagnostics: Command مقصوداً (CVE-2025-69691 متنازع عليه). |
GET /system/certificates/{refid}/export-key | متبقٍ منفصل: تصدير مفتاح مخصص على مدير الشهادات. ACME ليس لديه عملية تصدير مكافئة. |
GET /services/acme/validmethods | كتالوج الطرق. لا مفاتيح. |
CE jaredhendrickson/pfsense-api | منتج مختلف. |
ثبّتت Netgate/pfsense-api العام b4acd7ca بعد موجة CE 2.9.0-DEVELOPMENT. هذه الشجرة هي OpenAPI 3.0.3 (pfapi_openapi.yml، 486 مساراً، 755 عملية) بالإضافة إلى عميل Python مُولّد لوحدة تحكم Plus MIM على :8443. لا وسوم. آخر التزام عام في يوم استنساخي كان 2026-05-25، "Add Snort-3 API definitions."
اثنتا عشرة عملية بحث عبر login/JWT، والتشخيصات، وتسجيل MIM، وTLS العميل، والمستخدمين/الشهادات، والحزم، وVPN/الجدار الناري، وأمان OpenAPI، وIDOR الجهاز، وgit/البرامج الثابتة/التغذيات، بالإضافة إلى محاكاة loopback لكل عملية مُولّدة.
قائمة التجاهل أولاً: الخمسة المتبقية من CE التي أُرسلت بالفعل (QinQ parent-if، معالج OpenVPN CRLF، CARP VHID، رقم limiter، لافتة تسجيل دخول IPsec). حزمة CE REST من طرف ثالث. Diagnostics PHP/shell كـ RCE غير منشور. غياب securitySchemes كدليل مُثبت على عدم المصادقة. POST /system/firmware ليس لديه URL. Ping/DNS/traceroute هي التشخيص.
قرأت GET /services/acme. $ref للاستجابة 200 هو ACMEConfig. التنقل عبر الخصائص يصل إلى account_key، وprivateKey، وcustom_key، وcredentials مع format: byte على حقول المفاتيح. العميل المُولّد get_acme_config.py يستدعي GET /services/acme ويحلل ACMEConfig.
منعطفات خاطئة: اعتبار POST /services/acme/genprivatekey هو المتبقي (ذلك التوليد هو الميزة)؛ اعتبار غياب securitySchemes دليلاً مُثبتاً على عدم المصادقة (الأمثلة لا تزال ترسل Bearer)؛ الادعاء بأن دوراً غير خارق يتلقى فعلاً المفاتيح على Plus.
مسرحية: صندوق Plus حي. الأوراكل هو المخطط المنشور بالإضافة إلى محاكاة loopback 200.
pfapi_openapi.yml GET /services/acme:
/services/acme:
get:
tags:
- services
summary: Get ACME Config
operationId: GetACMEConfig
responses:
'200':
content:
application/json:
schema:
$ref: '#/components/schemas/ACMEConfig'
ACMEAccountKey.account_key: