TL; DR : debido a la forma en que Windows autentica a los usuarios de la red en escenarios que no son Kerberos (no Active Directory), los hashes de contraseñas funcionan igual que las contraseñas para autenticar a los usuarios de la red.
Versión larga : hay dos formas tradicionales de usar una contraseña para autenticar a alguien:
- El cliente envía la contraseña al servidor (tradicionalmente, en texto claro, aunque los protocolos más nuevos usan cifrado). El servidor toma la contraseña, la codifica y la compara con la contraseña que ha almacenado. Si los hashes coinciden, se asume que el cliente tiene la contraseña correcta y se trata como autenticado.
- Respuesta-desafío: el servidor genera un desafío (una secuencia de bytes aleatoria) y lo envía al cliente. El cliente acepta el desafío, lo combina con la contraseña del cliente, hace un hash del resultado y envía el hash al servidor. Mientras tanto, el servidor acepta el desafío, lo combina con la contraseña que ha almacenado y el resultado se obtiene. Si los dos hashes coinciden, el cliente se trata como autenticado.
Tenga en cuenta que, bajo un esquema de desafío-respuesta, la contraseña nunca se envía realmente al servidor (lo que es bueno), pero el servidor necesita saber la contraseña (lo que es malo). El primer enfoque es el enfoque tradicional de Unix; El segundo es el enfoque tradicional de Windows.
Para mitigar el "servidor necesita saber la contraseña" desventaja de desafío-respuesta, muchas implementaciones de desafío-respuesta utilizan un hash de la contraseña. En otras palabras, en lugar de comparar el hash de (challenge + password)
, las implementaciones comparan el hash de (challenge + hashed password)
. Sin embargo, en este caso, la contraseña con hash es todo lo que necesita para acceder al servicio (porque un cliente malintencionado puede enviar el hash de (challenge + hashed password)
incluso si no conoce la contraseña de texto claro). Por lo tanto, las contraseñas de hash bajo un esquema de desafío-respuesta hacen que sea más difícil obtener una contraseña de texto simple que presumiblemente podría usarse para atacar a otros servicios, pero no hace ninguna diferencia en términos de la seguridad del servicio en sí.
Otras lecturas y referencias:
-
enlace
Una vez que se obtienen los hashes, descifrarlos para descubrir la contraseña de texto simple puede ser una tarea larga y ardua (suponiendo que las contraseñas no sucumban a las listas de palabras o los ataques de la tabla del arco iris). Afortunadamente para nosotros, Windows aceptará gustosamente los valores de hash NTLM en muchas situaciones, como acceder a un recurso de red por su dirección IP (vs. nombre de host) o conectarse a un dispositivo que no esté unido al dominio. El único momento en que no se intercambiarían hashes sería cuando se soliciten recursos de red en un entorno exclusivo de Kerberos, pero ese tipo de implementación es poco frecuente y puede ser problemático para muchas organizaciones.
-
enlace
Muchos (pero no todos) algoritmos de desafío-respuesta ... requieren que tanto el cliente como el servidor tengan un secreto compartido. Dado que la contraseña en sí no se almacena, un algoritmo de desafío-respuesta usualmente tendrá que usar el hash de la contraseña como secreto en lugar de la contraseña en sí. En este caso, un intruso puede usar el hash real, en lugar de la contraseña, lo que hace que los hashes almacenados sean tan sensibles como las contraseñas reales.
-
enlace
El esquema UNIX normalmente envía contraseñas de texto simple a través de la red al iniciar sesión. Esto es incorrecto. El esquema de cifrado SMB nunca envía la contraseña de texto simple a través de la red, pero sí almacena los valores de hash de 16 bytes en el disco. Esto también es malo. ¿Por qué? Debido a que los valores de hash de 16 bytes son un "equivalente de contraseña". No puede derivar la contraseña del usuario, pero podrían usarse en un cliente modificado para obtener acceso a un servidor. Esto requeriría un considerable conocimiento técnico por parte del atacante pero es perfectamente posible. Por lo tanto, debe tratar los datos almacenados en cualquier backdb backend que use (archivo smbpasswd, LDAP) como si contuviera las contraseñas de texto simple de todos sus usuarios.