
Расшифровывает коммуникации Covenant C2, извлекая закрытые ключи RSA из минидампов, восстанавливая сеансовые ключи AES и преобразуя сетевые захваты в открытый текст.
CovenantDecryptor предназначен для расшифровки коммуникационных данных трафика Covenant.
Извлечение закрытого ключа из памяти применимо и к другим C2, например Empire, поскольку в нём для создания ключа используется
RSACryptoServiceProvider.
Инициализация обмена данными Covenant состоит из 3 этапов:
SetupAESKey, который встроен в вредоносный исполняемый файл. Перед отправкой он форматирует текст, как описано в GruntHTTPStager, с типом, установленным в 0.SessionKey, зашифрованный открытым ключом RSA, для последующей связи.SetupAESKey для расшифровки сообщения, а затем применяет закрытый ключ RSA для расшифровки SessionKey. После этого он шифрует 4 случайно сгенерированных байта с помощью SessionKey и передаёт их. Перед отправкой он форматирует текст, как описано в GruntHTTPStager, с типом, установленным в 1.SessionKey, добавляет ещё 4 случайно сгенерированных байта и передаёт полученные 8 байт данных заражённому агенту.SessionKey. Затем он проверяет, совпадают ли первые 4 байта с данными, переданными ранее, и передаёт последние 4 байта обратно на C2. Перед отправкой он форматирует текст, как описано в GruntHTTPStager, с типом, установленным в 2.После завершения проверки можно обмениваться данными.
CovenantDecryptor состоит из двух утилит. Скрипт extract_privatekey извлекает простые числа p и q из файла minidump, чтобы сформировать закрытый ключ RSA с использованием открытого модуля. Скрипт decrypt_covenant_traffic содержит 3 команды: modulus, key и decrypt. Первая команда извлекает модуль из обмена данными Covenant, вторая восстанавливает ключ AES, используемый для шифрования трафика данных. И наконец, третья команда расшифровывает трафик.
Извлеките модуль из запроса этапа 0 заражённого хоста :
$ python3 decrypt_covenant_traffic.py modulus -i traffic.txt -k "EQCZiHdmVUQzIhEAmYh3ZlVEMyIRAJmId2ZVRDMiEQA=" -t base64
[+] Modulus:
19574201286059123715221634877085223155972629451020572575626246458715199192950082143183900970133840359007922584516900405154928253156404028820410452946729670930374022025730036806358075325420793866358986719444785030579682635785758091517397518826225327945861556948820837789390500920096562699893770094581497500786817915616026940285194220703907757879335069896978124429681515117633335502362832425521219599726902327020044791308869970455616185847823063474157292399830070541968662959133724209945293515201291844650765335146840662879479678554559446535460674863857818111377905454946004143554616401168150446865964806314366426743287
[+] Exponent: 65537
Получите закрытый ключ RSA из файла minidump заражённого процесса Covenant :
$ python3 extract_privatekey.py -i memory.dmp -m 19574201286059123715221634877085223155972629451020572575626246458715199192950082143183900970133840359007922584516900405154928253156404028820410452946729670930374022025730036806358075325420793866358986719444785030579682635785758091517397518826225327945861556948820837789390500920096562699893770094581497500786817915616026940285194220703907757879335069896978124429681515117633335502362832425521219599726902327020044791308869970455616185847823063474157292399830070541968662959133724209945293515201291844650765335146840662879479678554559446535460674863857818111377905454946004143554616401168150446865964806314366426743287 -o ./keys/
[+] Saved private key /home/user/privkey1.pem
Скрипт попытается получить p и q как в little, так и в big endian.
Восстановите SessionKey из ответа этапа 0 C2 Covenant, который используется для шифрования сетевого трафика :
$ 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, расшифровка данных также достижима с использованием необработанного закрытого ключа RSA Microsoft.