Skip to content
KitploitKITPLOIT
ツールブログ
提出
ツールブログ
提出

ハッキング、侵入テスト、サイバーセキュリティツールをあなたのセキュリティアーセナルに!

Kitploitはハッキング、サイバーセキュリティ、ペネトレーションテストのツールディレクトリです。最新のプロジェクトアップデートを見つけて、脆弱性の発見、システム分析、テストの自動化、セキュリティの強化を行いましょう。

··フィード·お問い合わせ·プライバシー·© 2026 Kitploit

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
blackpill — Rustで書かれた、カスタムメイドのタイプ2ハイパーバイザー、eBPF XDPおよびTCプログラムを使用したLinuxカーネルルートキット | Kitploit
ツール/GitHubGitHub/shard77/blackpill
特権昇格永続化メカニズムIDS/IPS回避横移動シェルコードポストエクスプロイトコマンド&コントロールレッドチーミングペイロード開発バイナリエクスプロイトArchived
GitHubshard77/blackpill
340455ヶ月前Kitploit レビュー済み

人気

すべて見る →

コミュニティで最も使われているツールを見つけましょう。

すべてのツールを探索

ツールコレクションを閲覧

すべてのツールを見る →
共有

blackpill

Rustで書かれた、カスタムメイドのタイプ2ハイパーバイザー、eBPF XDPおよびTCプログラムを使用したLinuxカーネルルートキット

リポジトリを見る

BlackPill

BlackPillは、Rustで作られたステルス性の高いLinuxルートキットです。

Open issues Commit activity License

機能

ルートキットは複数のモジュール(カーネルモジュールではなくRustモジュール)で構成されています:

  • 防御回避: ファイル、プロセス、ネットワーク接続などを隠す
  • フッキング: システムコールとIDTをフックする
  • ハイパーバイザー: 悪意のあるコードを実行するための仮想マシンを作成する
  • 永続化: 再起動後もルートキットを永続化し、抑制に耐性を持たせる
  • ユーティリティ: さまざまなユーティリティ

アーキテクチャは以下のようになります:

ルートキットのシンプルなアーキテクチャスキーマ

そして、C2からVMゲストへの悪意のあるコードの実行方法は次のとおりです:

ルートキットコード実行シーケンス図

C2は、細工されたアセンブル済みのx86_64ニーモニックをルートキットに送信し、ルートキットはそれをVMゲストに送信して実行します。VMゲストはホストから分離されており、悪意のあるコードの実行に使用できます。

カーネルは、受信する悪意のあるパケットを認識しません。それらはeBPF XDPプログラムによってフィルタリングされ、LKMモジュールに送られるからです。また、送信パケットはeBPF TCプログラムによって変更されます。

[!IMPORTANT]
このプロジェクトはまだ開発中です。 すべての機能が動作しているわけではありません!
お気軽にIssueやプルリクエストを送信してください。

フッキング

フッキングはルートキットの基本的な機能であり、Linuxカーネルのkprobesを使用して実装されています。この技術はシステム関数の実行をインターセプトしてリダイレクトし、その動作を監視または変更します。このルートキットのコンテキストでは、kprobesはソースコードを直接変更することなくカーネル関数と対話する強力なメカニズムを提供します。

防御回避

ステルス性を確保するために、ルートキットは主に2つの検出防止メカニズムを採用しています:

  1. カーネルモジュールリストからモジュールを削除
    カーネルモジュールがロードされると、カーネルのモジュールリストに追加され、lsmodや/proc/modulesなどのツールで表示されます。検出を防ぐために:

    • ルートキットは手動でこのリストから自身を削除します。
    • リストから削除されても、モジュールは動作し続け、機能の実行を継続できます。
  2. 特定のディレクトリを隠すためのfilldir64関数のフッキング
    ルートキットで使用されるファイルを隠すために、filldir64関数にフックが実装されています。この関数は、プロセスがディレクトリの内容を読み取るとき(例:getdentsやreaddirシステムコールを介して)に呼び出されます。

    • フッキングプロセス:
      • ルートキットはkprobesを使用してfilldir64関数をインターセプトします。
      • 実行中、ハンドラはユーザーに返されるディレクトリエントリを検査します。
      • エントリが/BLACKPILL-BLACKPILLディレクトリ(重要なルートキットファイルを保存するために使用される)と一致する場合、そのエントリはフィルタリングされ、ユーザーに返されません。
      • 他のすべてのディレクトリエントリは通常通り返され、ユーザースペースツールに対して透過性を確保します。
  3. eBPF XDPおよびTCプログラムを使用したイングレスおよびエグレスネットワークトラフィックの変更
    悪意のあるネットワーク通信を正常に見せるために、eBPF XDP(eXpress Data Path)とTC(Traffic Control)プログラムを使用します。これにより、次のことが可能です:

    • C2からの細工されたTCPペイロード署名を照合することで、最も低いネットワークレベルでXDPプログラムを使用して特定の受信(イングレス)パケットをインターセプトし、VM/LKM処理のためにカスタムBPFマップにリダイレクトします。
    • VM/LKMによって生成されたTCPパケットを照合することで、TCプログラムを使用して特定の送信(エグレス)パケットをインターセプトし、ペイロードをC2応答データで上書きして変更します。元のパケットはTCPによって自動的に再送信され、正当なトラフィックの外観を維持します。

ハイパーバイザー

