Introducción
Este documento describe el encabezado de autenticador RADIUS y los atributos Message-Authenticator, cómo se utilizan y cuándo se espera un error de validación.
Encabezado de autenticador
Según RFC 2865, el encabezado Authenticator tiene 16 bytes de longitud. Cuando se utiliza en una solicitud de acceso, se denomina autenticador de solicitud. Cuando se utiliza en cualquier tipo de respuesta, se denomina autenticador de respuesta. Se utiliza para:
- Autenticación de respuesta
- Ocultación de contraseña
Autenticación de respuesta
Si el servidor responde con el autenticador de respuesta correcto, el cliente puede calcular si esa respuesta estaba relacionada con una solicitud válida.
El cliente envía la solicitud con el encabezado Authenticator aleatorio. Luego, el servidor que envía la respuesta calcula el autenticador de respuesta con el uso del paquete de solicitud junto con el secreto compartido:
ResponseAuth = MD5(Code + ID + Length + RequestAuth + Attributes + Secret)
El cliente que recibe la respuesta realiza la misma operación. Si el resultado es el mismo, el paquete es correcto.
Nota: El atacante que conoce el valor secreto no puede suplantar la respuesta a menos que pueda oler la solicitud.
Cuándo esperar un fallo de validación:
Se produce un error de validación si el switch ya no almacena en caché la solicitud (por ejemplo, debido al tiempo de espera). También puede experimentarlo cuando el secreto compartido no es válido (sí, Access-Reject también incluye este encabezado). De esta forma, el dispositivo de acceso a la red (NAD) puede detectar la discordancia de secreto compartido. Generalmente, los clientes/servidores de Autenticación, Autorización y Contabilización (AAA) lo notifican como una discordancia de clave compartida, pero no revela los detalles.
Ocultación de contraseña
El encabezado Authenticator también se utiliza para evitar el envío del atributo User-Password en texto sin formato. Primero se calcula el Message Digest 5 (MD5 - secreto, autenticador). A continuación, se ejecutan varias operaciones XOR con los fragmentos de la contraseña. Este método es susceptible de ataques sin conexión (tablas arcoíris) porque MD5 ya no se percibe como un algoritmo unidireccional fuerte.
Este es el script Python que calcula la User-Password:
def Encrypt_Pass(password, authenticator, secret):
m = md5()
m.update(secret+authenticator)
return "".join(chr(ord(x) ^ ord(y)) for x, y in zip(password.ljust
(16,'\0')[:16], m.digest()[:16]))
Retransmisiones
Si ha cambiado alguno de los atributos de la solicitud de acceso RADIUS (como ID de RADIUS, Nombre de usuario, etc.), se debe generar el nuevo campo Authenticator y se deben volver a calcular todos los demás campos que dependen de él. Si se trata de una retransmisión, nada cambia.
Contabilidad
El significado del encabezado de autenticador es diferente para una solicitud de acceso y una solicitud de contabilidad.
Para una solicitud de acceso, el autenticador se genera aleatoriamente y se espera que reciba una respuesta con el objeto ResponseAuthenticator calculado correctamente, que pruebe que la respuesta estaba relacionada con esa solicitud específica.
Para una Solicitud de Contabilización, el Autenticador no es aleatorio, pero se calcula (según RFC 2866):
RequestAuth = MD5(Code + ID + Length + 16 zero octets + Attributes + Secret)
De esta manera, el servidor puede verificar el mensaje de contabilización inmediatamente y descartar el paquete si el valor recalculado no coincide con el valor del autenticador. Identity Services Engine (ISE) devuelve:
11038 RADIUS Accounting-Request header contains invalid Authenticator field
La razón típica de esto es la clave secreta compartida incorrecta.
Atributo Message-Authenticator
El atributo Message-Authenticator es el atributo RADIUS definido en RFC 3579. Se utiliza con un fin similar: para firmar y validar. Pero esta vez, no se utiliza para validar una respuesta, sino una solicitud.
El cliente que envía una solicitud de acceso (también puede ser un servidor que responde con un desafío de acceso) calcula el código de autenticación de mensajes basado en hash (HMAC)-MD5 a partir de su propio paquete y, a continuación, agrega el atributo Message-Authenticator como una firma. A continuación, el servidor puede comprobar que realiza la misma operación.
La fórmula es similar al encabezado Authenticator:
Message-Authenticator = HMAC-MD5 (Type, Identifier, Length, Request Authenticator,
Attributes)
La función HMAC-MD5 tiene dos argumentos:
- La carga útil del paquete, que incluye el campo Message-Authenticator de 16 bytes rellenado con ceros
- El secreto compartido
Cuándo utilizar el autenticador de mensaje:
Se debe utilizar el autenticador de mensaje para cada paquete, que incluye el mensaje de protocolo de autenticación extensible (EAP) (RFC 3579). Esto incluye tanto al cliente que envía la solicitud de acceso como al servidor que responde con el desafío de acceso. El otro lado descarta silenciosamente el paquete si falla la validación.
Cuándo esperar un fallo de validación:
Se produce un error de validación cuando el secreto compartido no es válido. Entonces, el servidor AAA no puede validar la solicitud.
ISE informa de lo siguiente:
11036 The Message-Authenticator Radius Attribute is invalid.
Esto ocurre generalmente en la etapa posterior cuando se adjunta el mensaje EAP. El primer paquete RADIUS de la sesión 802.1x no incluye el mensaje EAP; no hay ningún campo Message-Authenticator y no es posible comprobar la solicitud, pero en ese momento, el cliente puede validar la respuesta con el uso del campo Authenticator.
Validar el atributo Message-Authenticator
A continuación se muestra un ejemplo para ilustrar cómo se cuenta manualmente el valor para asegurarse de que se calcula correctamente.
Se ha elegido el paquete número 30 (solicitud de acceso). Se encuentra en el medio de la sesión EAP y el paquete incluye el campo Message-Authenticator. El objetivo es verificar que el autenticador de mensaje sea correcto:
- Haga clic con el botón derecho del mouse en Radius Protocol y elija Export selected packet bytes.
- Escriba esa carga RADIUS en un archivo (datos binarios).
- Para calcular el campo Message-Authenticator, debe poner ceros allí y calcular el HMAC-MD5.
Por ejemplo, cuando utiliza un editor hexadecimal/binario, como vim, después de escribir ":%!xxd", que cambia al modo hexadecimal y pone a cero 16 bytes a partir de "5012" (50hex es 80 en dec que es el tipo autenticador de mensaje, y 12 es el tamaño que es 18 incluyendo el encabezado de pares de valores de atributo (AVP)):
Tenga en cuenta que vim y otros editores de texto pueden agregar un carácter de avance de línea adicional ('0a' en hexadecimal) al final del archivo al guardarlo. Asegúrese de utilizar el modo binario del editor de texto (archivo vim -b) para evitar que aparezca el carácter LineFeed.
Después de esa modificación, la carga útil está lista. Es necesario volver al modo hexadecimal/binario (tipo: ":%!xxd -r") y guarde el archivo (":wq"). Puede volver a comprobar si un carácter LineFeed adicional no se ha agregado mediante 'hexdump -C file'.
- Utilice OpenSSL para calcular HMAC-MD5:
pluton # cat packet30-clear-msgauth.bin | openssl dgst -md5 -hmac 'cisco'
(stdin)= 01418d3b1865556918269d3cf73608b0
La función HMAD-MD5 toma dos argumentos: el primero de entrada estándar (stdin) es el propio mensaje y el segundo es el secreto compartido (Cisco en este ejemplo). El resultado es exactamente el mismo valor que el autenticador de mensaje conectado al paquete de solicitud de acceso RADIUS.
Lo mismo se puede calcular con el uso del script Python:
Python 2:
pluton # cat hmac.py
#!/usr/bin/env python
import base64
import hmac
import hashlib
f = open('packet30-clear-msgauth.bin', 'rb')
try:
body = f.read()
finally:
f.close()
digest = hmac.new('cisco', body, hashlib.md5)
d=digest.hexdigest()
print d
pluton # python hmac.py
01418d3b1865556918269d3cf73608b0
Python 3:
import hmac
import hashlib
with open('packet30-clear-msgauth.bin', 'rb') as f:
body = f.read()
digest = hmac.new(b'cisco', body, hashlib.md5)
print(digest.hexdigest())
En el ejemplo anterior se muestra cómo calcular el campo autenticador de mensaje a partir de la solicitud de acceso. Para Access-Challenge, Access-Accept y Access-Reject, la lógica es exactamente la misma, pero es importante recordar que se debe utilizar Request Authenticator, que se proporciona en el paquete Access-Request anterior.
Información Relacionada