
Ferramenta de engenharia reversa e observabilidade para firewalls Draytek
Atacantes avançados estão cada vez mais escolhendo dispositivos de borda como alvos. No entanto, esses dispositivos são controlados por software fechado conhecido como firmware, frequentemente distribuído em um formato proprietário. Isso representa uma dificuldade adicional para defensores e pesquisadores, que precisam entender como extrair o firmware para avaliar sua segurança.
Isso não é apenas um cenário hipotético, como descobrimos recentemente quando um cliente foi comprometido. Com equipamentos Draytek na borda de sua infraestrutura, a pergunta natural era: poderia este ser o ponto de entrada dos atacantes? Mais de 500 mil dispositivos Draytek estão expostos à Internet. No entanto, não existe nenhuma ferramenta funcional para extrair seu firmware e auxiliar pesquisadores e defensores que trabalham com esses dispositivos.
Durante nossa avaliação, fizemos engenharia reversa do formato de firmware da Draytek, que contém um bootloader, um kernel RTOS compactado e dois sistemas de arquivos. Através de nossa investigação, desenvolvemos ferramentas para extrair esses componentes, revelando a capacidade do sistema operacional de tempo real de carregar módulos de código dinamicamente. Esses módulos são carregados a partir de um dos sistemas de arquivos na imagem do firmware durante a inicialização, mas também podem ser carregados enquanto o sistema está em execução e armazenados em um sistema de arquivos separado na memória flash. Um atacante pode explorar esse recurso para obter persistência, carregando um módulo que permanece ativo mesmo após uma reinicialização ou atualização de firmware, e o usuário final não tem como detectar esse tipo de ataque. Consequentemente, desenvolvemos nosso próprio módulo para verificar a integridade dos módulos carregados na memória, mitigando essa ameaça potencial.
Em busca de uma internet mais segura, estamos disponibilizando esse conjunto de ferramentas para a comunidade, permitindo observabilidade, hardening, transparência e pesquisa de vulnerabilidades em dispositivos de borda Draytek.
Esta ferramenta foi desenvolvida como parte de um projeto de pesquisa que foi apresentado no DEFCON HHV e La Villa Hacker. Você pode encontrar os slides e vídeos PoC aqui.
Inicialmente desenvolvemos isso como uma ferramenta interna. Era apenas um conjunto de scripts, mas mostrou grande potencial, levando-nos a torná-la open-source. Desde então, estamos trabalhando para integrar esses scripts no pacote Python que você encontrará neste repositório e torná-los compatíveis com outros modelos de dispositivos.
Requisitos:
(Opcional) Crie e ative o ambiente virtual Python:
$ python3 -m virtualenv .venv
$ source .venv/bin.activate
Instale o draytek_arsenal:
$ cd draytek_arsenal
$ python3 -m pip install -r requirements.txt
$ python3 -m pip install .
Teste a instalação:
$ python3 -m draytek_arsenal
Esta instalação será afetada por alterações locais no código
$ python3 -m pip install -e .
Alguns comandos como mips_compile e mips_merge precisam de uma imagem Docker complementar para funcionar.
Se ela não tiver sido baixada, esta mensagem de erro será exibida:
[x] Imagem 'draytek-arsenal' não encontrada. Por favor, construa ou baixe a imagem.
Você pode baixar a imagem com o seguinte comando:
$ docker pull ghcr.io/infobyte/draytek-arsenal:main
Ou construí-la com:
$ docker build -t draytek-arsenal ./mips-tools
draytek-arsenal é um conjunto de scripts reunidos em um pacote Python. Portanto, para usá-lo, você deve selecionar um comando:
uso: draytek-arsenal [-h] [comando] args..
Alguns dos comandos são:
Analisa e exibe informações de um firmware Draytek.
uso: parse_firmware [-h] firmware
argumentos posicionais:
firmware Caminho para o firmware
opções:
-h, --help mostra esta mensagem de ajuda e sai
Comando usado para extrair e descomprimir Draytek rodando RTOS.
uso: extract_rtos [-h] [--rtos RTOS] [--fs FS] [--dlm DLM] [--dlm-key1 DLM_KEY1]
[--dlm-key2 DLM_KEY2]
firmware
argumentos posicionais:
firmware Caminho para o firmware
opções:
-h, --help mostra esta mensagem de ajuda e sai
--rtos RTOS, -r RTOS Caminho do arquivo onde extrair e descomprimir o RTOS
--fs FS, -f FS Caminho do diretório onde extrair e descomprimir o Sistema
de Arquivos
--dlm DLM, -d DLM Caminho do diretório onde extrair e descomprimir os DLMs
--dlm-key1 DLM_KEY1 Primeira chave usada para descriptografar DLMs
--dlm-key2 DLM_KEY2 Primeira chave usada para descriptografar DLMs
Comando usado para extrair e descomprimir Draytek rodando Linux
uso: extract_linux [-h] [--fs FS] --key KEY firmware
argumentos posicionais:
firmware Caminho para o firmware
opções:
-h, --help mostra esta mensagem de ajuda e sai
--fs FS, -f FS Caminho do diretório onde extrair e descomprimir o Sistema de Arquivos
--key KEY Chave usada para descriptografar
Obtém o hash de um módulo DLM.
uso: dlm_hash [-h] [-c] dlm
argumentos posicionais:
dlm Caminho para o dlm
opções:
-h, --help mostra esta mensagem de ajuda e sai
-c Imprime como código .c
Encontra o endereço onde o RTOS é carregado com a primeira instrução de jump.
uso: find_loading_addr [-h] rtos
argumentos posicionais:
rtos Caminho para o rtos
opções:
-h, --help mostra esta mensagem de ajuda e sai
Verifica se o RTOS é little ou big endian.
uso: find_endianness [-h] rtos
argumentos posicionais:
rtos Caminho para o rtos
opções:
-h, --help mostra esta mensagem de ajuda e sai
Compila binário MIPS relocável (usado para DLMs).
uso: mips_compile [-h] output [input ...]
argumentos posicionais:
output Arquivo de saída
input Arquivo de saída
opções:
-h, --help mostra esta mensagem de ajuda e sai
Mescla dois arquivos ELF MIPS relocáveis.
uso: mips_merge [-h] first_input second_input output
argumentos posicionais:
first_input Primeiro arquivo de entrada
second_input Segundo arquivo de entrada
output Arquivo de saída
opções:
-h, --help mostra esta mensagem de ajuda e sai