Blog

Crackear Contraseña – Parte III – Conceptos básicos

En los artículos anteriores (Parte I y Parte II) vimos algunas herramientas para crackear contraseñas. En éste vamos a ver unos conceptos básicos, para comprender mejor qué hemos hecho y para que, a la hora de plantearnos en una aplicación cómo almacenar una contraseña, tengamos una base.

Una de las opciones que disponemos, la más vulnerable, es guardar la contraseña en texto plano. Esto quiere decir que se guarda tal cual la hemos introducido. Por supuesto, cualquier persona que pueda acceder a la base de datos en la que se encuentre, tendrá acceso a la contraseña. No hay seguridad al aplicar este método.

Bien, el siguiente paso que se nos puede ocurrir es codificada la contraseña al guardarla. Para ello podemos utilizar base64, o cualquier otro método. Sigue siendo inseguro porque, si conocemos el cifrado, se puede volver al estado anterior. la mayor parte de los métodos de cifrado, son fácilmente detectables.

Para evitar la vuelta a tras, podemos utilizar funciones hash. Estas funciones nos devuelven un resultado pero, a partir de él, no es posible conocer qué valor lo produjo. Son funciones de un solo sentido. Estas funciones tienen un incoveniente: las colisiones. Si el algoritmo utilizado genera colisiones, es decir, que dos valores produzcan el mismo hash, será más fácil encontrar el un valor que sea aceptado como contraseña.

Un algoritmo muy utilizado es el MD5, pero éste se considera inseguro, precisamente porque su salida siempre tiene 32 caracteres. Esta longitud no es muy larga, lo cual puede hacer que haya colisiones.

En los sistemas GNU/Linux, es muy posible que la clave de los usuarios estén almacenadas con este tipo hash. En algunas distribuciones se ha cambiado por SHA512, que se considera mucho más seguro. Es interesante que revisemos esa configuración y la cambiemos, si el algoritmo utilizado es MD5.

Disponemos de utilidades para consultar on-line nuestros hashes. Una de ellas es findmyhash, que nos permite buscar un valor que corresponda con nuestro hash.

Hasta aquí, los ataques que se pueden hacer a las contraseñas alamacenadas con hash, son mediante diccionario y fuerza bruta. El primero consiste en probar claves alamacenadas en un fichero. Cuánto más grande y completo sea el diccionario, más probabilidad de conseguir la clave tendremos. El segundo es probar todas las posibles combinaciones, hasta dar con la clave.

Otro método, similar al diccionario, es comprobar directamente un diccionario con claves hasheadas (rainbow tables).

Para reducir las colisiones y, además, evitar que funcionen los diccionarios, podemos echarle “sal” a nuestra contraseña.

¿Esto que es?

Antes de almacenar la contraseña, generamos un valor aleatorio, mezclando diferentes símbolos. Éste valor debe ser distinto por cada usuario y contraseña, es lo que se conoce como salt. Esto lo concatenamos a la contraseña y, después, aplicamos la función hash. De esta manera, hemos complicado el crackeo de las contraseñas:

  1. Una misma clave no va a generar el mismo hash.
  2. Los dicionarios difícilmente incluirán las claves junto con los salt.
  3. Hay que eliminar el salt para poder utilar la clave, en caso de obtenerla.

Un ejemplo de esto lo podemos ver, en los sistemas GNU/Linux, en el archivo /etc/shadow:

sal

Los campos en este archivo, al igual que en el /etc/passwd, se separan con “:”. El primer campo es el nombre del usuario, el segundo, es la clonseña. Podemos ver que también tienen separaciones, esta vez utilizando el “$”. Veamos qué almacena:

  • En primer lugar, el hash utilizado: 6, es el correspondiente a SHA512.
  • En segundo lugar, el salt: NaWEyQlU
  • En tercer lugar, la constraseña salteada y hasheada.

Además de esto, podemos utilizar funciones hash, pero que permitan retardo. Esto va a complicar el crackeo pues, si una función hash es lenta, un ataque de fuerza bruta tardará demasiado. Esto se puede coseguir mediante programación, incluyendo retardos en la función que valide la contraseña, o utilizando algoritmos como blowfish. En su implementación en PHP, podemos especificar el coste de aplicar el algoritmo. Esto va a hacer que, en el proceso de login, nuestra aplicación sea más lenta. En este caso, será más difícil un ataque de fuerza bruta exitoso, por el tiempo que llevará descifrar la contraseña. Debemos valorar cuánto costo vamos a aplicar, que dependerá de cuántos usuarios concurrentes vayamos a tener. Aún así, a la hora de desarrollar aplicaciones, es una opción que deberíamos aplicar.

Espero que os haya gustado, happy hacking!!

Mª José Montes – mjose@highsec.es – @MMontesDiaz

  1. Garito
    Garito11-20-2013

    Gracias, siempre me quedaba la duda de si es lo suyo guardar el salt y el hash juntos o que pero veo que lo estoy haciendo bien

    Aprovecho para proponerte un monografico pensado para los desarrolladores web que hay una patada!

    Saludos!

Leave a Reply

*

    No Twitter Messages