
Reverse-Engineering- und Observability-Toolkit für Draytek-Firewalls
Fortgeschrittene Angreifer wählen zunehmend Edge-Geräte als Angriffsziele. Allerdings werden diese Geräte von Closed-Source-Software gesteuert, die als Firmware bekannt ist und oft in einem proprietären Format ausgeliefert wird. Dies stellt eine zusätzliche Hürde für Verteidiger und Forscher dar, die verstehen müssen, wie man Firmware extrahiert, um deren Sicherheit zu bewerten.
Das ist mehr als nur ein hypothetisches Szenario, wie wir kürzlich festgestellt haben, als ein Kunde kompromittiert wurde. Mit Draytek-Geräten am Rand ihrer Infrastruktur war die naheliegende Frage: Könnte dies der Einstiegspunkt der Angreifer sein? Über 500.000 Draytek-Geräte sind dem Internet ausgesetzt. Dennoch gibt es kein funktionierendes Tool, um ihre Firmware zu extrahieren und Forschern und Verteidigern zu helfen, die mit diesen Geräten arbeiten.
Bei unserer Untersuchung haben wir das Firmware-Format von Draytek per Reverse Engineering analysiert, das einen Bootloader, einen komprimierten RTOS-Kernel und zwei Dateisysteme enthält. Durch unsere Untersuchung entwickelten wir Werkzeuge, um diese Komponenten zu extrahieren, und deckten dabei die Fähigkeit des Echtzeitbetriebssystems auf, Codemodule dynamisch zu laden. Diese Module werden beim Booten aus einem der Dateisysteme im Firmware-Image geladen, können aber auch während des laufenden Betriebs geladen und in einem separaten Dateisystem im Flash-Speicher abgelegt werden. Ein Angreifer kann diese Funktion ausnutzen, um Persistenz zu erlangen, indem er ein Modul lädt, das auch nach einem Neustart oder Firmware-Upgrade aktiv bleibt. Der Endbenutzer hat keine Möglichkeit, diese Art von Angriff zu erkennen. Daher haben wir ein eigenes Modul entwickelt, das die Integrität geladener Module im Speicher prüft und diese potenzielle Bedrohung entschärft.
Im Streben nach einem sichereren Internet stellen wir diese Tool-Sammlung der Community zur Verfügung, um Beobachtbarkeit, Härtung, Transparenz und Schwachstellenforschung an Draytek-Edge-Geräten zu ermöglichen.
Dieses Tool wurde im Rahmen eines Forschungsprojekts entwickelt, das auf DEFCON HHV and La Villa Hacker vorgestellt wurde. Die Folien und PoC-Videos findest du hier.
Wir haben dies ursprünglich als internes Tool entwickelt. Es war nur eine Sammlung von Skripten, zeigte aber großes Potenzial, weshalb wir es als Open Source veröffentlicht haben. Seitdem arbeiten wir daran, diese Skripte in das Python-Paket zu integrieren, das du in diesem Repo findest, und sie mit anderen Gerätemodellen kompatibel zu machen.
Voraussetzungen:
(Optional) Virtuelle Python-Umgebung erstellen und aktivieren:
$ python3 -m virtualenv .venv
$ source .venv/bin.activate
draytek_arsenal installieren:
$ cd draytek_arsenal
$ python3 -m pip install -r requirements.txt
$ python3 -m pip install .
Installation testen:
$ python3 -m draytek_arsenal
Bei dieser Installation werden lokale Codeänderungen berücksichtigt.
$ python3 -m pip install -e .
Einige Befehle wie mips_compile und mips_merge benötigen ein ergänzendes Docker-Image, um zu funktionieren.
Wenn das Image nicht heruntergeladen wurde, erscheint folgende Fehlermeldung:
[x] Image 'draytek-arsenal' not found. Please build or download the image.
Das Image kann mit dem folgenden Befehl heruntergeladen werden:
$ docker pull ghcr.io/infobyte/draytek-arsenal:main
Oder du kannst es mit folgendem Befehl erstellen:
$ docker build -t draytek-arsenal ./mips-tools
draytek-arsenal ist eine Sammlung von Skripten in einem Python-Paket. Zur Verwendung musst du einen Befehl auswählen:
usage: draytek-arsenal [-h] [command] args..
Einige der Befehle sind:
Parst und zeigt Informationen einer Draytec-Firmware an.
usage: parse_firmware [-h] firmware
positional arguments:
firmware Path to the firmware
options:
-h, --help show this help message and exit
Befehl zum Extrahieren und Dekomprimieren von Draytek-Geräten, die ein RTOS ausführen.
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
Befehl zum Extrahieren und Dekomprimieren von Draytek-Geräten, die Linux ausführen.
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
Ermittelt den Hash eines DLM-Moduls.
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
Ermittelt die Adresse, an der das RTOS mit der ersten Sprunganweisung geladen wird.
usage: find_loading_addr [-h] rtos
positional arguments:
rtos Path to the rtos
options:
-h, --help show this help message and exit
Prüft, ob das RTOS Little- oder Big-Endian ist.
usage: find_endianness [-h] rtos
positional arguments:
rtos Path to the rtos
options:
-h, --help show this help message and exit
Kompiliert eine MIPS-relozierbare Binärdatei (wird für DLMs verwendet).
usage: mips_compile [-h] output [input ...]
positional arguments:
output Output file
input Output file
options:
-h, --help show this help message and exit
Führt zwei relozierbare ELF-MIPS-Dateien zusammen.
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