
Kit d'ingénierie inverse et d'observabilité pour les pare-feu Draytek
Les attaquants avancés choisissent de plus en plus les équipements de périphérie comme cibles. Cependant, ces appareils sont contrôlés par un logiciel fermé appelé firmware, souvent distribué dans un format propriétaire. Cela représente une difficulté supplémentaire pour les défenseurs et les chercheurs, qui doivent comprendre comment extraire le firmware afin d'évaluer sa sécurité.
Il ne s'agit pas seulement d'un scénario hypothétique, comme nous l'avons découvert récemment lorsqu'un client a été compromis. Avec des équipements Draytek en périphérie de leur infrastructure, la question naturelle était : cela pouvait-il être le point d'entrée des attaquants ? Plus de 500 000 équipements Draytek sont exposés à Internet. Pourtant, aucun outil fonctionnel n'existe pour extraire leur firmware et aider les chercheurs et les défenseurs qui travaillent sur ces appareils.
Au cours de notre évaluation, nous avons fait de la rétro-ingénierie sur le format de firmware de Draytek, qui contient un bootloader, un noyau RTOS compressé et deux systèmes de fichiers. Grâce à nos recherches, nous avons développé des outils pour extraire ces composants, révélant la capacité du système d'exploitation temps réel à charger dynamiquement des modules de code. Ces modules sont chargés depuis l'un des systèmes de fichiers de l'image du firmware au démarrage, mais ils peuvent également être chargés pendant le fonctionnement du système et stockés dans un système de fichiers séparé en mémoire flash. Un attaquant peut exploiter cette fonctionnalité pour assurer sa persistance en chargeant un module qui reste actif même après un redémarrage ou une mise à niveau du firmware, et l'utilisateur final n'a aucun moyen de détecter ce type d'attaque. Par conséquent, nous avons développé notre propre module pour vérifier l'intégrité des modules chargés en mémoire, atténuant ainsi cette menace potentielle.
Dans notre quête d'un Internet plus sécurisé, nous mettons cet ensemble d'outils à la disposition de la communauté, permettant l'observabilité, le durcissement, la transparence et la recherche de vulnérabilités sur les équipements de périphérie Draytek.
Cet outil a été développé dans le cadre d'un projet de recherche présenté à DEFCON HHV et La Villa Hacker. Vous trouverez les diapositives et les vidéos de PoC ici.
Au départ, nous avons développé cet outil en interne. Ce n'était qu'un ensemble de scripts, mais il a montré un fort potentiel, ce qui nous a poussés à le rendre open-source. Depuis, nous travaillons à intégrer ces scripts dans le package Python que vous trouverez dans ce dépôt et à les rendre compatibles avec d'autres modèles d'appareils.
Prérequis :
(Facultatif) Créez et activez un environnement virtuel Python :
$ python3 -m virtualenv .venv
$ source .venv/bin.activate
Installez draytek_arsenal :
$ cd draytek_arsenal
$ python3 -m pip install -r requirements.txt
$ python3 -m pip install .
Testez l'installation :
$ python3 -m draytek_arsenal
Cette installation sera affectée par les modifications locales du code.
$ python3 -m pip install -e .
Certaines commandes comme mips_compile et mips_merge nécessitent une image Docker complémentaire pour fonctionner.
Si elle n'a pas été téléchargée, ce message d'erreur s'affiche :
[x] Image 'draytek-arsenal' not found. Please build or download the image.
Vous pouvez télécharger l'image avec la commande suivante :
$ docker pull ghcr.io/infobyte/draytek-arsenal:main
Ou la construire avec :
$ docker build -t draytek-arsenal ./mips-tools
draytek-arsenal est un ensemble de scripts regroupés dans un package Python. Pour l'utiliser, vous devez donc sélectionner une commande :
usage: draytek-arsenal [-h] [command] args..
Voici quelques-unes des commandes :
Analyse et affiche les informations d'un firmware Draytek.
usage: parse_firmware [-h] firmware
positional arguments:
firmware Path to the firmware
options:
-h, --help show this help message and exit
Commande utilisée pour extraire et décompresser les Draytek exécutant 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
Commande utilisée pour extraire et décompresser les Draytek exécutant 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
Obtient le hachage d'un module 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
Trouve l'adresse à laquelle le RTOS est chargé avec la première instruction de saut.
usage: find_loading_addr [-h] rtos
positional arguments:
rtos Path to the rtos
options:
-h, --help show this help message and exit
Vérifie si le RTOS est en little ou big endian.
usage: find_endianness [-h] rtos
positional arguments:
rtos Path to the rtos
options:
-h, --help show this help message and exit
Compile un binaire MIPS relocalisable (utilisé pour les DLM).
usage: mips_compile [-h] output [input ...]
positional arguments:
output Output file
input Output file
options:
-h, --help show this help message and exit
Fusionne deux fichiers ELF MIPS relocalisables.
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