Desenmascara.me

Luxury & Fashion brands; be aware of the online counterfeiting!: desenmascara.me

lunes, 25 de enero de 2010

Crawling sencillo con anemone (ruby)

Anemone es una librería en ruby para extraer enlaces de sitios web (aka crawler), y poder realizar diversas acciones en ellos tan sólo indicando la URL principal.  La descubrí a través del scanner whatweb.



Simplicidad y potencia, ejemplos.
Frontend de línea de comandos:

ecasbas@laptop:/var/lib/gems/1.8/bin$ ./anemone
Anemone is a web spider framework that can collect
useful information about pages it visits.

Usage:
  anemone [arguments]

Commands:
  count, cron, pagedepth, serialize, url-list



Ejemplo:
ecasbas@laptop:/#./anemone url-list http://www.wordpress.org
http://www.wordpress.org/
http://wordpress.org/
http://www.wordpress.org/extend/
http://wordpress.org/extend/
http://www.wordpress.org/about/
http://wordpress.org/about/
http://www.wordpress.org/showcase/
http://wordpress.org/showcase/
---------------cortado----------------


Ejemplo:
ecasbas@laptop:/#./anemone pagedepth http://www.wordpress.org
Depth: 0 Count: 1
Depth: 1 Count: 17
Depth: 2 Count: 6
Depth: 3 Count: 4


Más ejemplos en:
ecasbas@laptop:/var/lib/gems/1.8/bin$ ls /var/lib/gems/1.8/gems/anemone-0.3.0/lib/anemone/cli
count.rb  cron.rb  pagedepth.rb  serialize.rb  url_list.rb


Una característica que me interesaba, era poder indicar el nivel de crawling, por defecto no limita la profundidad del crawling. Para ello, anemone tiene la opción :depth_limit.
En el archivo:
/var/lib/gems/1.8/gems/anemone-0.3.0/lib/anemone/core.rb
Cambiamos:
  # by default, don't limit the depth of the crawl
      :depth_limit => false,
por
  # by default, don't limit the depth of the crawl
      :depth_limit => 1,
para que realice un crawling de nivel 1.

Uno de los pocos inconvenientes es que sólo consigue URLs del dominio solicitado, si este apunta a otro dominio diferente no lo sigue.


