Crack the hash




Como sabéis, casi siempre las constraseñas son hasheadas. Un hash de una cadena de caracteres es una conversión algorítmica de dicha cadena, de tal manera, que desde la restultante (o hash), no se puede volver a la cadena de texto plano base. Por tanto, la única manera que tenemos para extraer el texto plano de un hash es, probar una y otra vez hasta dar con la cadena correcta.

De esta manera, si tenemos una cadena CADENA, que convertimos en un hash HASH, la única manera de hacer la operación contraria es probar el hash de todas las posibles conbinaciones.

Se habla muchas veces de como son las contraseñas ideales, de que cuanto más aleatoria, más caracteres de distinto tipo ($4a^*@eE) mejor, y como la longitud es uno de los factores más importantes, las hace más dificiles de crackear, sin embargo, ahora, me gustaría darle un enfoque más matemático al asunto. Para esto, y para ver las cosas de una manera más práctica sin pararme a repetir una y otra vez el decálogo de "buenas prácticas poniendo contraseñas"; y como no todo depende de nosotros, me gustaría antes situar al lector en el punto tecnológico en el que estamos respecto a la seguridad


¿En que punto estamos?


Atendiendo a la ley de Moore y a los avances que se darán en computación cuantica y a las posibilidades que nuevos materiales como el grafeno dan a la informática, podemos decir que el futuro pinta negro, las contraseñas dejarán de ser útiles cuando la cadena de texto a memorizar tenga que ser suficientemente larga para ser segura, que nadie la pueda recordar.

Así, hace años, cuando internet era algo que estaba empezando, las contraseñas de unos pocos dígitos eran algo normal, y bastante seguro. Los procesadores tardaban años en iterar 15 caracteres. Nadie con un ordenador domestico podía permitirse hacer ese cálculo, de hecho, si la mayoría intentáis hacerlo en vuestras casas, para caracteres alfanuméricos, probablemente tardéis un par de días utilizando la potencia de un procesador decente.

Pues bien, los procesadores se han pasado de moda. Hace unos años, la discusión en password cracking era CPU vs GPU, hoy, ya hemos resuelto esa cuestión, la GPU ha ganado de largo. Para crackear contraseñas, ya no se mandan las operaciones matemáticas y los algoritmos a los 4 núcleos de un procesador, si no a los miles de hilos de nuestras tarjetas gráficas. Sin ir más lejos, en ordenadores destinados a hacer grandes cálculos, se están dejando de utilizar procesadores, para utilizar gráficas con tecnología CUDA (procesamiento paralelo). Esto aplicado a la seguridad de las contraseñas, permite romper contraseñas a mucha más velocidad que en el pasado.


En este sentido, cualquiera que tenga un par de gráficas GTX650 en SLI y con CUDA, puede romper una contraseña alfanumérica de 15 caracteres en un tiempo irrisorio.



¿Como afecta la longitud, los caracteres, etc al tiempo de crackeo?

Antes de pasar a la demostración práctica, que se hará con una GTX550m en un Windows 7 con Hashcat-lite 64x vamos a dejar clara una cosa, casi todos los hashes que son robados de diferentes servidores están hasheados multiples veces y son más seguros, cuando se obtiene un hash tras hackear una página web o sus bases de datos, no suele haber nada que impida obtener todas las hashes de esa misma página. Así pues, depende de los usuarios que tenga dicha página, pero si es un poco popular, pueden salir miles de hashes. Esto es una ventaja; cuando te enfrentas a una lista hasheada de estas características, prima la eficiencia: estadísticamente, casi todos los usuarios utilizan minúsculas o números, y raras veces la contraseña pasa de los 12 caracteres. Así acotamos bastante el tiempo que empleamos en cada una, dejando las más difíciles sin resolver en pos de la eficiencia.

Sé que md5 se está pasando de moda, pero (aunque no haya datos al respecto), y que sigue siendo el algoritmo más utilizado, aunque por suerte, cada vez se está mudando más a sha1.

Entre cada experimento dejaremos un tiempo intermedio para que la gráfica vuelva a enfriarse. Para cada prueba se han hecho varias pruebas y se ha realizado la media.



Cadena                       Tiempo

4 digitos                   1 segundo
5 digitos                   2 segundos
6 digitos                   4 segundo
7 digitos                   2 minutos 32 segundos
8 digitos                   16 minutos 48 segundos
9 digitos                   1 hora 34 minutos 14 segundos
4 alphanumerico      1 segundo
5 alphanumerico      1 segundo
6 alphanumerico      3 segundos
7 alphanumerico      1 minuto 3 segundos
8 alphanumerico      14 minutos 19 segundos
9 alphanumerico      1 hora 40 minutos 1 segundo



De estos resultados podemos ver que:

  • Si no se especifica un charset específico los resultados números alphanumerico es similar. Esto se debe a que se divide el segmento completo de combinaciones posibles a calcular entre los hilos que tenga la GPU en cuestión. Por lo tanto podemos decir que no hay un patrón continuo de prueba.
  • Si nos centramos en la eficiencia, para listas muy largas a computar, probar hasta 6 caracteres es lo ideal. Para listas medias  hasta 7 está bien. Aunque siempre dependerá de la GPU. Con una GTX690 y calculando hilos y rendimiento creo que sería optimo hasta con 9 caracteres. 
  • Si jugamos con las máscaras, y pensando en la gente que posiblemente ponga su número de teléfono como contraseña, tendríamos solo dos grupos de 8 caracteres, comenzados por 9 y por 6. Con la gráfica de sobremesa saldría bastante rápido.
  • Aunque no haya sido probado para este post, los caracteres especiales y extranjeros multiplican el tiempo de prueba.
  • El algoritmo md5 no es seguro.


¿Todo esto que implica?

Para webmasters:

  • Hay que cambiar a otros algoritmos más fuertes o anidar varios, por ejemplo md5(sha1(md5)). 
  • Es buena idea utilizar salts.
  • Obliga al usuario a poner una contraseña diversa y algo larga.
  • Contrasta los hashes almacenados contra una lista propia de contraseñas ya rotas, advierte a los usuarios de los casos positivos.
Para usuarios:

  • Cuanto más larga sea la contraseña, en un hipotético robo de datos, menos probabilidades de que rompan la tuya.
  • Utilizar símbolos especiales, por ejepmlo "+-#@€¬ñ" hace que la contraseña sea más fuerte.
  • El uso de mayúsculas da bastante más seguridad a la contraseña ya que agrega 28 probabilidades por cada carácter. 
  • Utiliza contraseñas diferentes para cada cosa.
  • Los nombres o palabras que hay en el diccionario NO son buenas contraseñas. Existen por internet listas precomputadas de nombres, palabras, etc.
  • Cuando se crackean contraseñas largas, normalmente de más de 12 caracteres, se guardan en diversas bases de datos para que no haga falta calcularlas de nuevo. Contraseñas únicas, es lo mejor. 




0 comentarios:

Publicar un comentario en la entrada

ShellShock Labs es un blog dedicado a seguridad y hacking en general, un lugar donde buscamos que la gente participe con sus opiniones.

Síguenos




Posts Populares