Press "Enter" to skip to content

Hacking de Infraestructura: Protocolo FTP

Last updated on octubre 30, 2020

Este es el primer post de la nueva sección de la web en la que explicaré en detalle un protocolo en contreto y mostraré ejemplos de diferentes formas de explotar distintas implementaciones vulnerables. Para realizar estos posts he utilizado como ejemplo implementaciones que se pueden encontrar en la plataforma hackthebox.eu, así como los vídeos de Ippsec.

 El Protocolo de transferencia de archivos (en inglés File Transfer Protocol o FTP) es un protocolo de red para la transferencia de archivos entre sistemas conectados a una red TCP (Transmission Control Protocol), basado en la arquitectura cliente-servidor.

image: geeksforgeeks.org

Una de las características de este protocolo es que no está cifrado. Por tanto, si obtenemos una traza de FTP, podemos abrirla con wireshark para ver todo el tráfico, incluido el usuario y la contraseña:

Utilizando el programa Wireshark es fácil seguir la traza TCP y descubrir el nombre de usuario y la contraseña:

Acceso

Es posible acceder a este servicio  indicando el host o IP y el puerto (por defecto es el puerto 21). Por ejemplo, para acceder al ftp de este sitio web (si lo tuviese activado) bastaría con escribir en la terminal ftp hackinglethani.com

Acceso Anónimo

 

Es posible acceder a un servidor ftp de forma anónima si este tiene el acceso anónimo habilitado. En la siguiente imagen podemos observar como nmap nos revela que el acceso anónimo esta activo:

Para acceder, hay que introducir de usuario “anonymous” y cualquier contraseña.

Modos de conexión

En el modo activo el servidor enviará los datos por el puerto 20:

En el modo pasivo el servidor indica el puerto de datos aleatorio que utilizará para realizar la conexión.

 

Si hay un firewall en el equipo posiblemente rechace las conexiones, por lo que se deba usar el modo pasivo.

Veamos algunos ejemplos de nmap:

Nmap indica un error en el FTP, “Can’t get directory listing”. Este error nos indica que no se ha configurado el servicio al cambiar de IP, por lo que probablemente el modo pasivo no funcionará correctamente.

En este otro ejemplo vemos de nuevo que el modo pasivo ha fallado, por lo que no podremos utilizarlo:

Esto puede dar problemas si por ejemplo queremos descargar todos los archivos con wget:

En este caso se solucionaría utilizando el flag –no-passive-ftp. (Nota: también valdría el comando –no-passive)

Transferencia de archivos

Modo ascii
Para transferir archivos que solo contengan caracteres imprimibles. Puede modificar saltos de lineas y otra información del archivo.
Modo binario
Para transferir binarios. El archivo se envía byte a byte sin modificar.

Comandos básicos de FTP

Comando y argumentosAcción que realiza
open portInicia una conexión con un servidor FTP.
close o disconnectFinaliza una conexión FTP sin cerrar el programa cliente.
bye o quitFinaliza una conexión FTP y la sesión de trabajo con el programa cliente.
cd directorioCambia el directorio de trabajo en el servidor.
delete archivoBorra un archivo en el servidor
mdelete patrónBorra múltiples archivos basado en un patrón que se aplica al nombre.
dirMuestra el contenido del directorio en el que estamos en el servidor.
get archivoObtiene un archivo
noop No OperationSe le comunica al servidor que el cliente está en modo de no operación, el servidor usualmente responde con un «ZZZ» y refresca el contador de tiempo inactivo del usuario.
mget archivosObtiene múltiples archivos
hashActiva la impresión de caracteres # a medida que se transfieren archivos, a modo de barra de progreso.
lcd directorioCambia el directorio de trabajo local.
lsMuestra el contenido del directorio en el servidor.
promptActiva/desactiva la confirmación por parte del usuario de la ejecución de comandos. Por ejemplo al borrar múltiples archivos.
put archivoEnvía un archivo al directorio activo del servidor.
mput archivosEnvía múltiples archivos.
pwdMuestra el directorio activo en el servidor.
rename archivoCambia el nombre a un archivo en el servidor.
rmdir directorioElimina un directorio en el servidor si ese directorio está vacío.
statusMuestra el estado actual de la conexión.
bin o binaryActiva el modo de transferencia binario.
asciiActiva el modo de transferencia en modo texto ASCII.
!Permite salir a línea de comandos temporalmente sin cortar la conexión. Para volver, teclear exit en la línea de comandos.
? nombre de comandoMuestra la información relativa al comando.
? o helpMuestra una lista de los comandos disponibles.
append nombre del archivoContinua una descarga que se ha cortado previamente.
bellActiva/desactiva la reproducción de un sonido cuando ha terminado cualquier proceso de transferencia de archivos.
globActiva/desactiva la visualización de nombres largos de nuestro PC.
literalCon esta orden se pueden ejecutar comandos del servidor de forma remota. Para saber los disponibles se utiliza: literal help.
mkdirCrea el directorio indicado de forma remota.
quoteHace la misma función que literal.
send nombre del archivoEnvía el archivo indicado al directorio activo del servidor.
userPara cambiar nuestro nombre de usuario y contraseña sin necesidad de salir de la sesión ftp.

