Mostrando entradas con la etiqueta hash. Mostrar todas las entradas
Mostrando entradas con la etiqueta hash. Mostrar todas las entradas

miércoles, 9 de abril de 2014

Hashes en Java

Para algún que otro proyecto que me he ido montando, he tenido la necesidad de sacar el hash de alguno de los objectos con los que estaba trabajando. Como de costumbre, es ese tipo de cosas que aunque en algún momento determinado ya las has hecho, siempre se te olvida cómo volverlo a hacer. Y tienes que volver a buscar. En mi caso, se trataba, precisamente, de obtener el resultado de la aplicar una función de hash determinada y recuperar el valor correspondiente, utilizando java.

Ahora que quería recopilar las cosas que había estado haciendo, me he encontrado con que no localizo alguna de éstas, y además, que lo que tengo, no es exactamente como esperaba.

Para el tema de los hashes me estoy acordando de que tengo dos opciones.

Opción "nativa"

Para esta opción tenemos que utilizar MessageDigest. En el mismo momento de instanciarla habrá que indicarle el algoritmo que queremos utilizar. Si no existiese, nos lanzaría una excepción. Un ejemplo sería este:

 String valor = "123456";  
 try{
  String hashAux = "";
  MessageDigest messageDigest = MessageDigest.getInstance("SHA-256");
  messageDigest.reset();
  messageDigest.digest(valor.getBytes("UTF-8"));
  messageDigest.update(valor.getBytes());
  byte[] digestArray = messageDigest.digest();
   
  for(byte aux : digestArray) {
   int b = aux & 0xff;
   if (Integer.toHexString(b).length() == 1)
    hashAux += "0";
   hashAux += Integer.toHexString(b);
  }
  
  String result = new String(digestArray);
  System.out.println("hashAux: "+hashAux);
 }catch(Exception e){
  System.out.println("E: "+e);
 }

Como resultado obtendremos:



8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92

y se puede verificar que es correcto al compararlo en un algún sitio por Internet.

Además, hay que tener en cuenta los distintos algoritmos que pueda permitir. Al menos no parece trivial encontrarlo. En alguno de los sitios donde he ido a buscar (porque, recuerdo, que hacía tiempo que no tenía que trabajar sobre esto, y lo de hardcodear los valores no me hacía ninguna gracia), he visto una lista parecida a esta:

  • MD2
  • MD5
  • SHA-256
  • SHA-384
  • SHA-512
  • SHA, SHA-1, SHA1
En la que voy a considerar los últimos elementos como que hacen el mismo algoritmo. ¡Ojo! Que según qué equipo podría fallar. 

Los resultados también podrían cambiar si estamos trabajando con codificaciones diferentes. En mi caso, he definido la que venía en el ejemplo. 

Opción "apache commons"

La otra opción es utilizar la librería de apache commons. Nos ofrecerá el método DigestUtils, el cual, al mismo tiempo, nada más instanciarlo tendremos que indicarle qué hash utilizar. 

 String hashAux2 = null;
 String hashAux3 = "";
 byte[] hashAux3byte = null;
 try{
  hashAux2 = DigestUtils.sha256Hex(valor); 
  hashAux3byte = DigestUtils.sha256(valor);
  for(byte aux : hashAux3byte) {
   int b = aux & 0xff;
   if (Integer.toHexString(b).length() == 1)
    hashAux3 += "0";
   hashAux3 += Integer.toHexString(b);
  }
     System.out.println("hashAux2: "+hashAux2);
     System.out.println("hashAux3: "+hashAux3);
     
 }catch(Exception e){
  System.out.println("Exception hash: "+e.getMessage());
 }

Como podréis comprobar, tenemos la opción de que nos pase directamente la cadena convertida en formato hexadecimal, y así no tendremos que hacer la chapuza de iterar sobre cada una de las posiciones del array que nos devuelva. Tambien DigestUtils nos ofrece directamente los algoritmos con los que nos permitirá trabajar.

A la hora de ejecutar este último ejemplo podremos ver que, en efecto, el resultado es el mismo que en el primero.

Esta última opción creo que es la mejor, aún dependiendo de una librería que se tenga que importar y que no venga directamente en la paquetería de java.