私たちのシンプルなハイパーバイザーは、次の手順に従って実装されています:

  1. 初期システム設定

    • BIOS/UEFIでハードウェア仮想化拡張(Intel VT-xまたはAMD-V)を有効にする(ルートキットはこれを実行しません。事前に有効になっている必要があります)。
    • 制御レジスタ(CR0、CR4、IA32_EFER)を設定して、VMX(Intel Virtual Machine Extensions)またはSVM(AMD Secure Virtual Machine)モードに切り替える。
  2. VMXまたはSVMモードへの移行

    • 仮想化固有のデータ構造(Intelの場合はVMCS、AMDの場合はVMCB)を初期化する。
    • ゲストとホスト間の相互作用を処理するためのVM exitなどのプロセッサ機能をプログラムする。
  3. ホストとゲスト間の遷移の管理

    • 仮想マシンのエントリポイントと終了ポイント(VM entry/exit)を設定する。
    • ゲストによって行われた機密システムコールをインターセプトし、その影響を分析するロジックを実装する。
  4. ゲストシステムの作成

    • ゲスト用のメモリを割り当て、リソース(レジスタ、スタックなど)を初期化する。
  5. 通信

    • ルートキットとハイパーバイザー間の通信チャネルを使用して、コマンドやデータを送信する。

永続化

永続化は、どのルートキットにおいても重要な機能であり、再起動後もターゲットシステムの制御を維持することを可能にします。現在の実装では、/bin/touchコマンドを使用してファイルシステムにテストファイルを作成することで、その機能を示しています。このプレースホルダアクションは、ルートキットが特権操作を実行する能力を示しており、より高度な永続化戦略を実装するために拡張できます。現在は、APTレベルのルートキットを作成することが優先事項ではなく、あまり知られていない概念に関する研究が重要であるため、この機能は現在は役に立っていません。

開発環境のセットアップ

ルートキットをコンパイルする前に、複数の手順を実行する必要があります。開発環境は以下で構成されています:

  • 必須ツールを提供するAlpine Linuxイメージ
  • Rustが有効になったカスタムコンパイル済みカーネル
  • KVMで高速化されたQEMU仮想マシン

リポジトリとその浅いサブモジュールをクローンすることから始めます:

root@kitploit:~
git clone [email protected]:DualHorizon/blackpill.git --recursive --depth 1

重要な依存関係

Archベースのディストリビューションの場合:

root@kitploit:~
sudo pacman -S qemu-base qemu-desktop docker grub

Linuxカーネル

ArchベースのLinuxディストリビューションで、Rustとその他の依存関係をインストールします:

root@kitploit:~
sudo pacman -S rust rust-src rust-bindgen
sudo pacman -S clang lld llvm

次に、Rustソースとbindgenが必要です:

root@kitploit:~
rustup component add rust-src clippy rustfmt
cargo install --locked bindgen-cli

linux/フォルダで以下を実行して、Rustでカーネルのコンパイルを開始できることを確認します:

root@kitploit:~
$ cd blackpill
$ pushd linux
$ make LLVM=1 rustavailable
Rust is available!
$ popd

カーネルを設定およびコンパイルする初回セットアップタスクを起動します:

root@kitploit:~
make first-time-setup

[!IMPORTANT]
オプションのカスタマイズを求められた場合は、毎回Enterキーを押してください。

ルートキット

Rustカーネルモジュール(アウトオブツリー)は次の方法でコンパイルできます:

root@kitploit:~
make

VMを起動するには:

root@kitploit:~
make vm

VM内では、自動的にrootでログインされています。モジュールを有効にするには:

root@kitploit:~
$ modprobe blackpill
# カーネルログを確認するには
$ dmesg

使用方法

ローカル権限昇格

VMが起動したら、上記のコマンドを使用して権限を昇格できます:

root@kitploit:~
mkdir ImFeelingRootNow_<PID>

<PID>を権限を昇格させたいプロセスのプロセスIDに置き換えてください。

C2

説明

このシンプルなC2は、UDPを介して感染マシンにx86-64オペコードを送信し、TCPパケットを受信します。現在の機能はマシンとの低レベルなやり取りに限定されていますが、より多くのラッパーを使用することで、多くの実用的な使い方が可能になるかもしれません。

使用方法

Pythonクライアントをセットアップ:

root@kitploit:~
cd blackpill-c2
poetry install
poetry shell
python client.py

引数([ip] [port])を指定してクライアントを起動すると、次のように表示されます:

root@kitploit:~
$ python client.py 0.0.0.0 1339
Connected to rootkit!

その後、helpコマンドを使用して使用可能なコマンドを表示できます:

root@kitploit:~
blackpill: help
Available Commands
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ Command                             ┃ Description                                             ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩
│ read_virt_memory <address>          │ 'address'のメモリ4バイト(32ビット)を読み取る              │
│ write_virt_memory <address> <value> │ 'address'のメモリに4バイト(32ビット)を書き込む             │
│ launch_userland_binary <path>       │ 'path'でユーザーランドバイナリを起動する                      │
│ change_msr <msr> <value>            │ モデル固有レジスタ(MSR)の値を変更する                     │
│ read_phys_memory <address> <value>  │ 'address'の物理メモリ4バイト(32ビット)を読み取る          │
│ write_phys_memory <address> <value> │ 'address'の物理メモリに4バイト(32ビット)を書き込む         │
│ stop_execution                      │ ゲストVMの実行を停止する                                  │
│ change_vmcs_field <field> <value>   │ VMCSフィールドを'value'に変更する                         │
│ help                                │ このヘルプメッセージを表示する                              │
└─────────────────────────────────────┴─────────────────────────────────────────────────────────┘

クレジット

環境セットアップ:

  • Setting Up an Environment for Writing Linux Kernel Modules in Rust - The Linux Foundation
  • Kernel config qemu-busybox-min.config patch
  • Rust out-of-tree module
ツールをダウンロード