
إعادة كتابة CLI لـ Drupalgeddon2 (CVE-2018-7600) PoC — للاختبار/التعليم المصرح به
إعادة كتابة سطر أوامر لإثبات المفهوم Drupalgeddon2 (CVE-2018-7600)، تم بناؤها كتمرين دراسي أثناء العمل على وحدة Attacking Common Applications من Hack The Box Academy.
[!WARNING] للاستخدام المصرح به في اختبارات الأمان والتعليم فقط. تشغيل هذا ضد أنظمة لا تملكها أو ليس لديك إذن كتابي صريح لاختبارها غير قانوني في معظم الدول. انظر الاستخدام القانوني والمسؤول.
[!NOTE] تمت كتابة التنفيذ بمساعدة الذكاء الاصطناعي. انظر ملاحظة حول التأليف.
Drupal هي واحدة من "التطبيقات الشائعة" التي تغطيها وحدة Attacking Common Applications من HTB Academy، و CVE-2018-7600 ("Drupalgeddon2") هو المثال الأساسي لـ RCE غير المصادق عليها. بدلاً من نسخ ولصق سكربت لمرة واحدة والانتقال، أردت أن أفهم فعليًا حقن Form API الذي يجعل الثغرة تعمل — لذلك أعدت بناء الإثبات العام من الصفر كتمرين تعليمي.
الأصل الذي يُشار إليه على نطاق واسع، a2u/CVE-2018-7600 لـ Vitalii Rudnykh، رائع لـ إظهار الثغرة، لكنه يتوقع منك تعديل الحمولة في المكان لكل تشغيل. في سير عمل مختبر/CTF — إعادة التشغيل ضد أهداف مختلفة، الرغبة في موطئ قدم قابل للتكرار — يصبح ذلك مملاً. هذا الإصدار يحولها إلى أداة CLI مناسبة بدلاً من ذلك:
cmd= مفتوحًا خلفكمصمم عن قصد لـ ثغرة معروفة ومصححة منذ زمن طويل (تم الإعلان عنها في 2018). الهدف كان فهم التقنية وإنتاج مرجع تنفيذ نظيف وموثق — لا قدرة هجومية جديدة.
الكود في هذا المستودع تمت كتابته بـ مساعدة الذكاء الاصطناعي (Anthropic's Claude) أثناء عملي على وحدة HTB. أنا من وضعت أهداف التصميم والمتطلبات — بيئة CLI، النشر التلقائي للغلاف، الوضع التفاعلي، عشوائية اسم الغلاف والمعامل — وراجعت واختبرت النتيجة. أعلن عن ذلك لأنه الشيء الصادق، ولأن القيمة هنا تكمن في الفهم والقرارات الهندسية وليس تأليف كل سطر.
--cmd، أو الدخول إلى شبه-شيل تفاعلي باستخدام --shell.CVE-2018-7600 تؤثر على:
هذا التنفيذ يستهدف متجه Form API لـ Drupal 8 (نقطة نهاية AJAX user/register). Drupal 7 يمكن استغلاله من خلال نقطة نهاية/حمولة مختلفة و لا يتم التعامل معه هنا.
الإصدارات المصححة (7.58 / 8.5.1 وما بعدها) غير متأثرة.
requestspip install requests
# أمر لمرة واحدة
python3 drupalgeddon2.py -u http://target/ -c id
# شبه-شيل تفاعلي
python3 drupalgeddon2.py -u http://target/ --shell
# فقط زرع الغلاف، لا تشغيل شيء
python3 drupalgeddon2.py -u http://target/ --deploy-only
# التوجيه عبر Burp، تجاهل شهادة الوكيل الذاتية التوقيع
python3 drupalgeddon2.py -u http://target/ -c id --proxy http://127.0.0.1:8080 -k
CVE-2018-7600 هو فشل في تنقية المدخلات في Form API لـ Drupal. Drupal يمثل النماذج كمصفوفات قابلة للتقديم متداخلة، والمفاتيح التي تبدأ بـ # تعامل كخصائص تقديم خاصة وليست بيانات مستخدم. التصحيح (SA-CORE-2018-002) أضاف تنقية لإزالة هذه المفاتيح المسبوقة بـ # من المدخلات المقدمة من المستخدم.
قبل التصحيح، يمكن لمهاجم غير مصادق عليه حقن خصائص تقديم في عنصر نموذج يتم معالجته بواسطة معالج AJAX الخاص بـ Drupal. تقديم خصائص مثل:
#post_render — قائمة من الدوال القابلة للاستدعاء التي يستدعيها Drupal بعد التقديم، و#markup — الوسيطة الممررة إليهاضد عنصر mail في نموذج تسجيل المستخدم يجعل Drupal يستدعي دالة PHP عشوائية (هنا exec) مع مدخلات يتحكم بها المهاجم خلال خطوة التقديم — أي تنفيذ كود عن بعد، دون الحاجة للمصادقة.
هذا الإثبات يستخدم تلك الأساسية لترميز سطر واحد من غلاف PHP بصيغة base64 محليًا، ويجعل الخادم يفك الترميز إلى ملف في جذر الويب، ثم يتفاعل مع ذلك الملف عبر طلبات GET عادية.
إذا كنت في جانب الدفاع:
الإصلاح
أفكار للكشف
#post_render، #markup، #type، #lazy_builder، إلخ. طلبات النموذج المشروعة لا تحتوي على هذه.…/user/register?element_parents=…&_wrapper_format=drupal_ajax التي تحمل معاملات مشبوهة..php تم إنشاؤه حديثًا في جذر الويب.system($_GET[...])).تُنشر هذه الأداة لـ التعليم و اختبارات الأمان المصرح بها — بيئات مختبرك الخاصة، أهداف HTB/CTF، أو الأنظمة التي لديك إذن كتابي صريح لاختبارها. الوصول غير المصرح به إلى أنظمة الكمبيوتر هو جريمة بموجب قوانين مثل قانون إساءة استخدام الكمبيوتر البريطاني 1990، قانون الاحتيال وإساءة استخدام الكمبيوتر الأمريكي، وما يعادلها في أماكن أخرى. أنت وحدك المسؤول عن كيفية استخدامها. المؤلف لا يتحمل أي مسؤولية عن سوء الاستخدام أو أي ضرر ناتج.
MIT
| العلم | الوصف |
|---|
-u, --url | (مطلوب) رابط القاعدة للهدف، مثلاً http://target/ |
-c, --cmd | أمر واحد لتشغيله على الهدف |
--shell | الدخول إلى شبه-شيل تفاعلي |
--deploy-only | فقط زرع غلاف الويب، لا تشغيل شيء |
--shell-name | اسم ملف الغلاف المزروع (الافتراضي: .php عشوائي) |
--param | اسم معامل GET للغلاف (الافتراضي: md5 عشوائي) |
--proxy | رابط الوكيل، مثلاً http://127.0.0.1:8080 |
-k, --insecure | تعطيل التحقق من TLS (لشهادات الوكيل الذاتية) |
--timeout | مهلة لكل طلب بالثواني (الافتراضي: 15) |