quarta-feira, 5 de fevereiro de 2014

All your routers are belong to us: Atacando OSPF (Parte 1)

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.

Observação:

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:
  1. Hello: Mensagem inicial utilizada por um roteador na descoberta de roteadores vizinhos em uma rede local.
  2. Database Description: Estas mensagens contém informações sobre a topologia de um AS (Autonomous System)
  3. Link State Request: Mensagem utilizada para realizar um pedido de informações para atualização de rotas.
  4. Link State Update: Mensagens de atualizações enviadas em resposta à uma requisição Link State Request.
  5. 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).
Vamos focar no campos AuType e Authentication!

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:
  1. Mensagem OSPF é gerada normalmente (checksum deve ser igual zero).
  2. 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.
  3. 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!



Um comentário: