高级攻击者越来越多地将边缘设备作为目标。然而,这些设备由闭源软件(即固件)控制,通常以专有格式分发。这对于防御者和研究人员来说增加了难度,他们必须了解如何提取固件以评估其安全性。
这不仅仅是一种假设场景,正如我们最近在客户遭到入侵时发现的那样。由于客户基础设施边缘部署了Draytek设备,自然而然地产生了疑问:这是攻击者的入口点吗?超过50万台Draytek设备暴露在互联网上。然而,目前尚无有效的工具可以提取其固件并帮助研究人员和防御者处理这些设备。
在评估过程中,我们对Draytek的固件格式进行了逆向工程,该格式包含一个引导加载程序、一个压缩的RTOS内核以及两个文件系统。通过调查,我们开发了提取这些组件的工具,揭示了实时操作系统动态加载代码模块的能力。这些模块在启动时从固件镜像中的一个文件系统加载,但也可以在系统运行时加载,并存储在闪存中的另一个文件系统中。攻击者可以利用此功能实现持久化,通过加载一个即使重启或固件升级后仍然保持活跃的模块,而最终用户无法检测此类攻击。因此,我们开发了自己的模块来检查内存中已加载模块的完整性,从而缓解这种潜在威胁。
为了追求更安全的互联网,我们将这套工具提供给社区,以实现对Draytek边缘设备的可观测性、加固、透明度和漏洞研究。
该工具作为研究项目的一部分开发,已在 DEFCON HHV 和 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 固件路径
options:
-h, --help 显示此帮助信息并退出
用于提取和解压缩运行 RTOS 的 Draytek 设备的命令。
usage: extract_rtos [-h] [--rtos RTOS] [--fs FS] [--dlm DLM] [--dlm-key1 DLM_KEY1]
[--dlm-key2 DLM_KEY2]
firmware
positional arguments:
firmware 固件路径
options:
-h, --help 显示此帮助信息并退出
--rtos RTOS, -r RTOS 提取并解压缩 RTOS 的目标文件路径
--fs FS, -f FS 提取并解压缩文件系统的目标目录路径
--dlm DLM, -d DLM 提取并解压缩 DLM 的目标目录路径
--dlm-key1 DLM_KEY1 用于解密 DLM 的第一个密钥
--dlm-key2 DLM_KEY2 用于解密 DLM 的第二个密钥
用于提取和解压缩运行 Linux 的 Draytek 设备的命令。
usage: extract_linux [-h] [--fs FS] --key KEY firmware
positional arguments:
firmware 固件路径
options:
-h, --help 显示此帮助信息并退出
--fs FS, -f FS 提取并解压缩文件系统的目标目录路径
--key KEY 用于解密的密钥
获取 DLM 模块的哈希值。
usage: dlm_hash [-h] [-c] dlm
positional arguments:
dlm DLM 路径
options:
-h, --help 显示此帮助信息并退出
-c 以 .c 代码格式输出
查找 RTOS 通过第一条跳转指令加载的地址。
usage: find_loading_addr [-h] rtos
positional arguments:
rtos RTOS 路径
options:
-h, --help 显示此帮助信息并退出
检查 RTOS 是小端序还是大端序。
usage: find_endianness [-h] rtos
positional arguments:
rtos RTOS 路径
options:
-h, --help 显示此帮助信息并退出
编译 MIPS 可重定位二进制文件(用于 DLMs)。
usage: mips_compile [-h] output [input ...]
positional arguments:
output 输出文件
input 输入文件
options:
-h, --help 显示此帮助信息并退出
合并两个 ELF MIPS 可重定位文件。
usage: mips_merge [-h] first_input second_input output
positional arguments:
first_input 第一个输入文件
second_input 第二个输入文件
output 输出文件
options:
-h, --help 显示此帮助信息并退出