hacktricks/physical-attacks/firmware-analysis/README.md
2023-07-07 23:42:27 +00:00

32 KiB
Raw Blame History

ファームウェア分析

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥

はじめに

ファームウェアは、デバイスのハードウェアコンポーネントに対する通信と制御を提供するソフトウェアの一種です。デバイスが実行する最初のコードです。通常、オペレーティングシステムを起動し、さまざまなハードウェアコンポーネントとの通信によってプログラムのための非常に特定のランタイムサービスを提供します。ほとんどの電子デバイスにはファームウェアがあります。

デバイスは、ROM、EPROM、またはフラッシュメモリなどの不揮発性メモリにファームウェアを格納します。

セキュリティの問題を多く発見できるため、ファームウェアを調査し、それを変更しようとすることが重要です。

情報収集と偵察

この段階では、ターゲットに関するできるだけ多くの情報を収集し、その全体的な構成と基礎となる技術を理解するために必要な情報を収集しようとします。次の情報を収集しようとしてください。

  • サポートされているCPUアーキテクチャ
  • オペレーティングシステムプラットフォーム
  • ブートローダの設定
  • ハードウェアの回路図
  • データシート
  • コード行数LoCの推定
  • ソースコードリポジトリの場所
  • サードパーティのコンポーネント
  • オープンソースライセンスGPL
  • 変更履歴
  • FCC ID
  • 設計およびデータフローダイアグラム
  • 脅威モデル
  • 以前の侵入テストレポート
  • バグトラッキングチケットJira、BugCrowd、HackerOneなどのバグバウンティプラットフォーム

可能な限り、オープンソースインテリジェンスOSINTツールと技術を使用してデータを取得します。オープンソースソフトウェアが使用されている場合は、リポジトリをダウンロードし、コードベースに対して手動および自動の静的解析を実行します。オープンソースソフトウェアプロジェクトでは、ベンダーが提供する無料の静的解析ツールCoverity ScanSemmles LGTMなど)を既に使用している場合があります。

ファームウェアの取得

ファームウェアをダウンロードするためには、異なる難易度の方法があります。

  • 開発チーム、メーカー/ベンダー、またはクライアントから直接ダウンロードする
  • メーカーが提供する手順に従ってゼロからビルドする
  • ベンダーのサポートサイトからダウンロードする
  • バイナリファイルの拡張子やDropbox、Box、Googleドライブなどのファイル共有プラットフォームに対してGoogleドーククエリを使用する
  • フォーラムやブログにコンテンツをアップロードする顧客からファームウェアイメージに出くわすことがよくあります。また、問題のトラブルシューティングのためにメーカーに問い合わせ、zipファイルやフラッシュドライブを送ってもらったことがある場合もあります。
  • 例:intitle:"Netgear" intext:"Firmware Download"
  • https://github.com/sa7mon/S3Scannerなどのツールを使用して、Amazon Web ServicesAWSのS3バケットなどの公開されたクラウドプロバイダのストレージ場所からビルドをダウンロードする
  • アップデート時のデバイス間通信の中間者攻撃MITM
  • UARTJTAGPICitなどを介してハードウェアから直接抽出する
  • アップデートサーバリクエストのためのハードウェアコンポーネント内のシリアル通信をスニフィングする
  • モバイルアプリケーションや厚いアプリケーション内のハードコードされたエンドポイントを介して
  • ブートローダU-bootからフラッシュストレージまたはtftpを介してネットワーク経由でファームウェアをダンプする
  • オフライン分析とデータ抽出のために、ボードからフラッシュチップSPIまたはMCUを取り外す最終手段
  • フラッシュストレージと/またはMCUのサポートされているチッププログラマが必要です。

ファームウェアの分析

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

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>コマンドで画像のエントロピーをチェックしてください。エントロピーが低い場合、暗号化されていない可能性が高いです。エントロピーが高い場合、暗号化されている可能性があります(または何らかの方法で圧縮されています)。

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

{% content-ref url="../../forensics/basic-forensic-methodology/partitions-file-systems-carving/file-data-carving-recovery-tools.md" %} file-data-carving-recovery-tools.md {% endcontent-ref %}

または、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

Alternatively, you can run the following command.

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

  • For squashfs (used in the example above)

$ unsquashfs dir.squashfs

Files will be in the "squashfs-root" directory afterwards.

  • CPIO archive files

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

  • For jffs2 filesystems

$ jefferson rootfsfile.jffs2

  • For ubifs filesystems with NAND flash

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

$ ubidump.py <bin>

ファイルシステムの分析

ファイルシステムを取得したら、以下のような悪いプラクティスを探すことができます。

  • telnetdなどのセキュリティの脆弱性のあるネットワークデーモン(メーカーがバイナリの名前を変更して隠すこともあります)
  • ハードコードされた認証情報ユーザー名、パスワード、APIキー、SSHキー、バックドアのバリエーションなど
  • ハードコードされたAPIエンドポイントとバックエンドサーバーの詳細
  • エントリーポイントとして使用できるアップデートサーバーの機能
  • リモートコード実行のためのコンパイルされていないコードと起動スクリプトの確認
  • オフライン分析のためにコンパイルされたバイナリの抽出

ファームウェア内で探すべき興味深いもの:

  • etc/shadowとetc/passwd
  • etc/sslディレクトリの一覧
  • .pem、.crtなどのSSL関連ファイルの検索
  • 設定ファイルの検索
  • スクリプトファイルの検索
  • 他の.binファイルの検索
  • admin、password、remote、AWSキーなどのキーワードの検索
  • IoTデバイスで使用される一般的なWebサーバーの検索
  • ssh、tftp、dropbearなどの一般的なバイナリの検索
  • 禁止されたC関数の検索
  • 一般的なコマンドインジェクションの脆弱な関数の検索
  • URL、メールアドレス、IPアドレスの検索
  • その他...

この種の情報を検索するツール(常に手動でファイルシステムの構造を確認し、ツールを使用して隠されたものを見つけることができます):

  • LinPEAS: ファイルシステム内の機密情報を検索するために便利な素晴らしいbashスクリプトです。ファームウェアファイルシステムにchrootして実行します。
  • Firmwalker: 潜在的な機密情報を検索するためのbashスクリプト
  • The Firmware Analysis and Comparison Tool (FACT):
  • オペレーティングシステム、CPUアーキテクチャ、サードパーティのコンポーネントなどのソフトウェアコンポーネントの識別と関連するバージョン情報
  • イメージからのファームウェアファイルシステムsの抽出
  • 証明書と秘密鍵の検出
  • Common Weakness EnumerationCWEにマッピングされる弱い実装の検出
  • 脆弱性のフィードと署名に基づく検出
  • 基本的な静的行動分析
  • ファームウェアバージョンとファイルの比較diff
  • QEMUを使用したファイルシステムバイナリのユーザーモードエミュレーション
  • NX、DEP、ASLR、スタックキャナリー、RELRO、FORTIFY_SOURCEなどのバイナリの防御機能の検出
  • REST API
  • その他...
  • FwAnalyzer: FwAnalyzerは、設定可能なルールセットを使用して、ext2/3/4、FAT/VFat、SquashFS、UBIFSファイルシステムイメージ、cpioアーカイブ、およびディレクトリコンテンツを分析するツールです。
  • ByteSweep: 無料のIoTファームウェアセキュリティ分析ツール
  • ByteSweep-go: これは、元のByteSweepプロジェクトをGoで完全に書き直したものです。
  • EMBA: _EMBA_は、ペネトレーションテスター向けの中央ファームウェア分析ツールとして設計されています。_EMBA_は、ファームウェアの抽出プロセスから始まり、静的分析、エミュレーションを介した動的分析、最終的にはレポートの生成まで、セキュリティ分析プロセス全体をサポートします。_EMBA_は、ファームウェア内の可能な脆弱性や弱点を自動的に検出します。例としては、セキュリティの脆弱性のあるバイナリ、古くて非推奨のソフトウェアコンポーネント、潜在的に脆弱なスクリプトやハードコードされたパスワードなどがあります。

{% hint style="warning" %} ファイルシステム内にはプログラムのソースコード(常に確認する必要があります)だけでなく、コンパイルされたバイナリも含まれている場合があります。これらのプログラムは何らかの形で公開されている可能性があり、潜在的な脆弱性を逆コンパイルして確認する必要があります。

checksec.shのようなツールは、保護されていないバイナリを見つけるのに役立ちます。Windowsバイナリの場合は、PESecurityを使用できます。 {% endhint %}

ファームウェアのエミュレーション

ファームウェアをエミュレートすることで、デバイスの実行中または単一のプログラム動的分析を実行できます。

{% hint style="info" %} ハードウェアやアーキテクチャの依存関係により、一部または完全なエミュレーションが動作しない場合があります。アーキテクチャとエンディアンが一致する場合、ラズベリーパイなどの所有しているデバイスにファームウェアのルートファイルシステムまたは特定のバイナリを転送してさらなるテストを行うことができます。この方法は、ターゲットと同じアーキテクチャとエンディアンを使用する事前にビルドされた仮想マシンにも適用されます。 {% endhint %}

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

脆弱性を検索するために単一のプログラムをエミュレートしたい場合は、まずそのエンディアンとコンパイルされたCPUアーキテクチャを特定する必要があります。

MIPSの例

file ./squashfs-root/bin/busybox
./squashfs-root/bin/busybox: ELF 32-bit MSB executable, MIPS, MIPS32 rel2 version 1 (SYSV), dynamically linked, interpreter /lib/ld-uClibc.so.0, stripped

今、QEMUを使用してbusybox実行ファイルをエミュレートすることができます。

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

実行可能ファイルはMIPS向けにコンパイルされており、ビッグエンディアンのバイト順序に従っているため、**qemu-mips**エミュレータを使用します。リトルエンディアンの実行可能ファイルをエミュレートする場合は、elサフィックスを持つエミュレータを選択する必要があります(qemu-mipsel)。

qemu-mips -L ./squashfs-root/ ./squashfs-root/bin/ls
100              100.7z           15A6D2.squashfs  squashfs-root    squashfs-root-0

ARMの例

<details>
<summary>Click to expand!</summary>

##### Firmware Analysis

- **Firmware Extraction**: The first step in firmware analysis is to extract the firmware from the target device. This can be done by using tools like `binwalk`, `firmware-mod-kit`, or by directly accessing the device's memory.

- **Firmware Reverse Engineering**: Once the firmware is extracted, it can be reverse engineered to understand its inner workings. Tools like `IDA Pro`, `Ghidra`, or `Radare2` can be used for this purpose.

- **Firmware Vulnerability Analysis**: After reverse engineering, the firmware can be analyzed for vulnerabilities. This involves identifying potential security flaws, such as buffer overflows, format string vulnerabilities, or hardcoded credentials.

- **Firmware Patching**: If vulnerabilities are found, patches can be developed to fix them. These patches can be applied to the firmware to enhance its security.

- **Firmware Emulation**: Emulating the firmware can help in understanding its behavior without running it on the actual device. Tools like `QEMU` or `Unicorn` can be used for firmware emulation.

- **Firmware Debugging**: Debugging the firmware can provide insights into its execution flow and help in identifying vulnerabilities. Tools like `GDB` or `OllyDbg` can be used for firmware debugging.

- **Firmware Exploitation**: Exploiting vulnerabilities in the firmware can lead to unauthorized access or control over the target device. Techniques like stack smashing, return-oriented programming (ROP), or code injection can be used for firmware exploitation.

