Java Log4j Zafiyeti İçin Tespit ve Tedbir Yöntemleri
Merhaba, bu makalenin konusu Dünya’yı kasıp kavuran etkisi ve yıkıcılığı uzun sürecek gibi görünen Log4j zafiyeti. Son bir kaç gündür gündemin birinci maddesi haline gelen zafiyet için sosyal medya ve diğer platformlardan onlarca paylaşım yapıldı ve yapılmaya devam ediyor. Ayrıca ardı ardına bir çok üretici zafiyetten etkilenen ürünleri için güncelleme ve saldırının şiddetini azaltmak için mitigate yöntemleri yayınlamakta. Bu makalede tüm bu paylaşımların bir derlemesini bulabilecek ve bu zafiyet için kendi sistemlerininiz üzerinde nasıl bir aksyion alabileceğiniz konusunda fikir sahibi olabileceksiniz.
Hadi başlayalım..
Zafiyet neden kaynaklanıyor?
Zafiyet, Apache’in geliştirdiği ve loglama için kullanılan Log4j kütüphanesinde bulunuyor.
Hangi sürümlerde zafiyet bulunmakta?
2.0-beta9 ile 2.14.1 ( dahil ) arasındaki sürümler bu zafiyetten etkileniyor.
Hangi sürüme yükseltmek gerek?
Sistemlerim zafiyetten etkilendi mi?
Öncelikle bu gün Hakan UZUNER ve Gökhan YÜCELER Hocam beraberindeki kıymetli ekipi Arda BÜYÜKKAYA ve OZAN ÜNAL hocalarımın düzenlediği “Log4j RCE (Log4Shell) Exploit Etme teknikleri ve Exploit Sistem Üzerinde Nasıl Yakalanır?” webcast’i kesinlikle izlemenizi tavsiye ediyorum.
SIEM üzerinde, aşağıdaki sorgular ile sisteminizi sorgulayın ( web sunucular )
Azure Sentinel
Webserver | where ((((c-useragent contains 'jndi') and (c-useragent contains 'ldap' or c-useragent contains 'rmi' or c-useragent contains 'ldaps' or c-useragent contains 'dns' or c-useragent contains 'lower' or c-useragent contains 'upper')) or ((c-uri contains 'jndi') and (c-uri contains 'ldap' or c-uri contains 'rmi' or c-uri contains 'ldaps' or c-uri contains 'dns' or c-uri contains 'lower' or c-uri contains 'upper'))) or ((post-body contains 'jndi') and (post-body contains 'ldap' or post-body contains 'rmi' or post-body contains 'ldaps' or post-body contains 'dns' or post-body contains 'lower' or post-body contains 'upper')))
IBM QRadar
SELECT UTF8(payload) from events where ((("user_agent" ilike '%jndi%') and ("user_agent" ilike '%ldap%' or "user_agent" ilike '%rmi%' or "user_agent" ilike '%ldaps%' or "user_agent" ilike '%dns%' or "user_agent" ilike '%lower%' or "user_agent" ilike '%upper%')) or (("URL" ilike '%jndi%') and ("URL" ilike '%ldap%' or "URL" ilike '%rmi%' or "URL" ilike '%ldaps%' or "URL" ilike '%dns%' or "URL" ilike '%lower%' or "URL" ilike '%upper%'))) or (("post-body" ilike '%jndi%') and ("post-body" ilike '%ldap%' or "post-body" ilike '%rmi%' or "post-body" ilike '%ldaps%' or "post-body" ilike '%dns%' or "post-body" ilike '%lower%' or "post-body" ilike '%upper%'))
Splunk
((((c-useragent="*jndi*") (c-useragent="*ldap*" OR c-useragent="*rmi*" OR c-useragent="*ldaps*" OR c-useragent="*dns*" OR c-useragent="*lower*" OR c-useragent="*upper*")) OR ((c-uri="*jndi*") (c-uri="*ldap*" OR c-uri="*rmi*" OR c-uri="*ldaps*" OR c-uri="*dns*" OR c-uri="*lower*" OR c-uri="*upper*"))) OR ((post-body="*jndi*") (post-body="*ldap*" OR post-body="*rmi*" OR post-body="*ldaps*" OR post-body="*dns*" OR post-body="*lower*" OR post-body="*upper*")))
Elastic Stack
(((user_agent.original:*jndi* AND user_agent.original:(*ldap* OR *rmi* OR *ldaps* OR *dns* OR *lower* OR *upper*)) OR (url.original:*jndi* AND url.original:(*ldap* OR *rmi* OR *ldaps* OR *dns* OR *lower* OR *upper*))) OR (post-body:*jndi* AND post-body:(*ldap* OR *rmi* OR *ldaps* OR *dns* OR *lower* OR *upper*)))
Regex
grep -P '^(?:.*(?:.*(?:.*(?:.*(?:.*(?=.*(?:.*.*jndi.*))(?=.*(?:.*.*ldap.*|.*.*rmi.*|.*.*ldaps.*|.*.*dns.*|.*.*lower.*|.*.*upper.*)))|.*(?:.*(?=.*(?:.*.*jndi.*))(?=.*(?:.*.*ldap.*|.*.*rmi.*|.*.*ldaps.*|.*.*dns.*|.*.*lower.*|.*.*upper.*)))))|.*(?:.*(?=.*(?:.*.*jndi.*))(?=.*(?:.*.*ldap.*|.*.*rmi.*|.*.*ldaps.*|.*.*dns.*|.*.*lower.*|.*.*upper.*)))))'
SIEM üzerinde, aşağıdaki sorgular ile sisteminizi sorgulayın ( Proxy sunucular )
Azure Sentinel
Proxy | where ((((c-useragent contains 'jndi') and (c-useragent contains 'ldap' or c-useragent contains 'rmi' or c-useragent contains 'ldaps' or c-useragent contains 'dns' or c-useragent contains 'lower' or c-useragent contains 'upper')) or ((c-uri contains 'jndi') and (c-uri contains 'ldap' or c-uri contains 'rmi' or c-uri contains 'ldaps' or c-uri contains 'dns' or c-uri contains 'lower' or c-uri contains 'upper'))) or ((post-body contains 'jndi') and (post-body contains 'ldap' or post-body contains 'rmi' or post-body contains 'ldaps' or post-body contains 'dns' or post-body contains 'lower' or post-body contains 'upper')))
IBM QRadar
SELECT UTF8(payload) from events where ((("user_agent" ilike '%jndi%') and ("user_agent" ilike '%ldap%' or "user_agent" ilike '%rmi%' or "user_agent" ilike '%ldaps%' or "user_agent" ilike '%dns%' or "user_agent" ilike '%lower%' or "user_agent" ilike '%upper%')) or (("URL" ilike '%jndi%') and ("URL" ilike '%ldap%' or "URL" ilike '%rmi%' or "URL" ilike '%ldaps%' or "URL" ilike '%dns%' or "URL" ilike '%lower%' or "URL" ilike '%upper%'))) or (("post-body" ilike '%jndi%') and ("post-body" ilike '%ldap%' or "post-body" ilike '%rmi%' or "post-body" ilike '%ldaps%' or "post-body" ilike '%dns%' or "post-body" ilike '%lower%' or "post-body" ilike '%upper%'))
Splunk
((((c-useragent="*jndi*") (c-useragent="*ldap*" OR c-useragent="*rmi*" OR c-useragent="*ldaps*" OR c-useragent="*dns*" OR c-useragent="*lower*" OR c-useragent="*upper*")) OR ((c-uri="*jndi*") (c-uri="*ldap*" OR c-uri="*rmi*" OR c-uri="*ldaps*" OR c-uri="*dns*" OR c-uri="*lower*" OR c-uri="*upper*"))) OR ((post-body="*jndi*") (post-body="*ldap*" OR post-body="*rmi*" OR post-body="*ldaps*" OR post-body="*dns*" OR post-body="*lower*" OR post-body="*upper*")))
Elastic Stack
(((user_agent.original:*jndi* AND user_agent.original:(*ldap* OR *rmi* OR *ldaps* OR *dns* OR *lower* OR *upper*)) OR (url.original:*jndi* AND url.original:(*ldap* OR *rmi* OR *ldaps* OR *dns* OR *lower* OR *upper*))) OR (post-body:*jndi* AND post-body:(*ldap* OR *rmi* OR *ldaps* OR *dns* OR *lower* OR *upper*)))
Regex
grep -P '^(?:.*(?:.*(?:.*(?:.*(?:.*(?=.*(?:.*.*jndi.*))(?=.*(?:.*.*ldap.*|.*.*rmi.*|.*.*ldaps.*|.*.*dns.*|.*.*lower.*|.*.*upper.*)))|.*(?:.*(?=.*(?:.*.*jndi.*))(?=.*(?:.*.*ldap.*|.*.*rmi.*|.*.*ldaps.*|.*.*dns.*|.*.*lower.*|.*.*upper.*)))))|.*(?:.*(?=.*(?:.*.*jndi.*))(?=.*(?:.*.*ldap.*|.*.*rmi.*|.*.*ldaps.*|.*.*dns.*|.*.*lower.*|.*.*upper.*)))))'
Linux tabanlı bilgisayarda log4j analizi ( sıkıştırılmamış dosyalar için )
sudo egrep -I -i -r '\$(\{|%7B)jndi:(ldap[s]?|rmi|dns|nis|iiop|corba|nds|http):/[^\n]+' /var/log
Linux tabanlı bilgisayarda log4j analizi ( sıkıştırılmış dosyalar için )
sudo find /var/log -name \*.gz -print0 | xargs -0 zgrep -E -i '\$(\{|%7B)jndi:(ldap[s]?|rmi|dns|nis|iiop|corba|nds|http):/[^\n]+'
Windows tabanlı bilgisayarda log4j analizi
gci 'C:\' -rec -force -include *.jar -ea 0 | foreach {select-string "JndiLookup.class" $_} | select -exp Path
open source suricata için alarm kuralları
https://rules.emergingthreatspro.com/open/suricata-5.0/rules/emerging-exploit.rules
YARA
https://github.com/Neo23x0/signature-base/blob/master/yara/expl_log4j_cve_2021_44228.yar
Üreticiler
VMware vCenter
https://kb.vmware.com/s/article/87081
Commvault
https://documentation.commvault.com/v11/essential/146231_security_vulnerability_and_reporting.html
Palo Alto
https://security.paloaltonetworks.com/CVE-2021-44228
Güncel vendor listesi
https://github.com/NCSC-NL/log4shell/blob/main/software/README.md#g
Aktif tarama ip listesi
https://raw.githubusercontent.com/CriticalPathSecurity/Public-Intelligence-Feeds/master/log4j.txt
Mitigate yöntemleri nelerdir?
- log4j2.formatMsgNoLookups=true olarak ayarlayın
- JndiLookup class’ın classpath’den kaldırılması
- Kubernetes için LOG4J_FORMAT_MSG_NO_LOOKUPS=”true”
- Java Virtual Machine starup ayarlarının “Dlog4j2.formatMsgNoLookups=true” olarak set edilmesi
Web sayfaların’da zafiyet kontrolü yapmak
Yukarda bahsettiğim “Log4j RCE (Log4Shell) Exploit Etme teknikleri ve Exploit Sistem Üzerinde Nasıl Yakalanır?” web cast’inde Gökhan YÜCELER hocam ve değerli ekibinin verdiği bilgiler ışığında aşağıdaki adımları izleyerek web uygulamalarınızın etkilenip etkilenmediği hakkında fikir sahibi olabilirsiniz.
ilk önce “http://www.dnslog.cn/” sayfasına gidiyorsunuz. Bu sayfa online dns hizmeti veriyor.
Öncelikle “Get subDomain” butonuna tıklarayak bir dns adresi elde ediyorsunuz.
Son olarak sisteminlerinizi mümkün olduğu en kısa sürede güncellemenizi tavsiye ediyoruz.
Kaynaklar:
https://github.com/Neo23x0
https://raw.githubusercontent.com
socprime.com
Güncel bilgiler buradan yayınlanmaya devam edecektir..
Elde edilen domain ile test edilen sanırım farklı olmuş.
Merhaba, farklı değil hocam ip ler linkedin.com’a ait
Eline sağlık.
Rica ederim hocam, saygılar.