domingo, 25 de septiembre de 2011

FTP Bounce o ¿Por qué el servidor FTP está escaneando la red?


Buenas a todos, una vez más traigo una de esas entradas de las que me gustan a mí... de las que consisten en darle una vuelta de tuerca a algún asunto y darle un uso que no es para el que fue diseñado.
En este caso es una técnica algo antigua pero que, a veces, uno tiene la suerte de encontrarse un host que permita emplearla.

Antes de nada, voy a explicar en qué se basa; Dentro del protocolo FTP existen dos maneras de llevar a cabo la sesión, el modo activo y el modo pasivo.

En el modo activo, el cliente se conecta al servidor FTP en su puerto 21 (usado como canal de órdenes), deja un puerto a la escucha (normalmente N+1, siendo N el puerto de origen en la conexión hacia el puerto 21 del servidor) y le indica al servidor FTP el puerto al que ha de conectarse desde su puerto de transmisión de datos, el 20. Para indicar dicho puerto se utiliza el comando PORT, por ejemplo: PORT 192,168,1,1,12,234 , con esto, estamos indicándole al servidor que la transferencia de ficheros se va a recibir en la dirección IP 192.168.1.1 en el puerto 3306. Aquí aclarar una cosa respecto a la forma en la que se indica el puerto, si os fijáis son dos valores (12,234 en este caso), lo que hay que hacer es coger por separado cada número y pasarlo a hexadecimal:
12 = 0x0C
234 = 0xEA
Ahora los juntamos y obtenemos 0x0CEA, si dicho número lo pasamos a decimal obtendremos que el puerto de conexión destino es el 3306.
Comentar que existe una manera más fácil de calcular lo mismo, consiste en multiplicar el primer número por 256 y sumar el resultado al segundo número: (12*256) + 234 = 3306. Lo sé, podría haberlo explicado antes, pero nunca esta de más saber varias formas de hacer lo mismo :P.

Por otro lado, en el modo pasivo, el cliente inicia la conexión como siempre al puerto 20 del servidor FTP y, en lugar de utilizar el comando PORT, utiliza el comando PASV para indicarle al servidor FTP que se va a utilizar el modo pasivo y solicitar el puerto al que conectarse para establecer el canal de datos, en ese momento el servidor FTP dejará a la escucha un puerto alto (no privilegiado) aleatorio y responderá al cliente con una respuesta con el mismo formato que el comando PORT, finalmente, el cliente conectará al puerto indicado por el servidor y ya existirá el canal de datos y el canal de comandos.

Ya hemos visto cómo funcionan ambos modos de conexión, así que pasaremos a ver el mencionado ataque “FTP Bounce”. Como acabamos de ver, el cliente le indica al servidor el host y el puerto al que conectarse para establecer la comunicación, tal y como se establece en el RFC959 – File Transfer Protocol (FTP), se puede utilizar el comando PORT para conectar con un tercer host para que reciba los datos. Si le damos una vuelta a esto, veremos que podemos utilizarlo para escanear equipos, si no puede establecer el “canal de datos”, quiere decir que el puerto está cerrado, en caso contrario, el puerto estará abierto.

Para poder llevar a cabo este escaneo tenemos que encontrar un servidor FTP que permita el comando PORT y del que contemos con usuario y contraseña (o que permita conexiones anónimas).
Si queréis poner Nmap a buscar, podéis intentarlo con el siguiente comando:
root@ph0b0s:~/nmap-svn# ./nmap -sS -p 21 -Pn -n --min-hostgroup 500 -oA /tmp/ftpopen-bounce -v -iR 100000 --script ftp-bounce (el script ftp-bounce permite probar si un servidor FTP se puede utilizar par realizar un escaneo de tipo bounce)

Podéis ir monitorizando el fichero de salida con un tail -f y, en el momento que veáis el texto “ftp-bounce: bounce working!” sabréis que habéis encontrado un servidor FTP que podéis usar para realizar este tipo de escaneo.

A continuación, pongo una imagen del proceso de “escaneo” realizado de forma manual.

Comando PORT realizado de forma manual

El primer PORT es el correspondiente al puerto 3306 (recordemos, (12*256) + 234 = 3306) a una de las direcciones IP de google, como vemos, la respuesta al LIST indica que no se ha podido establecer la conexión de datos, por lo que el puerto está cerrado o filtrado.
El siguiente PORT es a la misma dirección IP pero al puerto 80, como podemos observar, al hacer el comando LIST no se nos devuelve el error, lo que indica que se ha podido establecer correctamente la conexión, sabiendo así que el puerto está abierto.

Hacer este proceso a mano es bastante tedioso, por lo que podríamos hacernos una herramienta para ello basada en sockets bastante sencillita de hacer (ya tenemos algo que hacer para cuando no sepamos con qué trastear :P) o utilizar para ello el propio Nmap.

Para ello, bastaría con utilizar el siguiente comando: root@ph0b0s:~/nmap-svn# ./nmap -b XXX.XXX.XXX.11 -Pn -n -p80,3306 www.google.es -v (importante recordar que con -Pn evitamos que se realice ningún tipo de ping anterior al escaneo y con -n indicamos que no se relice ningún tipo de resolución DNS, para no enviar tráfico relacionado con las máquinas que van a ser escaneadas).

Escaneo "FTP bounce" realizado con Nmap

Tal y como vemos en la imagen anterior los resultados son los mismos que obtuvimos de forma manual, el puerto 80 abierto y el 3306 filtrado.

En este caso hemos escaneado un host accesible desde Internet, pero si el servidor FTP tiene acceso a direccionamiento IP interno, podemos utilizarlo para realizar escaneos de red a rangos de red internos desde Internet, puesto que realmente es el propio servidor FTP el que se conecta a dichas direcciones IP internas y no nosotros.

Por último, seguro que os estáis preguntando si esto se sigue viendo.... la verdad es que yo en auditoría externa lo he visto sólo una vez, pero basta con realizar escaneos aleatorios para encontrarse con host que permiten este tipo de escaneo. Otra cosa es en auditorías internas, puesto que suele ser común encontrar servidores FTP que permiten el comando PORT implementados en impresoras, así que ya sabéis, si un día veis que la impresora está haciendo conexiones raras....

Espero que os haya resultado interesante, nos vemos en el siguiente post.



No hay comentarios:

Publicar un comentario