
バックドア、C2、ライブラリインジェクション、実行ハイジャック、永続化、ステルス機能を備えたLinux eBPFルートキット
TripleCross は、eBPF テクノロジーの攻撃能力を示す Linux eBPF ルートキットです。
TripleCross は、この分野の以前のインプラント設計、特に DEFCON 27 の Jeff Dileo1、DEFCON 29 の Pat Hogan2、同じく DEFCON 29 の Guillaume Fournier と Sylvain Afchain3、そして Kris Nóva の Boopkit4 の研究に触発されています。これらの eBPF テクノロジーの攻撃能力に関する先駆的な探求により開拓された技法の一部を再利用し、拡張しています。
このルートキットは、UC3M での学士論文のために作成されました。設計の詳細については、論文ドキュメント を参照してください。
このルートキットは 純粋に教育および学術目的 です。ソフトウェアは「現状のまま」提供され、著者は使用中に発生する可能性のあるいかなる損害や事故についても責任を負いません。
TripleCross を法律違反に使用しないでください。提供されたソフトウェアおよび情報の誤用は、刑事告訴につながる可能性があります。
次の図は、TripleCross のアーキテクチャとそのモジュールを示しています。
ルートキットの通信に使用される Raw ソケットライブラリ RawTCP_Lib は私の著作であり、独自のリポジトリ があります。
次の表は、主要なソースコードファイルとディレクトリを説明し、ナビゲーションを容易にします。
| ディレクトリ | 説明 |
|---|---|
| docs | 元の論文ドキュメント |
| src/client | ルートキットクライアントのソースコード |
| src/client/lib | RawTCP_Lib 共有ライブラリ |
| src/common | ルートキットの定数と設定。リングバッファなど、ルートキットの eBPF 側とユーザースペース側に共通の要素の実装も含む |
| src/ebpf | ルートキットが使用する eBPF プログラムのソースコード |
| src/helpers | いくつかのルートキットモジュールの機能をテストするためのプログラム、および実行ハイジャックモジュールとライブラリインジェクションモジュールでそれぞれ使用される悪意のあるプログラムとライブラリを含む |
| src/libbpf | ルートキットに統合された libbpf ライブラリ |
| src/user | ルートキットが使用するユーザーランドプログラムのソースコード |
| src/vmlinux | カーネルデータ構造の定義を含むヘッダー(これは libbpf を使用する場合の推奨方法) |
この研究プロジェクトは、以下の環境でテストされています。
| ディストリビューション | カーネル | GCC | CLANG | GLIBC | |
|---|---|---|---|---|---|
| バージョン | Ubuntu 21.04 | 5.11.0 | 10.3.0 | 12.0.0 | 2.33 |
Ubuntu 21.04 を使用することを推奨します。デフォルトでここに示すソフトウェアバージョンが組み込まれます。そうでない場合、発生する可能性のある問題の一部はこちらで説明されています。
ルートキットのソースコードは、2 つの Makefile を使用してコンパイルされます。```
cd src make all
cd client make
以下の表は、各 Makefile の目的を詳細に説明しています:
| MAKEFILE | COMMAND | 説明 | 生成されるファイル |
| ------------- | ------------- | ------------- | ------------- |
| src/client/Makefile | make | ルートキットクライアントのコンパイル | src/client/injector |
| src/Makefile | make help | ルートキット機能をテストするためのプログラム、および実行ハイジャックモジュールとライブラリインジェクションモジュールの悪意のあるプログラムとライブラリのコンパイル(それぞれ) | src/helpers/simple_timer, src/helpers/simple_open, src/helpers/simple_execve, src/helpers/lib_injection.so, src/helpers/execve_hijack |
| src/Makefile | make kit | libbpf ライブラリを使用したルートキットのコンパイル | src/bin/kit |
| src/Makefile | make tckit | ルートキット TC 出力プログラムのコンパイル | src/bin/tc.o |
### インストール
ルートキットファイルが src/bin/ に生成されたら、*tc.o* と *kit* プログラムを順にロードする必要があります。以下の例では、ルートキットのバックドアがネットワークインターフェース *enp0s3* で動作します:```
// TC egress program
sudo tc qdisc add dev enp0s3 clsact
sudo tc filter add dev enp0s3 egress bpf direct-action obj bin/tc.o sec classifier/egress
// Libbpf-powered rootkit
sudo ./bin/kit -t enp0s3
攻撃者が実際の攻撃シナリオで行うように、ルートキットを自動的にコンパイルしてインストールする2つのスクリプト、packager.sh と deployer.sh があります。
packager.sh を実行すると、apps/ ディレクトリ以下にすべてのルートキットファイルが生成されます。
deployer.sh を実行すると、ルートキットがインストールされ、永続化ファイルが作成されます。
これらのスクリプトは、永続化モジュールが正しく機能するために、以下のパラメータを最初に設定する必要があります。
| スクリプト | 定数 | 説明 |
|---|---|---|
| src/helpers/deployer.sh | CRON_PERSIST | 再起動後に実行するCronジョブ |
| src/helpers/deployer.sh | SUDO_PERSIST | パスワードなしで特権を付与するSudoエントリ |
ルートキットは、sys_timerfd_settime または sys_openat システムコールを呼び出すプロセスの実行を乗っ取ることができます。これは、呼び出しを行っているプロセスの仮想メモリにあるGlobal Offset Table(GOT)セクションを上書きすることで実現されます。これにより、悪意のあるライブラリ(src/helpers/injection_lib.c)が実行されます。このライブラリは攻撃マシンにリバースシェルを起動し、その後、プロセスをクラッシュさせることなく実行フローを元の関数に戻します。
TripleCrossは、以下の一般的なELFハードニング技術をバイパスするように準備されています。
また、Intel CET互換のコードでも動作するよう準備されています。
モジュールの機能は、2つのテストプログラム src/helpers/simple_timer.c と src/helpers/simple_open.c を使用して確認できます。あるいは、任意のシステムプロセスを乗っ取ることも可能です(systemdでテスト済み、動作確認済み)。
モジュールの設定は、以下の定数によって行われます。
| ファイル名 | 定数 | 説明 |
|---|---|---|
| src/common/constants.h | TASK_COMM_NAME_INJECTION_ TARGET_TIMERFD_SETTIME | sys_timerfd_settime システムコールでハイジャックするプロセス名 |
| src/common/constants.h | TASK_COMM_NAME_INJECTION_ TARGET_OPEN | sys_openat システムコールでハイジャックするプロセス名 |
| src/helpers/injection_lib.c | ATTACKER_IP & ATTACKER_PORT | 攻撃マシンのIPアドレスとポート |
攻撃マシンからのリバースシェルを受信するには、netcatを使用します:``` nc -nlvp <ATTACKER_PORT>
### GOTハイジャック技術によるライブラリ注入
TripleCrossに組み込まれているこの技術は、5つの段階で構成されています。
#### GOTとリターンアドレスの特定
ルートキットは、トレースポイントプログラムを使用してシステムコールをフックします。そこから、PLTスタブがシステムコールを担当するglibc関数を呼び出すために使用したGOTセクションのアドレスを特定します。
GOTセクションに到達するために、eBPFプログラムはスタックに保存されたリターンアドレスを使用します。注意点は以下の通りです。
* .textは.pltを*call*するため、*rip*が*ret*としてスタックに保存されます。
* .pltは.gotを使用してglibcに*jump*するため、他の*rip*は保存されません。また、*rbp*の値を変更または保存しません。
* Glibcは*syscall*を実行しますが、*rip*をスタックに保存せず、*rcx*に保存します。
<img src="https://assets.kitploit.com/production/public/readmes/5614/d216fa5b7b656bb52587027db28f3e3902fa8389d0b2944a1f7e870d6d2e6bee.jpg" float="left">
したがって、スタック上のアドレスが、eBPFからフックしたシステムコールを実行するglibc関数にジャンプするGOTアドレスを使用するPLTスタブのリターンアドレスであるかどうかを確認するには、それが正しいGOTに導くリターンアドレスであることを確認する必要があります。
リターンアドレスを見つけるための2つの手法が組み込まれています。
* sys_timerfd_settimeを使用する場合、eBPFプログラムはシステムコールの引数を使用して前方にスキャンします。
* sys_openatを使用する場合、eBPFプログラムはトレースポイントの*pt_regs*構造体のデータを使用してリターンアドレスをスキャンします。
<img src="https://assets.kitploit.com/production/public/readmes/5614/61217fb3fd84bec65cbbee906dd27860e5e1c211912cfe450ea4cf9051fa480b.png" float="left">
#### シェルコードのための主要関数の特定
シェルコードは、ASLRやPIEをバイパスするために動的に生成する必要があります。これらはプログラム実行のたびにdlopen()などの関数のアドレスを変更します。
<img src="https://assets.kitploit.com/production/public/readmes/5614/6cbb620495d8cb9711e499fd5b1ae9ea845c03d0c33019cf008b456a95d5ddd6.png" float="left">