Descarga múltiple de archivos

Para descargar todos los archivos de un directorio podemos usar el comando mget * . Nos mostrará cada archivo uno por uno y nos preguntará si queremos descargarlo.

Otra opción para descarga múltiple de archivos es utilizar el siguiente comando:

wget –mirror ‘ftp://ftp_user:Passw0rd@10.10.10.10’

Listar archivos ocultos

Quiza con un dir no encuentres nada, pero con un dir -a podrás ver los archivos ocultos.

Descubrir la hora del servidor

En la siguiente imagen podemos ver como nos indica la hora del servidor. Esto podría ser utilizado para geoposicionarlo.

FTP via IPv6

Sin embargo, no sabemos la dirección IPv6. Para averiguarla, utilizaremos la vulnerabilidad conocida como FTP Bounce Attack.

 

 FXP & IPv6
FXP es un método para pasar archivos entre servidores FTP sin emplear un cliente. Es vulnerable a FTP Bounce Attack, ataque por el cual puedes mandar comandos PORT para que el servidor se conecte a algun puerto, y hacer asi escaneos de puertos
 

Veamos un servidor que permite FXP:

Podemos conectarnos por netcat para ejecutar comandos FTP escribiendolos directamente.

Para ello utilizaremos el comando EPRT, tal y como indica el RFC 2428:
 
EPRT<space><d><net-prt><d><net-addr><d><tcp-port><d>
 
<net-ptr> es 1 para IPv4 y 2 para IPv6.
 
Si nuestra IPv6 es dead:beef:2::1000, el comando sería el siguiente:

Nos tenemos que poner previamente a la escucha. Para ponernos a la escucha en IPv6 tenemos que usar ncat:

Si ahora utilizamos el comando LIST, nos muestra los archivos, pero además nos muestra la dirección IPv6 de la máquina: dead:beef::250:56ff:fe8f:5e5f

 

Ahora puedes hacer un nmap a esa dirección y quizá se muestren puertos abiertos accesibles que antes no.

Symlink

Si al ejecutar el comando ? aparece la opción symlink, quiza podamos crear un link simbólico al directorio root.

symlink / test

Al acceder en la página web a /test, estaremos accediendo al directorio raíz del servidor.

Tambien podemos ver el contenido de archivos php, por ejemplo:

symlink /var/www/html/index.php /index.txt

Versión de FTP

Podemos ver la versión en la cabecera si nos conectamos via netcat:

Versión de FTP vulnerable: vsftpd 2.3.4

Hay una versión de FTP que es vulnerable, tiene una backdoor. Es la version vsftpd 2.3.4

La vulnerabilidad consiste en que si en el login introduces una carita sonriente 🙂 al final del nombre de usuario, obtienes ejecución de comandos.

 

Acceso SSH

Si podemos crear carpetas y subir archivos en el home de un usuario, podemos crear una carpeta .ssh, generar las claves RSA y conectarnos con ese usuario via ssh sin necesidad de saber la contraseña:

Espero que te haya gustado esta primera entrada donde te he mostrado algunas de las formas más habituales de aprovecharse del protocolo FTP. En las próximas semanas subiré entradas en las que analizaré el resto de protocolos.

Lethani.

Be First to Comment

    Deja una respuesta

    Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *