Si bien este post va dirigido a las contraseñas en Windows, se podría aplicar a las contraseñas en general.
Como ya comenté en un anterior post, nos podemos encontrar con unos ficheros llamados rainbow tables. Estos son unos ficheros donde se tiene una gran colección de hashes correspondientes a contraseñas. ¿Para qué sirve tener una colección de hashes? En principio, nos permitirá hacer unas cuantas cosas. Por ejemplo. Dado el hash de una contraseña, se puede buscar éste dentro de la tabla.
También hay que tener en cuenta que dependiendo del conjunto de caracteres que se esté empleando, será más fácil, o no, encontrar la contraseña. Por el lado de las rainbow tables la dificultad radicará en que si se están utilizando caracteres especiales, como pueden ser guiones bajos (_), guiones (-), o, si vamos más allá, eñes (Ñs), acentos, etc, hará que el fichero donde están almacenados los hashes ocupen más que si sólo se tuvieran las combinaciones sencillas del ASCII. Y, desde el punto de vista de la contraseña, porque cuantos más caracteres especiales se utilicen, unido a la longitud de ésta, más costará el poder encontrar dicha contraseña dentro de las tablas, si es que está representada ahí dentro. También es cierto que a medida que la tabla va creciendo es más probable que se produzca una colisión. Y cuando hay colisiones implica que hay un hash que valdría para más de una contraseña.
Es muy, muy importante darse cuenta de que a medida que se van añadiendo caracteres a la combinatoria de las posibles contraseñas de las que queremos almacenar su hash, más ocupará el fichero donde estén almacenadas. Ayer estuve buscando material para poder hacer alguna demo y, para que se vea hasta donde puede llegar el tamaño de una colección de estas, un bicharraco de estos que contenga los hashes para LM de una longitud máxima de 7 caracteres, ocupa 120 GB.
En este sitio hay una buena presentación en la que se ve cómo se pueden generar estas tablas, y algunas características que se me queden colgadas o que no sean muy precisas.
De momento no puedo dar muchos más detalles. De todas maneras, como ya he dicho, quiero hacer una demo con una de estas para que veáis cómo funcionan.
Mostrando entradas con la etiqueta rainbow tables. Mostrar todas las entradas
Mostrando entradas con la etiqueta rainbow tables. Mostrar todas las entradas
miércoles, 9 de diciembre de 2009
domingo, 6 de diciembre de 2009
Contraseñas en Windows I
Algo que es de cajón: En Windows se utilizan contraseñas. Y éstas se almacenan en el sistema. Pero, si éstas se almacenaran en claro, del mismo modo que estamos leyendo este texto, sería muy, muy fácil obtenerlas. Sólo habría que encontrar el lugar donde están guardadas y abrir un bloq de notas. Ya está.
Y ahí está el quid de la cuestión. Que no es tan fácil hacer eso. Porque no se almacenan en claro. Estas se almacenan en lo que se llama (la) SAM (cuando se habla de eso se dice "la SAM esto, la SAM lo otro..."). La SAM es un fichero (no una BB.DD) que está en el registro de Windows donde se guarda la correspondencia usuario / contraseña utilizando hashes.
¿Qué es un hash? Un hash es un algoritmo que al aplicarlo sobre un elemento dado (en este caso, la contraseña), se bebería de obtener una codificación única. Y digo "se debería" porque si, dados dos elementos distintos, se produce el mismo hash, tenemos una colisión.
Ahora que sabemos dónde se guardan las usuarios y sus contraseñas (en la SAM) y qué usa para que no se vea la contraseña (un hash)... ¿Cuál es su algoritmo? Bueno. Yo puedo contar las características de los distintos algoritmos que utiliza. Porque, a lo largo del tiempo, Windows ha ido creando distintos formatos.
Y ahí está el quid de la cuestión. Que no es tan fácil hacer eso. Porque no se almacenan en claro. Estas se almacenan en lo que se llama (la) SAM (cuando se habla de eso se dice "la SAM esto, la SAM lo otro..."). La SAM es un fichero (no una BB.DD) que está en el registro de Windows donde se guarda la correspondencia usuario / contraseña utilizando hashes.
¿Qué es un hash? Un hash es un algoritmo que al aplicarlo sobre un elemento dado (en este caso, la contraseña), se bebería de obtener una codificación única. Y digo "se debería" porque si, dados dos elementos distintos, se produce el mismo hash, tenemos una colisión.
Ahora que sabemos dónde se guardan las usuarios y sus contraseñas (en la SAM) y qué usa para que no se vea la contraseña (un hash)... ¿Cuál es su algoritmo? Bueno. Yo puedo contar las características de los distintos algoritmos que utiliza. Porque, a lo largo del tiempo, Windows ha ido creando distintos formatos.
- Hash LM (Lan Manager):
- No se utiliza en red
- Se mantiene por compatibilidad hacia atrás. Es decir, para mantener la compatibilidad con sistemas antiguos.
- La longitud máxima es de 14 caracteres. Si la contraseña tiene mayor longitud no se guarda con en este tipo de hash. Si es menor, se añaden nulos hasta alcanzar esta cifra máxima.
- No es case sensitive, sensible a mayúsculas / minúsculas. Se escriba como se escriba, se guardará en mayúsculas.
- Utiliza ASCII puro y duro. No valen las Ñs ni los acentos. Se pueden utilizar 142 símbolos.
- La contraseña se separa en 2 mitades, cada una de 7 caracteres. (Por lo tanto, son 2 hashes, no 1).
- Como máximo, se puede conseguir una combinación de 6,8 · 1012 contraseñas.
- A partir de GPOs (de las que puede que hable en otro post) se puede evitar utilizarlas
- Hash NT
- La contraseña tendrá una longitud no fija, pero como máximo podrá ser de 127 caracteres.
- Es case sensitive, Permite utilizar 65.535 símbolos.
- Si nº caracteres es menor o igual a 14, llegamos aproximadamente a las 4,6 · 1025 contraseñas (set de caracteres de LM). Si es mayor, 2,7 * 1067 posibles contraseñas. (full charset). Si es igual a 127, podremos conseguir, 4,9 · 10611 combinaciones.
- No se rellena si faltan carcateres para llegar a un valor determinado (lo contrario a lo que hacía LM).
- Se utiliza el algorítmo MD4, por lo que hay colisiones.
- NTLM: v1 y v2
- Permiten autenticación por red.
- Funcionan de un modo parecido al MS-CHAP, desafío / respuesta.
- Se generan hashes de sesión, una vez se ha realizado la autenticación.
- Entre la versión 1 y la 2, es preferible utilizar la 2 (capitán obvio al rescate!!).
En general, los algoritmos de antes citados se pueden romper en mayor o menor medida por fuerza bruta. Si bien, los últimos, a nivel práctico, no sería viable por la gran cantidad de combinaciones existentes. Otra opción es utilizar unas rainbow tables. Unos ficheros con las contraseñas ya codificadas. (explicado de forma muy concisa). En otro post hablaré sobre las posibilidades de que esto puede brindar.
Espero que os gustara eso. Como siempre, se aceptan criticas.
Suscribirse a:
Entradas (Atom)
