martes, 22 de abril de 2003

Debilidad en protocolo de autenticación NTLM

Todas las versiones de Windows utilizan el protocolo SMB para los
servicios de compartición de archivos e impresoras. Cuando un cliente
se conecta a un recurso de la red, se utiliza la autenticación NTLM
para enviar las credenciales de usuario incluyendo la contraseña. Un
servidor SMB malévolo puede utilizar esta información para
autenticarse en el cliente, llegando a poder obtener pleno control
sobre los recursos compartidos en el cliente (incluyendo, por ejemplo,
a C$).

SMB (Server Message Block) es el protocolo utilizado para la
compartición de recursos (carpeta compartida, una impresora, un puerto
serie o mecanismos de comunicación como pueden ser los named pipes)
entre máquinas basadas en los sistemas operativos Windows. Para las
funciones de autenticación de usuarios se utiliza otro protocolo, NTLM
(NT Lan Manager).

El proceso de autenticación NTLM es, de forma resumida, el siguiente:
cuando el cliente se conecta a un servidor, éste responde enviando un
testigo generado aleatoriamente (el desafío). El cliente aplica una
función hash a este testigo utilizando la contraseña del usuario y
envía el resultado al servidor. En el momento en que éste recibe la
respuesta, comprueba su validez verificando que coincide con el
resultado de aplicar al desafío enviado la misma función hash con la
contraseña almacenada en su base de datos. Gracias a este método, se
puede verificar la identidad del usuario sin que sea necesario que la
contraseña circule por la red.

Por diseño, en el momento en que un cliente accede a un recurso
compartido realiza un intento de autenticación utilizando las
credenciales del usuario activo. Si estas credenciales no son
aceptadas por el servidor, la máquina cliente muestra al usuario una
ventada para que introduzca el usuario y contraseña para acceder al
recurso compartido.

Es precisamente esta característica, la de intentar autenticarse
automáticamente con las credenciales del usuario activo, la que puede
permitir a un servidor malicioso obtener la información de las
credenciales del usuario.

Como ejemplo de ataque, el atacante envía a la víctima un mensaje HTML
que contiene un objeto que reside en un recurso compartido del
servidor malévolo (SM1). Al visualizar este mensaje, la máquina
cliente (C1) intentará conectar con el recurso compartido.

El servidor malévolo (SM1) cuando recibe la petición de desafío, en
lugar de enviar éste lo que hace es una petición de conexión a un
recurso compartido a una estación cliente (C2). Este cliente malévolo,
C2, responde enviando una petición al servidor SMB de la víctima
(SC1).

El servidor SC1 envía su desafío a la máquina cliente del atacante,
C2. A continuación, C2, envía el desafío al servidor malévolo (SM1) y
éste a su vez lo envía a la máquina cliente (C1).

El cliente C1 recibe el desafío y aplica la función hash con su
contraseña. A continuación devuelve la respuesta al servidor malévolo
(SM1).

El servidor malévolo (SM1) reenvía esta respuesta a la máquina cliente
C2. Éste último, C2, redirecciona esta respuesta hacia el servidor SMB
de la víctima (SC1). En este punto, SC1 recibe la respuesta y la
considera como válida.

Como resultado de este galimatías, la máquina cliente del atacante
(C2) dispone de una conexión de red validada contra la máquina cliente
(C1).

Resumiendo y simplificando: el ataque consiste en aprovechar una
petición de autorización de acceso a un recurso compartido en un
servidor malévolo para construir y validar una conexión autenticada
contra la máquina que está realizando la petición.

Como puede comprobarse, el ataque es relativamente complejo y para
poder ser aprovechado es preciso disponer de un buen conocimiento del
funcionamiento de los protocolos SMB y NTLM.

No obstante, se tiene constancia de la existencia de pruebas de
concepto que muestran la viabilidad de este ataque. Todas las
versiones de Windows son vulnerables, incluyendo Windows 9x/ME
(vulnerable, aunque no se ha verificado), Windows NT 4 (vulnerable,
aunque no se ha verificado), Windows 2000 Professional/Server
(verificado), Windows XP (verificado) y Windows 2003 Server
(vulnerable, aunque no se ha verificado).


¿Es posible evitar este ataque?

La respuesta es afirmativa. Este ataque sólo puede utilizarse en los
sistemas que utilicen la autenticación NTLM. Aquellos que utilicen la
autenticación NTLM2 no son vulnerables. NTLMv2 está desactivado por
defecto, pero está disponible en NT 4.0 (a partir del Service Pack 4)
y versiones posteriores. NTLMv2 dispone de mecanismos adicionales de
seguridad mediante la utilización de claves de sesión únicas.

El ataque tampoco puede utilizarse cuando se utiliza la autenticación
Kerberos, que es el mecanismo de autenticación utilizado por defecto
en el Active Directory (Windows 2000 y posterior).


Xavier Caballé
xavi@hispasec.com