
Xilinx SP605向けPCI Express DIYハッキングツールキット。このリポジトリはHyper-VバックドアとBootバックドアの本拠地でもあります。リンクと情報についてはreadmeを確認してください。
一般情報
内容
SP605ボード構成
ソフトウェア構成
例
Python APIの使用
実践的なDMA攻撃
Option ROM攻撃
トラブルシューティング
ソースコードからのプロジェクト構築
このリポジトリには、PCI-EバスとDMA攻撃に関連するツールと概念実証のセットが含まれています。Spartan-6 FPGAを搭載したXilinx SP605 Evaluation Kit向けに、ソフトウェアで制御可能なPCI-E Gen 1.1エンドポイントデバイスを実装するHDLデザインが含まれています。一般的なUSB3380EVBと比較して、このデザインはPCI-Eバスの生のトランザクションレベルパケット(TLP)を操作し、完全な64ビットメモリ読み取り/書き込み操作を実行できます。この設計の応用ユースケースを示すため、プラットフォーム初期化中に任意のUEFI DXEドライバーを実行できるUEFIベースのマシンに対する起動前DMA攻撃用のツールがあります。
このプログラムは、起動前DMA攻撃を使用して、UEFIセキュアブートが有効なプラットフォーム上で実行されているvirtualization-based securityが有効なWindows 10および11に、Hyper-V VM exit handlerバックドアを注入する方法を示しています。提供されているHyper-V Backdoor PoCは、リバースエンジニアリングやエクスプロイト開発の目的に役立つ可能性があり、ゲストパーティションからハイパーバイザーの状態(VMCS、物理/仮想メモリ、レジスタなど)を検査し、ゲストからホストへのVMエスケープ攻撃を実行するためのインターフェースを提供します。
別のプログラムは、起動前DMA攻撃を使用して、Boot Backdoorを使ったブートプロセスの乗っ取りにより、任意のユーザーモードまたはカーネルモードのコードをWindowsオペレーティングシステムに注入する方法を示しています。このプログラムはDMA Shellとも連携できます。DMA Shellは、悪意のあるPCI-Eデバイスを介してコンソールコマンドを実行し、ファイルを転送し、実行時にサードパーティの実行可能ファイルをターゲットオペレーティングシステムにロードできるBoot Backdoorペイロードです。
💾 このプロジェクトのHyper-V Backdoor部分には、このドキュメントで説明されている以外にも多くの機能と展開オプションがあります。特別なハードウェアがなくてもDMA攻撃ツールとは別に使用できます。そのドキュメントを確認してください
💾 このプロジェクトのBoot Backdoor部分には、このドキュメントで説明されている以外にも多くの機能と展開オプションがあります。特別なハードウェアがなくてもDMA攻撃ツールとは別に使用できます。そのドキュメントを確認してください
💾 このプロジェクトのPythonツールと、SP605、ZC706、PicoEVBボード用のFPGAデザインは、起動前DMA攻撃によるSMM Backdoor Next Genの展開にも使用できます。技術的な詳細についてはそのドキュメントを確認してください。
🛠️ このプロジェクトのPythonツールとペイロード(Hyper-V BackdoorやBoot Backdoorを含む)は、Xilinx Zynq-7000 SoCベースのボードでも使用できます。Xilinx ZC706評価キット用のDMA攻撃デザインには別のプロジェクトがあります。
🛠️ このプロジェクトのPythonツールとペイロード(Hyper-V BackdoorやBoot Backdoorを含む)は、PicoEVB開発ボードでも使用できます。M.2スロット用の完全自律型起動前DMA攻撃ハードウェアインプラントであり、任意のUEFI DXEドライバーをペイロードとして実行できる、別のPico DMAプロジェクト − があります。
s6_pcie_microblaze.xise − Xilinx ISEプロジェクトファイル。
microblaze/pcores/axis_pcie_v1_00_a/ − Spartan-6 FPGAのPCI Express統合エンドポイントブロックを生のTLPストリームとしてMicroBlazeソフトプロセッサコアに接続できるカスタムペリフェラルモジュール。
sdk/srec_bootloader_0/ − MicroBlazeソフトプロセッサ用のシンプルなブートローダー。SRECイメージ形式とSP605のオンボードリニアフラッシュメモリを使用して、メインのMicroBlazeプログラムをロードおよび格納します。
sdk/main_0/ − MicroBlazeソフトプロセッサ用のメインプログラム。SP605のオンボードイーサネットポートとlwIPネットワークスタックを使用して、PCI-Eバスの生のTLPパケットをTCP接続に転送します。
python/pcie_lib.py − SP605ボード上で実行されているメインのMicroBlazeプログラムとネットワーク経由で対話するためのPythonライブラリ。PythonコードからPCI-EのTLPレベルを操作するためのさまざまな低レベルおよび高レベルの抽象化を実装します。
python/pcie_mem.py − MRd TLPを送信して、ホストRAMの内容を画面または出力ファイルにダンプするコマンドラインプログラム。
python/pcie_mem_scan.py − 対象ホスト上でPCI-Eバスを介してアクセス可能な物理メモリ範囲をスキャンするコマンドラインプログラム。IOMMU有効プラットフォームのセキュリティ監査に役立ちます(例: 1、2、3、4)。
python/uefi_backdoor_simple.py − ダミーのUEFIドライバーを対象マシンのブートシーケンスに注入する起動前DMA攻撃用のコマンドラインプログラム。
python/uefi_backdoor_hv.py − Hyper-V VM exit handlerバックドアを対象システムのブートシーケンスに注入する起動前DMA攻撃用のコマンドラインプログラム。
python/uefi_backdoor_boot.py − Boot Backdoorを対象システムのブートシーケンスに注入する起動前DMA攻撃用のコマンドラインプログラム。
python/payloads/DmaBackdoorSimple/ − uefi_backdoor_simple.pyで使用するダミーUEFI DXEドライバーのソースコード。
python/payloads/DmaBackdoorHv/ − uefi_backdoor_hv.pyで使用するUEFI DXEドライバーのソースコード。Hyper-V Backdoor機能を実装しています。
python/payloads/DmaBackdoorBoot/ − uefi_backdoor_boot.pyで使用するUEFI DXEドライバーのソースコード。Boot Backdoor機能を実装しています。
Xilinx UG526ドキュメント、別名SP605 Hardware User Guideは、この素晴らしいボードの使用方法と構成について詳しく知りたい場合の最良の参考書です。
オンボードSPIフラッシュチップからビットストリームをロードするには、SW1スイッチを1-ON、2-OFFの位置に設定してSP605を構成する必要があります。
次に、FPGAビットストリームをSPIフラッシュに書き込む必要があります。Xilinx iMPACTユーティリティを使用してJTAG経由で書き込む場合はs6_pcie_microblaze.mcsファイルを使用してください(このチュートリアルを参照)。または、SP605のJ17ヘッダーに接続された外部SPIフラッシュプログラマーを使用したい場合はs6_pcie_microblaze.binを使用してください(これが最も速くて便利な方法です)。
flashrom互換のSPIフラッシュプログラマーの場合は、flashromラッパーとしてflash_to_spi.pyプログラムを使用できます:```
$ ./flash_to_spi.py linux_spi:dev=/dev/spidev1.0 s6_pcie_microblaze.bin
Using region: "main".
Calibrating delay loop... OK.
Found Winbond flash chip "W25Q64.V" (8192 kB, SPI) on linux_spi.
Reading old flash chip contents... done.
Erasing and writing flash chip...
Warning: Chip content is identical to the requested image.
Erase/write done.
3) 前のステップでSPIフラッシュに書き込まれたビットストリームファイルには、MicroBlazeコア用のカスタムブートローダーが含まれています(詳細は[bootloader.c](https://github.com/Cr4sh/s6_pcie_microblaze/blob/master/sdk/srec_bootloader_0/src/bootloader.c)を参照)。このブートローダーを使用すると、ボードオプションの設定や、SP605のUARTポート経由でのメインプログラムのリニアフラッシュへの書き込みが可能です。
MicroBlazeをアップデートモードで起動するには、SPIフラッシュプログラマを取り外し、`SW4`押しボタンスイッチを押したままボードの電源を入れます。アクティブなアップデートモードを示す`DS6` LEDが点灯したら、`SW4`を離します。
4) メインプログラム(詳細は[main.c](https://github.com/Cr4sh/s6_pcie_microblaze/blob/master/sdk/main_0/src/main.c)を参照)をリニアフラッシュに書き込むには、コンピュータをSP605のUARTブリッジUSBポートに接続し、`--flash`オプションを指定して`bootloader_ctl.py`プログラムを実行する必要があります。```
$ easy_install pyserial
$ ./python/bootloader_ctl.py /dev/ttyUSB0 --flash sdk/main_0/Debug/main_0.srec
[+] Opening device "/dev/ttyUSB0"...
[+] Flasing 339852 bytes from "sdk/main_0/Debug/main_0.srec"...
Erasing flash...
Writing 0x100 bytes at 0x00100000
Writing 0x100 bytes at 0x00100100
...
Writing 0x100 bytes at 0x00152e00
Writing 0x8c bytes at 0x00152f00
[+] DONE
bootloader_ctl.py プログラムを --config オプション付きで実行する必要があります:```
$ ./python/bootloader_ctl.py /dev/ttyUSB0 --config 192.168.2.247:255.255.255.0:192.168.2.1:28472
[+] Opening device "/dev/ttyUSB0"...
[+] Updating board settings...Address: 192.168.2.247 Netmask: 255.255.255.0 Gateway: 192.168.2.1 Port: 28472
Erasing flash... Writing 0x12 bytes at 0x00000000 [+] DONE
6) これでアップデートモードを終了し、リニアフラッシュからメインのMicroBlazeプログラムを起動できます:```
$ ./python/bootloader_ctl.py /dev/ttyUSB0 --boot
[+] Opening device "/dev/ttyUSB0"...
[+] Exitting from update mode...