Implementando ataques de fuerza bruta en valores hash en Javascript

3

Estoy trabajando para mi tesis de licenciatura al final de la cual mi objetivo es implementar un cracker de hash basado en Javascript de prueba de concepto. La idea es trabajar así: los usuarios pueden enviar un valor hash junto con información sobre el algoritmo utilizado. (Otros) los usuarios también pueden hacer clic en un botón en el sitio web para participar en el proceso de craqueo. La tarea del servidor es aceptar y dividir las "órdenes" enviadas en rangos, dependiendo del número de trabajadores disponibles. Los rangos se envían a los clientes que hicieron clic en dicho botón.

Actualmente estoy atascado con la gran pregunta de cómo implementar realmente esta función de fuerza bruta. Por lo tanto, mi principal problema ahora es que, francamente, todavía no estoy tan acostumbrado a Javascript. Para empezar, solo usaría un juego de caracteres codificado: alfanumérico, mayúsculas y minúsculas, sin caracteres especiales. El problema es que, honestamente, no tengo absolutamente NINGUNA pista de cómo implementar realmente la función que probaría las combinaciones de caracteres, sobre cómo programar eso. Me imagino usando una matriz normal que contiene el conjunto de caracteres, luego dos cadenas. Una cadena contendrá el rango, la otra contendrá las combinaciones probadas. Así que de alguna manera tendría que recorrer el conjunto de caracteres y las cadenas quizás con bucles en cascada o algo así, pero estoy realmente atascado con la pregunta de "cómo" exactamente :). No espero que ninguno de ustedes realmente me proporcione el código fuente completo para tal función (a menos que quiera, por supuesto), pero realmente apreciaría algunas sugerencias o explicaciones sobre cómo implementar una función de fuerza bruta. Tampoco me preocuparía por el rendimiento o la codificación optimizada en este momento, sino por la codificación completa, o como quiera llamarlo.

    
pregunta slagjoeyoco 05.09.2012 - 18:44
fuente

2 respuestas

3

Primero define el espacio de contraseñas potenciales. Luego numéralas secuencialmente.

Por ejemplo, suponga que define las posibles contraseñas como "secuencias de ocho letras y dígitos". Este es un alfabeto de 62 signos (26 letras minúsculas, 26 letras mayúsculas, 10 dígitos). Así que hay 62 8 = 218340105584896 contraseñas para probar. Las contraseñas se asignan fácilmente a números enteros en el rango 0..218340105584895 considerando que las contraseñas son una representación de base 62 (es decir, 'a' es 0, 'b' es 1, ... 'z' es 25, 'A' es 26, ... 'Z' es 51, '0' es 52 ... y '9' es 61). Ahora que las contraseñas potenciales son solo números enteros en una secuencia consecutiva, es fácil distribuir rangos.

Por supuesto, el rendimiento de la función hash implementada en Javascript será muy decepcionante. Una sola PC con una buena GPU puede probar más contraseñas MD5 que 1000 clientes que usan Javascript. Es posible que desee crear versiones que utilicen Java y / o .NET (Silverlight): estos lenguajes de programación tienen mucha más capacidad (no tan buenos como C, pero al menos en el mismo orden de magnitud).

Editar: a partir de tu comentario, entiendo que también deseas mantener el hash de destino algo privado, y no enviarlo a las máquinas de craqueo. Esto obliga a las máquinas de craqueo a devolver todos sus hashes (o parte del mismo) al servidor, y tendrá un problema de ancho de banda. Cada máquina de craqueo podría devolver, digamos, solo los dos primeros bytes de cada hash computado; el servidor entonces sabe qué contraseña los candidatos coinciden con el hash de destino en los primeros dos bytes. Esto reduciría el problema por un factor 65536, y luego el servidor puede terminar el trabajo (volviendo a probar los candidatos correspondientes en su propia CPU). Sin embargo, con un ancho de banda entrante de 10 MBytes / s, podría recibir solo unos 5 millones de hashes por segundo, y si se dirige a un hash "simple" (como una sola iteración de MD5), entonces este es un rendimiento muy pobre ( solo el servidor, en su propia CPU, puede probar muchas más contraseñas por segundo). Este sería un esquema válido para un hash lento (como bcrypt ) donde cada máquina de craqueo ser capaz de calcular cien hashes por segundo a lo sumo (pero entonces, realmente no desea usar Javascript ...).

    
respondido por el Thomas Pornin 06.09.2012 - 00:12
fuente
2

En primer lugar, suena como si necesitaras formular una estrategia de cracking, y para hacerlo debes ver qué herramientas están usando los piratas informáticos. Aquí hay una bonita publicación de blog de alguien. quien rompió 122 millones de hashes . También se vincula a una gran lista de hashes de contraseñas reales que puede utilizar para su tesis. Creo que todos estos hashes no tienen sal, así que eso facilita las cosas.

RainbowCrack y JohnTheRipper son herramientas que han existido durante mucho tiempo y son herramientas populares para romper hashes. Pero lo que está haciendo es bastante diferente, es más parecido a una nube, ya que está dividiendo una gran tarea que debe ser completada por una gran cantidad de nodos. Existen herramientas de craqueo en la nube como Cryptohaze que parecen prometedores.

    
respondido por el rook 05.09.2012 - 19:04
fuente

Lea otras preguntas en las etiquetas