Desenmascara.me

How to verify whether a website is legitimate or not?: desenmascara.me

viernes, 15 de enero de 2010

Cómo hacer un plugin para el scanner web WhatWeb

WhatWeb es un scanner para identificar el software bajo el que funcionan los sitios web. Lo descubrí recientemente. Esta bajo licencia GPLv3.

Actualmente cuenta con unos 60 plugins para identificar diferentes sistemas. Echando un vistazo para ver los sitios que detectaba, ví que no tenía para sistemas opencms, tan famoso recientemente.  Leyendo la documentación y a través de varios intercambios de correos con Andrew Horton, el desarrollador, he creado un plugin para detectar webs que se ejecuten sobre opencms. El objetivo era experimentar con esta herramienta, aprender, y de paso colaborar con el proyecto. En la próxima versión estará disponible este plugin. He documentado los pasos para tenerlos como referencia, o por si sirven para que alguien desarrolle nuevos.

Pasos para crear un plugin para WhatWeb, esta hecho para detectar sistemas "opencms", pero será similar para cualquier otro sistema:


1. Descargamos el software, lo desempaquetamos y vamos al directorio plugin-development. Creamos una carpeta "opencms" para guardar todo lo relacionado al plugin que vamos a crear. Buscamos ejemplos de webs que usan el mismo software para comprobar diferencias entre versiones. En la mayoría de proyectos CMS o similares, tienen un apartado para mostrar ejemplos de sitios web que lo usan, y creamos un archivo plano con todas las urls.

2. Estando situados en la carpeta "opencms" y con el archivo de urls que usan opencms, copiamos el script wget-list y lo ejecutamos con el archivo de urls como argumento.
#wget-list opencms-sites
con esto, nos descargaremos todo el html (extensión html) y cabeceras de las urls (extensión meta) qué se guardaran en archivos con el mismo nombre que su dominio.


3. Ejecutamos el script find-common-stuff en todos los archivos html.
#find-common-stuff *html 
en la salida podremos comprobar si hay tags comunes o cadenas entre "quotes" comunes. Si no las hay, no pasa nada, aunque llevará más tiempo, podremos buscar firmas leyendo el código HTML.

Revisamos manualmente evang.ro-hermannstadt.html y comprobamos que no es opencms sino TYPO3, lo borramos.

Leemos el archivo www.abfabini.ro-opencms-export-demosite-.meta y .html 
y vemos que tiene un HTTP 404, o sea, no encontrado, lo borramos. Podemos probar a descargar el html manualmente.

#wget -O www.abfabini.ro.html www.abfabini.ro
y las cabeceras
#curl -I www.abfabini.ro > www.afbabini.ro.meta


Leemos el código html de www.abfabini.ro.html y vemos que sí es opencms porque tiene la siguiente línea:
<link href ="/opencms/export/fabini/resources/fabinistyle.css" type="text/css" rel="STYLESHEET">


4. Buscamos en www.abfabini.ro.meta para ver qué información ofrece.

#cat www.abfabini.ro.meta

HTTP/1.1 200 OK
Date: Sat, 09 Jan 2010 18:30:58 GMT
Server: Apache-Coyote/1.1
ETag: W/"12746-1170499050000"
Last-Modified: Sat, 03 Feb 2007 10:37:30 GMT
Content-Type: text/html
Content-Length: 12746
X-Cache: MISS from www.abfabini.ro



No se observa ningún patrón obvio.

5. Realizamos una búsqueda de la etiqueta "link href" anterior en todos los html para comprobar si la tienen los demas sitios opencms.

#fgrep '<link href ="/opencms/export/' *html


Sólo aparecen 2 sitios, no es mucho.

Vamos a ver cuantos sitios son realmente opencms:
#grep -l opencms *html

www.abfabini.ro.html
www.area.trieste.it.html
www.bionet-intl.org.html
www.bng-galiza.org.html
www.boersewien.at-.html
www.ccbh.net-.html
www.edgebox.net-.html
www.eu2010.es-.html
www.opencms.org-.html
www.paradine.at-.html 


OK, vemos que una firma válida como la anterior coincide en todos esos sitios. Todas las demás páginas que no han salido en la anterior búsqueda, posiblemente no sean opencms, pero es muy difícil asegurarlo, luego veremos como.



6. La etiqueta anterior "stylesheet" dio buen resultado, vamos a chequear todas las etiquetas de este tipo:
#grep -i stylesheet *html
  

