
Kit de herramientas de ingeniería inversa y observabilidad para firewalls Draytek
Los atacantes avanzados eligen cada vez más los dispositivos perimetrales como objetivos. Sin embargo, estos dispositivos están controlados por software de código cerrado conocido como firmware, a menudo distribuido en un formato propietario. Esto supone una dificultad adicional para defensores e investigadores, que deben comprender cómo extraer el firmware para evaluar su seguridad.
Esto es más que un simple escenario hipotético, como descubrimos recientemente cuando un cliente fue comprometido. Con equipos Draytek en el perímetro de su infraestructura, la pregunta natural era: ¿Podría ser este el punto de entrada de los atacantes? Más de 500 000 dispositivos Draytek están expuestos a Internet. Sin embargo, no existe ninguna herramienta funcional para extraer su firmware y ayudar a investigadores y defensores que trabajan con estos dispositivos.
Durante nuestra evaluación, aplicamos ingeniería inversa al formato de firmware de Draytek, que contiene un cargador de arranque, un kernel RTOS comprimido y dos sistemas de archivos. A través de nuestra investigación, desarrollamos herramientas para extraer estos componentes, revelando la capacidad del sistema operativo en tiempo real para cargar módulos de código dinámicamente. Estos módulos se cargan desde uno de los sistemas de archivos de la imagen de firmware durante el arranque, pero también pueden cargarse mientras el sistema está en ejecución y almacenarse en un sistema de archivos separado en la memoria flash. Un atacante puede explotar esta característica para lograr persistencia cargando un módulo que permanece activo incluso después de un reinicio o una actualización de firmware, y el usuario final no tiene forma de detectar este tipo de ataque. En consecuencia, desarrollamos nuestro propio módulo para verificar la integridad de los módulos cargados en memoria, mitigando esta amenaza potencial.
En nuestra búsqueda de un internet más seguro, ponemos este conjunto de herramientas a disposición de la comunidad, permitiendo la observabilidad, el endurecimiento, la transparencia y la investigación de vulnerabilidades en dispositivos perimetrales Draytek.
Esta herramienta fue desarrollada como parte de un proyecto de investigación que se presentó en DEFCON HHV y La Villa Hacker. Puedes encontrar las diapositivas y los videos de PoC aquí.
Inicialmente desarrollamos esto como una herramienta interna. Era solo un conjunto de scripts, pero mostró un gran potencial, lo que nos impulsó a hacerla de código abierto. Desde entonces, hemos estado trabajando para integrar estos scripts en el paquete de Python que encontrarás en este repositorio y hacerlos compatibles con otros modelos de dispositivos.
Requisitos:
(Opcional) Crear y activar el entorno virtual de Python:
$ python3 -m virtualenv .venv
$ source .venv/bin.activate
Instalar draytek_arsenal:
$ cd draytek_arsenal
$ python3 -m pip install -r requirements.txt
$ python3 -m pip install .
Probar la instalación:
$ python3 -m draytek_arsenal
Esta instalación se verá afectada por los cambios locales en el código.
$ python3 -m pip install -e .
Algunos comandos, como mips_compile y mips_merge, necesitan una imagen Docker complementaria para funcionar.
Si no se ha descargado, se muestra este mensaje de error:
[x] Image 'draytek-arsenal' not found. Please build or download the image.
Puedes descargar la imagen con el siguiente comando:
$ docker pull ghcr.io/infobyte/draytek-arsenal:main
O construirla con:
$ docker build -t draytek-arsenal ./mips-tools
draytek-arsenal es un conjunto de scripts recopilados en un paquete de Python. Por lo tanto, para usarlo debes seleccionar un comando:
usage: draytek-arsenal [-h] [command] args..
Algunos de los comandos son:
Analiza y muestra información de un firmware Draytec.
usage: parse_firmware [-h] firmware
positional arguments:
firmware Path to the firmware
options:
-h, --help show this help message and exit
Comando utilizado para extraer y descomprimir equipos Draytek que ejecutan un RTOS.
usage: extract_rtos [-h] [--rtos RTOS] [--fs FS] [--dlm DLM] [--dlm-key1 DLM_KEY1]
[--dlm-key2 DLM_KEY2]
firmware
positional arguments:
firmware Path to the firmware
options:
-h, --help show this help message and exit
--rtos RTOS, -r RTOS File path where to extract and decompress the RTOS
--fs FS, -f FS Directory path where to extract and decompress the File
System
--dlm DLM, -d DLM Directory path where to extract and decompress the DLMs
--dlm-key1 DLM_KEY1 First key used to decrypt DLMs
--dlm-key2 DLM_KEY2 First key used to decrypt DLMs
Comando utilizado para extraer y descomprimir equipos Draytek que ejecutan linux.
usage: extract_linux [-h] [--fs FS] --key KEY firmware
positional arguments:
firmware Path to the firmware
options:
-h, --help show this help message and exit
--fs FS, -f FS Directory path where to extract and decompress the File System
--key KEY Key used to decrypt
Obtén el hash de un módulo DLM.
usage: dlm_hash [-h] [-c] dlm
positional arguments:
dlm Path to the dlm
options:
-h, --help show this help message and exit
-c Print as .c code
Encuentra la dirección donde se carga el RTOS con la primera instrucción de salto.
usage: find_loading_addr [-h] rtos
positional arguments:
rtos Path to the rtos
options:
-h, --help show this help message and exit
Comprueba si el RTOS es little o big endian.
usage: find_endianness [-h] rtos
positional arguments:
rtos Path to the rtos
options:
-h, --help show this help message and exit
Compila binarios reubicables MIPS (utilizados para DLMs).
usage: mips_compile [-h] output [input ...]
positional arguments:
output Output file
input Output file
options:
-h, --help show this help message and exit
Combina dos archivos reubicables ELF MIPS.
usage: mips_merge [-h] first_input second_input output
positional arguments:
first_input First input file
second_input Second input file
output Output file
options:
-h, --help show this help message and exit