ファームウェア分析

Reading time: 17 minutes

tip

AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE) Azureハッキングを学び、実践する:HackTricks Training Azure Red Team Expert (AzRTE)

HackTricksをサポートする

はじめに

ファームウェアは、デバイスが正しく動作するために必要なソフトウェアであり、ハードウェアコンポーネントとユーザーが対話するソフトウェア間の通信を管理し促進します。これは永続的なメモリに保存されており、デバイスが電源を入れた瞬間から重要な指示にアクセスできるようにし、オペレーティングシステムの起動につながります。ファームウェアを調査し、潜在的に変更することは、セキュリティの脆弱性を特定するための重要なステップです。

情報収集

情報収集は、デバイスの構成や使用されている技術を理解するための重要な初期ステップです。このプロセスには、以下のデータを収集することが含まれます:

  • 実行されているCPUアーキテクチャとオペレーティングシステム
  • ブートローダーの詳細
  • ハードウェアのレイアウトとデータシート
  • コードベースのメトリクスとソースの場所
  • 外部ライブラリとライセンスの種類
  • 更新履歴と規制認証
  • アーキテクチャ図とフローダイアグラム
  • セキュリティ評価と特定された脆弱性

この目的のために、**オープンソースインテリジェンス(OSINT)**ツールは非常に貴重であり、手動および自動レビュープロセスを通じて利用可能なオープンソースソフトウェアコンポーネントの分析も重要です。Coverity ScanSemmle’s LGTMのようなツールは、潜在的な問題を見つけるために活用できる無料の静的分析を提供します。

ファームウェアの取得

ファームウェアの取得は、さまざまな手段を通じてアプローチでき、それぞれ異なる複雑さのレベルがあります:

  • 直接ソース(開発者、製造業者)から
  • 提供された指示からビルドする
  • 公式サポートサイトからダウンロードする
  • ホストされたファームウェアファイルを見つけるためにGoogle dorkクエリを利用する
  • S3Scannerのようなツールを使用してクラウドストレージに直接アクセスする
  • マンインザミドル技術を介して更新を傍受する
  • UARTJTAG、またはPICitのような接続を通じてデバイスから抽出する
  • デバイス通信内での更新リクエストをスニッフィングする
  • ハードコーディングされた更新エンドポイントを特定して使用する
  • ブートローダーまたはネットワークからダンプする
  • すべてが失敗した場合、適切なハードウェアツールを使用してストレージチップを取り外して読み取る

ファームウェアの分析

ファームウェアを取得したので、それについての情報を抽出してどのように扱うかを知る必要があります。それに使用できるさまざまなツール:

bash
file <bin>
strings -n8 <bin>
strings -tx <bin> #print offsets in hex
hexdump -C -n 512 <bin> > hexdump.out
hexdump -C <bin> | head # might find signatures in header
fdisk -lu <bin> #lists a drives partition and filesystems if multiple

画像のエントロピーbinwalk -E <bin>で確認し、エントロピーが低ければ暗号化されていない可能性が高いです。エントロピーが高ければ、暗号化されている(または何らかの方法で圧縮されている)可能性があります。

さらに、これらのツールを使用してファームウェア内に埋め込まれたファイルを抽出できます:

File/Data Carving & Recovery Tools

またはbinvis.io (code)を使用してファイルを検査します。

ファイルシステムの取得

前述のツールbinwalk -ev <bin>を使用してファイルシステムを抽出できたはずです。
Binwalkは通常、ファイルシステムのタイプに名前を付けたフォルダー内に抽出します。通常、以下のいずれかです:squashfs、ubifs、romfs、rootfs、jffs2、yaffs2、cramfs、initramfs。

手動ファイルシステム抽出

場合によっては、binwalkがファイルシステムのマジックバイトをシグネチャに持っていないことがあります。このような場合は、binwalkを使用してファイルシステムのオフセットを見つけ、バイナリから圧縮されたファイルシステムを切り出し、以下の手順に従ってそのタイプに応じてファイルシステムを手動で抽出**します。

$ binwalk DIR850L_REVB.bin

DECIMAL HEXADECIMAL DESCRIPTION
----------------------------------------------------------------------------- ---

