Antes que todo, antes que nada, si lo que el lector quiere es conseguir la forma de entrar en una computadora de Windows XP o Windows Vista sin saber la contraseña, lo puede lograr con diferentes utilidades como lo son:
Windows Key (Pagando).
Offline NT Password & Registry Editor (gratis, pero mas difícil de entender y usar).
He probado ambas utilidades y les doy fe de que funcionan bien.
Ahora si el lector lo que quiere es averiguar la contraseña de una cuenta de usuario y entender como funciona el procedimiento, pues siga leyendo…
Primero debemos tener lo siguiente:
1) Tiempo para entender el tutorial y conceptos (sobre 1 hora).
2) HashCalc 2,01.
3) ophcrack Live CD Vista ó ophcrack Live CD XP.
Al descargar ophcrack LiveCd lo que estaremos descargando es una imagen que se puede quemar en un cd-r utilizando Nero Burning ROM o Magic ISO . Ophcrack viene tanto en su versión para Windows como en su versión para Linux. Las versiones ophcrack LiveCD lo que traen adentro es el sistema operativo Linux y traen adentro la versión de ophcrack que corre en Linux. Una vez que se ingrese el CD dentro de la computadora solo tiene que apretar donde dice “Graphical Mode” y esperar un rato, todo el proceso es automatico.
Todo el tutorial lo estoy desarrollando en Windows Vista 32 bits,Build 6000, con privilegios de administrador.
Tanto MD5, Sha128,Sha256, CRC, son algoritmos de una sola dirección, también se les conoce como funciones de HASH. Al MD5 Tu le pones un Input cualquiera digamos un archivo, o un texto y el te proporciona una OUTPUT de un largo fijo. Sí a ese Input le cambias una letras te proporciona otro OUTPUT bien diferente pero también de un largo fijo. Como muestro a continuación. Muchas veces a lo que aquí yo llamo OUTPUT, tambien se le conoce como clave, llave, Message digest o simplemente el Hash.
INPUT -> OUTPUTS
amor -> 5da2297bad6924526e48e00dbfc3c27a
Amor -> d21f3f8a8c140e8889147a0f810d04e3
amol -> 34754f2e7d395b4b26577121aa9b03e6
e -> e1671797c52e15f763380b45e841ec32
El truco es que nadie nunca pueda adivinar cual es el INPUT de un OUTPUT. Que alguien con mirar 5da2297bad6924526e48e00dbfc3c27a no me pueda decir eso salio de la palabra amor. El algoritmo MD5 es case-sensitive, eso quiere decir, que no es lo mismo un letra mayúscula que una letra minúscula. No importa que tan largo o corto sea el INPUT, el OUTPUT siempre sera del mismo largo 32 caracteres en el caso particular de MD5.
Podemos decir que los distintos algoritmos nos dejan representar de manera casi unívoca los diferentes INPUTS. ¿Porque digo de manera casi unívoca?
Sí de casualidad a dos INPUTS diferentes les diera el mismo OUTPUT, a esto se le llama una colisión, “collision”.
Sí de casualidad fueran iguales estos OUTPUTS entonces tendríamos una colisión.
amor -> 5da2297bad6924526e48e00dbfc3c27a
sencillo – > 5da2297bad6924526e48e00dbfc3c27a
El chance de que esto ocurra es (1/(16^32). “Bien poco probable pero probable“.
¿Que utilidad se puede obtener de esto de Hashing?
1) Se utiliza para verificar que un archivo de internet, no sea alterado de manera maliciosa.
2) Se utiliza para verificar que la descarga de un archivo de internet, no sea corrupta.
3 ) Por solo dar un ejemplo el programa llamado mirc utiliza internamente el CRC, cuando alguien intenta alterar mirc.exe (para hacer ingieneria inversa y crakearlo) , el algoritmo CRC lo detecta y no deja que se ejecute el programa.
4) Se utiliza para acelerar la búsqueda en un base de datos.
5) Se utiliza para encontrar archivos idénticos.
6) Por otra parte podemos utilizar el MD5 para verificar si podemos dejar entrar a alguien a un sistema (una computadora) . Simple e sencillamente se comparando los dos OUTPUTS.
IF ( 5da2297bad6924526e48e00dbfc3c27a equals d21f3f8a8c140e8889147a0f810d04e3 ) {
-> DEJARLO ENTRAR PERSONA EN EL SISTEMA
} ELSE {
-> NO DEJAR ENTRAR PERSONA EN EL SISTEMA
}
En este caso una computadora ejecutaría NO DEJAR ENTRAR PERSONA EN EL SISTEMA porque los dos numeros no son iguales.
————————————————————————————-
¿Porque matemáticamente hablando , no podemos revertir el OUTPUT hacia el INPUT?
X/8 = 10
en este caso sabemos que X = 80.
El signo %, se le conoce como el modulo.
35/6 = 5.8333333333333333333333333333333
X % 6 = 5 <- Para esta ecuación tenemos muchas respuestas.
35 % 6 = 5 <- Respuesta correcta
34 % 6 = 5 <- Respuesta correcta
33 % 6 = 5 <- Respuesta correcta
32 % 6 = 5 <- Respuesta correcta
En este caso X puede ser un infinidad distinta de valores. X puede ser 32,33,34,35.
————————————————————————————–
Cada vez que creas un cuenta de usuario en Windows 2000, 2003, XP o Vista y le pones una contraseña, Windows procesa tu contraseña por un algoritmo (función Hash) y crea un OUTPUT. Ese OUTPUT de tu contraseña se guarda en un archivo llamado sam (sin extensión). Que por lo general se encuentra en C:\Windows\System32\config\.
Cada vez que miras la pantalla del Logon de Windows y entras tu username y tu contraseña, el sistema operativo lo que hace es verificar los dos OUTPUTS internamente, de esa forma se sabe si te deja entrar o sí no te deja entrar. Windows verifica el OUTPUT de la contraseña que estas entrando en el momento VS el OUTPUT que se encuentra en el archivo sam, asociado al username que entrastes.
Windows en vez de utilizar MD5 o CRC, utiliza LM Hash y NTLM (NTLan Manager) para generar los OUTPUTS de las contraseñas. En el caso de Windows XP si la contraseña es mayor a 14 caracteres se utiliza NTLM, si la contraseña es menor de 14 caracteres se utiliza LM Hash. En el caso de Windows Vista LM Hash está desactivado por defecto y se utiliza NTLM.
Por default Windows protege este archivo sam para que nadie lo pueda ver, tocar o modificar, utilizar para nada. La forma mas fácil de ver esos OUTPUTS en el archivo sam es, bootenado desde un XP LiveCd ( bajar por aquí ) cualquiera en tu ordenador, copiando el contenido completo del directorio config en tu jump drive (reboot) y despues abriendo el mismo archivo sam con OPHCrack en su versión para Windows.
—————————————————————————————–
-Para y piensa por un minuto en lo siguiente… ¿Que puede hacer un atacante “hacker” que de casualidad conosca nuestro OUTPUT “Message Digest” pero no se sepa el INPUT ? ¿Que puede hacer este para tratar de conocer nuestro INPUT ?
Existen varias alternativas:
A) Primero puede tratar de generar una colisión, de esa forma no necesariamente tiene que saber la contraseña verdadera para poder entrar en un sistema. (SERIA LO IDEAL).
B) Puede tratar de conseguir la contraseña por fuerza bruta.
C) Puedes tratar de hacer un ataque por diccionario.
D) Podemos calcular todos los Message Digest posibles de antemano y ponerlos a todos en una gran base de datos. ( Que de hecho esto ,es lo que se a echo en esta web ).
E) Por ultimo podemos utilizar lo que se conoce como Rainbow Tables, que solo es una variación, (digamos una mejora) de la técnica anterior. Y cuando hablo de arcoiris no me refiero al de uno literal.
Sí seguimos con el punto D entonces nos encontramos con que:
1) El tiempo en hacer los cálculos de antemano no es un gran problema hoy en día con las computadoras existentes. GREAT!
2) El espacio necesario para almacenar toda la información generada puede que sí represente un problema. Estamos hablando de trillones y trillones de posibles combinaciones. ¿Tienes 1,000,000,000,000,000,000,000 de GB disponibles?
Entonces Philippe Oechslin propuso una optimización basada en lo que se conoce como función de reducción. En vez de almacenar toda la información, almacenemos la información de tal forma que se pueda deducir las que no está almacenada a partir de las que si lo está. Según él podemos decir que de cada 10,000 OUTPUTS, solo almacenemos 1.
—–>>>>> IMPORTANTE
QUE QUEDE CLARO, EL PROPÓSITO DE LA ALTERNATIVA E vs la alternativa D, es la de literalmente ahorrar espacio a la hora de almacenar data. Pero si tuviéramos el espacio disponible, el tiempo de búsqueda seria bien parecido (prácticamente el mismo).
—–>>>>>
Esto se logra con la función de reducción. Recuerden que al MD5, CRC, SHA256 se les conoce como funciones de Hash.
hash() - Generara un OUTPUT a partir de un INPUT cualquiera.
reduction() – Aceptara un OUTPUT y generara una numero especial a partir de este.
Ejemplo ——————————————————————
MD5(amor) = 5da2297bad6924526e48e00dbfc3c27a
Reduction(5da2297bad6924526e48e00dbfc3c27a) = 522976
En este caso el numero especial 522976 sale de los primeros 6 números del OUTPUT.
Se le conoce como función de reduction porque lo que sale (522976) es menor que lo que entra (5da2297bad6924526e48e00dbfc3c27a).
Debemos de tener claro que la función de reduction puede ser cualquier otra cosa, como por ejemplo la propia función de hash CRC.
MD5(amor) = 5da2297bad6924526e48e00dbfc3c27a
Reduction(5da2297bad6924526e48e00dbfc3c27a) = 522976
MD5(522976) = 7e90472c2010eaf9bebdcb203bf95102
Reduction(7e90472c2010eaf9bebdcb203bf95102) = 790472
MD5(790472) = 9e9450dd108ff890ec692a4a01b7ac2d
Reduction(9e9450dd108ff890ec692a4a01b7ac2d) =994501
MD5(994501) = 942a866a400d4add7eaf7cdd7dd3a512
Reduction(942a866a400d4add7eaf7cdd7dd3a512) =942866
MD5(942866) = a8af735b67116c40eee3f94a35923eb2
y así sucesivamente pudo haber sido hasta 10,000 veces.
Desechamos lo del medio y nos quedamos con esta cadena : (Que seria lo que guardariamos en la tabla)
Supongamos que cada cadena alberga la representación de 10,000 OUTPUTS.
-COLUMNA1—COLUMNA2 de OUTPUTS finales —
1) amor
a8af735b67116c40eee3f94a35923eb2 <-(10,000)
2) ZZZ
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX <-(10,000)
3) ZZZ
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX <-(10,000)
4) ZZZ
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX <-(10,000)
y así sucesivamente, nos encontramos con que tenemos una tabla que contiene muchas cadenas.
La palabra amor fue con lo que empezamos la cadena, y a8af735b67116c40eee3f94a35923eb2 fue con lo que terminamos nuestra cadena. En este caso amor y a8af735b67116c40eee3f94a35923eb2 es lo único que se guarda en nuestra tabla para poder representar los 10,000 OUTPUTS.
Sí por ejemplo tenemos un OUTPUT ( en este caso 9e9450dd108ff890ec692a4a01b7ac2d) que no conocemos su INPUT, procedemos de la siguiente manera: empezamos aplicando la reducción al INPUT.
Reduction(9e9450dd108ff890ec692a4a01b7ac2d) = 994501
MD5(994501) = 942a866a400d4add7eaf7cdd7dd3a512 <-NO APARECE EN LA COLUMNA2 SEGUIMOS
Reduction(942a866a400d4add7eaf7cdd7dd3a512) = 942866
MD5(942866 ) = a8af735b67116c40eee3f94a35923eb2 <-APARECIO “PARAMOS”
Cuando paramos quiere significar que nuestro INPUT se encuentra en alguna parte de la Cadena#1 de la Columna #1 de nuestra tabla.
La razón por la cual son llamada tablas de arcoiris es porque cada cadena de la tabla puede utilizar una función de “reduction” diferente. Y Sí fuéramos a ponerle un color diferente a cada reduction tendríamos una tabla de arcoiris.
Limitaciones ———————————————————————————–
Cuando se le añade lo que se conoce como la sal a la función del hash el rainbow table puede que no sea tan efectivo. Digamos que en este caso la sal son los caracteres %#é . Pues la sal aumenta la complejidad de la contraseña y se tiene que tener una “rainbow table” que contenga los caracteres que no son de uso común.
MD5(amor + %#é ) = 00900a3eeabd97131443d253adc15356
MD5(password, MD5(username))
Una sal que sea de una letra (f) no tendría sentido. Se deben de usar sales que sean de bastantes caracteres y mejor si son de caracteres no ordinarios.
Se supone que cada usuario de un sistema tenga una sal diferente.






Enero 14, 2009 a las 1:51 pm
Excelente explicacion, pero adicionalmente se podria inlcuir sobre ataques de diccionario y de fuerza bruta para establecer diferencias con reainbow tables