martes, 14 de agosto de 2012

Crawling con Sitemap2Proxy

En nuestro trabajo diario, tanto para hacer un Pentest como para muchas otras disciplinas dentro del mundo de la seguridad, es común que tengamos que hacer Crawling automático de algún sitio web para poder tener accesible toda su estructura y contenido sin tener que ir link a link pinchando en todos los enlaces.

El Crawling (Wikipedia English | Wikipedia Español), al contrario de lo que pueda parecer, no es algo nada trivial de hacer. Hace años, cuando todos los websites estaban formados por HTML estáticos, un wget recursivo bastaba para hacernos con el contenido completo de un site, pero hace años que los Javascript, Ajax, Flash y un sin fin de tecnologías web, hacen que el hecho de "seguir los enlaces" no resulte nada trivial.

Una alternativa a hacer un crawling tradicional es utilizar los Sitemaps. Un Sitemap es una fichero XML en el que el desarrollador o administrador de un sitio web introduce una especie de inventario de todas las URL que existen en su site, para facilitar el crawling por parte de los buscadores como Google, Yahoo, etc. Estos ficheros, tienen una pinta como la siguiente:


Como podeis ver, el XML proporciona información muy útil para un buscador, como por ejemplo las URLs que existen y la fecha de última modificación de cada una de ellas. Sabiendo esto, el buscador puede decidir si tiene indexada el contenido más reciente de la URL o si por el contrario es necesario volver a crawlear esa URL para actualizar su información.

Pues bien, hace un par de días observé que Robin Wood, compañero en el Advisory Board del SANS Institute, y al que seguro conoceis si seguís listas de correo de seguridad en Inglés, había publicado una herramienta llamada Sitemap2Proxy, que podeis descargar de su página web AQUÍ.


$ ./sitemap2proxy.rb 
You must specify either a file or URL to process

sitemap2proxy 1.0 Robin Wood (robin@digininja.org) (www.digininja.org)

Usage: sitemap2proxy [OPTIONS]
--help, -h: show help
--file, -f : local file to parse
--url, -u : URL to the file
--proxy, -p : address of the proxy
--ua, -a : specify an alternative user agent - default is Googlebot
-v: verbose

La herramienta está desarrollada en Ruby y puede funcionar de dos formas diferentes: Por un lado, puedes pasarle la URL donde está el fichero sitemap.xml y él se encarga de descargarlo y extraer las URLs. Por otro lado, puedes descargar tu mismo el fichero sitemap.xml (o .xml.gz, a veces viene comprimido) y hacer lo mismo desde un fichero local. El segundo parámetro obligatorio es el proxy (que generalmente será http://localhost:8080), que define a través de que proxy se va a acceder a las URLs que se encuentren al analizar el sitemap, con lo que vamos a poder tener un inventario de todas las URLs en nuestro proxy favorito (Burp, ZAP, o el que sea). Por último, opcionalmente podemos definir el User-Agent que se utilizará para acceder a las URLs, aunque por defecto usa el de GoogleBot, que debería ser suficiente como para no tener problemas. Al final, una llamada a esta herramienta podría ser tal que así:

$ ./sitemap2proxy.rb --url http://www.una-web.es/sitemap.xml --proxy http://localhost:8080 -v

Sabiendo esto, me decidí a probar que tal funcionaba la herramienta con alguna página conocida, así que realicé una sencilla búsqueda en Google para obtener algunos ficheros XML con los que poder jugar:


He tapado (y voy a tapar en el resto de capturas) los nombres de las webs, aunque por supuesto podeis obtenerlas de una forma trivial, pero al menos no os las doy directamente.

Cogiendo alguno de estos ficheros XML hice algunas pruebas, y en aquellos casos en que el fichero XML era único, la herramienta funcionaba a las mil maravillas, pero también me encontré con casos como este:


Como podéis ver, en algunos casos, los XML hacen referencia a su vez a otros XML de forma jerárquica, y la herramienta en este momento no está preparada para seguir recursivamente esta jerarquía, lo cual resulta un problema para hacer el crawling de la web.

Esto puede ser solucionado aplicando un poco de simple shellscript, es decir, haciendo que todos estos ficheros se descarguen a local y luego haciendo que la herramienta se ejecuta sobre cada uno de ellos. La otra opción, que fue la que hice yo, es hacer algunas modificaciones sobre la herramienta original para que sea capaz de seguir la jerarquía de XMLs y obtener así todas las URLs de la web.


Mientras estaba realizando estas pruebas pensé en publicar el código con mis modificaciones, pero tratándose de la herramienta de un compañero del Advisory Board me pareció muy poco elegante hacerlo, así que lo que he hecho ha sido ponerme en contacto con Robin y mandarle las modificaciones que he hecho, así que es probable que dentro de poco tengamos una versión 1.1 de la herramienta que incorpore esta capacidad de recursividad.

Por último, una pregunta que me surgió al acabar de probar la herramienta es ¿y si la web que queremos crawlear no tiene sitemap? Esta parte no la he llegado a probar, pero parece ser que existen herramientas on-line como ésta para generar el sitemap.xml de la web que le pasemos. Estas herramientas on-line no dejarán de hacer un crawling de la web, con toda la problemática que ello conlleva, pero de una forma mucho más anónima para nosotros :)

2 comentarios :

Adrián dijo...

Hacer un buen crawling siempre es un problema. Lo que nosotros nos encontramos más a menudo son páginas sin sitemap, y con requisitos de datos específicos para alcanzar ciertas partes de la web. Es decir, que para ir de a.php a b.php, hay que rellenar el formulario de a.php con ciertos datos (un ID de cliente, o una fecha específica). Es una pesadilla hacer así las auditorías, pero es lo que hay me temo.

Jose Selvi dijo...

@Adrián: Sobretodo esto sirve para webs "públicas". Por ejemplo si una web tiene parte privada, esa evidentemente no está indexada en sitemap.

Por otro lado, lo que comentas es cierto, los formularios son un problema, ya que muchas veces la aplicación no te deja ir al siguiente paso si no introduces datos coherentes, y esto es un problema para los Crawlers. Al final, en muchos casos, no queda otro remedio que pegarle un vistazo a la funcionalidad de la web a través de un proxy que te lo registre todo, de forma bastante manual.