
Kit di reverse engineering e osservabilità per firewall Draytek
Gli attaccanti avanzati scelgono sempre più spesso i dispositivi edge come bersagli. Tuttavia, questi dispositivi sono controllati da software closed-source noto come firmware, spesso distribuito in un formato proprietario. Questa è una difficoltà aggiuntiva per difensori e ricercatori, che devono capire come estrarre il firmware per valutarne la sicurezza.
Non si tratta solo di uno scenario ipotetico, come abbiamo scoperto di recente quando un cliente è stato compromesso. Con apparecchiature Draytek ai margini della loro infrastruttura, la domanda naturale era: potrebbe essere questo il punto di ingresso degli attaccanti? Oltre 500.000 dispositivi Draytek sono esposti a Internet. Eppure, non esiste uno strumento funzionante per estrarne il firmware e assistere ricercatori e difensori che lavorano con questi dispositivi.
Durante la nostra valutazione, abbiamo effettuato il reverse engineering del formato firmware di Draytek, che contiene un bootloader, un kernel RTOS compresso e due filesystem. Attraverso la nostra indagine, abbiamo sviluppato strumenti per estrarre questi componenti, svelando la capacità del sistema operativo real-time di caricare moduli di codice dinamicamente. Questi moduli vengono caricati da uno dei filesystem nell'immagine del firmware all'avvio, ma possono anche essere caricati mentre il sistema è in esecuzione e memorizzati in un filesystem separato nella memoria flash. Un attaccante può sfruttare questa funzionalità per ottenere persistenza caricando un modulo che rimane attivo anche dopo un riavvio o un aggiornamento del firmware, e l'utente finale non ha un modo per rilevare questo tipo di attacco. Di conseguenza, abbiamo sviluppato il nostro modulo per verificare l'integrità dei moduli caricati in memoria, mitigando questa potenziale minaccia.
Nella nostra ricerca di un internet più sicuro, rendiamo questo set di strumenti accessibile alla comunità, consentendo osservabilità, hardening, trasparenza e ricerca sulle vulnerabilità dei dispositivi edge Draytek.
Questo strumento è stato sviluppato come parte di un progetto di ricerca presentato al DEFCON HHV e La Villa Hacker. Puoi trovare le slide e i video PoC qui.
Inizialmente abbiamo sviluppato questo come strumento interno. Era solo un insieme di script, ma ha mostrato un grande potenziale, spingendoci a renderlo open-source. Da allora, abbiamo lavorato per integrare questi script nel pacchetto Python che troverai in questo repo e renderli compatibili con altri modelli di dispositivi.
Requisiti:
(Facoltativo) Crea e attiva l'ambiente virtuale Python:
$ python3 -m virtualenv .venv
$ source .venv/bin.activate
Installa draytek_arsenal:
$ cd draytek_arsenal
$ python3 -m pip install -r requirements.txt
$ python3 -m pip install .
Testa l'installazione:
$ python3 -m draytek_arsenal
Questa installazione sarà influenzata dalle modifiche locali al codice
$ python3 -m pip install -e .
Alcuni comandi come mips_compile e mips_merge richiedono un'immagine Docker complementare per funzionare.
Se non è stata scaricata, viene mostrato questo messaggio di errore:
[x] Image 'draytek-arsenal' not found. Please build or download the image.
Puoi scaricare l'immagine con il seguente comando:
$ docker pull ghcr.io/infobyte/draytek-arsenal:main
Oppure crearla con:
$ docker build -t draytek-arsenal ./mips-tools
draytek-arsenal è un insieme di script raccolti in un pacchetto Python. Quindi, per usarlo devi selezionare un comando:
usage: draytek-arsenal [-h] [command] args..
Alcuni dei comandi sono:
Analizza e mostra le informazioni di un firmware Draytek.
usage: parse_firmware [-h] firmware
positional arguments:
firmware Path to the firmware
options:
-h, --help show this help message and exit
Comando usato per estrarre e decomprimere Draytek che esegue 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 usato per estrarre e decomprimere Draytek che esegue 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
Ottieni l'hash di un modulo 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
Trova l'indirizzo in cui l'RTOS viene caricato con la prima istruzione di jump.
usage: find_loading_addr [-h] rtos
positional arguments:
rtos Path to the rtos
options:
-h, --help show this help message and exit
Verifica se l'RTOS è 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 un binario MIPS rilocabile (usato per i DLM).
usage: mips_compile [-h] output [input ...]
positional arguments:
output Output file
input Output file
options:
-h, --help show this help message and exit
Unisce due file ELF MIPS rilocabili.
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