Espero que esto os sea de utilidad. Por mi parte, me vendrá muy bien tenerlo a mano para cuando se me vuelva a olvidar cómo lo hice. 

miércoles, 6 de noviembre de 2013

Las imágenes en blogger no son las que he subido

Así es como debería de empezar el artículo: Las imágenes en blogger no son las que he subido... al menos, en lo que a su hash se refiere.

Como algunos sabréis, recientemente he montado mi primer reto. Era de esperar que quería que funcionase bien, pero ha sucedido algo que no me esperaba. Y aquí he de entonar el mea culpa. Vamos a poner un ejemplo muy curioso. Pongamos que queremos subir una imagen…

Vamos a poner un ejemplo: esta captura quita el ajuste automático de imágenes en blogger. Para desactivarlo tienes que acceder a https://www.google.com/settings/plus:

Cómo quitar ajuste automático de imagenes en Google / Blogger
Cómo quitar ajuste automático de imagenes en Google / Blogger
Esta imagen tiene el siguiente hash md5 (sí, lo sé, no es recomendable, pero bueno, por poner un ejemplo):

Hash imagen del ajuste: e39f872040f4474ef49edb06f87c38dd
Ahora, habría que mirar qué pasa si nos bajamos la imagen. El problema está en que en vista previa no me deja cogerla bien. Como he podido leer que las imágenes se guardan en álbumes en Picasa, voy a ver si ahí sí que puedo hacerme con la foto correctamente, descargarla, y probar qué hash me muestra ahora. Por desgracia, aún no me la muestra, tendré que publicar este post para hacer la prueba.  

[Lugar donde pondré los resultados después de actualizar las modificaciones que hace blogger al subir las fotos. ¿Qué resultado obtendremos?]
[UPDATED]

Comparación de imágenes después de realizar el cambio de configuración en el perfil de Google
Comparación de imágenes después de realizar el cambio de configuración en el perfil de Google
Al cambiar la configuración, las imágenes ya son las que deberían de ser. Al menos, eso parece.
[/UPDATED]

Por poner un ejemplo claro de que se producen cambios, me bajaré las dos imágenes que se tenían que analizar y las compararé con las que se tendrían que haber bajado. Estos son los enlaces:

Imágenes para descargar
Los "segundos enlaces" te llevan a las miniaturas que te presenta blogger cuando te muestra todas las fotos. O eso es lo que he deducido. 

Hashes de las imágenes originales y las descargadas
Hashes de las imágenes originales y las descargadas
Para que se entienda la anterior captura: las dos primeras imágenes son con las que habría que trabajar. Las otras son la miniatura (las que llevan el apellido "_reducida") y las de tamaño normal.

Por eso, el reto no salió todo lo bien que esperaba. Ahora me gustaría hacer un sondeo: ¿Cuántos de vosotros lo habéis intentado hacer? Como mínimo, Longinos tuvo la idea de que se podría haber manipulado de alguna forma la imagen por parte de blogger, cosa al final se ha podido corroborar. Por lo tanto, para los siguientes tengo que buscar un plan de actuación para evitar en la medida de lo posible este problema (¿el cambio que he hecho en la configuración de mi perfil?). Una idea que me dio Longinos cuando estuvimos allí por la NoConName, es que tendría que haber puesto la firma de la imagen para que aquel que se la bajase supiese si era la foto correcta o no. Ya sabéis, algo que tendría que haber caído en la cuenta.

Espero que para las próximas tenga más éxito. Ahora, vamos a ver qué resultado obtenemos de publicar este artículo y bajarme la imagen que he hasheado al principio.

miércoles, 5 de junio de 2013

WCE: Windows Credential Editor

Hace poco os conté cómo me había olvidado de la contraseña del administrador de mi equipo, de las técnicas que utilicé para intentar recuperarla y de las que hubiera siguiendo utilizando de haberme hecho falta.

Pues bien, una de ellas era utilizar Windows Credential Editor. Esta herramienta, que los antivirus la detectan como una potencial amenaza, permite mostrar los usuarios de Windows, con sus contraseñas... en claro. Y no requiere de un diccionario para mostrarlas. En pocos segundos, no más de 5 o 10, nos las saca.