Observamos que hay cadenas comunes cómo:
/export/system/modules 
/system/modules/

Las buscamos

grep -l export/system/modules *html 

www.area.trieste.it.html
www.bng-galiza.org.html
www.boersewien.at-.html
www.eu2010.es-.html
www.opencms.org-.html


vamos a chequear las rutas de las hojas de estilo.
/ccbh/export/templateone/resources/navigation.css
/opencms/export/sites/default/dropdown.css
/export/system/modules/es.ieci.opencms.content/resource/styles.css
----salida omitida-----

las etiquetas de las hojas de estilo son muy variadas, algunas empiezan con:
<link type="text/css" rel="stylesheet" href="
y otras con:
<link rel="stylesheet" type="text/css" media="all" href="
<link href="/css/screen_ie6.css" rel="stylesheet"
etc.

7. Con esos datos podemos crear una regla para las hojas de estilo, por ejemplo:
  • Tiene una etiqueta "link"
  • La ruta contiene /opencms/ o /export/system/modules
  • La etiqueta termina con .css
Una expresión regular para este patrón quedaría:
/<link [^>]+ href="[^"]+(\/opencms\/|\/export\/system\/modules)[^"]+\.css"/

OK, ya tenemos un patrón, no es gran cosa, pero debería coincidir en la mayoría de los sistemas opencms.
Obviamente, cada web con opencms es muy diferente excepto en las rutas de los directorios, un vistazo rápido, nos revela que esas rutas también se usan para imágenes, la expresión regular quedaría:
 /<(link|img) [^>]+(href|src)="[^"]+(\/opencms\/|\/export\/system\/modules)/}

8. Con los datos que tenemos hasta ahora, podemos tomar de ejemplo un plugin de los que ya existen. Hay 3 tipos de comprobaciones posibles:

:ghdb    (google hack database)
:text      (texto normal)
:regexp (expresiones regulares en ruby)

El campo probabilidad puede ser; maybe 25%, probably 75%, certain 100%.
Lo modificamos con los datos que tenemos y nos queda:


matches [


{:name=>"/opencms/",
:probability=>25,
:regexp=>/(\/system\/modules\/|\/export\/system\/modules)/},



{:name=>"/opencms/",
:probability=>75,
:text=>"/opencms/"},


{:name=>"tag with opencms or export/systems/modules",
:probability=>100,
/<(link|img) [^>]+(href|src)="[^"]+(\/opencms\/|\/export\/system\/modules)/}
]
código creado con html-entities
 

En las expresiones regulares, hay que tener cuidado en escapar caracteres como: . / ? [ ] ( ) etc.

9. Una vez visto que de los archivos "html" no podemos sacar ninguna información más (sin un gran esfuerzo y dedicación) que nos diga que el software es "opencms". Entonces nos toca revisar los archivos meta.

ecasbas@cipher:~/opencms$ more www.bonduelle.de.meta
HTTP/1.1 200 OK
Date: Thu, 14 Jan 2010 22:00:53 GMT
Server: OpenCms/7.0.2
Last-Modified: Thu, 14 Jan 2010 22:00:54 GMT
Content-Type: text/html;charset=UTF-8
Content-Length: 9775
Set-Cookie: JSESSIONID=361BEED9A72E5A384627647ED52A4FE5; Path=/


Para implementar en el plugin la lectura de esta cabecera, es necesario código en ruby, esta parte es opcional.

def passive
    m=[]
    # note that http strings are downcased, so Server becomes server
    if @meta["server"] =~ /^OpenCms\/[0-9a-z\.]+/
        version=@meta["server"].scan(/^OpenCms\/([0-9a-z\.]+)/)[0][0]
        m << {:name=>"HTTP Server String", :probability=>100, :version=>version }
    end

    m
end




Con todo lo anterior ya tenemos todo lo necesario en nuestro plugin para que WhatWeb detecte gran parte de los sitios web que funcionan bajo opencms.


ecasbas@cipher:~/WhatWeb$ ./whatweb www.eu2010.es
http://www.eu2010.es [302] md5[d41d8cd98f00b204e9800998ecf8427e], redirect-location[http://www.eu2010.es/en/index.html], server-header[Apache]
http://www.eu2010.es/en/index.html [200] probably OpenCms, md5[3ab4ce7f1efe84089a46646b410e7e16], server-header[Apache], title[www.eu2010.es]

No hay comentarios:

Publicar un comentario

Trata a los demás como te gustaría ser tratado.