
Covenant C2の通信を復号化します。ミニダンプからRSA秘密鍵を抽出し、AESセッションキーを回復し、ネットワークキャプチャを平文に変換します。
CovenantDecryptor は、Covenant トラフィックの通信データを復号するために設計されています。
メモリからの秘密鍵の抽出は、
RSACryptoServiceProviderを使用して鍵を作成する Empire など、他の C2 にも適用できます。
Covenant の通信初期化は、次の3つのステージで構成されています:
SetupAESKey を使用して暗号化された公開鍵を送信することにより、RSA セッションを開始します。送信前に、GruntHTTPStager に記述されている形式でテキストを整形し、タイプを 0 に設定します。SessionKey を転送します。SetupAESKey を使用してメッセージを復号し、その後 RSA 秘密鍵を使用して SessionKey を復号します。次に、ランダムに生成された4バイトを SessionKey で暗号化して送信します。送信前に、GruntHTTPStager に記述されている形式でテキストを整形し、タイプを 1 に設定します。SessionKey を使用して4バイトを復号し、追加の4バイトのランダムデータを付加して、結果の8バイトデータを感染エージェントに転送します。SessionKey で8バイトを復号します。続いて、最初の4バイトが以前に送信したデータと一致するかどうかを確認し、最後の4バイトを C2 に送り返します。送信前に、GruntHTTPStager に記述されている形式でテキストを整形し、タイプを 2 に設定します。検証が完了すると、データを交換できます。
CovenantDecryptor は2つのユーティリティで構成されています。extract_privatekey スクリプトは、ミニダンプファイルから p と q の素数を取得し、公開モジュラスを使用して RSA 秘密鍵を構築します。decrypt_covenant_traffic スクリプトは、modulus、key、decrypt の3つのコマンドで構成されています。最初のコマンドは Covenant 通信からモジュラスを抽出し、2番目のコマンドはデータトラフィックの暗号化に使用される AES 鍵を復元します。最後に、3番目のコマンドはトラフィックを復号します。
感染したホストのステージ0リクエストからモジュラスを抽出します:
$ python3 decrypt_covenant_traffic.py modulus -i traffic.txt -k "EQCZiHdmVUQzIhEAmYh3ZlVEMyIRAJmId2ZVRDMiEQA=" -t base64
[+] Modulus:
19574201286059123715221634877085223155972629451020572575626246458715199192950082143183900970133840359007922584516900405154928253156404028820410452946729670930374022025730036806358075325420793866358986719444785030579682635785758091517397518826225327945861556948820837789390500920096562699893770094581497500786817915616026940285194220703907757879335069896978124429681515117633335502362832425521219599726902327020044791308869970455616185847823063474157292399830070541968662959133724209945293515201291844650765335146840662879479678554559446535460674863857818111377905454946004143554616401168150446865964806314366426743287
[+] Exponent: 65537
感染した Covenant プロセスのミニダンプファイルから RSA 秘密鍵を取得します:
$ python3 extract_privatekey.py -i memory.dmp -m 19574201286059123715221634877085223155972629451020572575626246458715199192950082143183900970133840359007922584516900405154928253156404028820410452946729670930374022025730036806358075325420793866358986719444785030579682635785758091517397518826225327945861556948820837789390500920096562699893770094581497500786817915616026940285194220703907757879335069896978124429681515117633335502362832425521219599726902327020044791308869970455616185847823063474157292399830070541968662959133724209945293515201291844650765335146840662879479678554559446535460674863857818111377905454946004143554616401168150446865964806314366426743287 -o ./keys/
[+] Saved private key /home/user/privkey1.pem
スクリプトは、p と q をリトルエンディアンおよびビッグエンディアンとして取得しようとします。
ネットワークトラフィックの暗号化に使用される Covenant C2 のステージ0レスポンスから SessionKey を復元します:
$ python3 decrypt_covenant_traffic.py key -i traffic.txt --key "EQCZiHdmVUQzIhEAmYh3ZlVEMyIRAJmId2ZVRDMiEQA=" -t base64 -r mykey.pem -s 1
[+] New AES key : 0011223344556677889900112233445566778899001122334455667788990011
Covenant 通信を復号します:
$ python3 decrypt_covenant_traffic.py decrypt -i traffic.txt -k "0011223344556677889900112233445566778899001122334455667788990011" -t hex -s 2
[...]
[*] Response message 10 : {"status":"2","output":"Hello.\r\n"}
[...]
extract_privatekey - 生ファイルを解析。extract_privatekey - ヘッダーに基づいて秘密鍵を検索(モジュラスなし)。StackOverflow で述べられているように、生の Microsoft RSA 秘密鍵を利用してデータを復号することも可能です。