
Aggrokatz は、Cobalt Strike 用の aggressor プラグイン拡張機能であり、pypykatz がビーコンとリモートで連携できるようにし、LSASS ダンプファイルやレジストリハイブファイルを解析して、ファイルをダウンロードしたりビーコンに疑わしいコードをアップロードすることなく、資格情報やその他の秘密情報を抽出することを可能にします。

aggrokatz は、CobaltStrike 用の Aggressor プラグイン拡張で、pypykatz がリモートでビーコンとインターフェースできるようにします。
現在のバージョンの aggrokatz では、pypykatz が LSASS ダンプファイルとレジストリハイブファイルを解析し、ファイルをダウンロードしたり、ビーコンに不審なコードをアップロードしたりすることなく、保存された資格情報やその他の秘密を抽出できます(Cobalt Strike はすでにそこにあります)。
将来的には、このプロジェクトは、すべての DPAPI シークレットの検索と復号化、Kerberoasting などの隠密運用のための追加機能を提供することを目指しています。
このツールのリリースに際して、短い ブログ記事 を公開しました。スクリーンショットも含まれています。
LSASS/レジストリのダンプはこのプロジェクトの目標ではなく、解析のみです。理由:
CredBandit の修正版を使用するように切り替えました。クールなツールです。チェックしてみてください。CS クライアントでは、スクリプトを変更した場合、「リロード」を使用したり、手動でアンロードしてから再読み込みしようとしたりしないでください。必ずアンロードし、クライアントを閉じて新たに起動し、その後変更したスクリプトを読み込んでください。そうしないと、複数のバージョンが同時に実行され、大量のエラーや奇妙な動作が発生します!
リモート側で LSASS/レジストリファイルを解析している間は、スクリプトを開始した特定のビーコンと対話しないでください。通常は問題を引き起こしませんが、保証はできません。
pycobalt をインストールしてセットアップする必要があります。GitHub ページに readme があります。pypykatz をインストールする必要があります。バージョンは >=0.4.8 でなければなりません。aggressor.cna ファイルがセットアップされ、Python インタプリタの場所を認識していることを確認してください。aggrokatz.cna 内の pycobalt_path を pycobalt.cna を指すように変更してください。View > Script Console と Cobalt Strike > Script Manager ウィンドウを使用します。Script Manager を使用して aggkatz.cna スクリプトを読み込んでください。aggkatz.cna スクリプトが正常に読み込まれると、ビーコンを右クリックしたときに新しいメニュー項目 pypykatz が表示されます。Script Console ウィンドウにデバッグメッセージが表示されます。Script Console ウィンドウとビーコン自身のウィンドウの両方に表示されます。LSASS file: リモートコンピュータ上の lsass.dmp ファイルの場所。UNC パスを使用して、SMB 経由で共有されている lsass.dmp ファイルにアクセスすることもできます。chunksize : 一度に読み取られる最大量BOF file : チャンク読み取りを可能にする BOF ファイル(Beacon Object File)。このファイルは、新しいチャンクが読み取られるたびにアップロードされ、メモリ内で実行されます。(module) : 解析するモジュールを指定します。デフォルト: allOutput : 出力形式を指定します。Populate Credential tab : 解析が成功すると、取得したすべての資格情報が Cobalt Strike の資格情報タブで利用できるようになります。この機能はベータ版です。Delete remote file after parsing : 解析が成功すると、LSASS ダンプファイルがターゲットから削除されます。SYSTEM file: リモートコンピュータ上の SYSTEM.reg ファイルの場所。UNC パスを使用して、SMB 経由で共有ファイルにアクセスすることもできます。SAM file (optional): リモートコンピュータ上の SAM.reg ファイルの場所。UNC パスを使用して、SMB 経由で共有ファイルにアクセスすることもできます。SECURITY file (optional): リモートコンピュータ上の SECURITY.reg ファイルの場所。UNC パスを使用して、SMB 経由で共有ファイルにアクセスすることもできます。SOFTWARE file (optional): リモートコンピュータ上の SOFTWARE.reg ファイルの場所。UNC パスを使用して、SMB 経由で共有ファイルにアクセスすることもできます。chunksize : 一度に読み取られる最大量BOF file : チャンク読み取りを可能にする BOF ファイル(Beacon Object File)。このファイルは、新しいチャンクが読み取られるたびにアップロードされ、メモリ内で実行されます。Output : 出力形式を指定します。ファイル読み取り BOF は現在、最大 4GB のファイル読み取りをサポートしています。これは修正により拡張可能ですが、これまでそのような大きなファイルは観測されていません。
通常、pypykatz のパーサーはディスク上で一連のファイル読み取り操作を実行しますが、aggrokatz の助けを借りて、これらの読み取り操作は特別に作成された BOF (Beacon Object File) を使用してビーコンにトンネリングされ、リモートファイルの内容をチャンク単位で読み取ることができます。これにより、pypykatz はファイル全体を読み取ることなく、秘密が保存されている必要なチャンクだけを取得して、リモートファイルからすべての秘密を抽出できます。
プロセス全体の全体像を把握するには、2つの部分を強調する必要があります:
pypykatz が CobaltStrike とどのように統合されるかpypykatz がファイル全体を読み取らずに資格情報抽出をどのように実行するかCobaltStrike (エージェント) は Java で書かれており、pypykatz は Python で書かれています。これは問題です。幸運なことに、未知のエンティティが pycobalt を作成しており、これは Python から直接呼び出せる便利な API を備えた、2つの世界の間のすっきりしたインターフェースを提供しています。pycobalt は素晴らしいエンジニアリング作品ですが、指摘しておくべきいくつかの問題/欠点があります:
pycobalt プロジェクトの信頼について:pycobalt プロジェクトが将来維持されることは保証できません。pycobalt の開発のどの側面も制御していません。pycobalt と CobaltStrike の間にはいくつかのエンコーディング問題があります。これにより、一部のバイトがエンコーダによって破損されるために使用できないバイトを返すAPI呼び出しが発生します。コードを確認した結果、ほとんどのエンコード/デコード問題は、pycobalt が Java プロセスとの通信に STDOUT/STDIN を使用しているためであると結論付けました。bof_pack API 呼び出しは、純粋なアグレッサースクリプトとして実装し、Python からはバイトを使用せずに基本データ構造(文字列と整数)のみを使用して呼び出す必要がありました。pycobalt パッケージが提供するのはスレッドサポートなしのブロッキングAPIのみです。まあ、少なくともスレッドがランダムに壊れるのを観測しましたが、ある程度予想していました。pypykatz とそのコンパニオンモジュール minidump は、以前実装されていたものよりも効率的なチャンク解析を可能にするために修正する必要がありましたが、これはまた別の日の話題です。
pypykatz が pycobalt を介して CobaltStrike とインターフェースできるようになった後、次のステップはチャンクファイル読み取りを可能にすることでした。残念ながら、この機能は私たちが見てきたどの C2 ソリューションでもデフォルトでは利用できなかったため、実装する必要がありました。この問題に取り組んだ方法は、CobaltStrike の Beacon Object Files インターフェース(略して BOF)を使用してチャンク読み取りを実装することです。BOF は、ビーコン上で別個の実行ファイルとしてではなく、すでに実行中のビーコンの一部として動作する C プログラムです。このインターフェースは、すべてのコードがディスクに何も書き込まれることなくメモリ内で実行されるため、BOF をはるかにステルスにするため、非常に便利です。
私たちの BOF ソリューションは単純な関数で、4つの引数を取ります:
fileName : LSASS ダンプファイルまたはレジストリハイブ(リモート側)の完全なファイルパスbuffsize : ファイルから読み取る量(バイト単位)seekSize : ファイル読み取り操作を開始する位置(ファイルの先頭から)rplyid : 衝突を避けるために応答に組み込まれる識別番号これらのパラメータを使用して、pypykatz(エージェント上で実行)は、ファイルの特定の部分を対象とするファイル読み取り操作をビーコン(ターゲットコンピュータ)に発行できます。
もう一方の端(CobaltStrike 内)では、aggrokatz がコールバックを登録し、ターゲットビーコンから返されるすべてのメッセージを監視します。メッセージのヘッダーがファイル読み取り操作のヘッダーと一致する場合、それは minidump ファイルのチャンクとして処理され、minidump パーサーにディスパッチされ、結果が pypykatz に送られます。さらに読み取りが必要な場合、pypykatz は minidump リーダーを使用して読み取りを発行し、BOF インターフェースを介して新しい読み取りコマンドをビーコンにディスパッチします。このプロセスはファイルが解析されるまで繰り返されます。
この方法を使用して約100個のLSASSダンプを解析した後、以下のことを述べることができます(使用したチャンクサイズは20kです):
dcsync - pycobalt の作者
@anthemtotheego Twitter - CredBandit の作成者
Nicol Jos @shinepaw - ロゴデザイン