
أشياء ممتعة ضد إساءة استخدام الثغرة الأمنية الأخيرة CVE-2021-44228 (Log4Shell) باستخدام خوادم الويب الشائعة.
أدوات ممتعة ضد إساءة استخدام الثغرة الأمنية الحديثة CVE-2021-44228 (Log4Shell) باستخدام خوادم الويب الشائعة.
بناءً على منشور @shipilev (https://gist.github.com/shipilev/92e709a868f3d328b6636e1bfc21cf09) قمت بنقل مثاله إلى Apache2. وقام زميل في العمل بذلك لـ Lighttpd. قررت جعل أمثلتنا عامة للراحة.
هناك أسباب قليلة فقط لوضع السلسلة "jndi:" في رؤوس الطلبات أو وكلاء المستخدم أو في أي مكان آخر. حاليًا، أعرف سببًا واحدًا فقط للقيام بذلك: استغلال CVE-2021-44228. بينما يأمل العالم أن يكون مشغولًا بتصحيح كل تطبيق من إصدارات Log4j الضعيفة، قد يكون من المعقول إبطاء المهاجمين قدر الإمكان. فماذا عن تقديم بعض الجيجابايت من الهراء لهم أثناء محاولتهم استغلال خدماتك؟
مقتطفات الكود التالية لا تحمي أجهزتك وخدماتك من ثغرة Log4Shell 0-Day! يُرجى تحديث البرامج الضعيفة، استخدم log4j2.formatMsgNoLookups=true لتعطيل عمليات بحث jndi أو أوقف تشغيلها حتى يتوفر تصحيح! استخدم هذا فقط على الخوادم التي لا تحتوي على خدمات Log4j! مزيد من المعلومات حول كيفية التخفيف من CVE-2021-44228: https://research.hisolutions.com/log4shell
هذا لن يغطي أيضًا الاستدعاءات المبهمة مثل ${${::-j}${::-n}${::-d}${::-i}:${::-l}${::-d}${::-a}${::-p}://${hostName}.} أو أي شيء آخر يحاول إخفاء جزء "jndi:". نظرًا لعدم وجود حل بسيط لذلك، لن أغطي تقنيات الكشف المتقدمة في هذا الوقت. ما زلت أعتقد أن أغلب الهجمات لن تستخدم هذه، لذا لا يزال بإمكاننا إزعاج معظم صغار المخترقين. :)
على نظام لينكس، أنشئ ملفًا يحتوي على رسالة HTML عشوائية. يُرجى عدم استخدام LOL من المثال أدناه لأنه يسهل على المهاجم تنفيذ مرشح عام لتجنبنا. نحن نستخدم أداة pv لعرض تقدم إنشاء الملف، قد تحتاج إلى تثبيتها عبر مدير الحزم المفضل لديك أو ببساطة تجاهلها.
$ awk 'BEGIN { for(c=0;c<10000000;c++) printf "<p>LOL</p>" }' > 100M.html
$ (for I in `seq 1 100`; do cat 100M.html; done) | pv | gzip -9 > 10G.boomgz
$ rm 100M.html
بافتراض أن خادم الويب الخاص بك يعمل كمستخدم www-data، لننشئ دليلاً مملوكًا لـ www-data حتى لا نضطر لرفع نسخة في كل جذر ويب قد يخدمه خادم الويب:
mkdir /bombs
mv 10G.boomgz /bombs
chown -R www-data:www-data /bombs
الآن للجزء الممتع...
انظر https://gist.github.com/shipilev/92e709a868f3d328b6636e1bfc21cf09
كل الشكر لـ @shipilev
تفعيل الوحدات المطلوبة
a2enmod rewrite headers ratelimit
انتقل إلى /etc/apache2/sites-enabled. افتح كل ملف تكوين مضيف باستخدام محررك المفضل وأدرج مقتطف الكود التالي فوق كل سطر يحتوي على (قد يكون هناك أكثر من واحد):
RewriteEngine On
RewriteCond %{THE_REQUEST} "^.*(\${jndi|\${\${).*$" [OR]
RewriteCond %{QUERY_STRING} "^.*(\${jndi|\${\${).*$" [OR]
RewriteCond %{REQUEST_URI} "^.*(\${jndi|\${\${).*$" [OR]
RewriteCond %{HTTP_COOKIE} "^.*(\${jndi|\${\${).*$" [OR]
RewriteCond %{HTTP_HOST} "^.*(\${jndi|\${\${).*$" [OR]
RewriteCond %{REMOTE_HOST} "^.*(\${jndi|\${\${).*$" [OR]
RewriteCond %{REMOTE_USER} "^.*(\${jndi|\${\${).*$" [OR]
RewriteCond %{HTTP_USER_AGENT} "^.*(\${jndi|\${\${).*$" [OR]
RewriteCond %{HTTP_REFERER} "^.*(\${jndi|\${\${).*$"
RewriteRule . /bombs/10G_lol.boomgz [L]
<Files ~ "\.boomgz$">
Header Set Expires "Sat, 1 Jan 2000 00:00:00 GMT"
Header Set Content-Encoding "gzip"
Header Set Content-Type "text/html"
SetOutputFilter RATE_LIMIT
SetEnv rate-limit 100
</Files>
<Directory /bombs>
allow from allow
Require all granted
</Directory>
قد تتساءل لماذا يوجد الكثير من المتغيرات مقارنة بالمثال الأولي لـ @shipilev. لقد قررت محاولة التقاط أكبر عدد ممكن من المواقع. قد يؤدي هذا إلى تعطيل الخدمات في حالات نادرة جدًا، لذا إذا كنت تريد استخدام المجموعة الأصلية من الفحوصات،只需 قم بتعليق أو حذف الأسطر السبعة الأولى بعد عبارة RewriteEngine On وإزالة أجزاء |\${\${ من الأسطر المتبقية.
يمكنك أيضًا وضع الكود في ملف جديد، مثل /etc/apache2/conf-available/anti-jndi.conf وتضمينه كما يلي:
Include /etc/apache2/conf-available/anti-jndi.conf
الآن احفظ الملف (الملفات) وأعد تحميل تكوين Apache2:
systemctl reload apache2
إذا سار كل شيء على ما يرام، يجب ألا تحصل على رسالة خطأ.
قريبًا
يمكنك التحقق مما إذا كنت قد نجحت عن طريق الاتصال بموقعك المعدل عبر curl (تذكر استبدال your-hostname باسم المضيف الفعلي لإحدى الخدمات التي قمت بتحريرها للتو:
curl -s -L your-hostname -A "\${jndi:testing}" | pv > /dev/null
يجب أن ترى شريط تقدم يظهر سرعة تنزيل تبلغ حوالي 100 كيلوبايت/ثانية. إذا لم تقم بإلغائه، فسيتم الانتهاء بعد بضع دقائق، اعتمادًا على ما استخدمته كسلسلة في ملف HTML الأولي. بالنسبة لي، استغرق الأمر حوالي 5 دقائق. الآن تحقق مما يحدث على جانب العميل:
curl -s --compressed -L your-hostname -A "\${jndi:testing}" | pv > /dev/null
هل ترى كيف لم تعد 100 كيلوبايت/ثانية؟ الضغط يقوم بسحره، إنه بضع غيغابايت على جانب العميل. لذا بعد تنزيل كومة من الهراء لبضع دقائق، يكون لدى المهاجم بضع غيغابايت مخزنة للتحليل. من يعلم؟ :)