Introdução
Este documento descreve o cabeçalho do RADIUS Authenticator e o atributo Message-Authenticator, como eles são usados e quando esperar uma falha de validação.
Cabeçalho do autenticador
De acordo com o RFC 2865, o cabeçalho do autenticador tem 16 bytes de comprimento. Quando usado em uma solicitação de acesso, é chamado de Autenticador de solicitação. Quando usado em qualquer tipo de resposta, é chamado de Autenticador de resposta. É usado para:
- Autenticação de resposta
- Ocultação de senha
Autenticação de resposta
Se o servidor responder com o Autenticador de Resposta correto, o cliente poderá calcular se essa resposta foi relacionada a uma solicitação válida.
O cliente envia a solicitação com o Cabeçalho Autenticador aleatório. Em seguida, o servidor que envia a resposta calcula o Autenticador de Resposta com o uso do pacote de solicitação junto com o segredo compartilhado:
ResponseAuth = MD5(Code + ID + Length + RequestAuth + Attributes + Secret)
O cliente que recebe a resposta executa a mesma operação. Se o resultado for o mesmo, o pacote está correto.
Note: O invasor que conhece o valor secreto não pode falsificar a resposta, a menos que seja capaz de farejar a solicitação.
Quando esperar falha na validação:
A falha de validação ocorre se o switch não armazenar a solicitação em cache mais (por exemplo, por causa do tempo limite). Você também pode experimentar quando o segredo compartilhado for inválido (sim - Access-Reject também inclui este cabeçalho). Dessa forma, o dispositivo de acesso à rede (NAD) pode detectar a incompatibilidade de segredo compartilhado. Geralmente, ele é relatado por clientes/servidores AAA (Authentication, Authorization, and Accounting) como uma incompatibilidade de chave compartilhada, mas não revela os detalhes.
Ocultação de senha
O cabeçalho do autenticador também é usado para evitar o envio do atributo User-Password em texto simples. Primeiro, o Message Digest 5 (MD5 - segredo, autenticador) é computado. Em seguida, várias operações XOR com os pedaços da senha são executadas. Esse método é susceptível a ataques off-line (tabelas de arco-íris) porque o MD5 não é mais percebido como um algoritmo unidirecional forte.
Aqui está o script Python que computa a senha de usuário:
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]))
Retransmissões
Se qualquer um dos atributos na solicitação de acesso RADIUS tiver sido alterado (como o ID do RADIUS, o nome do usuário e assim por diante), o novo campo Authenticator deverá ser gerado e todos os outros campos que dependem dele deverão ser recalculados. Se for uma retransmissão, nada mudará.
Relatório
O significado do cabeçalho do autenticador é diferente para uma solicitação de acesso e uma solicitação de contabilidade.
Para uma Solicitação de Acesso, o Autenticador é gerado aleatoriamente e espera-se receber uma resposta com o ResponseAuthenticator calculado corretamente, o que prova que a resposta foi relacionada a essa solicitação específica.
Para um Accounting-Request, o Autenticador não é aleatório, mas é calculado (de acordo com o RFC 2866):
RequestAuth = MD5(Code + ID + Length + 16 zero octets + Attributes + Secret)
Dessa forma, o servidor pode verificar a mensagem de contabilização imediatamente e descartar o pacote se o valor recalculado não corresponder ao valor do Autenticador. O Identity Services Engine (ISE) retorna:
11038 RADIUS Accounting-Request header contains invalid Authenticator field
A razão típica para isso é a chave secreta compartilhada incorreta.
Atributo de Autenticador de Mensagem
O atributo Message-Authenticator é o atributo RADIUS definido no RFC 3579. É utilizado para um fim semelhante: para assinar e validar. No entanto, dessa vez, ele não é usado para validar uma resposta, mas uma solicitação.
O cliente que envia uma solicitação de acesso (também pode ser um servidor que responde com um desafio de acesso) calcula o Hash-Based Message Authentication Code (HMAC)-MD5 de seu próprio pacote e adiciona o atributo Message-Authenticator como uma assinatura. Em seguida, o servidor é capaz de verificar se ele executa a mesma operação.
A fórmula é semelhante ao Cabeçalho do autenticador:
Message-Authenticator = HMAC-MD5 (Type, Identifier, Length, Request Authenticator,
Attributes)
A função HMAC-MD5 aceita dois argumentos:
- O payload do pacote, que inclui o campo Message-Authenticator de 16 bytes preenchido com zeros
- O segredo compartilhado
Quando usar o Autenticador de Mensagens:
O Autenticador de Mensagens deve ser usado para cada pacote, o que inclui a mensagem do Protocolo de Autenticação Extensível (EAP) (RFC 3579). Isso inclui o cliente que envia a solicitação de acesso e o servidor que responde com o desafio de acesso. O outro lado descarta silenciosamente o pacote se a validação falhar.
Quando esperar falha na validação:
A validação falha quando o segredo compartilhado é inválido. Em seguida, o servidor AAA não pode validar a solicitação.
O ISE relata:
11036 The Message-Authenticator Radius Attribute is invalid.
Isso geralmente ocorre no estágio posterior quando a mensagem EAP é anexada. O primeiro pacote RADIUS da sessão 802.1x não inclui a mensagem EAP; não há nenhum campo Message-Authenticator e não é possível verificar a solicitação, mas nesse estágio, o cliente pode validar a resposta com o uso do campo Authenticator.
Validar o atributo Message-Authenticator
Aqui está um exemplo para ilustrar como você conta manualmente o valor para garantir que ele seja calculado corretamente.
O pacote número 30 (solicitação de acesso) foi escolhido. Ele está no meio da sessão EAP e o pacote inclui o campo Message-Authenticator. O objetivo é verificar se o Autenticador de Mensagens está correto:
- Clique com o botão direito do mouse em Radius Protocol e escolha Export seleted packet bytes.
- Grave esse payload RADIUS em um arquivo (dados binários).
- Para computar o campo Message-Authenticator, você deve colocar zeros lá e computar o HMAC-MD5.
Por exemplo, quando você usa o editor hexadecimal/binário, como vim, depois de digitar ":%!xxd", que alterna para o modo hexadecimal e zera 16 bytes a partir de "5012" (50hex é 80 em dec, que é do tipo Autenticador de Mensagem, e 12 é do tamanho 18, incluindo o cabeçalho dos Pares de Valores de Atributos (AVP)):
Observe que o vim e outros editores de texto podem adicionar um caractere extra LineFeed ('0a' em hexadecimal) ao final do arquivo ao salvá-lo. Certifique- se de usar o modo binário do seu editor de texto (arquivo vim - b) para evitar que apareça o caracter LineFeed.
Após essa modificação, o payload está pronto. É necessário voltar ao modo hexadecimal/binário (tipo: ":%!xxd -r") e salve o arquivo (":wq"). Você pode verificar duas vezes se um caractere LineFeed extra não foi adicionado utilizando o 'arquivo hexdump -C'.
- Use o OpenSSL para calcular o HMAC-MD5:
pluton # cat packet30-clear-msgauth.bin | openssl dgst -md5 -hmac 'cisco'
(stdin)= 01418d3b1865556918269d3cf73608b0
A função HMAD-MD5 recebe dois argumentos: a primeira a partir da entrada padrão (stdin) é a própria mensagem e a segunda é o segredo compartilhado (Cisco neste exemplo). O resultado é exatamente o mesmo valor que o Autenticador de Mensagem anexado ao pacote de Solicitação de Acesso RADIUS.
O mesmo pode ser computado com o uso do 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())
O exemplo anterior mostra como calcular o campo Message-Authenticator a partir de Access-Request. Para Access-Challenge, Access-Accept e Access-Reject, a lógica é exatamente a mesma, mas é importante lembrar que o Request Authenticator deve ser usado, que é fornecido no pacote anterior Access-Request.
Informações Relacionadas