</details>

ARMの例

<details>
<summary>クリックして展開する!</summary>

##### ファームウェア解析

- **ファームウェアの抽出**: ファームウェア解析の最初のステップは、対象デバイスからファームウェアを抽出することです。これは、`binwalk`、`firmware-mod-kit`などのツールを使用するか、デバイスのメモリに直接アクセスすることで行うことができます。

- **ファームウェアの逆アセンブリ**: ファームウェアが抽出されたら、その内部動作を理解するために逆アセンブリすることができます。この目的のために、`IDA Pro`、`Ghidra`、`Radare2`などのツールを使用することができます。

- **ファームウェアの脆弱性分析**: 逆アセンブリ後、ファームウェアは脆弱性の分析のために調査されます。これには、バッファオーバーフロー、フォーマット文字列の脆弱性、ハードコードされた認証情報などの潜在的なセキュリティ上の問題の特定が含まれます。

- **ファームウェアのパッチ適用**: 脆弱性が見つかった場合、それらを修正するためのパッチを開発することができます。これらのパッチは、ファームウェアに適用してセキュリティを強化することができます。

- **ファームウェアのエミュレーション**: ファームウェアのエミュレーションは、実際のデバイス上で実行せずにその動作を理解するのに役立ちます。`QEMU`や`Unicorn`などのツールを使用してファームウェアのエミュレーションを行うことができます。

- **ファームウェアのデバッグ**: ファームウェアのデバッグは、実行フローを分析し、脆弱性の特定に役立ちます。`GDB`や`OllyDbg`などのツールを使用してファームウェアのデバッグを行うことができます。

- **ファームウェアの攻撃**: ファームウェアの脆弱性を悪用することで、対象デバイスへの不正アクセスや制御を行うことができます。スタックスマッシング、リターンオリエンテッドプログラミングROP、コードインジェクションなどの技術を使用してファームウェアの攻撃を行うことができます。

</details>
file bin/busybox
bin/busybox: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-musl-armhf.so.1, no section header

エミュレーション:

qemu-arm -L ./squashfs-root/ ./squashfs-root/bin/ls
1C00000.squashfs  B80B6C            C41DD6.xz         squashfs-root     squashfs-root-0

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

一部のツールは、一般的にqemuをベースにしており、完全なファームウェアをエミュレートすることができます。

  • https://github.com/firmadyne/firmadyne:
  • ファームウェアを抽出するためにextractor.pyスクリプトを実行し、getArch.shスクリプトを使用してアーキテクチャを取得するために、いくつかのものをインストールし、postgresを設定する必要があります。次に、tar2db.pyおよびmakeImage.shスクリプトを使用して、抽出したイメージからの情報をデータベースに保存し、エミュレートできるQEMUイメージを生成します。次に、ネットワークインターフェースを取得するためにinferNetwork.shスクリプトを使用し、最後に./scratch/1/folderに自動的に作成されるrun.shスクリプトを使用します。
  • https://github.com/attify/firmware-analysis-toolkit:
  • このツールはfirmadyneに依存しており、firmadyneを使用してファームウェアをエミュレートするプロセスを自動化します。使用する前にfat.configを設定する必要があります:sudo python3 ./fat.py IoTGoat-rpi-2.img --qemu 2.5.0
  • https://github.com/therealsaumil/emux
  • https://github.com/getCUJO/MIPS-X
  • https://github.com/qilingframework/qiling#qltool

動的解析

この段階では、攻撃対象のファームウェアを実行しているデバイスまたはエミュレートされたファームウェアを攻撃するために、実行中のOSとファイルシステムにシェルがあることが強く推奨されます

ファームウェアをエミュレートしている場合、エミュレーション内の一部のアクティビティが失敗することがあり、エミュレーションを再起動する必要があるかもしれません。たとえば、ウェブアプリケーションは、元のデバイスが統合されているデバイスから情報を取得する必要があるかもしれませんが、エミュレーションではそれをエミュレートしていません。

