
Inline-Execute-PE は、Beacon Object File(BOF)と、CobaltStrike 用の Aggressor スクリプトのスイートです。これにより、オペレーターはアンマネージド Windows 実行可能ファイルを Beacon メモリにロードして実行し、出力を取得して Beacon コンソールに表示できます。
これにより、オペレーターは多くのサードパーティ製ツール(Mimikatz、Dsquery、Sysinternals ツールなど)を、ディスクに書き込んだり、Donut のようなツールを使って位置独立コードに再フォーマットしたり、新しいプロセスを作成して実行したりする必要がなくなります。
これらの実行可能ファイルは Beacon メモリにマッピングされるため、ネットワーク経由で送信したり、新しいメモリを割り当てたり、毎回新しい conhost.exe プロセスを作成したりすることなく、繰り返し実行できます。
Beacon にロードされた実行可能ファイルは、CobaltStrike Team Server に接続されたすべての CobaltStrike クライアントがアクセスおよび実行できます。
Inline-Execute-PE は、x64 Beacon と、Mingw または Visual Studio でコンパイルされた x64 Windows C または C++ 実行可能ファイル用に設計されています。このプロジェクトは、x86 実行可能ファイルや、別の言語で記述された、または別のコンパイラでコンパイルされた x64 実行可能ファイルはサポートしていません。

リポジトリをクローンし、必要に応じて make を実行して BOF を再コンパイルします。
Inline-Execute-PE.cna を CobaltStrike クライアントにロードします。CobaltStrike が実行されているディレクトリがユーザーによって書き込み可能であることを確認してください。Inline-Execute-PE は、機能に必要なデータの可用性を確保するために、そこにテキストファイル(petable.txt)を作成します。
Inline-Execute-PE は、BOF を実行する 3 つのターゲット向けコマンドと、プロジェクトのデータ構造を操作する 3 つの内部コマンドで構成されています。
ターゲット向け:
内部データ構造:
peload は Inline-Execute-PE の開始点です。このコマンドは、PE を Beacon メモリにロードするために使用されます。以下の主要なアクションを実行します:
perun は Inline-Execute-PE の 2 番目のステップです。以下の主要なアクションを実行します:
peunload は、オペレーターが PE を使い終えたとき、または別の PE をロードしたいときに、Beacon メモリから PE を削除するために呼び出されます。以下の主要なアクションを実行します:
petable は、現在 Beacon にロードされているすべての PE に関する情報を表示するために使用されます。
各 CobaltStrike クライアントは独自の petable を持っています。Inline-Execute-PE は、接続されているすべての CobaltStrike クライアント間でデータの同期を確保するために多大な努力を払っており、すべてのオペレーターが PE を使用できるようにしています。詳細については、「設計上の考慮事項と解説」を参照してください。

peconfig は、Inline-Execute-PE の機能に関するオプションを構成するために使用されます。現在変更可能な 2 つのオプションは次のとおりです:
pebroadcast は、クライアントの petable の内容を、接続されている他のすべての CobaltStrike クライアントに手動でブロードキャストするために使用できます。
その他のすべての CobaltStrike クライアントは、ブロードキャストされたデータで petable を更新します。これが必要になることはほとんどありませんが、念のため機能として存在します。
peload を使用して PE を Beacon メモリにロードします。

または、ターゲットマシン上に新しいプロセスを作成せずに使用したい PE がある場合は、パスと --local スイッチを指定します。

perun を呼び出し、ロードされた PE に任意の引数を渡します。

引数内の二重引用符は、バックスラッシュでエスケープする必要があります。

アンロード時に DLL の解放に問題が発生する PE を特定した場合は、peconfig を使用して unloadlibraries を false に設定します。

PE の使用が完了したら、peunload を呼び出して Beacon からクリーンアップします。

これで、別の PE を Beacon にロードできるようになります。

PE に渡すコマンドライン引数には注意が必要です。一部の PE は間違った引数を与えるとすぐにクラッシュしますが、他の PE は無限に実行され、プロセスはまだ実行中であっても Beacon がコールバックしなくなることがあります。
これは、引数リストの最後に 'exit' を指定しない場合の Mimikatz.exe で確認できます。

...

Inline-Execute-PE は、指定されたタイムアウト値に達すると、実行中の PE のスレッドを終了します。これにより、Beacon が通常の通信を再開できるようになります(perun BOF の実行が完了するまで Beacon はコールバックしません)。この Beacon で通常の CobaltStrike コマンドや他の BOF を引き続き使用することはできますが、Inline-Execute-PE は無効になります。この方法で実行中の PE が終了すると、Beacon プロセスの stdout と stderr が壊れ、後続の PE が適切に機能しないようです。
PE は Beacon メモリからアンロードすることは可能です(また、そうすべきです)。ただし、petable を表示すると、この Beacon にそれ以上 PE をロードできなくなることが示されます。 
Inline-Execute-PE で実行する PE をテストし、perun にコマンドライン引数を渡す際には注意を払うことが必須です。許容度の高い PE もあれば、そうでないものもあります。
以下は、テストと開発中に行った、ユーザーが Beacon にロードしたいと思われる特定の PE に関する観察事項であり、順不同です。
Inline-Execute-PE に関連する IOC には、以下が含まれますが、これらに限定されません:
開発中に EDR に対する完全なバッテリーテストは行いませんでした。怠慢とテスト環境の不足が理由の一部です。ただし、最新パッチの Windows Defender(私の経験ではかなり優れた AV 製品です)に対してテストしました。
Mimikatz.exe はおそらく、Inline-Execute-PE で使用する候補として最も疑わしくよく知られた PE です。Inline-Execute-PE を使用した Mimikatz の実行を Windows Defender が検出できるかどうかは、Beacon が実行されているプロセスに依存することがわかりました。