14 noviembre 2008

Detección de "proxies" perdidos por Internet.

Un proxy es un mecanismo que funciona como pasarela web y permite hacer de puente entre nuestro navegador y el servidor al que queremos conectar. Estos tipos de herramienta son utilizadas en compañías para restringir el contenido que se puede visitar, acelerarlo mediante mecanismos de "cacheo" e incluso rastrear navegaciones que un determinado usuario ha podido hacer. Debido a estas características es dificil no encontrar una organización que no haga uso de este sistema.

En ocasiones estos proxies son expuestos por error en Internet sin ningún tipo de control, y es es común utilizarlos para navegar de forma anónima o saltarse controles de determinados sitios basados en el direccionamiento IP.

De esta forma han nacido webs que se encargan de recopilar direcciones IP que permiten ser utilizadas como proxies donde se identifica la nacionalidad a la que pertenecen, el tiempo de respuesta y el puerto que utiliza.

La siguiente imagen muestra una captura de una de estas webs: http://www.proxy4free.com/page1.html


Configurar uno de estos proxies en nuestro navegador es sencillo y podeis como consultarlo en la ayuda.

Retomando el control de accesos, y por poner un ejemplo, el portal Hulu es una web que permite únicamente a usuarios afincados en el reino de la hamburguesa la escucha de series de tv y otros tipos de videos. El problema viene dado por lo extendido de lo contado hasta ahora: las listas de páginas web con proxies, en su gran mayoría mantiene direcciones IP en las que el servicio ha desaparecido o presenta una configuración adecuada no permitiendo su utilización, asi que se vuelve necesario la detección de proxies por nuestra parte o la comprobación de estas listas públicas.

Existen cientos de herramientas para comprobar y encontrar una lista de proxies, pero mi inteción era centrarme sobre una que ya hemos hablado: Nmap.

Dada una lista de proxies obtenida de una página web con el formato: "IP:Puerto", tal y como podríamos obtener de la página de proxy-hispano, se introduce en un fichero de texto y se guarda con un nombre.

Nmap no acepta como entrada IP:Puerto, únicamente direcciones IP, es necesario que la lista sea procesada obteniendo únicamente las IPs y almacenandolas en otro fichero:
awk -F: '{ print $1}' proxies.txt >lista.txt
Para conocer que puertos se han de comprobar y optimizar el número, se puede obtener un listado de repeticiones, donde en la gran mayoría de casos, el mayor número es: 8080, 80, 3128
awk -F: '{ print $2 }' proxies.txt | sort | uniq -c

Ahora ya solo falta lanzar el nmap para las comprobaciones:
nmap -T4 -iL lista.txt -p80,8080,3128 -v --open --script=http-open-proxy.nse -n -PN -oX salida.xml
La detección real la ejecuta el script "http-open-proxy.nse", que mediante una petición a google, comprobará que la respuesta contiene la cabecera "Server: GWS". Este script ha sufrido un cambio funcional y para su correcto uso, es necesario descargar la versión del svn o esperar a la próxima versión de Nmap.

svn co --username guest --password "" svn://svn.insecure.org/nmap/

La otra opción es no utilizar ninguna lista de proxies y dejar a Nmap que vaya probando IPs generadas aleatoriamente. Este proceso es mucho más lento y aunque podemos escanear miles de IPs por minúto, siempre tardará más. Eso si, garantizamos una vida más larga a los proxies encontrados.

nmap -v -T4 -iR 100000 -p80,8080,3128 --open --script=http-open-proxy.nse -n -PN -oX salida2.xml


El único cambio hecho, es el parámetro "iL", fichero de entrada, por "iR", entrada de ips generadas al azar. El número siguiente 100.000, es el número de hosts a probar.


La velocidad es controlada mediante el parámetro "T", siendo 1 el número más bajo y usado únicamente para tratar de no ser detectados por sistemas de detección de intrusos, y 5 el más agresivo y por lo tanto más llamativo. Teniendo en cuenta que en este caso únicamente se busca en 3 puertos y que mi conexión no es suficientemente buena, lo he dejado en 4.

Una vez haya finalizado la ejecución, si se aplica el siguiente xslt sobre le XML generado (salida.xml), obtendremos otra lista del tipo "IP:puerto", pero esta vez comprobada por nosotros mismos y funcional.

Desde línea de comandos, una forma sencilla de aplicar esta petición, es la ejecución del siguiente comando:

xmlstarlet sel -T -t -m /nmaprun/host -i "ports/port/script/@output" -v address/@addr -o : -v ports/port/@portid -n salida.xml

Otro día, veremos más ejemplo del uso de esta aplicación, xmlstarlet, para seleccionar datos interesantes de la salida de un XML de Nmap, ya que a día de hoy, no hay nada de documentación.