Nesta postagem eu vou estar falando um pouco sobre possíveis ataques contra o protocolo OSPF (Open Shortest Path First). Estarei focando nesta primeira parte na coleta de tráfego OSPF e ataques contra os métodos de autenticação utilizados pelo protocolo.
O
conteúdo apresentado nesta postagem deve ser reproduzido apenas em um
ambiente no qual você possui autorização para a realização de testes de
segurança.
Introdução
O OSPF é um protocolo importante utilizado para facilitar a troca de informações de roteamento entre roteadores. Para realizar os ataques, vamos primeiro analisar os tipos de mensagens utilizadas pelo protocolo:
- Hello: Mensagem inicial utilizada por um roteador na descoberta de roteadores vizinhos em uma rede local.
- Database Description: Estas mensagens contém informações sobre a topologia de um AS (Autonomous System)
- Link State Request: Mensagem utilizada para realizar um pedido de informações para atualização de rotas.
- Link State Update: Mensagens de atualizações enviadas em resposta à uma requisição Link State Request.
- Link State Acknowledgment: Mensagem de confirmação (para o Link State Update).
O protocolo OSPF permite que todos os tipos de mensagens possam ser autenticadas através de diferentes métodos (descritos mais adiante). A análise dos cabeçalhos das mensagens OSPF torna-se importante para entender como podemos atacar estes métodos de autenticação.
Formato de Mensagens:
O cabeçalho de uma mensagem OSPF costuma ter 8 campos (um total de 24 bytes):
- Version: Versão do protocolo
- Type: Tipo de mensagem OSPF (descrito na introdução)
- Packet Length: Tamanho da mensagem (incluindo o cabeçalho)
- Router ID: Identificador do roteador que gerou a mensagem.
- Area ID: Identificador da área a qual a mensagem pertence.
- Checksum: Código checksum da mensagem
- AuType: Tipo de autenticação utilizado pela mensagem
- Authentication: Campo utilizado para autenticação da mensagem (conteúdo do campo vai depender do tipo de autenticação utilizado).
![]() |
Figura 01: Cabeçalho OSPF |
Método de autenticação 01: Autenticação nula
O primeiro método de autenticação utilizado pelo protocolo é uma autenticação nula (ou simplesmente a falta de autenticação hehe). Neste método o campo AuType apresenta um valor 0 e o campo Authentication encontra-se vazio. A figura 02 apresenta um exemplo de mensagem OSPF com autenticação nula.
![]() |
Figura 02: Autenticação Nula |
Método de autenticação 02: Autenticação simples
O segundo método de autenticação utilizado pelo protocolo apresenta a utilização de uma senha para trocar de mensagens OSPF. Neste método o campo AuType apresenta o valor 1, enquanto que o campo Authentication apresenta a senha em texto claro! A figura 03 apresenta um exemplo de mensagem OSPF com autenticação simples.
![]() |
Figura 03: Autenticação Simples |
Método de autenticação 03: Autenticação com criptografia
O terceiro método utiliza funções de hash para a autenticação de mensagem OSPF. Neste método o campo AuType apresenta o valor 2, enquanto que o campo Authentication apresenta um valor hash em MD5 (construção do hash é descrito a seguir). A figura 04 apresenta um exemplo de mensagem OSPF autenticada através de criptografia.
![]() |
Figura 04: Autenticação com criptografia |
Construção do Hash
O hash presente no método de autenticação 03 é criado da seguinte forma:
- Mensagem OSPF é gerada normalmente (checksum deve ser igual zero).
- A senha secreta (em texto claro) deve ter tamanho igual a 16 bytes. Caso o tamanho da senha seja menor que 16, bytes nulos (0x00) são adicionados no final da senha. Caso contrário, apenas os primeiros 16 bytes da senha secreta devem ser utilizados.
- Hash = MD5(Mensagem OSPF + senha secreta de 16 bytes).
Atacando OSPF: Criando um sniffer
Para iniciar os ataques, precisamos primeiro criar um sniffer para a coleta de tráfego OSPF. Eu vou utilizar a biblioteca Scapy para criar um sniffer em Python (como de costume hehe!). Os testes apresentados nesta postagem foram realizados em uma VM do Kali Linux 1.0.6 (antigo BackTrack).
A biblioteca Scapy não apresenta o suporte à mensagens OSPF por padrão. Por isso, precisamos pegar uma extensão disponível publicamente para a coleta e manipulação de mensagens OSPF (extensão disponivel para download em http://bb.secdev.org/scapy/raw/300258ace1bc7e50a5c6e159d2919f474149d8ba/scapy/contrib/ospf.py).
A primeira parte da criação do sniffer é gerar um método para a filtragem de pacotes OSPF (o qual pode ser facilmente realizado através da classe OSPF_Hdr). A figura 05 apresenta uma maneira de realizar a filtragem de mensagens OSPF.
![]() |
Figura 05: Filtrando pacotes |
A segunda parte do script envolve a verificação do tipo de autenticação utilizado pela mensagem OSPF capturada. A figura 06 apresenta um exemplo de função para a verificação do tipo de autenticação.
![]() |
Figura 06: Verificando o tipo de autenticação |
A terceira parte é responsável por realizar um ataque de dicionário contra o hash encontrado no pacote coletado. A figura 7 apresenta um exemplo de criação de hash a partir de uma determinada wordlist.
![]() |
Figura 07: Quebra de senha (Hash MD5) |
As figuras abaixo apresentam o resultado do script rodando em 3 cenários possíveis de autenticação (autenticação nula, autenticação simples e autenticação com criptografia).
![]() |
Figura 08: Autenticação Nula |
![]() |
Figura 09: Autenticação Simples |
![]() |
Figura 10: Autenticação com Criptografia |
O script encontra-se para download no GitHub:
https://raw2.github.com/pasknel/hacking-com-tapioca/master/OSPF/ospf_crack.py
Conclusão
Nesta postagem foram apresentados alguns ataques contra o protocolo OSPF. Os métodos de autenticação utilizados nas mensagens OSPF podem ser atacados através da coleta de pacotes e ataques de força-bruta/dicionário. Por favor escrevam suas sugestões e comentários!
Obrigado :)
Keep Hacking!
Show! Parabéns pelo artigo Pasknel.
ResponderExcluir