0 0x0 DLOB firmware header, boot partition: """"dev=/dev/mtdblock/1""""
10380 0x288C LZMA compressed data, properties: 0x5D, dictionary size: 8388608 bytes, uncompressed size: 5213748 bytes
1704052 0x1A0074 PackImg section delimiter tag, little endian size: 32256 bytes; big endian size: 8257536 bytes
1704084 0x1A0094 Squashfs filesystem, little endian, version 4.0, compression:lzma, size: 8256900 bytes, 2688 inodes, blocksize: 131072 bytes, created: 2016-07-12 02:28:41

次のddコマンドを実行してSquashfsファイルシステムを切り出します。

$ dd if=DIR850L_REVB.bin bs=1 skip=1704084 of=dir.squashfs

8257536+0 records in

8257536+0 records out

8257536 bytes (8.3 MB, 7.9 MiB) copied, 12.5777 s, 657 kB/s

代わりに、次のコマンドを実行することもできます。

$ dd if=DIR850L_REVB.bin bs=1 skip=$((0x1A0094)) of=dir.squashfs

  • squashfs(上記の例で使用)

$ unsquashfs dir.squashfs

ファイルはその後"squashfs-root"ディレクトリにあります。

  • CPIOアーカイブファイル

$ cpio -ivd --no-absolute-filenames -F <bin>

  • jffs2ファイルシステム用

$ jefferson rootfsfile.jffs2

  • NANDフラッシュを使用したubifsファイルシステム用

$ ubireader_extract_images -u UBI -s <start_offset> <bin>

$ ubidump.py <bin>

ファームウェアの分析

ファームウェアが取得されたら、その構造と潜在的な脆弱性を理解するために解剖することが重要です。このプロセスでは、さまざまなツールを利用してファームウェアイメージから貴重なデータを分析および抽出します。

初期分析ツール

バイナリファイル(<bin>と呼ばれる)の初期検査のためのコマンドセットが提供されています。これらのコマンドは、ファイルタイプの特定、文字列の抽出、バイナリデータの分析、およびパーティションとファイルシステムの詳細の理解に役立ちます。

bash
file <bin>
strings -n8 <bin>
strings -tx <bin> #prints offsets in hexadecimal
hexdump -C -n 512 <bin> > hexdump.out
hexdump -C <bin> | head #useful for finding signatures in the header
fdisk -lu <bin> #lists partitions and filesystems, if there are multiple

画像の暗号化状態を評価するために、entropybinwalk -E <bin>でチェックされます。低いエントロピーは暗号化がないことを示唆し、高いエントロピーは暗号化または圧縮の可能性を示します。

埋め込まれたファイルを抽出するためには、file-data-carving-recovery-toolsのドキュメントやファイル検査のためのbinvis.ioなどのツールとリソースが推奨されます。

ファイルシステムの抽出

binwalk -ev <bin>を使用することで、通常はファイルシステムを抽出でき、しばしばファイルシステムタイプにちなんだ名前のディレクトリ(例:squashfs、ubifs)に保存されます。しかし、binwalkがマジックバイトが欠如しているためにファイルシステムタイプを認識できない場合、手動での抽出が必要です。これには、binwalkを使用してファイルシステムのオフセットを特定し、その後ddコマンドを使用してファイルシステムを切り出すことが含まれます。

bash
$ binwalk DIR850L_REVB.bin

$ dd if=DIR850L_REVB.bin bs=1 skip=1704084 of=dir.squashfs

その後、ファイルシステムのタイプ(例:squashfs、cpio、jffs2、ubifs)に応じて、異なるコマンドが使用されて手動で内容を抽出します。

ファイルシステム分析

ファイルシステムが抽出されると、セキュリティの欠陥を探し始めます。注意が払われるのは、安全でないネットワークデーモン、ハードコーディングされた資格情報、APIエンドポイント、更新サーバーの機能、未コンパイルのコード、スタートアップスクリプト、およびオフライン分析のためのコンパイルされたバイナリです。

確認すべき主要な場所項目には以下が含まれます:

  • etc/shadowetc/passwd のユーザー資格情報
  • etc/ssl のSSL証明書とキー
  • 潜在的な脆弱性のための設定ファイルとスクリプトファイル
  • さらなる分析のための埋め込まれたバイナリ
  • 一般的なIoTデバイスのウェブサーバーとバイナリ