UPDATE (27-1-2010): Es posible que para URLs con HTTPS al ejecutarlas de un error similar a: /usr/lib/ruby/1.8/rubygems/custom_require.rb:31:in `gem_original_require': no such file to load -- net/https (LoadError).

Eso es debido a que no tenemos las librerias ssl de ruby, para solucionarlo bastará con:
sudo apt-get install libopenssl-ruby
o algo similar si tu sistema usa otro gestor de paquetes.


 


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]

lunes, 11 de enero de 2010

Recursos online para aprender inglés

Auto-apunte de referencia.

Este es el sitio más completo y con mejores recursos para aprender inglés que conozco en la red; Dispone de podcasts, mp3 y scripts para la lectura de cada historia junto con vocabulario, phrasal verbs, expresiones comunes. Todo ello de diferentes temáticas muy bien organizado y actualizado diariamente. Lo mejor es explorarlo y descubrir todas las actividades que ofrece. A raíz de él también descubrí http://www.listen-to-english.com

Technology, Entertainment, Design son las siglas de TED; las conferencias de las mentes más brillantes. La mayoría de los videos pueden verse con subtítulos en inglés o castellano entre otros gracias al proyecto de traducción abierto, donde tú también puedes colaborar si lo deseas.
Podeis comprobar algunas curiosidades de la lengua de Shakespeare y ver las 10 palabras más comunes, las más largas...

3. Películas y series en VSO, cómo esto es sólo un blog, no hay peligro. Estos servicios los he conocido recientemente a través de twitter:

4. Vídeos de la Casa Blanca, por el mismo precio, te pones al día de temas políticos de interés y aprendes inglés con los videos subtitulados como este tan divertido. (la mejor parte en el último minuto :-) )

4. Skype
Tiene varios recursos para aprender inglés de manera gratuita. Hace tiempo, no recuerdo bien como, contacté con alguien de Canada. Era un antiguo profesor de Inglés ya jubilado, qué dedicaba parte de su tiempo libre a enseñar a través de Skype. Estuvimos en contacto durante 2 meses, 3 veces a la semana. Hablando, haciendo ejercicios que me enviaba. Fue una gran experiencia.

5. Colaborar en proyectos de traducción: Puedes buscar un proyecto de interes y colaborar en su traducción, una manera práctica de aprender inglés. En este punto, hay que tener un cierto nivel para no mermar la calidad del proyecto.

6. Itunes y blogs: En itunes, en la sección de podcasts hay miles de recursos al igual que blogs. Pero únicamente los 4 puntos anteriores son mi recurso recurrente para el ingles online.

En modo offline, tambien tambien suelo hacer:

7. Intercambio de idiomas: En el mes que estuve en Londres estudiando inglés, a través de un anuncio en un corcho de la academia que asistía, realicé intercambio de idioma con una nativa; 30 minutos hablando inglés y 30 minutos hablando castellano. Fue una buena experiencia.
En España, a través de universidades y centros de idiomas, seguro que se puede encontrar este tipo de actividades.

8. Intercambio de habilidades: Lo practique hace tiempo con una antigua profesora de inglés. 30 minutos de clases de ingles a cambio de 30 minutos de consultoría informática. :-)
En diferentes ciudades de España hay iniciativas similares con todo tipo de habilidades.

9. Televisión: Con la TDT tenemos la opción de ver en V.O algunos programas, series y dibujos animados.

¿Conoces algún otro recurso igual de interesante?, si es así, déjalo en los comentarios.


Actualización 11-1-09 a las 23:47: A través de @yoriento, cómo aprender un idioma sin estudiar.

Actualización 19-01-10: Diccionario lexicológico.

Actualización 23-02-10: Ejercicios de gramática

Actualización 3-5-2010: Englishcentral, un proyecto de Google Ventures  

Actualización 23-06-2010: 8 técnicas realmente efectivas para mejorar tu inglés (con mención incluida a este artículo)

Actualización 24-08-2010: Revisión de gramática

Actualización 20-9-2010: Escuela idiomas Pamplona

Actualización 15-11-2010: Aprende con música

Actualización 15-11-2010: Cómo se pronuncia 

Actualización 25-11-2010: Todos los sonidos (fonemas) del inglés

Actualización 14-5-2011: NetSpeak (When in doubt about how something is written) 

viernes, 8 de enero de 2010

Si algún problema tiene el Software Libre, no es de comunicación

Uno de los argumentos (léase FUD) más escuchados en contra del uso de Open Source  o Software Libre (FLOSS) en la empresa es: "No existe una garantía de respaldo, o mantenimiento". Independientemente del modelo de negocio del Open Source, sí por algo se caracterizan las comunidades de desarrollo de este modelo, es por su espíritu abierto y colaborativo.

Si utilizas un software y por cualquier motivo necesitas ayuda o información más allá de lo que está disponible en la documentación oficial, ¿quién mejor para responderte que alguien del equipo de desarrollo?. En el campo del software propietario esto sería inconcebible, pero en el software libre es una realidad.

La última experiencia la tuve hace algunas horas antes de escribir este post. Había descubierto Whatweb, una herramienta de seguridad que permite identificar sistemas de administración de contenido como el de la presidencia española, plataformas de blogs, software de análisis/estadísticas y librerías javascript entre otras cosas. En su archivo de instrucciones (README) informa de proyectos relacionados en el cual aparece w3af. Ambos proyectos tienen el fin de convertirse en el nmap de la web.

Me dispongo a probar la herramienta whatweb, escrita en ruby. No tengo nada de experiencia con ruby, pero en el archivo (INSTALL) vienen las instrucciones para instalarlo en Ubuntu.

Install Ruby
---------------------------------------
sudo apt-get install ruby OK

Install RubyGems
---------------------------------------
sudo apt-get install rubygems OK


Install Anemone, Spidering library
---------------------------------------
sudo apt-get install libxslt-ruby OK
sudo apt-get install libxslt1-dev OK


sudo gem install anemone
ERROR:  While executing gem ... (Gem::GemNotFoundException)
    Could not find anemone (> 0) in any repository

Investigando, a través de varios buscadores veo que el comando gem, es la interfaz del sistema de paquetes rubygems, y anemone es una librería ruby para programas que crawlean sitios web. Alguién con un problema similar, comenta que se soluciona borrando el archivo source_cache, algo que tampoco funciona. Instalando ruby-dev avanza, pero todavía me da algún problema.

En ese archivo INSTALL, al final pone "Please contact me if these installation instructions don't work for you.", y eso hago, envio un correo al desarrollador informando de mi problema para instalarlo.

A las pocas horas, quizá por el cambio horario ya que el desarrollador es de Nueva Zelanda me escribe con varias instrucciones sobre como proceder, entre ellas:

$ sudo gem sources -a http://gems.rubyforge.org 
$ sudo gem update
$ sudo gem install anemone

qué solucionan mi problema. En ese correo también me informa de otras herramientas similares y cualquier feedback y colaboración es bienvenida. Se puede investigar como hacer nuevos plugins para que la herramienta sea capaz de detectar nuevos sitios; esta característica me viene como anillo al dedo en forma de información para desarrollar mi trabajo actual.

Creo que esto resume bien el espíritu del Software Libre, de comunidad, de ayuda, y compartición de conocimiento. Kevin Kelly, en What Matters Now apunta otras ventajas del modelo Open Source.
"Open-Source DNA: There will surely be people who will not share any part of their genome with anyone under any circumstances. that’s okay. But great benefits will accrue to those who are willing to share
their genome. By making their biological source code open, a
person allows others to “work” on their kernel, to mutually
find and remedy bugs, to share investigations into rare bits, to
pool behavior results, to identify cohorts and ancestor codes."
No abogo por una vía única, creo que la mejor opción y la experiencia lo demuestra, es usar la mejor solución (propietaria o libre) para las necesidades del momento; pero acciones como esta, demuestran que el software libre es conocimiento compartido y beneficio para la comunidad.

ACTUALIZACIÓN: Tras alguna reinstalación, al volver a probar WhatWeb me encontre con otro problema:

/usr/bin/gem:10:Warning: Gem::manage_gems is deprecated and will be removed on or after March 2009.
/usr/bin/gem:23: uninitialized constant Gem::GemRunner (NameError)

qué se solucionaba añadiendo en /usr/bin/gem la línea
require 'rubygems/gem_runner'
después de
require 'rubygems'

Después de esa pequeña modificación, #sudo gem install anemone funcionará correctamente.

domingo, 3 de enero de 2010

Clasificación de amenazas de sitios web (v 2.0)

La clasificación de amenazas de WASC versión 2.0 por fin ve la luz tras varios años de trabajo entre bastidores. Robert Auger ha liderado este proyecto que ha calificado cómo "el proyecto más desafiante y estimulante intelectualmente."

El proyecto de clasificación de amenazas web de WASC, tiene el objetivo de clasificar y organizar las debilidades y ataques que pueden llevar a comprometer a un sitio web, sus datos y usuarios. El proyecto intenta crear una terminología estándar para describir las amenazas de seguridad web. Con el fin de tener un lenguage consistente en el que; desarrolladores de aplicaciones, profesionales de la seguridad, vendedores de software, y auditores de seguridad puedan referirse a términos relacionados con la seguridad web.

Esta versión 2.0, viene a suplir las carencias de su antecesora 1.0, que por la naturaleza de su contenido quedo desfasada hace ya tiempo. En esta versión se han añadido secciones, se han actualizado otras y se ha reorganizado la terminología entre otras acciones. Se trata de un proyecto vivo que irá evolucionando conforme lo hace la tecnología y sus amenazas.

Tuve la oportunidad de colaborar en algunas de las definiciones de las amenazas web, y puedo asegurar que; discutir con Ryan Barnett (autor de Preventing Web attacks with apache entre otros), leer Papers de Amit Klein y ver cómo Robert Auger coordina todo el proyecto de Threat Classification WASC v2.0, son acciones totalmente estimulantes.

WASC son las siglas de Web Application Security Consortium, su misión es; desarrollar, adoptar y recomendar estándares para la seguridad de aplicaciones web.

Está formado por un grupo de expertos y representantes de organizaciones que producen Open Source y estándares de mejores prácticas para la seguridad en el WWW. Se trata de una comunidad activa que facilita el intercambio de ideas y colabora en proyectos abiertos de la industria de la seguridad.

Si te interesa el campo de la seguridad Web y te gustaría participar en alguno de los proyectos de la WASC, tú también puedes contribuir.