Covenant は、最新かつ最強クラスのコマンド&コントロール(C2)ポストエクスプロイト(post-exploitation)フレームワークの1つです。この記事では、Covenant の設定手順と、侵害されたホスト上でペイロードを実行するために Covenant を使用する方法を順を追って説明します。
注: この記事は、2019年9月中旬時点の Covenant の能力を示しています。
1. Covenant をインストール
まず、Covenant を、Covenant データベースとしても、アプリケーション エージェントを制御する管理アプリケーションとしても機能するホスト マシンにインストールする必要があります。アプリケーション エージェントは grunts と呼ばれます。
前提条件
このブログ記事では Windows 10 のワークステーションに Covenant をインストールしましたが、.NET Core をサポートする最近の Windows Server OS や Linux ディストリビューションであれば、同様に問題なく動作するはずです。
Covenant をホスティングするマシンに、次のアプリケーションをインストールする必要があります。
インストール手順
Covenant のモダンでクロスプラットフォームなアーキテクチャを踏まえると、昔ながらのインストーラー実行ファイルは提供されていません。その代わりに、プロジェクトの git リポジトリをクローンし、次のコマンドを使ってアプリケーションをビルドして実行する必要があります:
git clone --recurse-submodules https://github.com/cobbr/Covenant
cd Covenant/Covenant
dotnet build
dotnet run
別の方法として、Covenant を Docker コンテナで実行することもできます。
2. アカウントを作成します。
Covenant サービスが起動して稼働状態になったら、デフォルトの Web ポート 7443 から Covenant のアプリケーション インターフェイスにアクセスできます。ユーザー アカウントをセットアップするように求められます:
登録プロセスを完了すると、「User Management」ページにリダイレクトされます:
左側のメニューを使うことで、Covenant のさまざまな機能に移動できます。
3. リスナーを設定します。
リスナーを有効にすると、grunt が Covenant アプリケーションと通信できるようになります。初期設定ではリスナーが何も構成されていないため、1 つ設定する必要があります。Listeners を左側のメニューでクリックして、リスナー ページを開きます:
次に Create ボタンをクリックして「HTTP リスナーの作成」ページを開きます:
いくつかの指定された値を更新する必要があります:
- Name — デフォルトでは、Covenant はシンプルな「GUID」タイプの名前を提供します。より分かりやすい名前に変更しても構いません。
- BindAddress および ConnectAddress — これらの両方が、grunts が到達可能なアドレスを指定していることを確認してください。
- UseSSL — SLL を使用する場合は、SSL 証明書ファイルとパスワードを指定する必要があります。
設定が完了したら Create ボタンをクリックしてリスナーを作成し、有効化します。
4. ランチャーを作成します。
次に、ランチャーを作成する必要があります。ランチャーは、リモートホストを grunts に変換し、それらを Covenant アプリケーションに接続するために使用します。通常、ランチャーはリモートホストで実行されるペイロードパッケージの形で提供されます。各ランチャーはリスナーとペアになっています。
「ユーザー管理(User Management)」ページの左メニューで Launchersをクリックします。起動(launcher)の種類の一覧が表示されます。カスタムのバイナリを生成するために使用する Binary launcher は、使いやすい起動の1つなので、最初の起動として Binary を選びましょう。
設定(コンフィギュレーション)ページが開きます:
次の設定オプションを指定します:
- Listener — 新しい起動(launcher)が使用するリスナー(listener)を指定します。先ほど作成した HTTP リスナーを使いましょう:
- Template — 標準(デフォルト)のテンプレート GruntHTTP を使いましょう:
- 遅延 および ジッター — これらの設定は、grunt が Covenant と通信する頻度を制御します。デフォルト値のままで問題ありません。
- 接続試行回数 および キル日 — これらの設定は、grunt が Covenant との通信を試みるのをいつ停止するかを制御します。こちらもデフォルト値のままで問題ありません。
設定が完了したら、Generate ボタンをクリックして新しいランチャーを作成し、設定ページに戻ります。
5. ランチャーを実行して grunt を作成します。
次はランチャーのペイロードを保存します。Download をクリックしてから Save File をクリックします。
次に、保存したファイルを目的のホストにコピーし、実行します。
新しく登録した grunt は、Covenant のダッシュボードに次のように表示されます:
6. grunt にタスクを割り当てます。
ユーザー管理ページの左メニューで Grunts をクリックし、先ほど登録した grunt を開きます。Info タブには、接続状態と機能に関する詳細が表示されます:
grunt にタスクを割り当てるには、Task タブをクリックする必要があります。
例 1:スクリーンショットを取得します。
まず、grunt にアクティブなユーザーのデスクトップのスクリーンショットを撮らせたいとします。「タスク」ドロップダウンから Screenshot を選択し、その後、下の Task ボタンをクリックして、この操作を grunt 上でただちに実行します。
ページを更新して、タスクの最新ステータスを確認します。タスクが完了したことが表示され、その出力も提供されます。この場合の出力は、単にスクリーンショットです。なお、タスクの出力はタスクの種類によって異なります。
例 2:Mimikatz を実行します。
grunt に別のタスクを実行させましょう。Mimikatz を実行します。
grunt の詳細ページの Tasks タブに戻る必要があります。次に、タスクのドロップダウンから Mimikatz を選択します。
多くのタスクには、カスタマイズ可能な入力パラメータのセットがあります。Mimikatz のタスクには「Command」という入力パラメータがあり、実行したい Mimikatz のコマンドを指定できます。なお便利なことに、これは次の sekurlsa::logonPasswords コマンドがあらかじめ設定されています。このコマンドは、メモリ内に保存されたパスワードを検出します。このタスクを自分の grunt に割り当てて、何が起きるか見てみましょう。
たまたま、この grunt ホストに Domain Admin アカウントがログインしていました。そのため、タスクの出力では Domain Admin のパスワードが平文で確認できます!
Covenant を使って Mimikatz を実行すると、攻撃者が検知を回避しやすくなります。Covenant はタスクを grunt ホストに直接保存しないためです。代わりに、タスクを指示するタイミングで、そのクライアント接続経由にタスクのペイロードを動的にコンパイルしてデプロイします。さらに、新しい grunt が作成されたり、grunt に新しいタスクが割り当てられたりするたびに、関連コードが再コンパイルされ ConfuserEx で難読化されます。これにより、より発見されやすい静的ペイロードを回避できます。実際に、こちらの手順を私のマシンで実行した際は、Windows Defender が有効化され最新の状態でしたが、それでも grunt の Mimikatz タスクは問題なく実行されました。
タスクの履歴と出力を確認します。
Covenant は、実行したタスクの明確な履歴を提供します。ユーザー管理ページの左側メニューで Taskings をクリックします:
先ほど実行した「スクリーンショット」タスクと mimikatz タスクの両方を確認できます。任意の行をクリックすると、タスクのパラメーターと完全な出力内容が表示されます。
多くのタスクでは、出力の一部要素も Data ページに保存されます。さまざまなタブをクリックして、認証情報(credentials)、指標、ダウンロードされたアーティファクト、スクリーンショットを確認してください。たとえば、こちらは Mimikatz タスクで発見された認証情報です:
そして、こちらが別のタスクで取得されたスクリーンショットです:
例 3:ファイルをダウンロードします。
次に、grunt でタスクをもう 1 つ実行してファイルをダウンロードし、Downloads タブで表示できるようにします。
たとえば、grunt ホスト上に次の名前のファイルがあると判明したとしましょう: MySecretDocument.txt 。Download タスクを使って、このファイルのコピーを手に入れましょう!
このタスクを実行するとファイルのコピーが取得され、すぐに Downloads タブで利用できるようになります:
このタスク自体はシンプルですが、grunt ランチャーを実行したユーザーの権限、または他のタスクを通じて取得した資格情報を使ってこのタスクを実行できるため、興味深いユースケースがいくつかあります。
結論
Covenant はすでにさまざまなタスクを提供しており、オープンソース コミュニティの関与のおかげで、リストは毎日増えています。このプロジェクトは非常に高い確率でワクワクするような今後が期待でき、ぜひ一度見てみる価値があります!
共有する
もっと詳しく
著者について
Joe Dibley
セキュリティリサーチャー
Netwrix のセキュリティリサーチャーであり、Netwrix Security Research Team のメンバーです。Joe は Active Directory、Windows、およびさまざまなエンタープライズソフトウェアのプラットフォームとテクノロジーの専門家であり、新たなセキュリティリスク、複雑な攻撃手法、そしてそれに関連する緩和策と検知について研究しています。