02 noviembre 2009

Una implantación de C(r)aptchas. Bitacoras.com

Los captchas es un tema que hemos tratado en este blog repetidas veces, como la ocasión de Tuenti, de Digg, el caso de MegaUpload o la charla del Curso de Verano de Salamanca. Hoy, aprovechando que se han dado a conocer los nominados finales en los premios Bitacoras.com repetimos con su curioso y divertido caso, que a más de uno le hará sonreír de medio lado.

Bitacoras.com para muchas de sus tareas implanta esta contramedida con el objetivo de evitar procesos automáticos, como por ejemplo en la inserción de noticias o durante el concurso de blogs, sumar votos.



Si nos fijamos en la dirección de origen del captcha (la etiqueta IMG), se puede observar que está formada por un hash md5. En este caso: 7d1f58aeb175fd9c9425467c480cfc7f que corresponde con el texto de la imagen: 859061CD y que en todos los casos en las imágenes generadas su texto corresponde a un tamaño de 8 caracteres de un mapa hexadecimal, es decir, siempre se compondrá con los caracteres: 0123456789ABCDEF.

[f00f@sbd bitacoras]$ echo -n '859061CD' |md5sum -
7d1f58aeb175fd9c9425467c480cfc7f -


Con esta información es suficiente para encontrar un sistema rápido que permita saltarse el control sin necesidad de procesar la imagen del captcha, que por otro lado, y sea dicho de paso, es fija en tamaño, colores y rotación, así como en la imagen de fondo. Lo que la convierte también en muy débil ante otros ataques de tipo OCR.

Volviendo al nombre de archivo y su contenido, con las tablas rainbow podemos generar una combinación con todas las posibilidades en un tamaño de 640Mbs y consultarla cada vez que se solicite un captcha.

Para generar las tablas, primero es necesario modificar el archivo 'charset.txt' y añadir la línea siguiente línea:
alpha-hex = [ABCDEF0123456789]
Posteriormente se genera y ordenando la tabla con el comando "rtgen"

[f00f@sbd bitacoras]$ ./rtgen md5 alpha-hex 8 8 0 1000 40000000 0
hash routine: md5
hash length: 16
plain charset: ABCDEF0123456789
plain charset in hex: 41 42 43 44 45 46 30 31 32 33 34 35 36 37 38 39
plain length range: 8 - 8
plain charset name: alpha-hex
plain space total: 4294967296
rainbow table index: 0
reduce offset: 0

generating...
100000 of 40000000 rainbow chains generated (0 m 49 s)
[...]

[f00f@sbd bitacoras]$ ./rtsort md5_alpha-hex#8-8_0_1000x40000000_0.rt

Tras finalizar, ya se puede consultar sobre las tablas los nombres de archivo y por lo tanto, averiguar su valor:

[f00f@sbd bitacoras]$ ./rcrack *.rt -h 7d1f58aeb175fd9c9425467c480cfc7f
[...]
searching for 1 hash...
cryptanalysis time: 0.00 s
5984 bytes read, disk access time: 0.00 s
searching for 1 hash...
cryptanalysis time: 0.00 s
5984 bytes read, disk access time: 0.00 s
searching for 1 hash...
plaintext of 7d1f58aeb175fd9c9425467c480cfc7f is 859061CD
cryptanalysis time: 0.00 s

statistics
-------------------------------------------------------
plaintext found: 1 of 1 (100.00%)
total disk access time: 0.03 s
total cryptanalysis time: 0.76 s
total chain walk step: 498501
total false alarm: 309
total chain walk step due to false alarm: 119601

result
-------------------------------------------------------
7d1f58aeb175fd9c9425467c480cfc7f 859061CD hex:3835393036314344

En algunas pruebas el tiempo que ha tardado en obtener el resultado es menor al segundo y en otros ha llegado a superar los 10. En cualquier caso, es una espera más que aceptable para una resolución del 100%.

Agradeceros a todos los votos recibidos. Nos habéis situado en los seis primeros puestos, siendo realmente el primer blog íntegramente de seguridad de la categoría, que por otro lado, no entiendo muy bien la mezcla con los de Software.

Adelantaros que en nuestra próxima entrada contaremos, como se podría haber clasificado un blog con unos cuantos comandos que sumarían votos automáticos. Algo que desde luego no hemos hecho nosotros que finalmente hemos quedado sextos :-)


9 comments :

Miguel dijo...

zas! en toda la boca

estas entradas son de las que más me gustan :)

vierito5 dijo...

jajaja muy buena Alejandro

Yo tampoco entiendo la división, hay blogs sobre seguridad de sobra para formar un grupo grande aparte.

chencho dijo...

Genial la sutileza en el título ;)

ramandi dijo...

Buenísimo!! Y encima no tienes que compartir el mérito con otros 400.000 chalados ;-)

Anónimo dijo...

Os mereciais ganar, aunque realmente en vuestra categoria ya sois los mejores. El año que viene espero que hagan 2 grupos diferentes, sino siempre podeis aplicar esto xD

Me quedo con el "no hemos ganado porque no hemos querido ;) clack-clack"

Anónimo dijo...

jejeje... hace ya tiempo vi un captcha que me dejó a cuadros... por lo insólito. Veo que aún lo tienen en http://www.so4h2.com/

Anónimo dijo...

Me uno a Miguel...

Newlog

Anónimo dijo...

+1 Miguel

Asfasfos dijo...

Minipunto y punto para el equipo de Security By Default :)