
Async PICO Hubは、カスタムイベントモニタリングとインプロセス非同期BOFでCobalt Strikeを拡張するための開発中のフレームワークです。
Async PICOs は、Cobalt Strike Beacon プロセス内で長時間稼働するイベント駆動型の Beacon Object Files(BOF)を実行するためのフレームワークです。Crystal Palace の PICO と Beacon 側の実行モデルを組み合わせることで、非同期実行、タスク追跡、グレースフルシャットダウン、安全な非同期出力を提供します。
Cobalt Strike のネイティブな非同期 BOF とは異なり、Async PICOs は Beacon のプロセス内で実行され、イベント発生時に Beacon をウェイクアップして出力を表示できます。
Cobalt Strike のネイティブ非同期 BOF は別の問題を解決します。Async PICOs は、Beacon 内で実行され、結果をオペレーターに即座に安全に伝えることができる、長時間稼働するイベント駆動型タスクを対象としています。
実装の詳細と設計根拠については、付随するブログ記事を参照してください:
https://www.nccgroup.com/research/async-picos-and-custom-beacon-wakeups-in-cobalt-strike/
ビルドする前に、以下のコンポーネントが必要です:
このリポジトリのローカルチェックアウト
ビルド済みの Crystal Palace
MSVC と CMake をサポートする Visual Studio
Tradecraft Garden
リポジトリのクローン
git clone <repo-url>
cd async-pico-hub
Async PICOs は PICO の生成を Crystal Palace に依存しています。
Crystal Palace の最新の圧縮リリースをダウンロードし、その指示に従ってビルドしてください。ビルド後、Crystal Palace のバイナリを以下の場所に配置します:
pico-tools/crystal-palace/
期待されるレイアウトは次のようになります:
pico-tools/
└── crystal-palace/
├── src/
├── lib/
└── ...
Tradecraft Garden の最新リリースをダウンロードし、以下の場所に配置します
pico-tools/tradecraftgarden
期待されるレイアウトは次のようになります:
pico-tools/
└── tradecraftgarden/
├── libtcg/
├── simple_pic/
└── ...
Async PICOs をビルドできるようにするには、libtcg と simple_pic の例を必ずビルドしてください。
このプロジェクトは CMake を使用して、MSVC でのビルドを簡素化しています。
リポジトリのルートから、フォルダーを右クリックして選択します:
Open with Visual Studio
これにより CMake プロジェクトが読み込まれ、利用可能なビルド構成が表示されます。
以下のビルド構成が利用可能です:
x64 Debug
デバッグ用に PICO と BOF のローカル実行可能バージョンをビルドします。
ローカルでの動作デバッグや Visual Studio でのコードのステップ実行には、この構成を使用してください。
x64 Release
最適化された PICO と BOF のローカル実行可能バージョンをビルドします。
Beacon 外部でリリース動作をテストするには、この構成を使用してください。
x64 Release Objects
デプロイ用アーティファクトをビルドします:
これは Cobalt Strike 用のオブジェクトを生成するために使用される構成です。
ビルドが完了すると、生成されたアーティファクトは以下の場所にあります:
build/x64-ReleaseObject/obj/
このディレクトリには、すぐに使用できるコンパイル済みの PICO と BOF が含まれています。
Async PICOs を使用するには、Beacon がカスタムスリープマスクを使用する必要があります。
Malleable プロファイルで、Async PICOs を使用する前にカスタムスリープマスクのサポートを有効にしてください。
picos-cna/sleepmask.cnaスクリプトは、非同期出力と Beacon のウェイクアップ調整をサポートするために使用される最小限の参照実装であるasync-sleepmaskを読み込みます。このスリープマスクは意図的にシンプルに作られており、制限事項 セクションで説明されている制限があります。これは、フレームワークのデモンストレーションとテストの簡素化を目的として提供されており、完成した本番運用可能なコンポーネントではありません。
スタック操作などの OPSEC 技術を備えたカスタムスリープマスクをすでにお持ちの場合は、既存のスリープマスクを Async スリープマスクに変更する を参照して、既存の実装に Async PICO サポートを統合してください。
x64 Release Objects 構成でプロジェクトをビルドした後、picos.cna と sleepmask.cna の Aggressor スクリプトを Cobalt Strike に読み込みます:
Script Manager → Load → picos-cna/picos.cna
Script Manager → Load → picos-cna/sleepmask.cna
読み込み後、Async PICOs は picos コマンドで管理できます。
PICO を開始するには:
picos start [path to pico] [arguments]
例:
picos start C:\temp\MonitorTGT.pico
引数付きの場合:
picos start C:\temp\MonitorTGT.pico DOMAIN\serviceaccount
実行中の Async PICOs を表示するには:
picos
これにより、現在実行中のタスクとその識別子が表示されます。
Async PICO を停止するには:
picos stop [pico id]
例:
picos stop 3
PICO は停止シグナルを受け取り、クリーンアップを実行した後にグレースフルに終了します。
追加の使用情報は、picos コマンド用の組み込みヘルプメニューから Cobalt Strike 内で直接確認できます。
詳細は docs/writing_custom_async_pico.md を参照してください。
詳細は docs/modifying_existing_sleepmask.md を参照してください。
公開実装は、高度な回避技術を用いず、意図的にシンプルに保たれています。これは、変更せずにそのままデプロイするためのものではなく、適応させるための基盤として意図されています。
Async PICOs は CreateThread を使用して起動されます。これにより実行モデルがシンプルで理解しやすくなりますが、同時に検出対象となる面も導入されます。公開実装では、スレッドはモジュールイメージにバックされていないメモリから実行を開始するため、スレッドの開始アドレスを検査する製品やヒューリスティックによって検出される可能性があります。
ユーザーは、代替のスレッド作成戦略や実行戦略が自環境により適しているかどうかを評価する必要があります。
このフレームワークは、非同期出力を Beacon に中継し、ウェイクイベントを調整するために、改変されたスリープマスクに依存しています。ここに含まれる実装は意図的に最小限であり、運用で使用する前にレビューする必要があります。
スリープマスクは実行モデルの一部であり、単なる利便性のためのレイヤーではありません。出力のキューイング、ドレイン、シグナリングの方法に変更を加える場合は、並行性の問題や Beacon 内部とのサポートされていない相互作用を引き起こさないように、慎重に評価する必要があります。
公開実装には、使用前に理解しておくべきいくつかの実際的な制限があります。
Crystal Palace により PICO はグローバル変数を使用できますが、公開実装はグローバル状態を保存するために単純な共有ストレージモデルを使用しています。その結果、グローバル変数はスレッドごとに分離されません。
実際には、複数の Async PICOs を同時に実行する場合、それらがグローバル変数に依存していると追加の注意が必要になる可能性があります。
Async PICOs は、非同期出力と Beacon のウェイクアップ調整のために改変されたスリープマスクに依存しています。したがって、このフレームワークは完全に自己完結型ではなく、ドロップイン BOF として扱うことはできません。
このリポジトリは、完成した本番運用可能なコンポーネントを提供するというよりも、フレームワークと実装アプローチをデモンストレーションするように設計されています。同梱の例は、個々のユースケースに合わせて拡張、修正、適応されることを意図しています。