¿En qué se basa para obtenerlas? Si lo cuento yo, así, de memoria, las obtiene a partir de un servicio esencial de Windows que se llama lsass.exe. Si no me equivoco, y no he podido corroborarlo, este proceso es capaz de devolver la contraseña en base64. Y ahí es cuando se puede descifrar al texto plano. Para más información, en la cuenta de Shileshare de la RootedCon están las diapositivas de la presentación de la herramienta en 2011.

Ahí es nada. A donde iba. La cosa es que en ese momento, cuando quise utilizar esta herramienta, tuve varios problemillas. El primero de todos, y el que más fácil es de solventar, es que para lanzar la herramienta no puedes hacerlo con permisos de usuario mortal:

Lanzando WCE sin permisos
Lanzando WCE sin permisos
Por lo tanto, voy a elevar privilegios en la consola para poderlo lanzar en condiciones. Y, para mi sorpresa, me dice exactamente lo mismo. Es muy, muy raro. Si lo pruebo en la máquina virtual, instalada como 32 bits, me da el mismo aviso estando tanto como usuario normal como habiendo elevado privilegios. Si lo hago en mi equipo, que es 64 bits, me permite solicitar la ayuda siendo usuario mortal

Pidiendo ayuda en WCE sin privilegios. No permite listar los usuarios
Pidiendo ayuda en WCE sin privilegios. No permite listar los usuarios
Y, si intento listar los usuarios y su contraseña, tanto en LM como en NTLM:

Listando los usuarios y sus contraseñas cifradas
Listando los usuarios y sus contraseñas cifradas
Ahora, tocaría mirar las contraseñas sin cifrar, pero, no acaba siendo así:

WCE -l -w: Imprimir contraseñas en clear text. Pero no funciona
WCE -l -w: Imprimir contraseñas en clear text. Pero no funciona
Como podéis ver, no acaba de funcionar. En teoría, debería de mostrarlo. También hay que tener en cuenta que según las propias instrucciones, hay que haber explotado alguna vulnerabilidad para que funcione. El día que haga un artículo sobre la explotación de vulns utilizando metasploit, a ver si lo incluyo, que seguro que ahí sí que funciona. Porque ni siquiera con la máquina virtual, haciendo el "truco de los 5 shitfs", funciona. 

Al menos, os he enseñado lo que me hizo exactamente aquel día. 

miércoles, 10 de octubre de 2012

Cain y sus ficheros de texto


Esta entrada es una de esas que, sin estar escrita, lleva muchiiiisimo tiempo en la bandeja de borradores. Y me da la sensación de que va siendo hora de escribirla. ¿No? Incluso, me da la sensación de que no va a ser muy larga. ¡A ver qué sale!

También recordar lo típico: cualquier cosa aquí expuesta, el que la haga, que apechugue con las consecuencias, que yo no me hago responsable. Puede ser legar, puede no serlo... Lo dicho: yo no me responsabilizo de nada. He dicho.

Ahora. Empecemos.

Lo primero de todo. ¿Sabemos qué es el Cain (& Abel)? Supongo que sí, ¿no? Entre otras cosas, permite hacer ataques MITM, obtener hashes de contraseñas, obtener sus correspondencias con el texto claro... Y seguro que tiene muchas más de las que desconozco.

Ahora bien. Para algunas cosas cuesta bastante utilizarlo. Otra forma de verlo es que tiene algunas opciones que no son tan conocidas, y le dan más versatilidad.

Por ejemplo:

Queremos intentar realizar un ataque MITM. Para ello, se necesita hacer un escaneo de toda la red, y, una vez tengamos el listado los equipos "victima", realizar el ataque.

Cain escaneando la red


Al final, después de acabar la operación, obtendremos el listado de las direcciones IP encontradas junto con sus direcciones MAC. Además, también nos mostrará el fabricante (teniendo en cuenta que se obtiene a partir de la MAC). La historia está en que ese scan puede cantar mucho en una red. ¿Qué podemos hacer? Existe una fórmula. Nos cogeremos una consola, por ejemplo, un cmd. Con éste, iremos haciendo ping a cada una de las direcciones IP que se correspondan con nuestro netid. Y tomaremos nota de la dirección IP que corresponda con la dirección física que nos de el comando arp.

¿Has entendido todo hasta aquí? ¿Tienes todo listo?

