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.
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:
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
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 argumentos | Acción que realiza | |
open port | Inicia una conexión con un servidor FTP. | |
close o disconnect | Finaliza una conexión FTP sin cerrar el programa cliente. | |
bye o quit | Finaliza una conexión FTP y la sesión de trabajo con el programa cliente. | |
cd directorio | Cambia el directorio de trabajo en el servidor. | |
delete archivo | Borra un archivo en el servidor | |
mdelete patrón | Borra múltiples archivos basado en un patrón que se aplica al nombre. | |
dir | Muestra el contenido del directorio en el que estamos en el servidor. | |
get archivo | Obtiene un archivo | |
noop No Operation | Se 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 archivos | Obtiene múltiples archivos | |
hash | Activa la impresión de caracteres # a medida que se transfieren archivos, a modo de barra de progreso. | |
lcd directorio | Cambia el directorio de trabajo local. | |
ls | Muestra el contenido del directorio en el servidor. | |
prompt | Activa/desactiva la confirmación por parte del usuario de la ejecución de comandos. Por ejemplo al borrar múltiples archivos. | |
put archivo | Envía un archivo al directorio activo del servidor. | |
mput archivos | Envía múltiples archivos. | |
pwd | Muestra el directorio activo en el servidor. | |
rename archivo | Cambia el nombre a un archivo en el servidor. | |
rmdir directorio | Elimina un directorio en el servidor si ese directorio está vacío. | |
status | Muestra el estado actual de la conexión. | |
bin o binary | Activa el modo de transferencia binario. | |
ascii | Activa 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 comando | Muestra la información relativa al comando. | |
? o help | Muestra una lista de los comandos disponibles. | |
append nombre del archivo | Continua una descarga que se ha cortado previamente. | |
bell | Activa/desactiva la reproducción de un sonido cuando ha terminado cualquier proceso de transferencia de archivos. | |
glob | Activa/desactiva la visualización de nombres largos de nuestro PC. | |
literal | Con esta orden se pueden ejecutar comandos del servidor de forma remota. Para saber los disponibles se utiliza: literal help. | |
mkdir | Crea el directorio indicado de forma remota. | |
quote | Hace la misma función que literal. | |
send nombre del archivo | Envía el archivo indicado al directorio activo del servidor. | |
user | Para cambiar nuestro nombre de usuario y contraseña sin necesidad de salir de la sesión ftp. |
Descarga múltiple de archivos
Listar archivos ocultos
Descubrir la hora del servidor
FTP via IPv6
Sin embargo, no sabemos la dirección IPv6. Para averiguarla, utilizaremos la vulnerabilidad conocida como FTP Bounce Attack.
Veamos un servidor que permite FXP:
Podemos conectarnos por netcat para ejecutar comandos FTP escribiendolos directamente.
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
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.
Pretty! This was an extremely wonderful post. Thanks for supplying
this information.