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

# ApiBase

## Identificación

### Escaneo de puertos

Empezamos a escanear los puertos abiertos del servidor con el comando `nmap`.

```bash
sudo nmap -p- -sS -sV -sC --open --min-rate=5000 -n -Pn 172.17.0.2
```

Con el comando `nmap` es el comando de escaneo de redes.\
El parámetro `-p-` indica que se escaneen todos los puertos disponibles.\
El parámetro `-sS` hace que sea un escaneo más sigiloso para no ser detectado.\
El parámetro `-sV` hace que se determine la versión del servicio de cada puerto.\
El parámetro `-sC` hace que nmap ejecute scripts para la recolección de información.\
El parámetro `--open` muestra todos los puertos que estén abiertos.\
El parámetro `--min-rate=5000` establece la tasa mínima de paquetes enviados por segundo, por lo que hace un escaneo más rápido.\
El parámetro `-n` indica que no realice la resolución de nombres DNS, sirve para acelerar el escaneo.\
El parámetro `-Pn` hace que no haga ping antes de escanear.

Da el siguiente resultado:

```
PORT     STATE SERVICE VERSION
22/tcp   open  ssh     OpenSSH 8.4p1 Debian 5+deb11u4 (protocol 2.0)
| ssh-hostkey: 
|   3072 20:ab:09:61:00:7b:cc:18:48:8e:bf:8d:3d:e4:cd:b5 (RSA)
|   256 42:0c:71:44:7c:13:ba:8f:b7:82:35:f2:b3:f7:b9:ff (ECDSA)
|_  256 85:95:6c:96:ac:a1:f0:3e:1e:0d:c1:c8:b0:6f:bb:1d (ED25519)
5000/tcp open  http    Werkzeug httpd 1.0.1 (Python 3.9.2)
|_http-title: Site doesn't have a title (application/json).
|_http-server-header: Werkzeug/1.0.1 Python/3.9.2
MAC Address: 02:42:AC:11:00:02 (Unknown)
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
```

Como se puede observar hay dos puertos:

* Puerto **22** del servicio **OpenSSH 8.4p1** del sistema operativo de **Debian**.
* Puerto **5000** que parece ser **http** de **Werkzeug httpd** de **python**.

Vamos a inspeccionar el servidor http.

## Inspeccionando la API

Al inspeccionar el servidor http podemos ver que parece ser  **una API** ya que sale de la siguiente manera y nos da algúna pista de lo que podemos provar con `/add` y `/users` .

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

### Foozing con /users

Para descubrir posibles directorios hacemos foozing con la herramienta **wfuzz**, para ello ejecutamos el siguiente comando:

```bash
wfuzz -c --hc=404 --hw 169 -t 200 -w /usr/share/wordlists/dirbuster/directory-list-2.3-small.txt -u http://172.17.0.2:5000/users?FUZZ=
```

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

Nos lo apuntamos.

### Descubriendo /add

Cuando navegamos a /add podemos ver que no acepta el metodo GET.

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

Por lo que debemos probar el metodo POST.

Para ello ejeuctamos el comando curl de la sigueinte manera:

```bash
curl -X POST "http://172.17.0.2:5000/add" > add.html
```

Entonces asi redirigo la salida al archivo add.html para que pueda ver el resultado.

En el resultado sale un error, por lo que nos muestra bastante información sobre el codigo del script de la API.

<figure><img src="/files/5MSj36BiqQ7BAAdygVCi" alt=""><figcaption></figcaption></figure>

Ahí como podemos ver, sale el 'username' y si seguímos investigando y encontramos el chivatazo en el que sale una parte importante del script.

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

Entonces ya probamos con el curl enviando los datos que vimos.

```bash
curl -X POST "http://172.17.0.2:5000/add" --data "username=Ciberap&password=1234"
```

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

Y como podemos ver hemos añadido en el archivo users.db correctamente.

### Ver usuario

Al haber añadido ya un usuario podemos ver nuestro usuario con el users?username= que vimos antes, entonces al poner Ciberap que es el usuario que registramos antes, podemos ver nuestras credenciales.

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

## Explotación

Al ver el /users?username que vimos antes y parte del código que vimos antes, solo nos falta probar si **es inyectable a una inyección SQL**, por lo que en la parte de nombre de usuario ponemos el ' or 1=1 — -

<figure><img src="/files/2NZn0w3lNluO3Jn9aUev" alt=""><figcaption></figcaption></figure>

Y en conclusión ya podemos ver todos los usuarios registrados.

## Conexión por SSH

al saber algunos usuarios y contraseñas podemos intentar acceder por SSH por alguno de esos usuarios.

Probamos con el usuario pingu y con su contraseña pudimos acceder.

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

Al entrar probamos varios métodos de intrusión, y encontramos en la carpeta de /home un archivo de registro llamado network.pcap.

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

Por lo que lo podemos verlo con el comano **cat** y así podemos ver que hay unas credenciales:

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

Entonces para preovar esas credenciales nos cambiamos al usuario root con **su root**.

![](/files/dpsJ31nHa9BnreTiMiuh)

Así logramos tener acceso completo al servidor como usuario root.

## Final

En la máquina ApiBase se toca temas como **foozing** y **descubrimiento de API** y su manejo con **curl**.
