FTP (File Transfer Protocol)
El Protocolo de Transferencia de Archivos (FTP) es uno de los protocolos más antiguos de Internet. Se ejecuta dentro de la capa de aplicación de la pila de protocolos TCP/IP, por lo tanto, se encuentra en la misma capa que HTTP o POP. Estos protocolos también funcionan con el apoyo de navegadores o clientes de correo electrónico para realizar sus servicios. También existen programas FTP especiales para el Protocolo de Transferencia de Archivos.
Configuración del servidor (vsftpd.conf)
| Configuración | Descripción |
|---|---|
listen=NO | ¿Ejecutar desde inetd o como un demonio independiente? |
listen_ipv6=YES | ¿Escuchar en IPv6? |
anonymous_enable=NO | ¿Habilitar acceso anónimo? |
local_enable=YES | ¿Permitir que los usuarios locales inicien sesión? |
dirmessage_enable=YES | ¿Mostrar mensajes del directorio activo cuando los usuarios acceden a determinados directorios? |
use_localtime=YES | ¿Usar la hora local? |
xferlog_enable=YES | ¿Activar el registro de cargas/descargas? |
connect_from_port_20=YES | ¿Conectar desde el puerto 20? |
secure_chroot_dir=/var/run/vsftpd/empty | Nombre de un directorio vacío. |
pam_service_name=vsftpd | Nombre del servicio PAM que utilizará vsftpd. |
rsa_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem | Ubicación del certificado RSA que se utilizará para conexiones cifradas SSL. |
rsa_private_key_file=/etc/ssl/private/ssl-cert-snakeoil.key | Ubicación de la clave privada RSA asociada al certificado anterior. |
ssl_enable=NO | ¿Habilitar cifrado SSL/TLS para las conexiones? |
Entornos peligrosos
Hay muchas configuraciones diferentes relacionadas con la seguridad que se pueden realizar en cada servidor FTP. Estas pueden tener varios propósitos, como probar conexiones a través de firewalls, o probar rutas y mecanismos de autenticación. Uno de estos mecanismos es el usuario anonymous, que suele utilizarse para permitir que todos en la red interna compartan archivos y datos sin necesidad de acceder a las computadoras de los demás.
Con vsFTPd, las configuraciones opcionales que se pueden agregar al archivo de configuración para el inicio de sesión anónimo tienen este aspecto:
| Configuración | Descripción |
|---|---|
anonymous_enable=YES | ¿Permitir el inicio de sesión anónimo? |
anon_upload_enable=YES | ¿Permitir que anónimo cargue archivos? |
anon_mkdir_write_enable=YES | ¿Permitir que anónimo cree nuevos directorios? |
no_anon_password=YES | ¿No pedir contraseña a un anónimo? |
anon_root=/home/username/ftp | Directorio para anónimos. |
write_enable=YES | ¿Permitir el uso de comandos FTP: STOR, DELE, RNFR, RNTO, MKD, RMD, APPE y SITE? |
Configuraciones adicionales relevantes
| Configuración | Descripción |
|---|---|
dirmessage_enable=YES | ¿Mostrar un mensaje cuando ingresan por primera vez a un nuevo directorio? |
chown_uploads=YES | ¿Cambiar la propiedad de los archivos cargados de forma anónima? |
chown_username=username | Usuario al que se le otorga la propiedad de los archivos cargados de forma anónima. |
local_enable=YES | ¿Permitir que los usuarios locales inicien sesión? |
chroot_local_user=YES | ¿Colocar a los usuarios locales en su directorio de inicio? |
chroot_list_enable=YES | ¿Utilizar una lista de usuarios locales que se colocarán en su directorio de inicio? |
| Configuración | Descripción |
|---|---|
hide_ids=YES | Toda la información de usuarios y grupos en los listados del directorio se mostrará como "ftp". |
ls_recurse_enable=YES | Permite el uso de listados recurrentes. |
En el siguiente ejemplo, podemos ver que si la configuración hide_ids=YES está presente, la representación UID y GID del servicio se sobrescribirá, lo que nos hará más difícil identificar con qué derechos se escriben y cargan estos archivos.
Inicio de sesión anónimo
❯ ftp 172.16.55.10
Connected to 172.16.55.10.
220 "Welcome to the vsFTP service."
Name (172.16.55.10:cry0l1t3): anonymous
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls- Si el servidor acepta
anonymoussin pedir contraseña real (o aceptando cualquier valor), estamos ante un servidor FTP mal configurado que permite acceso sin autenticación.
Descargar un archivo
ftp> get Important\ Notes.txtDescargar todos los archivos disponibles
❯ wget -m --no-passive ftp://anonymous:anonymous@172.16.55.10-m: modo "mirror", descarga recursivamente todo el contenido del servidor.--no-passive: desactiva el modo pasivo (útil cuando hay problemas de conectividad con el modo pasivo por defecto).
Cargar un archivo
ftp> put testupload.txt- Requiere que el servidor tenga habilitada la escritura para el usuario usado (
write_enable=YESy, en caso de sesión anónima,anon_upload_enable=YES).
Scripts FTP de Nmap
❯ find / -type f -name ftp* 2>/dev/null | grep scripts
/usr/share/nmap/scripts/ftp-syst.nse
/usr/share/nmap/scripts/ftp-vsftpd-backdoor.nse
/usr/share/nmap/scripts/ftp-vuln-cve2010-4221.nse
/usr/share/nmap/scripts/ftp-proftpd-backdoor.nse
/usr/share/nmap/scripts/ftp-bounce.nse
/usr/share/nmap/scripts/ftp-libopie.nse
/usr/share/nmap/scripts/ftp-anon.nse
/usr/share/nmap/scripts/ftp-brute.nseftp-anon: comprueba si el servidor permite inicio de sesión anónimo.ftp-vsftpd-backdooryftp-proftpd-backdoor: verifican versiones vulnerables con puertas traseras conocidas (ej. vsFTPd 2.3.4).ftp-vuln-cve2010-4221: comprueba una vulnerabilidad de denegación de servicio específica de ProFTPD.ftp-bounce: comprueba si el servidor es vulnerable al ataque FTP bounce.ftp-brute: realiza fuerza bruta de credenciales contra el servicio FTP.
Ejemplo de uso directo de uno de estos scripts:
❯ nmap -p21 --script ftp-anon,ftp-vsftpd-backdoor 172.16.55.10FTP sobre TLS/SSL
Se ve ligeramente diferente si el servidor FTP se ejecuta con cifrado TLS/SSL, porque entonces necesitamos un cliente que pueda manejar TLS/SSL. Para ello podemos utilizar el cliente openssl y comunicarnos con el servidor FTP. Lo bueno de usar openssl es que también podemos ver el certificado SSL, lo cual puede ser de ayuda (nombre de la organización, dominio interno, correo del administrador, etc.).
❯ openssl s_client -connect 172.16.55.10:21 -starttls ftp
CONNECTED(00000003)
Can't use SSL_get_servername
depth=0 C = US, ST = California, L = Sacramento, O = EmpresaCorp, OU = Dev, CN = master.empresacorp.local, emailAddress = admin@empresacorp.local
verify error:num=18:self signed certificate
verify return:1
depth=0 C = US, ST = California, L = Sacramento, O = EmpresaCorp, OU = Dev, CN = master.empresacorp.local, emailAddress = admin@empresacorp.local
verify return:1
---
Certificate chain
0 s:C = US, ST = California, L = Sacramento, O = EmpresaCorp, OU = Dev, CN = master.empresacorp.local, emailAddress = admin@empresacorp.local
i:C = US, ST = California, L = Sacramento, O = EmpresaCorp, OU = Dev, CN = master.empresacorp.local, emailAddress = admin@empresacorp.local
---
Server certificate
-----BEGIN CERTIFICATE-----
MIIENTCCAx2gAwIBAgIUD+SlFZAWzX5yLs2q3ZcfdsRQqMYwDQYJKoZIhvcNAQEL
...SNIP...verify error:num=18:self signed certificate: indica que el certificado no está firmado por una CA de confianza (autofirmado), algo común en servidores internos o mal configurados y que puede ser una señal a investigar.- El campo
CN(Common Name) yemailAddressdel certificado a menudo filtran nombres de dominio internos, subdominios o direcciones de correo útiles para reconocimiento adicional.