Muy bien. Ahora, con el Cain cerrado, vamos a su carpeta de instalación

C:\Program Files (x86)\Cain

y abrimos, con permisos administrativos, el fichero HOSTS.LST.

Por lo tanto, con una modificación como esta:

Fichero HOSTS.LST con un resultado más

Obtendríamos un resultado como este, que, a todos lo efectos es un elemento más en la lista que ya teníamos:

Nuevo equipo, con su hostname

En este caso, aparece el hostname, que es el tercer campo con el que trabaja este fichero, separando cada uno de los campos por "punto y coma" (;).

Tenemos más cosas que se pueden manipular con los ficheros de texto. De hecho, lo anterior es un relleno que no tenía pensado contar. En realidad, este post viene por lo siguiente. Por ejemplo, se han publicado un montón de hahses de MD5. Por lo tanto, vamos a insertarlos desde la aplicación. Seleccinamos cracker, escogemos MD5 (es el ejemplo, se escogerá el que tenga que ser), botón derecho sobre el listado de la derecha, add to list,...

Introducir hash MD5

Te permite introducir sólo un hash, en un instante determinado. ¡Pero quiero poner 200.000! ¿Qué hago? Repetiré la misma opción anterior, pero, en esta ocasión, el fichero a manipular será el MD5.LST.

Hashes MD5 en el MD5.LST

Ahora, después de haber puesto unos pocos hashes, conseguimos:

Cain y los hashes puestos en el MD5.LST

Como habréis observado, he dicho que tenían que ser "unos pocoshashes. ¿Por qué? Porque estos ficheros se cargan en memoria cuando arrancas el programa. Si intentas cargar un fichero que ocupe 200MB, o más (por poner un ejemplo. podrían ser 100MB o 1GB, lo mismo da), podrías no conseguir lanzarlo y te quedarías... a verlas venir. 

Hay más opciones que me gustaría explorar: saber en qué fichero se utiliza el caracter de tab para separar las columnas, en cuál el "punto y coma" (;)... qué carácter se utiliza para que separe las contraseñas de los hahses...

Pufff!! Lo que ha dado de si el hecho de que en una ocasión quisiera abrir un archivo gigantesco para romper un montón de MD5. 

¿Conocéis más truquitos en Cain que no sean tan conocidos (por los que llevamos poco tiempo en esto)?

lunes, 27 de agosto de 2012

Hash dumping en Windows

Ya se que este tema se ha tratado en multitud de blogs y que este post en concreto no acaba siendo obra mía. Pero, como últimamente acumulo muchas cosas por leer y aprender y me gustaría tenerlas a buen recaudo por si algún día las necesito, aquí lo dejo por si las moscas. Y, si a alguien le resulta de utilidad, pues bienvenido sea, ¿no?

Aquí dejo un resumen de una serie de posts que han escrito sobre los dumps de los hashes en sistemas Windows. Ya he hablado unas cuantas veces de este tema, y, he de reconocer, cada vez que leo algo al respecto, acabo aprendiendo más, o, como mínimo, asentando mejor lo que ya conocía.

Este primer artículo nos habla de cómo obtener los hashes en modo offline. O también, herramientas como kon-boot (esta la probé hace tiempo), BootRoot o SysRQ2, para (descrito un poco a lo burro) que salte el kernel y entrar en el sistema sin que el usuario seleccionado pida la contraseña. Eso sí, cuando probé el kon-boot, si se tenía puesto el Syskey, éste no se lo saltaba.

Otra posibilidad es resetear la contraseña de un usuario local con chntpw.

Más posiblidades explicadas en el artículo (y que también explicaban en el FTSAI): hacer un backup del sistema (el resgistro, al menos: SYSTEM y SAM). Después, lo volcabas a otra unidad o carpeta y a partir de ahí,  ya que no estaba en uso, podías leer los datos, desde, por ejemplo, Caín.

Más técnicas: el uso de shadow copies, herramientas como regback.exe...O, las herramientas que permiten hacer el dump desde memoria: pwdump6, pwdump7, fgdump, gsecdump, PWdumpX... (de las que también nos hablaron en el FTSAI). En general, y según he podido entender, alguno de estos métodos permiten inyectar en el servicio LSASS datos que permiten recuperar los hashes. Eso sí, se pueden producir BSODs.

