
Инструментарий реверс-инжиниринга и наблюдаемости для межсетевых экранов Draytek
Продвинутые злоумышленники всё чаще выбирают в качестве целей периметровые устройства. Однако эти устройства управляются закрытым программным обеспечением, известным как прошивка, которая часто распространяется в проприетарном формате. Это создаёт дополнительные трудности для защитников и исследователей, которым необходимо понимать, как извлечь прошивку, чтобы оценить её безопасность.
Это не просто гипотетический сценарий, как мы недавно обнаружили, когда клиент был скомпрометирован. При наличии оборудования Draytek на периметре их инфраструктуры естественным образом возник вопрос: не могло ли оно стать точкой входа злоумышленников? Более 500 тысяч устройств Draytek доступны из Интернета. И всё же не существует рабочего инструмента для извлечения их прошивки, который помог бы исследователям и защитникам, работающим с этими устройствами.
В ходе нашей оценки мы провели реверс-инжиниринг формата прошивки Draytek, которая содержит загрузчик, сжатое ядро RTOS и две файловые системы. В процессе исследования мы разработали инструменты для извлечения этих компонентов, раскрыв способность операционной системы реального времени динамически загружать модули кода. Эти модули загружаются из одной из файловых систем в образе прошивки при загрузке, но также могут загружаться во время работы системы и храниться в отдельной файловой системе во флеш-памяти. Злоумышленник может использовать эту возможность для достижения постоянства (persistence), загружая модуль, который остаётся активным даже после перезагрузки или обновления прошивки, при этом конечный пользователь не имеет возможности обнаружить такой тип атаки. В связи с этим мы разработали собственный модуль для проверки целостности загруженных модулей в памяти, снижая эту потенциальную угрозу.
В стремлении к более безопасному интернету мы делаем этот набор инструментов доступным для сообщества, обеспечивая наблюдаемость, укрепление защиты, прозрачность и исследования уязвимостей периметровых устройств Draytek.
Этот инструмент был разработан в рамках исследовательского проекта, представленного на DEFCON HHV and La Villa Hacker. Слайды и PoC-видео можно найти здесь.
Изначально мы разработали это как внутренний инструмент. Это был просто набор скриптов, но он показал большой потенциал, что побудило нас сделать его открытым. С тех пор мы работаем над интеграцией этих скриптов в Python-пакет, который вы найдёте в этом репозитории, и над совместимостью с другими моделями устройств.
Требования:
(Необязательно) Создайте и активируйте виртуальное окружение Python:
$ python3 -m virtualenv .venv
$ source .venv/bin.activate
Установите draytek_arsenal:
$ cd draytek_arsenal
$ python3 -m pip install -r requirements.txt
$ python3 -m pip install .
Проверьте установку:
$ python3 -m draytek_arsenal
На эту установку будут влиять локальные изменения кода
$ python3 -m pip install -e .
Некоторые команды, такие как mips_compile и mips_merge, требуют дополнительный Docker-образ для работы.
Если он не был загружен, отображается следующее сообщение об ошибке:
[x] Image 'draytek-arsenal' not found. Please build or download the image.
Вы можете загрузить образ следующей командой:
$ docker pull ghcr.io/infobyte/draytek-arsenal:main
Или собрать его с помощью:
$ docker build -t draytek-arsenal ./mips-tools
draytek-arsenal — это набор скриптов, собранных в Python-пакет. Чтобы использовать его, выберите команду:
usage: draytek-arsenal [-h] [command] args..
Некоторые из команд:
Разбор и отображение информации о прошивке Draytek.
usage: parse_firmware [-h] firmware
positional arguments:
firmware Path to the firmware
options:
-h, --help show this help message and exit
Команда для извлечения и распаковки Draytek с 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
Команда для извлечения и распаковки Draytek с 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
Получение хеша 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
Поиск адреса, по которому загружается RTOS, по первой инструкции перехода.
usage: find_loading_addr [-h] rtos
positional arguments:
rtos Path to the rtos
options:
-h, --help show this help message and exit
Проверка порядка байтов (little или big endian) в RTOS.
usage: find_endianness [-h] rtos
positional arguments:
rtos Path to the rtos
options:
-h, --help show this help message and exit
Компиляция MIPS-релокационного бинарного файла (используется для DLM).
usage: mips_compile [-h] output [input ...]
positional arguments:
output Output file
input Output file
options:
-h, --help show this help message and exit
Объединение двух 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