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