
Heavily-modified fork of David Buchanan's dlinject project. Injects arbitrary assembly (or precompiled binary) payloads directly into x86-64, x86, and ARM32 Linux processes without the use of ptrace by accessing /proc/<pid>/mem. Useful for certain post-exploitation scenarios, recovering content from process memory, etc..
asminject.py は、David Buchanan の dlinject プロジェクト を大幅に改変したフォークです。ptrace でアタッチする代わりに /proc/<pid>/mem にアクセスすることで、任意のアセンブリ(またはプリコンパイル済みバイナリ)ペイロードを x86-64、x86、ARM32 の Linux プロセスに直接注入します。信頼できるプロセスの改ざん、特定のポストエクスプロイテーションシナリオ、プロセスメモリからのコンテンツ復元、一部のセキュリティコントロールの回避に役立ちます。ホスト上で root アクセスがあれば、コンテナの外からコンテナ化されたプロセスに注入することもできます。
asminject.py とその成り立ちについては、Bishop Fox のツールページでも読むことができます。このツールの着想となった研究成果の詳細な解説も含まれています。
この文書の内容:
より詳細な個別ドキュメント:
asminject.py は dlinject のようなものだが、ライブラリをロードするだけではなく任意のペイロードを注入でき、複数のアーキテクチャで動作する。"asminject.py は Frida にぼんやり似ているが、ptrace インターフェース経由でアタッチしないため、プロセスが自分自身を ptrace してブロックすることはできない。"asminject.py は、Linux 環境におけるペネトレーションテストの 2 つの主要なシナリオのために書かれました:
たとえば、テスターが多数のコンテナをホストするサーバーへの root アクセスを取得したペネトレーションテストを考えてみましょう。そのうちの 1 つのコンテナが銀行振込を処理しており、非常に堅牢なエンドポイントセキュリティ製品が内部にインストールされています。ペンテスターがコンテナ内から銀行振込データを変更しようとすると、エンドポイントセキュリティソフトウェアがその試みを検出してブロックします。asminject.py を使用すると、ペンテスターはコンテナの外から、銀行ソフトウェアのプロセスメモリやエンドポイントセキュリティ製品そのものに任意のコードを直接注入できます。デカルトの「悪魔」の犠牲者のように、コンテナ内のセキュリティソフトウェアは無力です。なぜなら、それは攻撃者が完全に制御する環境の中に存在するからです。
元の dlinject.py は、既存のプロセスに Linux 共有ライブラリをロードすることだけを目的として設計されました。asminject.py は元のツールができるすべてのことを実行し、それ以上のことができます。任意のアセンブリコードを実行し、さまざまな攻撃用のテンプレートを含みます。また、ライブラリロードイベントなどの不審な可能性のある活動に反応するセキュリティメカニズムによる検知を回避するようにも再設計されています。
このリポジトリの practice ディレクトリには、タイムスタンプとループ反復回数をコンソールに出力する基本的なループコードが含まれているため、管理された環境でさまざまなタイプのコードを注入する練習ができます。これらの練習用ループは、以降の例で参照されます。
asminject.py を呼び出すための基本構文は次のとおりです:
# python3 ./asminject.py <target_process_id> <payload> \
--arch [x86-64|x86|arm32] --relative-offsets-from-binaries --stop-method "slow" \
--var <payload_variable_1_name> <payload_variable_1_value> \
# ... \
--var <payload_variable_n_name> <payload_variable_n_value>
ほとんどの場合、例で使用されているペイロードはサポートされているすべてのアーキテクチャで動作します。
ほとんどの Linux ディストリビューションには、他のプロセスに対する ptrace 機能の使用を制御する Yama というカーネルセキュリティモジュールが含まれています。asminject.py はデバッガーインターフェースにアタッチしませんが、それでも ptrace 機能を使用する権限が必要です。この機能に関するエラーが発生している場合は、/proc/sys/kernel/yama/ptrace_scope の内容を確認してください。2 に設定されている場合は、root として次のコマンドを実行します:
echo 1 > /proc/sys/kernel/yama/ptrace_scope
3 以上の値は、再起動しないと解除できません。ただし、あなたが Linux システムの正規の管理者であり、誰かが誤って /proc/sys/kernel/yama/ptrace_scope を 3 に設定してしまった場合、またはその値が設定された環境で正規のペネトレーションテストを実施している場合は、ptrace_scope_kernel_module ディレクトリ を参照してください。再起動を必要としない回避策が含まれている可能性があります。
gcc コマンドを呼び出す代わりに、Keystone を使用したシェルコードアセンブルを検討する。eval スタイルの人間可読スクリプトコード実行ではなく、コンパイル済みバイトコードを実行用に渡す API を持つ他のスクリプトインタープリター向けに、この能力を利用してさらにステルス性を高めるペイロードを提供する。dlinject.py から引き継いだ現在の「次の syscall をフックする」手法に代わるものとして、特定のメソッド(またはアドレスなど)をフックするオプションを追加する。asminject.py を使って Frida を注入する方法を見つける方が理にかなっているかもしれない - さらなる調査が必要である。asminject.py がオペレーターに注入するコードの行をプロンプト表示し、それを注入し、結果の出力を返し、そしてオペレーターに別のコードの行をプロンプト表示する。
asminject.py を使ってプロセスに注入でき、Frida が一時的にデバッガーインターフェースを呼び出す必要を回避できるのであれば、Frida を使って処理する方が理にかなっているかもしれない。asminject.py が実行されているプロセッサアーキテクチャと一致しないアーキテクチャで動作しているターゲットプロセスと対話する方法を提供する。例: PCI leech のようなハードウェアを使用してリモートデバイスと対話する、NFS 共有経由で root としてアクセス可能な /proc/mem を持つデバイスのような極端なエッジケースを悪用するなど。