El segundo post tratan el cómo obtener los hashes de un Active Directory. Para ello hará falta acceder a la base de datos que utiliza, y que se encuentra en %SystemRoot%\ntds\NTDS.DIT. También lo puedes obtener desde una copia del fichero SYSTEM. Una forma de poder hacer una copia de esos ficheros sería utilizar el comando ntdsutil que se encuentra a partir de los sistemas operativos Windows 2008.

Alguna de las herramientas que nos permita sacar las contraseñas serían Windows Password Recovery Toolntds_dump_hash.

Y, la tercera parte, nos habla sobre los históricos de las contraseñas (muy comunes en entornos corporativos y de AD). Sobretodo porque si se usan patrones, consiguiendo alguna contraseña antigua se podría encontrar la actual. También las contraseñas que se utilizan en servicios del sistema y para el autologon: encontrándose estas dos últimas en el LSA Secrets. La herramienta ya mencionada gsecdump se puede utilizar para obtenerlas. Sea cual sea la herramienta utilizada para obtener este tipo de contraseñas, se podrá conseguir en texto claro.

Además, sabiendo que se hay servicios arrancados con usuarios que son "Administradores de Dominio" o, incluso, "System", el agujero que tendremos en el sistema será de órdago.

martes, 2 de noviembre de 2010

A vueltas con... contraseñas en Windows

A lo largo de la semana tendría que haber jugado un poco más con el tamper data o con las cabeceras. Y, al final, he acabado haciendo otras cosas, que, aunque puede que no sean igual de interesantes, son válidas para escribir aquí. Por lo tanto, voy a la carga.

Hace meses escribí varias veces sobre las contraseñas en Windows: I, II, otro y... otro más. Pues, una vez más, tengo algo que decir al respecto.

Hace unos minutos un amigo ha enviado un correo de un sitio, que, una vez más, enlaza a otro mucho más interesante.

Como ya comentamos en su momento, cuando se almacena una contraseña lo que se hace es guardar su hash. Así, si este hash viaja por la red, se podría capturar, por ejemplo, con un ataque man in the middle y, después, buscar la contraseña que corresponda con ese hash.

Recordando un poco lo que comenté en su momento, hay varias formas de buscar esa correspondencia. O furza bruta: ir probando a pelo todas las combinaciones posibles hasta que una contraseña case con ese hash. O utilizar un diccionario de datos, lo mismo que la posibilidad anterior, pero buscando la posible contraseña en un fichero de texto. O con las rainbow tables.

Todas estas opciones pueden llevar su tiempo. Bastante tiempo. Pero, los sitios que acabo de enlazar lo tienen todo hecho. Le pasas el hash, y te devuelve la contraseña en apenas unos segundos.

He probado un hash al azar y no ha sido capaz de encontrar la contraseña. ¿Qué le vamos a hacer? La cosa está en que este servicio ayudará bastante a a la hora de buscar estas correspondencias.

Ya que estamos. Otro serivio de este estilo, pero para MD5, se puede encontrar en una comparativa que hizo SbD.

miércoles, 20 de enero de 2010

Hashes y colisiones

En su momento hablé de las contraseñas de Windows (I y II) éstas se guardan utilizando un algoritmo que genera un hash.

Si recuerdo lo que comenté en alguno de esos dos posts, en la universidad te enseñan que al realizar un algoritmo para introducir un dato en una tabla hash se utiliza ese hash como "posición" para localizar ese dato. Y que a veces, y sólo a veces, (cómo me gustaba la serie de El cuervo aunque a muchos no les acabara de gustar), se producía una colisión. ¿Y qué es una colisión? Describiéndolo de una manera resumida es cuando dos paquetes coinciden en un instante determinado en la misma red... Vaya, no quería poner esto. Ese tipo de colisión es la definición aplicadas a las redes. Yo quería definirlo aplicado a los hashes. Y ésta es la circustancia en la que dado un algoritmo determinado, y un dos elementos del que se quiere saber sus hashes, ambos hashes coinciden. En la universidad, para solventar esto, a la hora de realizar la búsqueda, lo que se hacía era que si el elemento a buscar no estaba en la posición del hash obtenido, se buscaba secuencialmente en una tabla auxiliar. Pero estamos hablando de contraseñas. Y aquí no debería de haber cabida para las colisiones. Cuanto más complicado sea que se produzcan, mejor.

