performing-firmware-extraction-with-binwalk について
組み込み機器のセキュリティ研究者向けに、ファームウェアを抽出・調査する手順です。binwalk でファイルシステムやデータ領域を特定し、抽出、エントロピー分析、機密情報の検索を行います。
主な機能
- 01ファームウェアのシグネチャスキャン
- 02エントロピーによる圧縮・暗号化領域の特定
- 03埋め込みファイルの再帰抽出
- 04抽出したファイルシステムの調査
- 05認証情報、鍵、設定の検索
- 06ファームウェア分析結果の整理
活用シーン
- 01ルーターや IoT ファームウェアの分析
- 02ファームウェア内のファイルシステム調査
- 03暗号化されている可能性のある領域の特定
- 04ハードコードされた認証情報の監査
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ mukul975/ anthropic-cybersecurity-skills --skill performing-firmware-extraction-with-binwalkインストール後、Claude Code で/performing-firmware-extraction-with-binwalkを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
LICENSEreferences/api-reference.mdscripts/agent.py詳細
Binwalk によるファームウェアの抽出
使用する場面
- ベンダーサイトからダウンロードした、またはフラッシュチップから抽出した IoT デバイスのファームウェアを分析する場合
- 脆弱性調査のために、ルーター、カメラ、組み込みデバイスのファームウェアをリバースエンジニアリングする場合
- ファームウェアのバイナリ内にある組み込みファイルシステム(SquashFS、CramFS、JFFS2、UBIFS)を特定する場合
- エントロピー分析を使用して、暗号化領域や圧縮領域を検出する場合
- ファームウェアからハードコードされた認証情報、API キー、証明書、設定ファイルを抽出する場合
- 許可を得たペネトレーションテストで、組み込みデバイスのセキュリティ評価を実施する場合
ファームウェアイメージではない標準的なデスクトップアプリケーションのバイナリやマルウェアサンプルの分析には、使用しないでください。代わりに、専用のマルウェア分析ツールを使用してください。
前提条件
- binwalk v3.x がインストールされていること(
pip install binwalk3またはシステムのパッケージマネージャーからインストール) - 標準ライブラリ(struct、math、hashlib、subprocess)を備えた Python 3.8 以降
- 抽出した SquashFS ファイルシステムのマウントに使用する SquashFS ツール(
unsquashfs) - JFFS2 ファイルシステムの抽出に使用する Jefferson(
pip install jefferson) - TP-Link や D-Link などのベンダーが使用する標準外の SquashFS バリアントに対応する Sasquatch
- 文字列の抽出に使用する
stringsユーティリティ(GNU binutils) - オプション:変更したファームウェアイメージの再パッケージ化に使用する firmware-mod-kit
ワークフロー
ステップ 1:ファームウェアの初期調査
シグネチャースキャンを実行し、組み込みファイルの種類とオフセットを特定します。
# Basic signature scan - identify all recognized file types
binwalk firmware.bin
# Scan with verbose output showing confidence levels
binwalk -v firmware.bin
# Scan for specific file types only
binwalk -y "squashfs" firmware.bin
binwalk -y "gzip\|lzma\|xz" firmware.bin
# Opcode scan to identify CPU architecture
binwalk -A firmware.bin
# Scan for raw strings to find version info, URLs, credentials
binwalk -R "password" firmware.bin
binwalk -R "http://" firmware.bin
ステップ 2:エントロピー分析
エントロピーを分析して、暗号化、圧縮、平文の領域を特定します。
# Generate entropy plot
binwalk -E firmware.bin
# Entropy with specific block size for higher resolution
binwalk -E -K 256 firmware.bin
# Combined entropy and signature scan
binwalk -BE firmware.bin
エントロピー値の解釈:
- 0.0 - 1.0:空の領域またはパディング領域(ヌルバイト、0xFF の埋め込み)
- 1.0 - 5.0:平文データ、コード、ASCII 文字列、設定
- 5.0 - 7.0:圧縮データ(gzip、LZMA、zlib)
- 7.0 - 7.99:強く圧縮されたデータ、または暗号化されたデータ
- ~8.0:エントロピーが最大で、暗号化データまたはランダムデータの可能性が高い
ステップ 3:組み込みファイルの抽出
ファームウェアイメージから、特定したすべてのコンポーネントを抽出します。
# Automatic extraction of known file types
binwalk -e firmware.bin
# Recursive extraction (matryoshka mode) for nested archives
binwalk -Me firmware.bin
# Recursive extraction with depth limit
binwalk -Me -d 5 firmware.bin
# Extract specific file type with custom handler
binwalk -D "squashfs filesystem:squashfs:unsquashfs %e" firmware.bin
# Manual extraction of data at a known offset
dd if=firmware.bin of=extracted.squashfs bs=1 skip=327680 count=4194304
ステップ 4:抽出したファイルシステムのマウントと検査
抽出したファイルシステムをマウントし、詳細に検査します。
# Mount SquashFS filesystem
mkdir /tmp/squashfs_root
unsquashfs -d /tmp/squashfs_root extracted.squashfs
# Mount CramFS filesystem
mkdir /tmp/cramfs_root
mount -t cramfs -o loop extracted.cramfs /tmp/cramfs_root
# Extract JFFS2 filesystem
jefferson extracted.jffs2 -d /tmp/jffs2_root
# Inspect the extracted filesystem
ls -la /tmp/squashfs_root/
find /tmp/squashfs_root -name "*.conf" -o -name "*.cfg" -o -name "*.key"
find /tmp/squashfs_root -name "passwd" -o -name "shadow"
ステップ 5:文字列分析と認証情報の検出
抽出したファイルシステムとファームウェアの生データから、機密データを検索します。
# Extract all printable strings
strings -a firmware.bin > all_strings.txt
strings -n 12 firmware.bin | sort -u > long_strings.txt
# Search for credentials and secrets
grep -rni "password\|passwd\|secret\|api_key\|token" /tmp/squashfs_root/etc/
grep -rni "BEGIN.*PRIVATE KEY" /tmp/squashfs_root/
# Find hardcoded URLs and endpoints
grep -rnoE "https?://[a-zA-Z0-9./?=_-]+" /tmp/squashfs_root/
# Search for certificate files
find /tmp/squashfs_root -name "*.pem" -o -name "*.crt" -o -name "*.key" -o -name "*.p12"
# Identify busybox and service versions
strings /tmp/squashfs_root/bin/busybox | grep "BusyBox v"
cat /tmp/squashfs_root/etc/banner 2>/dev/null
ステップ 6:ファームウェア分析レポートの作成
抽出と分析の結果を包括的にまとめます。
Report should include:
- Firmware metadata (vendor, model, version, build date)
- Identified components with offsets and sizes (bootloader, kernel, filesystem, config)
- Entropy analysis summary with regions of interest
- Extracted filesystem structure and key contents
- Discovered credentials, keys, certificates
- Identified services, daemons, and their versions
- Known CVEs applicable to identified component versions
- Recommendations for hardening or vulnerability remediation
主な概念
| 用語 | 定義 |
|---|---|
| ファームウェア | ハードウェアデバイスに組み込まれ、低レベルの制御を行うソフトウェアです。通常、ブートローダー、カーネル、ルートファイルシステム、設定データが含まれます |
| エントロピー分析 | バイナリデータのランダム性を統計的に測定する手法です。エントロピーが高い場合は暗号化または圧縮、低い場合は平文または構造化データを示します |
| SquashFS | 組み込み Linux デバイスでよく使われる読み取り専用の圧縮ファイルシステムです。LZMA、gzip、LZO、zstd による圧縮に対応しています |
| マジックバイト | ファイルの種類を識別する、固定オフセットにある既知のバイト列です。binwalk はマジックシグネチャーのデータベースを使用して、組み込みファイルを検出します |
| Matryoshka 抽出 | binwalk が抽出したファイルを再スキャンして、さらに組み込まれたコンテンツを検出する再帰的な抽出モードです。深くネストしたアーカイブにも対応します |
| CramFS | フラッシュストレージが限られた組み込みシステム向けに設計された、圧縮 ROM ファイルシステムです。zlib 圧縮のみをサポートしています |
| JFFS2 | Journalling Flash File System version 2(ジャーナリングフラッシュファイルシステム バージョン 2)の略で、組み込みデバイスの NOR 型および NAND 型フラッシュメモリ向けに設計されています |
ツールとシステム
- binwalk:ファームウェア分析の主要ツールです。シグネチャスキャン、エントロピー分析、埋め込みファイルの自動抽出に使用します
- unsquashfs:ルーターや IoT のファームウェアに含まれる読み取り専用の圧縮ファイルシステムをマウントするための、SquashFS 抽出ユーティリティです
- jefferson:組み込みデバイスで一般的に使用される JFFS2 フラッシュファイルシステムイメージを抽出する Python ツールです
- sasquatch:ベンダーが独自に変更した標準外の SquashFS バリアントに対応する、パッチ適用済みの SquashFS ユーティリティです
- firmware-mod-kit:セキュリティテスト用のファームウェアイメージの抽出、変更、再パッケージ化を行うツールキットです
一般的なシナリオ
シナリオ:ハードコードされた認証情報を特定するためのルーターファームウェアの抽出と監査
コンテキスト:セキュリティ研究者が、一般消費者向けルーターの許可を得たセキュリティ評価を実施しています。ファームウェアの更新ファイルは、ベンダーのサポートページからダウンロードされています。目的は、ハードコードされた認証情報、安全でないデフォルト設定、既知の脆弱なコンポーネントを特定することです。
手順:
binwalk -e firmware.binを実行して、最初の抽出を行いますbinwalk -E firmware.binを使ってエントロピーを確認し、暗号化された領域を特定します- 抽出結果の中から SquashFS のルートファイルシステムを探します
unsquashfsでマウントし、/etc/passwd、/etc/shadow、ウェブサーバーの設定を調べますgrep -rni "password" /tmp/root/etc/でハードコードされた認証情報を検索します- サービスのバージョンを特定し、CVE データベースと照合します
- 起動スクリプト内にデバッグインターフェース(telnet、UART、JTAG に関する記述)がないか確認します
- ウェブアプリケーションのコードを調べ、認証回避やコマンドインジェクションがないか確認します
注意点:
- ベンダーによっては、カスタム圧縮を使用した標準外の SquashFS を採用しています。その場合は
unsquashfsではなく sasquatch を使用してください - 暗号化されたファームウェアには、復号鍵が必要です。復号鍵は、ブートローダーや以前の未暗号化バージョンに含まれていることがよくあります
- binwalk で埋め込みファイルシステムを識別するには、ファームウェアのヘッダーを削除する必要がある場合があります
- 難読化された文字列は単純な grep 検索では見つからないことがあります。エントロピー分析を使ってデータブロブを特定してください
出力形式
FIRMWARE EXTRACTION REPORT
====================================
Firmware: TP-Link TL-WR841N v14
File: wr841nv14_en_3_16_9_up.bin
Size: 3,932,160 bytes (3.75 MB)
SHA-256: a1b2c3d4e5f6...
SIGNATURE SCAN RESULTS
Offset Type Size
------ ---- ----
0x00000000 U-Boot bootloader header 64 bytes
0x00020000 LZMA compressed data 1,048,576 bytes
0x00120000 SquashFS filesystem v4.0 2,752,512 bytes
0x003B0000 Configuration partition 131,072 bytes
ENTROPY ANALYSIS
Region 0x000000-0x020000: 4.21 (bootloader - plaintext code)
Region 0x020000-0x120000: 7.89 (kernel - LZMA compressed)
Region 0x120000-0x3B0000: 7.45 (filesystem - SquashFS compressed)
Region 0x3B0000-0x3C0000: 1.12 (config - mostly empty)
EXTRACTED FILESYSTEM
Root filesystem: SquashFS v4.0, LZMA compression
Total files: 847
Total dirs: 112
BusyBox version: 1.19.4
SECURITY FINDINGS
[CRITICAL] Hardcoded root password in /etc/shadow (hash: $1$...)
[HIGH] Telnet daemon enabled by default in /etc/init.d/rcS
[HIGH] Private RSA key at /etc/ssl/private/server.key
[MEDIUM] BusyBox 1.19.4 (CVE-2021-42373, CVE-2021-42374)
[MEDIUM] Dropbear SSH 2014.63 (CVE-2016-3116)
[LOW] UPnP service enabled by default
コメント
Markdown 対応