実行環境では、新しい情報にアクセスできる可能性があるため、ファイルシステムを再確認する必要があります

ウェブページが公開されている場合、コードを読み、アクセスできるようになったら、それらをテストする必要があります。hacktricksでは、さまざまなウェブハッキングテクニックに関する多くの情報を見つけることができます。

ネットワークサービスが公開されている場合、それらを攻撃しようとする必要があります。hacktricksでは、さまざまなネットワークサービスのハッキングテクニックに関する多くの情報を見つけることができます。また、Mutinyboofuzz、およびkittyなどのネットワークおよびプロトコルのファジングツールを使用して、それらをファズすることもできます。

ブートローダを攻撃してルートシェルを取得できるかどうかを確認する必要があります:

{% content-ref url="bootloader-testing.md" %} bootloader-testing.md {% endcontent-ref %}

デバイスがいかなる種類のファームウェア整合性テストを行っているかをテストする必要があります。そうでない場合、攻撃者はバックドア付きのファームウェアを提供したり、他の人が所有するデバイスにそれをインストールしたり、ファームウェアの更新に脆弱性がある場合はリモートで展開したりすることができます:

{% content-ref url="firmware-integrity.md" %} firmware-integrity.md {% endcontent-ref %}

ファームウェアの更新の脆弱性は、ファームウェアの整合性検証されない暗号化されていない ネットワークプロトコルの使用、ハードコードされた 資格情報の使用、クラウドコンポーネントへの安全でない認証、および過剰で安全でないロギング(機密データ)などが原因です。また、検証なしで物理的な更新を許可します。

ランタイム解析

ランタイム解析では、デバイスが通常の環境またはエミュレートされた環境で実行されている間に、実行中のプロセスまたはバイナリにアタッチします。基本的なランタイム解析の手順は以下の通りです:

  1. sudo chroot . ./qemu-arch -L <optionalLibPath> -g <gdb_port> <binary>
  2. gdb-multiarchをアタッチするか、IDAを使用してバイナリをエミュレートします
  3. memcpy、strncpy、strcmpなどのステップ4で特定された関数にブレークポイントを設定します。
  4. ファズツールを使用して、オーバーフローやプロセスのクラッシュを特定するために、大きなペイロード文字列を実行します。
  5. 脆弱性が特定された場合は、ステップ8に進んでください。

役立つツール(非網羅的)は次のとおりです:

  • gdb-multiarch
  • Peda
  • Frida
  • ptrace
  • strace
  • IDA Pro
  • Ghidra
  • Binary Ninja
  • Hopper

バイナリの攻撃

前の手順でバイナリ内の脆弱性を特定した後、実世界の影響とリスクを示すために適切な概念実証PoCが必要です。エクスプロイトコードの開発には、低レベルの言語ASM、C/C++、シェルコードなどでのプログラミング経験と、特定のターゲットアーキテクチャMIPS、ARM、x86などの背景が必要です。PoCコードは、メモリ内の命令を制御することによって、デバイスまたはアプリケーションで任意の実行を取得することを目的としています。

組み込みシステムでは、バイナリのランタイム保護NX、DEP、ASLRなどが一般的には行われないことが一般的ですが、これが発生する場合、ROPReturn Oriented Programmingなどの追加のテクニックが必要になる場合があります。ROPは、既存のコードを連鎖させることによって、ターゲットプロセス/バイナリのコード内に任意の悪意のある機能を実装することを攻撃者に可能にします。バッファオーバーフローなどの特定された脆弱性を悪用するためには、ROPチェーンを形成するための手順を踏む必要があります。このような状況に役立つツールとしては、CapstoneのガジェットファインダーやROPGadget- https://github.com/JonathanSalwan/ROPgadgetがあります。

詳しいガイダンスについては、以下の参考文献を利用してください:

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

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

参考文献

トレーニングと認定

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