いくつかのツールがファイルシステム内の機密情報や脆弱性を明らかにするのを助けます:

コンパイルされたバイナリのセキュリティチェック

ファイルシステム内で見つかったソースコードとコンパイルされたバイナリは、脆弱性のために精査されなければなりません。Unixバイナリ用のchecksec.shやWindowsバイナリ用のPESecurityのようなツールは、悪用される可能性のある保護されていないバイナリを特定するのに役立ちます。

動的分析のためのファームウェアのエミュレーション

ファームウェアをエミュレートするプロセスは、デバイスの動作または個々のプログラムの動的分析を可能にします。このアプローチは、ハードウェアやアーキテクチャの依存関係に関する課題に直面することがありますが、ルートファイルシステムや特定のバイナリを、Raspberry Piのような一致するアーキテクチャとエンディアンネスを持つデバイスや、事前構築された仮想マシンに転送することで、さらなるテストを促進できます。

個々のバイナリのエミュレーション

単一のプログラムを調べるためには、プログラムのエンディアンネスとCPUアーキテクチャを特定することが重要です。

MIPSアーキテクチャの例

MIPSアーキテクチャのバイナリをエミュレートするには、次のコマンドを使用できます:

bash
file ./squashfs-root/bin/busybox

必要なエミュレーションツールをインストールするには:

bash
sudo apt-get install qemu qemu-user qemu-user-static qemu-system-arm qemu-system-mips qemu-system-x86 qemu-utils

MIPS(ビッグエンディアン)には qemu-mips が使用され、リトルエンディアンバイナリには qemu-mipsel が選択されます。

ARMアーキテクチャエミュレーション

ARMバイナリの場合、プロセスは似ており、エミュレーションには qemu-arm エミュレーターが利用されます。

フルシステムエミュレーション

FirmadyneFirmware Analysis Toolkit などのツールは、フルファームウェアエミュレーションを容易にし、プロセスを自動化し、動的分析を支援します。

実践における動的分析

この段階では、実際のデバイス環境またはエミュレートされた環境が分析に使用されます。OSおよびファイルシステムへのシェルアクセスを維持することが重要です。エミュレーションはハードウェアの相互作用を完全に模倣できない場合があるため、時折エミュレーションを再起動する必要があります。分析はファイルシステムを再訪し、公開されたウェブページやネットワークサービスを悪用し、ブートローダーの脆弱性を探るべきです。ファームウェアの整合性テストは、潜在的なバックドアの脆弱性を特定するために重要です。

実行時分析技術

実行時分析は、gdb-multiarch、Frida、Ghidraなどのツールを使用して、プロセスまたはバイナリとその動作環境で相互作用し、ブレークポイントを設定し、ファジングやその他の技術を通じて脆弱性を特定します。

バイナリの悪用と概念実証

特定された脆弱性のPoCを開発するには、ターゲットアーキテクチャと低レベル言語でのプログラミングに関する深い理解が必要です。組み込みシステムにおけるバイナリ実行時保護は稀ですが、存在する場合は、Return Oriented Programming(ROP)などの技術が必要になることがあります。

ファームウェア分析のための準備されたオペレーティングシステム

AttifyOSEmbedOS などのオペレーティングシステムは、必要なツールを備えたファームウェアセキュリティテストのための事前構成された環境を提供します。

ファームウェアを分析するための準備されたOS

  • AttifyOS: AttifyOSは、IoTデバイスのセキュリティ評価とペネトレーションテストを行うためのディストリビューションです。必要なツールがすべてロードされた事前構成された環境を提供することで、多くの時間を節約します。
  • EmbedOS: ファームウェアセキュリティテストツールがプリロードされたUbuntu 18.04に基づく組み込みセキュリティテストオペレーティングシステムです。

脆弱なファームウェアの練習

ファームウェアの脆弱性を発見する練習をするために、以下の脆弱なファームウェアプロジェクトを出発点として使用してください。

参考文献

トレーニングと認証

tip

AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE) Azureハッキングを学び、実践する:HackTricks Training Azure Red Team Expert (AzRTE)

HackTricksをサポートする