
Draytekファイアウォール向けのリバースエンジニアリングおよび可観測性ツールキット
高度な攻撃者は、ますますエッジデバイスを標的にするようになっています。しかし、これらのデバイスはファームウェアとして知られるクローズドソースのソフトウェアによって制御されており、多くの場合、独自の形式で配布されています。これは、ファームウェアの抽出方法を理解してセキュリティを評価する必要がある防御者や研究者にとって、さらなる困難となっています。
これは単なる仮想的なシナリオではなく、最近クライアントが侵害された際に私たちが発見したことです。彼らのインフラストラクチャのエッジにDraytek機器があったため、自然な疑問は「これが攻撃者の侵入口になり得るのか?」というものでした。50万台以上のDraytekデバイスがインターネットに露出しています。しかし、それらのファームウェアを抽出して、これらのデバイスを扱う研究者や防御者を支援する実用的なツールは存在しません。
私たちは評価の中で、Draytekのファームウェア形式をリバースエンジニアリングしました。この形式には、ブートローダー、圧縮されたRTOSカーネル、および2つのファイルシステムが含まれています。調査を通じて、これらのコンポーネントを抽出するツールを開発し、リアルタイムオペレーティングシステムがコードモジュールを動的にロードできることを明らかにしました。これらのモジュールは、ブート中にファームウェアイメージ内のファイルシステムの1つからロードされますが、システムの実行中にロードして、フラッシュメモリ内の別のファイルシステムに保存することもできます。攻撃者はこの機能を悪用して、再起動やファームウェアアップグレード後もアクティブなままのモジュールをロードすることで永続性を実現できます。そして、エンドユーザーにはこの種の攻撃を検出する方法がありません。その結果、私たちはメモリ内のロードされたモジュールの整合性をチェックする独自のモジュールを開発し、この潜在的な脅威を軽減しました。
より安全なインターネットの実現を目指して、私たちはこのツール群をコミュニティに公開します。これにより、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..
コマンドの一部は次のとおりです:
Draytecファームウェアを解析して情報を表示します。
usage: parse_firmware [-h] firmware
positional arguments:
firmware Path to the firmware
options:
-h, --help show this help message and exit
RTOSを実行しているDraytekを抽出および展開するためのコマンドです。
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
Linuxを実行しているDraytekを抽出および展開するためのコマンドです。
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
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
2つの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