En NTLM (v1 y v2), el protocolo de autenticación en sí no es malo, siempre y cuando lo juegues dentro de una conexión segura. De hecho:
Los atacantes activos , que pueden espiar la red y también inyectar sus propios paquetes, pueden secuestrar las conexiones abiertas a voluntad. Si su protocolo de autenticación se realiza en una conexión TCP básica, un atacante solo tiene que esperar una conexión normal de un usuario autorizado y robarlo una vez que se realiza el paso de autenticación.
-
Incluso los atacantes pasivos, observando los mensajes del protocolo, obtendrán suficiente información para ejecutar un ataque de diccionario sin conexión : pueden probar una contraseña potencial hasta que se encuentre una que coincida con los mensajes vistos en el cable; y pueden hacerlo en la privacidad de sus propias máquinas (esa es la parte "fuera de línea").
SSL / TLS soluciona ambos problemas. Si el cliente abre por primera vez una conexión SSL con el servidor (con la debida autenticación del servidor a través de su certificado y así sucesivamente), y el resto de la comunicación (incluido el protocolo de autenticación basado en contraseña) ocurre dentro del túnel cifrado, entonces estará seguro. de los atacantes. Sin embargo, en estas condiciones, sería mejor un protocolo "mostrar la contraseña" más simple, en el que el cliente simplemente envíe la contraseña "tal cual" (en el túnel SSL).
De hecho, los atacantes son inventivos y no se limitan a espiar en la red. A menudo sucede (con demasiada frecuencia) que los atacantes obtienen algunos destellos de los datos del servidor, por ejemplo. a través de inyecciones de SQL, o mediante la recuperación de discos duros viejos de los contenedores de basura. Esta es la razón por la que los servidores deben almacenar solo las contraseñas con hash . Pero hay buenas funciones hash para eso, y también hay malas funciones hash (vea esta respuesta para una gran cantidad de detalles). Cuando se usa el protocolo simple "mostrar la contraseña", el servidor es libre de usar cualquier función de hashing de contraseña que considere adecuada; sin embargo, cuando se usa NTLM, el servidor debe almacenar el valor de hash que el protocolo exige, es decir, "NT Hash" o "LM Hash".
Desafortunadamente, NT Hash es muy débil contra un atacante de fuerza bruta: es muy rápido (un atacante con una PC + GPU puede probar miles de millones de contraseñas por segundo) y no tiene sal (los atacantes pueden colude y use tablas precomputadas, como tablas arcoiris , para ejecutar ataques casi gratis). LM Hash es aún peor .
Por lo tanto, realmente no deberías usar NTLM si puedes evitarlo.
Una contraseña débil es débil, sin embargo, la pones, porque los atacantes también pueden realizar ataques de diccionario en línea simplemente dirigiéndose al servidor. En estas condiciones, se puede tolerar una contraseña débil solo con procedimientos estrictos de bloqueo, como cerrar la cuenta de usuario si se ingresan cuatro contraseñas incorrectas consecutivas. Esto es lo que hacen la mayoría de las tarjetas inteligentes. Sin embargo, esto no es apropiado para un servidor, ya que sería demasiado fácil para las personas malintencionadas bloquear las cuentas de otras personas.
Por lo tanto, debes educar a tus usuarios para que elijan contraseñas seguras. En este sentido, NTLMv1 agrega un insulto adicional a la lesión, a través de LM Hash , que restringe las contraseñas a 14 caracteres y asigna letras minúsculas a mayúsculas. La seguridad de la contraseña depende de la entropía : una medida de lo que podría haber sido la contraseña. La entropía necesita algo de espacio; especialmente porque los humanos están involucrados. Los humanos son malos para hacer elecciones al azar, pero también en recordar elecciones al azar; su tarea se hace más fácil si se les permite elegir long contraseñas . Pero LM Hash no permite contraseñas largas. La siguiente mejor cosa, entonces, es agregar entropía adicional, por ejemplo, haciendo que cada letra sea mayúscula o minúscula de forma aleatoria. ¡Pero LM Hash también previene eso!