Pongamos un ejemplo. En un abecedario, de la A la Z, sin distinguir mayúsculas y minúsculas:

A
B
C
D
E
F
G
H
I
J
K
L
M
N
Ñ
O
P
Q
R
S
T
U
V
W
X
Y
Z
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27

¿Qué ejemplo de algoritmo puede producir colisiones? Un ejemplo podría ser la suma del valor de las letras que tiene la palabra de la queremos sacar el hash. Si queremos codificar:

  • osos: 16 + 20 + 16 + 20 = 72
  • soso: 20 + 16 + 20 + 16 = 72
En efecto, si utilizásemos la segunda palabra como contraseña en un sistema que utilizase este algoritmo, tendríamos la posibilidad de pasar con la primera palabra. A parte de que no es el mejor ejemplo porque ambas palabras existen, y seguro que se encuentra en un diccionario de datos. Si no es así, dad por seguro que ahora sí que estará.

Ahora. Hace unas dos semanas, en el curso / master de seguridad que estoy haciendo con Informática64 nos enseñaron que un sitio determinado tenía una zona de acceso restringido. Y, ese sitio tenía varias cosas que deberían de arreglar:
  1. La seguridad estaba en el lado del cliente. ¿Qué significa esto? Que el control de si la autenticación es válida o no se hace desde el navegador. No se solicita comprobación en el servidor. 
  2. Los usuarios están incluidos en un combo. No se pueden introducir nombres de usuario. Pero con tal de tener ese combo con los usuarios válidos ya es un paso para poder entrar en el sitio. 
  3. Las contraseñas están codificadas en la propia página web. ¿Qué implica esto? Que si tenemos el usuario y tenemos la contraseña (codificada), estamos a un paso para poder entrar en el sitio. 
  4. Tenemos el algoritmo que genera ese hash, que ya tenemos. 
Con estas 4 cosas, ya podríamos entrar en el sitio. Pero eso no es lo que quiero enseñar. Primero, porque entrar en un sitio sin autorización, por muy fácil que sea la contraseña, no es legal. Y segundo, porque quiero enseñar un poquito un pseudocódigo de como es el algortimo que han utilizado (si acaso, modifico cosas para que no sea tan fácil averiguar de dónde sale:

funcion dameHash(palabra, modificador){
  palabra_auxiliar = palabra;
  elHash = 0;
  desde i =0;i
    elHash = elHash *(modificador^modificador) + valor_letra_en_posicion(i,palabra_auxiliar) + 1;
  }
  devolver elHash;
}
Existe algún que otro problema. Uno de ellos, el que comentaba antes. Puede haber un montón de combinaciones posibles que den el mismo hash. ¿Qué pasa si hacemos la invera? Buscar la (¿no serán las?) palabra(¿s?) que nos permitan llegar a ese hash.

Para eso hay que despejar en la ecuación anterior. Pero nos podemos encontrar con problemas con los nombres. Por eso hay que pensar en un hash_auxiliar y el hash_actual.

La ecuación quedaría algo así:

hash_auxiliar = (hash_actual -1 - posicionPosibleDeLaLetra);
Esto está muy resumido, pero, se explica de una menera muy sencilla. Hay que hacer todas las pruebas posibles de esta ecuación, hasta que hash_auxiliar sea 0. Lo que significa que:

  1. La ecuación se repetirá tantas veces como longitud_siempre_fija tenga como valor.
  2. Después de realizar la operación, hash_actual cogerá le valor de hash_auxiliar
  3. posicionPosibleDeLaLetra será una variable que irá cogiendo todos los posibles valores que permitan que su combinación con las selecciones anteriores lleguen al objetivo deseado, es decir, que el hash_auxiliar sea 0. Siempre se puede elegir obtener el primer resultado ó que nos devuelva todos. Y esto es lo que quería enseñar.
Se que no está muy, muy resumido, pero no puedo dar muchos más datos. El tema está en que una función de estas características puede producir casi 1019 colisiones. Si alguien quiere más detalles, que me de un toque. 

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.


  • 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.