Vulnerabilità LOG4J
Un progetto basato su Java che mostra come sfruttare la vulnerabilità CVE-2021-44228.
https://user-images.githubusercontent.com/13152452/147803050-458593e9-4b54-4e1f-ba07-802866b9b43e.mp4
Requisiti
- Un sistema operativo basato su Linux: io ho usato Ubuntu Desktop 20.10 64 bit
- OpenJDK 17.0.1: per compilare il programma di sfruttamento. Anche versioni più recenti potrebbero funzionare.
- Oracle Java Development Kit (JDK) 1.8.0_181: è essenziale per far funzionare lo sfruttamento. Non è necessario installarlo, ma il progetto lo richiede estratto nella directory principale. Il JDK si può trovare nella pagina Oracle Java SE 8 Archive Downloads (JDK 8u202 e versioni precedenti).
- Apache Maven 3.6.3: per gestire le dipendenze e generare i file jar. Anche versioni successive potrebbero funzionare.
- Docker 20.10.12: per gestire il container che contiene il servizio da sfruttare. Anche versioni successive potrebbero funzionare.
- Docker-compose 1.29.2: per aiutare a orchestrare la generazione dell'immagine e la creazione, l'esecuzione e la rimozione del container. Anche versioni successive potrebbero funzionare.
- GNU Make 4.3: questo progetto usa un Makefile per aiutare a verificare e generare i file obbligatori. Anche versioni successive potrebbero funzionare.
- OpenBSD Netcat (noto anche come nc): per creare la comunicazione con il server invaso. Questo pacchetto può essere installato tramite il gestore di pacchetti della tua distribuzione Linux (come apt).
- (Consigliato) IntelliJ IDEA Community Edition 2021.3.1: se vuoi controllare cosa c'è sotto il cofano di questi progetti, ti consiglio di installare questo IDE. Anche in questo caso, versioni successive potrebbero funzionare.
Esecuzione
- Clona questo repository sulla tua macchina locale.
- Scarica la pagina Oracle Java SE 8 Archive Downloads (JDK 8u202 e versioni precedenti) ed estraila nella directory principale del progetto. Tienila nella directory
jdk1.8.0_181 creata durante l'estrazione.
- Esegui
make all per compilare tutti i progetti e creare un'immagine Docker con il servizio vulnerabile.
- Apri tre terminali ed esegui i seguenti comandi:
- Primo terminale:
make start-vulnerable-service per avviare un container Docker che esegue il servizio da sfruttare. Il servizio sarà accessibile attraverso la porta 8080 della macchina locale
- Secondo terminale:
make start-nc per avviare un listener TCP che attenderà che venga stabilita la connessione con il server invaso.
- Terzo terminale:
make start-exploiter per avviare il programma che ci aiuterà a sfruttare la vulnerabilità.
- Dopo aver avviato il terzo terminale, il programma exploiter mostrerà un URL a cui accedere. Incollalo nel tuo browser per iniziare lo sfruttamento.
- Se tutto è andato come previsto, il browser non riceverà una risposta e rimarrà bloccato in uno stato di caricamento.
- Ora controlla il secondo terminale (quello in cui è stato eseguito
make start-nc). Potresti aver ricevuto un messaggio come Connection received on 172.24.0.2 46638 (l'indirizzo IP e la porta TCP potrebbero non essere gli stessi mostrati qui). Questo significa che lo sfruttamento ha funzionato e ora abbiamo una shell collegata al server/container Docker.
- Per essere sicuro che tutto sia avvenuto come previsto, prova a eseguire un comando
whoami. Potresti ricevere root come output.
- Ora prova a eseguire
cat ../private-directory/my-secret-file.txt per vedere cosa succede. 🙂
- Quando hai finito di fare danni sul server, premi
CTRL+C per chiudere la connessione.
- Puoi anche premere
CTRL+C negli altri terminali per interrompere i processi.
Come funziona?
Prima di rispondere, diamo un'occhiata ai processi creati durante il flusso.

Container Docker
Questo container Docker servirà un semplice servizio HTTP responsabile di ricevere richieste GET sul percorso /log con un parametro input. Una volta ricevuto, registra l'input sulla console.
https://user-images.githubusercontent.com/13152452/147826880-8ee10391-bcb7-46d3-8d69-2f7ddb4a7b37.mp4
Per sfruttare la vulnerabilità, sono necessarie alcune configurazioni specifiche:
- La versione dell'ambiente di runtime Java (JRE) utilizzata per eseguire il servizio è
1.8.0_181. Ciò è necessario per consentire il caricamento di una classe Java da un servizio esterno.
- Le dipendenze del progetto Java devono essere pesantemente modificate per sostituire il
spring-boot-starter-logging:2.6.1 predefinito con spring-boot-starter-log4j2:2.6.1. Quest'ultimo porta log4j-core:2.14.1 nel progetto, che è una versione vulnerabile a CVE-2021-44228.

- Il file Jar del servizio è stato creato con il compilatore Java versione
1.8.0_181.
Programma Netcat (nc)
Non ci sono grandi spiegazioni o modifiche qui. È un semplice programma usato per leggere e scrivere dati attraverso i protocolli TCP e UDP. Lo useremo per rimanere in ascolto di connessioni TCP in arrivo sulla porta 9001 (qualcos'altro aprirà questa connessione per noi lato server. 😉).
Una volta stabilita la connessione, tutti i dati in arrivo verranno mostrati sulla console. Inoltre, tutto l'input scritto verrà inviato attraverso questa connessione.
Exploiter
Ed è qui che il divertimento ha inizio!
Questo programma racchiude diversi passaggi necessari per sfruttare la vulnerabilità. Analizziamolo:
Argomenti di esecuzione
Per eseguire questo programma, dobbiamo fornire tre parametri:
- Indirizzo IP/host del server HTTP e di Netcat: per sfruttare la vulnerabilità, avremo bisogno dell'indirizzo IP del server HTTP relativo al servizio vulnerabile, così la nostra risposta LDAP potrà reindirizzarlo a scaricare la classe Java compilata attraverso di esso. Sarà usato anche dalla classe Java stessa per aprire una connessione TCP con Netcat (spiegato sopra).
- Porta del server HTTP: la porta su cui il server HTTP responsabile dell'invio della classe Java compilata accetterà le connessioni. Verrà anche inviata con la risposta LDAP per comunicare la porta da cui verrà scaricata la classe Java compilata.
- Porta di Netcat: la porta su cui Netcat è in ascolto per le connessioni. Sarà usata dalla classe Java compilata per aprire una connessione TCP con Netcat.
Classe Java Exploit
Una volta avviato il programma, scriverà un codice Java basato su un template. Questo template richiede due argomenti: l'indirizzo IP e la porta di Netcat.
Una volta scritto il codice, il programma lo compilerà in un file di classe binario usando il compilatore Java (javac) versione 1.8.0_181. Questo è importante per mantenere la stessa versione del codice del servizio sfruttato.