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

# 🟩 File

🧠Dificultad: Fácil | 🔓14/06/2026

## 🕵️ Reconocimiento

Comenzamos con un escaneo de puertos con `nmap`:

{% code overflow="wrap" %}

```bash
nmap -sC -sV -Pn $IPTARGET -oN nmap.txt
```

{% endcode %}

<figure><img src="https://3832202623-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FhaHYQaFsZAHOyVtSUS1x%2Fuploads%2FAFuypM8cKW6kDkXgYMyG%2Fimage.png?alt=media&amp;token=02729a3e-e44b-45e0-9281-99184a73043f" alt=""><figcaption></figcaption></figure>

Tenemos servicios FTP y HTTP en los puertos estándar. Realizamos un escaneo de directorios con `ffuf` sobre el servicio web:

{% code overflow="wrap" %}

```bash
ffuf -w /usr/share/wordlists/SecLists-2025.2/Discovery/Web-Content/directory-list-2.3-medium.txt:FUZZ -u "http://$IPTARGET/FUZZ" -e .html,.php,.txt,.xml,.js
```

{% endcode %}

<figure><img src="https://3832202623-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FhaHYQaFsZAHOyVtSUS1x%2Fuploads%2FBEsynklbeD7nOLU3WHMO%2Fimage.png?alt=media&amp;token=843c23a6-9906-400a-b1aa-b5fd82768f49" alt=""><figcaption></figcaption></figure>

Si accedemos al recurso `file_upload.php` en un navegador, vemos lo siguiente:

<div align="center"><figure><img src="https://3832202623-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FhaHYQaFsZAHOyVtSUS1x%2Fuploads%2FPfQ7oUvi2ELSVmUHNm2C%2Fimage.png?alt=media&amp;token=ad0eab2c-4169-486c-b4f2-1bf19174b62f" alt=""><figcaption></figcaption></figure></div>

Si accedemos al código HTML servido por esta página, vemos que el botón de subir archivo hace un POST al endpoint `subir_archivo.php`.

<figure><img src="https://3832202623-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FhaHYQaFsZAHOyVtSUS1x%2Fuploads%2FWnI4SdFpRctUK3UFc4My%2Fimage.png?alt=media&amp;token=ac842498-6910-4e21-99f0-3b905e65e43a" alt=""><figcaption></figcaption></figure>

Solo con lo que hemos obtenido, pinta que los ficheros se almacenan en el directorio `/uploads` que hemos descubierto en el escaneo de directorios. Intentando subir un fichero `.php`, vemos que nos da un error al subir el archivo:

<figure><img src="https://3832202623-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FhaHYQaFsZAHOyVtSUS1x%2Fuploads%2FzLLQqJRo31N80tiQAoTZ%2Fimage.png?alt=media&amp;token=23e53549-1c01-4acb-8b52-066f9e39a4b0" alt=""><figcaption></figcaption></figure>

Probando extensiones con el intruder de burpsuite y la wordlist `extensions-most-common.fuzz.txt` de SecLists, vemos que podemos subir un fichero `.phar`:

<figure><img src="https://3832202623-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FhaHYQaFsZAHOyVtSUS1x%2Fuploads%2F3QY8Cdo4L9LtnVTkTnjc%2Fimage.png?alt=media&amp;token=dbb7c7fc-2e21-4097-b1f3-46250083fb16" alt=""><figcaption></figcaption></figure>

Vemos el fichero que hemos subido en el fuzzing en el directorio `uploads`:

<figure><img src="https://3832202623-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FhaHYQaFsZAHOyVtSUS1x%2Fuploads%2FbwzaqXpoRDfwZ7JaAfBs%2Fimage.png?alt=media&amp;token=fd3adbe8-4dbc-4159-bf85-09035ecd44e6" alt=""><figcaption></figcaption></figure>

## 🚪 Ganando acceso

Ejecutamos el fichero `.phar` que hemos subido, ya que se trataba de una reverse shell en PHP y `.phar` es un formato de empaquetado de PHP, por lo que permitirá la ejecución del código que subimos.

Si nos ponemos a la escucha en nuestra máquina, obtenemos acceso a la máquina con el usuario `www-data`:

<figure><img src="https://3832202623-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FhaHYQaFsZAHOyVtSUS1x%2Fuploads%2FExFcwaxPCDVgAp9BkIM3%2Fimage.png?alt=media&amp;token=0c1d40fd-3c76-4c7b-b3c6-3dc6c5aee8c4" alt=""><figcaption></figcaption></figure>

## 💥 Escalada de privilegios

Enumeramos los usuarios que contiene la máquina:

<figure><img src="https://3832202623-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FhaHYQaFsZAHOyVtSUS1x%2Fuploads%2FU0BgJ89hxEuM2InBNZS7%2Fimage.png?alt=media&amp;token=b6ac0dfc-f117-40e6-aa86-ca6d22897701" alt=""><figcaption></figcaption></figure>

Como la máquina no tiene abierto el puerto SSH, podemos hacer fuerza bruta con su mediante un script que se encuentra en el siguiente [repositorio](https://github.com/carlospolop/su-bruteforce). Utilizamos también la wordlist que viene en el repositorio (`top12000.txt`).

Con el usuario `fernando`, tenemos un acierto con la contraseña `chocolate`:

<figure><img src="https://3832202623-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FhaHYQaFsZAHOyVtSUS1x%2Fuploads%2FU6I2yxOj6fDaBfOZn8YB%2Fimage.png?alt=media&amp;token=62b419f0-f779-4ad3-8246-15458ec3ec51" alt=""><figcaption></figcaption></figure>

<figure><img src="https://3832202623-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FhaHYQaFsZAHOyVtSUS1x%2Fuploads%2FAcLUGsjniaU2y0dxrmtF%2Fimage.png?alt=media&amp;token=dd644964-6c62-4b63-8a9e-d4421208a730" alt=""><figcaption></figcaption></figure>

Una vez dentro como `fernando`, vemos que en su directorio personal hay una imagen. Iniciamos un python server y nos la llevamos a nuestra máquina.

<figure><img src="https://3832202623-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FhaHYQaFsZAHOyVtSUS1x%2Fuploads%2FcQq0wipj2fuLj2TtFkFj%2Fimage.png?alt=media&amp;token=b35188c8-56b0-437a-b3fa-149c0cfd25bf" alt=""><figcaption></figcaption></figure>

Con `stegseek` hacemos fuerza bruta para probar si contiene un fichero embebido con alguna contraseña.

<figure><img src="https://3832202623-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FhaHYQaFsZAHOyVtSUS1x%2Fuploads%2FVNTXFtFVg1YLyfMP3uIW%2Fimage.png?alt=media&amp;token=9265aad8-1e4e-421d-a14d-b90d12407996" alt=""><figcaption></figcaption></figure>

Había un fichero embebido con la contraseña `secret`. El fichero embebido se llama `pass.txt`, y contiene un hash.

<figure><img src="https://3832202623-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FhaHYQaFsZAHOyVtSUS1x%2Fuploads%2Fpyev9WBCNdzsK0NQ5375%2Fimage.png?alt=media&amp;token=8a1f5352-a4a4-4c3b-8372-342e1a184ffe" alt=""><figcaption></figcaption></figure>

Con `hashid` vemos se trata de un hash SHA-1.

<figure><img src="https://3832202623-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FhaHYQaFsZAHOyVtSUS1x%2Fuploads%2FF061fRp5UvZLHORyWMp1%2Fimage.png?alt=media&amp;token=4091a4bd-7f8e-4ed6-941f-60f3d603e7cf" alt=""><figcaption></figcaption></figure>

Utilizamos `hashcat` con `-m 100` que corresponde a SHA-1 y la wordlist `rockyou.txt`:

{% code overflow="wrap" %}

```bash
hashcat -m 100 cbfdac6008f9cab4083784cbd1874f76618d2a97 /usr/share/wordlists/rockyou.txt
```

{% endcode %}

<figure><img src="https://3832202623-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FhaHYQaFsZAHOyVtSUS1x%2Fuploads%2F3qVceb787Ikld4xRDN30%2Fimage.png?alt=media&amp;token=425fad91-58e0-4565-beb4-87a170383ae8" alt=""><figcaption></figcaption></figure>

Probamos esta contraseña con `mario`:

<figure><img src="https://3832202623-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FhaHYQaFsZAHOyVtSUS1x%2Fuploads%2FT3JIOGIU5bbOW5Ngd1MX%2Fimage.png?alt=media&amp;token=0e7c88d4-d658-4730-b689-02533b0e5bd6" alt=""><figcaption></figcaption></figure>

Revisamos los permisos con `sudo -l` para el usuario `mario`:

<figure><img src="https://3832202623-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FhaHYQaFsZAHOyVtSUS1x%2Fuploads%2Ffdk5rRCyLju9hJeOvurg%2Fimage.png?alt=media&amp;token=48d0b4ff-6cf9-43bb-8dc2-6407b2f5eb26" alt=""><figcaption></figcaption></figure>

Podemos ejecutar el binario `/usr/bin/awk` como el usuario `julen` sin necesidad de introducir su contraseña. En [gtfobins](https://gtfobins.org/gtfobins/awk/) encontramos una forma de aprovechar esta configuración para obtener una shell como `julen`:

<figure><img src="https://3832202623-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FhaHYQaFsZAHOyVtSUS1x%2Fuploads%2F82cSB9pAreG67cBeOsxX%2Fimage.png?alt=media&amp;token=86867d92-5a7e-4fb7-9a34-96d2f370431a" alt=""><figcaption></figcaption></figure>

Ahora revisamos los permisos de sudo para `julen`. Podemos ejecutar `/usr/bin/env` como `iker` sin necesidad de introducir su contraseña. De nuevo, mirando en [gtfobins](https://gtfobins.org/gtfobins/env/) obtenemos una vía para atacar esta configuración y obtener acceso al usuario.

<figure><img src="https://3832202623-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FhaHYQaFsZAHOyVtSUS1x%2Fuploads%2Fy74630Ybz14UVeMY9cB2%2Fimage.png?alt=media&amp;token=df75a4eb-2ea5-41a4-85da-3b768d0c8f9e" alt=""><figcaption></figcaption></figure>

Ahora miramos los permisos con `sudo` para el usuario `iker`. Esta vez, tenemos permisos para ejecutar `/usr/bin/python3 /home/iker/geo_ip.py` como cualquier usuario (lo usaremos para `root`) sin necesidad de introducir contraseña.&#x20;

<figure><img src="https://3832202623-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FhaHYQaFsZAHOyVtSUS1x%2Fuploads%2FhtXcxh1mP3w01jnB7P9Z%2Fimage.png?alt=media&amp;token=22a45a75-58d0-4332-853e-accf17b39eb0" alt=""><figcaption></figcaption></figure>

Vemos el script y observamos que utiliza la libreria `requests`. Podemos aprovecharnos de esto para hacer library hijacking.

<figure><img src="https://3832202623-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FhaHYQaFsZAHOyVtSUS1x%2Fuploads%2FBtg0m119jSoIL7kl4SWK%2Fimage.png?alt=media&amp;token=7bc16b9d-ae82-4c20-b324-8aacd5d9eef7" alt=""><figcaption></figcaption></figure>

Creamos nuestra librerira `requests.py` modificando el método utilizado en el script (`get`) para que ejecute `/bin/bash` y poder obtener una shell como `root`.

<figure><img src="https://3832202623-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FhaHYQaFsZAHOyVtSUS1x%2Fuploads%2F18Wf6Adws9Pp3OqhXmdM%2Fimage.png?alt=media&amp;token=58f6983d-4da2-49bb-9eaf-22359e7c2b2f" alt=""><figcaption></figcaption></figure>

Ahora ejecutamos el script con `sudo` y obtenemos acceso al usuario `root`.

<figure><img src="https://3832202623-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FhaHYQaFsZAHOyVtSUS1x%2Fuploads%2FZX9HiyjstbVvT0gzPL81%2Fimage.png?alt=media&amp;token=e71e564a-6b53-47c6-af67-51434a805239" alt=""><figcaption></figcaption></figure>
