Uno de los primeros pasos que se dan a la hora de meterle mano a una web es revisar el código de la página en busca de datos que nos permitan hacernos una idea de la composición del sitio, de la tecnología que utiliza, etc. Buscar direcciones de correo en el código, revisar los comentarios, buscar campos ocultos, la estructura de carpetas, etc, puede ser algo bastante aburrido y, sobre todo, tedioso si el sitio es un poco grande. Para ello existen los crawlers, que son programitas que se encargan de hacer este trabajo por nosotros y ahorrarnos un montón de tiempo. También son muy utilizados por los motores de búsqueda para indexar las webs y mostrarlas en los resultados de las búsquedas, pero lo que buscan estos últimos es muy diferente de lo que vamos a buscar nosotros.
El camino fácil es coger un crawler conocido como BlackWidow, Sam Spade o Teleport y dejarle que haga el trabajo sucio pero, como lo que nos mola es aprender cómo funcionan las cosas, vamos a hacernos uno sencillito, con un simple script para la consola. En este caso he elegido hacerlo para Linux, pero si se quiere hacer para Windows simplemente cambiaremos grep por findstr (o similares).
Lo primero que necesitamos es hacernos una copia local del sitio en nuestra máquina (por aquello de la velocidad y tal...). Podemos currarnos un programita que recorra todas las páginas de un sitio y las copie en el disco duro pero, es domingo, tengo resaca y conozco un programa que ya lo hace: WGET. Además hay versión tanto para Windows como para Linux, así que, p'alante!
Supogo que sabemos cómo funciona wget (y si no, nos leemos la ayuda, que es muy fácil, jeje), así que el comando que necesitaríamos para descargarnos una web sería el siguiente:
wget -r -m -nv http://www.unawebcualquiera.com
Este comando nos va a generar una carpeta con el nombre de la web y nos va a dejar dentro todos los ficheros de la misma respetando la estructura de carpetas (esto es importante, ya que así podremos hacernos una idea de cómo se estructura el sitio, qué tipo de aplicaciones alberga y qué tecnologías utiliza).
Una vez que ha acabado de copiar (puede tardar bastante si el sitio es un poco grande), necesitamos filtrar cada uno de los ficheros y buscar lo que queremos. ¿Qué usaremos para filtrar? a mí me mola grep para linux y findstr para windows, pero es una cuestión de gustos. Ahora viene lo importante: ¿Qué queremos buscar? Bueno, en este ejemplo sencillo, buscaremos lo más básico, que viene a ser:
- Comentarios: Os sorprendería ver lo que nos podemos encontrar comentado en cualquier código, desde credenciales de acceso, hasta referencias a ficheros de configuración, logs, etc, que nos pueden ayudar muchísimo a la hora de buscarle las cosquillas al asunto. Los comentarios en html empiezan con la misma cadena, <!-- , así que ya sabemos cómo sacarlos...
- Enlaces: Por supuesto, cualquier link que venga en el código. Podemos encontrar referencias a scripts, ficheros, carpetas, etc. Yo buscaré cadenas HREF (podemos buscar también por ACTION, pero estoy vago...).
- Direcciones de correo: Fundamental. Tanto para hacer ingeniería social como para su posible uso como usuario, ¿Cuántas webs conoces en las que el usuario es una dirección de correo? Pues eso, a buscar @...
- Campos ocultos: ¿Por qué se oculta un campo en una web? Porque seguro que es importante. Así que, al saco todo aquello que ponga type=hidden
- Meta Tags: Estas etiquetas que se añaden al código pueden contener direcciones, teléfonos, nombres, etc. Son una buena fuente de información para ataques de ingeniería social, así que, si pone meta...
- Scripts: Por supuesto, si hay algún script, lo quiero ver.
Podríamos seguir añadiendo cosas para buscar, pero para el ejemplo, creo que es más que suficiente.
¿Cómo sería el comando para aplicar una de estas búsquedas? Por ejemplo, para sacar los enlaces sería muy sencillo:
cat ./www.unawebcualquiera.com/index.html | grep -i -F 'href'
Nos sacaría por pantalla todas las líneas que contuvieran la cadena indicada. Lo que tendríamos que hacer es ir cambiando el patrón de búsqueda según el tipo, y sacarlo todo a un fichero de texto. Para ello, me he hecho un script en bash al que le paso dos parámetros: la carpeta con la web descargada y el fichero con los resultados.
#!/bin/bash#para cada fichero de la carpeta de entrada, lo parseamos...for i in $(find $1/)doecho "Parseando " $iif [ -f $i ];thenecho "[" $i "]" >> $2#Buscamos comentarios "<!--"echo "Comments" >> $2echo "" >> $2cat $i | grep -i -F '<!--' >> $2echo "-----------------------------------------------------------------" >> $2#Buscamos correos "@"echo "Emails" >> $2echo "" >> $2cat $i | grep -i -F '@' >> $2echo "-----------------------------------------------------------------" >> $2#Buscamos campos ocultos "hidden"echo "Hidden Fields" >> $2echo "" >> $2cat $i | grep -i -F 'type=hidden' >> $2echo "-----------------------------------------------------------------" >> $2#Buscamos Links "href"echo "Links" >> $2echo "" >> crawlcat $i | grep -i -F 'href=' >> $2echo "-----------------------------------------------------------------" >> $2#Buscamos Meta "Meta"echo "Meta Tags" >> $2echo "" >> $2cat $i | grep -i -F 'meta' >> $2echo "-----------------------------------------------------------------" >> $2echo "" >> $2echo "-----------------------------------------------------------------" >> $2#Buscamos scripts "script"echo "SCRIPTS" >> $2echo "" >> $2cat $i | grep -i -F 'script'>>; $2echo "-----------------------------------------------------------------" >> $2echo "" >> $2echo "********************************************************" >> $2echo "********************************************************" >> $2echo "" >> $2fidoneecho "FIN!"
En este ejemplo, el fichero de resultado podría salir algo tosco si la web en cuestión no sigue una indentación correcta, pero como ejemplo nos sirve más que de sobra. Una forma de mejorar esto sería mediante el uso de expresiones regulares. Como no me quiero meter con ello en este post, simplemente os dejo un ejemplo de cómo se filtrarían las direcciones de correo mediante el uso de expresiones regulares:
grep -o -e "[A-Za-z0-9\._-]*@[A-Za-z0-9\._-]*\.[a-zA-Z]\{2,4\}" $i >> $2
En este comando le estamos diciendo que sólo nos saque la cadena que coincida con el patrón que le indicamos (parámetro -o) y le indicamos el susodicho patrón (-e): una cadena de caracteres entre los que se pueden encontrar letras de la A a la Z (mayúsculas y minúsculas), números del 0 al 9 y los caracteres ".", "_","-", seguidos del carácter "@", y después otra cadena con el mismo patrón, seguida de un "." y otra cadena que sólo contenga las letras de la A a la Z mayúsculas o minúsculas, de un mínimo de dos caracteres y un máximo de cuatro... Un poco farragoso de leer, ¿no?, pero sin duda más amigable a la hora de presentar los resultados...
Como ya he dicho antes, si lo queremos hacer para Windows, simplemente cambiaríamos el cat por el type (comando para ver el contenido de un fichero en Windows), y el grep por findstr o similares.
Espero que os resulte útil.
CIAO!
P.D.: Sí, sí, ya sé que con grep, si ponemos el parámetro -r, nos recorre recursivamente un directorio y aplica el filtro a todos los ficheros, pero me molaba más así...
No hay comentarios:
Publicar un comentario