
ينفّذ هذا السكربت المكتوب بلغة بايثون استغلالًا لتنفيذ التعليمات البرمجية عن بُعد (RCE) لتطبيقات Laravel المعرّضة للخطر عبر إلغاء التسلسل غير الآمن، استنادًا إلى الثغرة الأمنية CVE-2018-15133.
يستغل هذا الاستغلال ثغرة أمنية في Laravel (الإصدارات 5.5.40 وما قبلها، ومن 5.6.0 حتى 5.6.29) حيث يتم إلغاء تسلسل الجلسات المشفرة تلقائيًا دون تحقق مناسب. وبامتلاك مفتاح APP_KEY الخاص بـ Laravel، يمكن للمهاجم تشفير حمولات خبيثة سيتم إلغاء تسلسلها وتنفيذها على الخادم.
يستخدم Laravel آلية تشفير متماثل للجلسات بثلاثة مكوّنات:
IV (Initialization Vector): متجه تهيئة عشوائي يُولَّد لكل جلسة
Value: القيمة المشفرة باستخدام AES-128-CBC أو AES-256-CBC
MAC: رمز مصادقة الرسالة (HMAC-SHA256) المحسوب على IV + value + APP_KEY
يستقبل ثلاث وسائط إدخال: مفتاح APP_KEY الخاص بـ Laravel بترميز base64، والأمر المراد تنفيذه، والنطاق المستهدف
يستدعي أداة PHPGGC مع سلسلة الأدوات (gadget chain) Laravel/RCE5 لتوليد سلسلة من كائنات PHP الخبيثة
يبني أمر نظام التشغيل الذي سيُنفَّذ على الخادم المستهدف (مثال: system('whoami');)
يولّد الحمولة المسلسَلة بصيغة PHP التي تحتوي على الأدوات (gadgets) المتسلسلة
يفك ترميز الحمولة من base64 إلى صيغة ثنائية
يعالج مفتاح APP_KEY بحذف البادئة "base64:" إن وُجدت
يُكمل الحشو (padding) اللازم ليكون المفتاح بترميز base64 صالحًا
يفك ترميز المفتاح من base64 إلى بايتات
يولّد متجه تهيئة (IV) عشوائيًا من 16 بايت
يشفر الحمولة باستخدام AES في وضع CBC مع المفتاح و IV
يطبّق حشو PKCS7 على الحمولة قبل التشفير
يرمّز IV بترميز base64
يرمّز النص المشفر (الحمولة المشفرة) بترميز base64
يضمّ IV و value بترميز base64 كرسالة لحساب HMAC
يحسب MAC باستخدام HMAC-SHA256 على الرسالة المضمومة مع المفتاح كسرٍّ سري
يبني كائن JSON بثلاثة حقول: iv و value و mac
يرمّز كائن JSON كاملًا بترميز base64
يبني طلب HTTP باستخدام curl مع الحمولة في ملف تعريف الارتباط laravel_session
يرسل الطلب إلى النطاق المستهدف
يستقبل خادم Laravel ملف تعريف الارتباط ويفك ترميز base64
يتحقق Laravel من سلامة MAC مقابل IV و value المستلَمين
يفك Laravel تشفير المحتوى باستخدام AES-CBC مع مفتاح APP_KEY الخاص به
يلغي Laravel تسلسل المحتوى المفكوك تشفيره تلقائيًا
يستدعي PHP الدالتين السحريتين __destruct() أو __wakeup() للكائنات التي أُلغي تسلسلها
تنطلق سلسلة الأدوات (gadget chain) التي تبلغ ذروتها في call_user_func() أو eval()
يُنفَّذ أمر نظام التشغيل على الخادم
يستخدم الاستغلال سلاسل أدوات (gadget chains) تربط استدعاءات الدوال السحرية في PHP:
أثناء إلغاء التسلسل، يستدعي PHP تلقائيًا __destruct() أو __wakeup()، لتبدأ السلسلة التي تبلغ ذروتها في eval() لتنفيذ تعليمات برمجية عشوائية.
المتطلبات الأساسية
لكي يعمل الاستغلال، يحتاج المهاجم إلى:
مفتاح APP_KEY الخاص بـ Laravel (يُحصَّل عبر تسريب متغيرات البيئة، أو حاويات S3 المكشوفة، أو الكود المصدري، إلخ)
إصدار معرّض للخطر من Laravel مع تفعيل إلغاء التسلسل افتراضيًا
PHPGGC مثبّتًا في الدليل ./phpggc/ https://github.com/ambionics/phpggc
مثال على الاستخدام
python exploit.py "base64:dGhpc2lzYXNlY3JldGtleQ==" "whoami" "http://target.htb"
Este comando generará un payload serializado que ejecutará whoami cuando Laravel deserialice la sesión.