
Uno script che verifica la presenza di sistemi Log4j vulnerabili (CVE-2021-44228) iniettando il payload nelle comuni intestazioni HTTP.
Venerdì 10 dicembre 2021 è stata pubblicata una nuova Proof-of-Concept 1 relativa a una vulnerabilità di esecuzione remota di codice (RCE) nella libreria Java 'log4j' 2. Questa vulnerabilità non era stata divulgata preventivamente agli sviluppatori del software. La vulnerabilità è tracciata come CVE-2021-44228 3. Ulteriori informazioni sulla vulnerabilità sono disponibili nella Northwave Threat Response 4.
Northwave ha creato uno script di test che verifica la presenza di sistemi vulnerabili tramite l'iniezione del payload negli header HTTP comuni e come parte di una richiesta HTTP GET. I sistemi vulnerabili vengono rilevati ascoltando le richieste DNS in entrata che contengono un UUID creato specificamente per il target. Ascoltando il DNS in entrata invece di implementare (ad esempio) un server LDAP, aumentiamo la probabilità di rilevare sistemi vulnerabili che hanno un filtro del traffico in uscita. In pratica, il DNS in uscita è spesso consentito. Ci si aspetta un alto tasso di falsi negativi; si prega di leggere l'avvertenza.
Sono coperti i seguenti header HTTP:
X-Api-VersionUser-AgentRefererX-Druid-CommentOriginLocationX-Forwarded-ForCookieX-Requested-WithX-Forwarded-HostAcceptPer ogni iniezione, vengono controllati i seguenti prefissi JNDI:
jndi:rmijndi:ldapjndi:dnsjndi:${lower:l}${lower:d}apSi noti che lo script esegue solo due controlli specifici: header HTTP e richiesta HTTP GET. Ciò causerà falsi negativi nei casi in cui è necessario prendere di mira altri header, campi di input specifici, eccetera per attivare la vulnerabilità. Questo è molto probabile che accada.
IMPORTANTE: nei casi in cui il checker restituisce 'no vulnerability detected', procedere con i controlli del filesystem come descritto nella Northwave Threat Response 4. Eseguire solo questo checker non è sufficiente per determinare se un sistema è vulnerabile o meno.
Per prima cosa, abbiamo bisogno di un sottodominio da usare per ricevere le richieste DNS in entrata. In questo caso usiamo la zona log4jdnsreq.northwave.nl e implementiamo il nostro script su log4jchecker.northwave.nl. Configurare una voce DNS come segue:
log4jdnsreq 3600 IN NS log4jchecker.northwave.nl.
Ora configuriamo un server DNS BIND su un sistema Debian usando apt install bind9 e aggiungiamo quanto segue al file /etc/bind/named.conf.options:
recursion no;
allow-transfer { none; };
Questo disabilita la ricorsione, perché non vogliamo eseguire un server DNS aperto. Configura il logging in /etc/bind/named.conf.local aggiungendo la seguente configurazione:
logging {
channel querylog {
file "/var/log/named/query.log";
severity debug 3;
print-time yes;
};
category queries { querylog;};
};
Non dimenticare di riavviare BIND usando systemctl restart bind9. Verifica che il logging funzioni eseguendo una query DNS per xyz.log4jdnsreq.northwave.nl. Una o più query dovrebbero comparire in /var/log/named/query.log.
È importante verificare che le lookup del nameserver vengano effettivamente registrate. Questo script non può rilevare siti vulnerabili a meno che la configurazione del nameserver non registri le richieste
Metti alla prova il tuo server eseguendo una lookup di test (idealmente da una macchina diversa):
dig test.log4jchecker.northwave.nl
Non dovresti aspettarti una risposta, ma dovresti aspettarti una voce nel file di log (cat /var/log/named/query.log). Questa voce potrebbe essere simile a:
14-Dec-2021 13:36:01.402 client @0x7f8b180a9b30 requester-ip#58755 (test.log4jchecker.northwave.nl): query: test.log4jchecker.northwave.nl IN A -E(0)DC (your-ip)
Non continuare se non vedi una risposta nei log. Senza di essa lo script non rileverà le vulnerabilità.
Installa le dipendenze Python usando pip install -r requirements.txt. Modifica lo script per cambiare la riga seguente con la zona DNS che hai configurato:
HOSTNAME = "log4jdnsreq.northwave.nl"
Ora puoi eseguire lo script fornendo un singolo URL tramite il parametro -u o un elenco di URL tramite il parametro -l:
usage: nw_log4jcheck.py [-h] [-l LIST] [-u URL] [-w WAIT] [-t TIMEOUT]
optional arguments:
-h, --help show this help message and exit
-l LIST, --list LIST A text file with a list of URLs to check (one url per line)
-u URL, --url URL URL to check (for example: http://yoururl.com)
-w WAIT, --wait WAIT Number of seconds to wait before checking DNS logs (default: 15)
-t TIMEOUT, --timeout TIMEOUT
HTTP timeout in seconds to use (default: 5)
L'ultima riga dell'output mostra se il sistema è stato trovato vulnerabile:
NO VULNERABILITY DETECTED. Proceed with on-server checking. No incoming DNS request to 3414db71-309a-4288-83d4-aa3f103db97c.log4jdns.northwave.nl was seen
Nel caso in cui non venga rilevata alcuna vulnerabilità, procedi con i controlli del filesystem come descritto nella Northwave Threat Response 4. Ancora una volta, eseguire solo questo checker non è sufficiente per determinare se un sistema è vulnerabile o meno.
Log4jcheck è un software open-source concesso in licenza secondo la licenza MIT.