взлом cobaltstrike 4.5, удаление сигнатур checksum8, обход BeaconEye, исправление утечки stage по неверному пути, добавление двухфакторной аутентификации TOTP, исправление CVE-2022-39197 и др.
Взлом версии cobaltstrike4.5, удаление признака checksum8, обход BeaconEye, исправление утечки stage по неверному пути, добавление двухфакторной проверки TOTP, добавление шифрованного отображения имени пользователя, исправление бага наследования foreign в версии 4.5, изменение имени файла конфигурации клиента и т.д.
взлом cobalt strike 4.5
взлом cobaltstrike4.5
[TOC]
Данный инструмент и содержимое статьи предназначены только для исследований в области безопасности. Пользователь несёт всю юридическую и связанную с этим ответственность за использование данного инструмента и содержимого статьи! Автор не несёт никакой юридической ответственности! Если в процессе использования данного инструмента и содержимого статьи вы совершаете любые незаконные действия, вы самостоятельно несёте соответствующие последствия, и мы не несём никакой юридической или связанной ответственности. В противном случае, пожалуйста, не устанавливайте и не используйте данный инструмент. Ваше использование или любое иное явное или подразумеваемое выражение согласия с настоящим соглашением означает, что вы прочитали и согласны с его условиями. При использовании данного инструмента для исследований в области безопасности вы должны убедиться, что такие действия соответствуют законодательству и что у вас есть достаточные полномочия. Не используйте его против неавторизованных целей.
Да, я снова здесь, продолжаю оригинальный cobaltstrike4.4_cdf: https://github.com/lovechoudoufu/about_cobaltstrike4.4_cdf На этот раз версия 4.5. Предыдущий 4.4 был удалён GitHub'ом; вероятно, скоро этот проект тоже будет удалён~.
Рекомендуется вступить в группу Telegram, в дальнейшем, после удаления проекта и других обновлений, их можно будет скачать из группы:

Перед использованием внимательно сверьте хэш jar-пакета соответствующей версии.
Процесс проверки лицензии (на примере 4.3): в версии 4.5 в конце есть небольшие изменения.
Официальные ключи дешифрования для каждой версии:
4.0 1be5be52c6255c33558e8a1cb667cb06
4.1 80e32a742060b884419ba0c171c9aa76
4.2 b20d487addd4713418f2d5a3ae02a7a0
4.3 3a4425490f389aeec312bdd758ad2b99
4.4 5e98194a01c6b48fa582a6a9fcbb92d6
cobaltstrike.auth — файл ключа аутентификации, зашифрован RSA; после расшифровки содержимое:
4.3
-54, -2, -64, -45, //文件头
0, 77, //后续长度
1, -55, -61, 127, //证书时间限制29999999(永久)
0, 0, 0, 1, //watermark(水印)
43, //版本
16, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
16, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
16, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
16, 58, 68, 37, 73, 15, 56, -102, -18, -61, 18, -67, -41, 88, -83, 43, -103
С каждым обновлением версии соответствующая длина увеличивается на 17, ключ увеличивается на 17 байт.
В aggressor/Aggressor.class проверка лицензии начинается с License.checkLicenseGUI(new Authorization());:

В License.checkLicenseGUI методы isValid, isPerpetual, isExpired, isAlmostExpired определяют, действительна ли лицензия и не истекла ли она:

В классе Authorization обрабатывается файл cobaltstrike.auth: читается содержимое файла и вызывается AuthCrypto().decrypt для его обработки:

В конструкторе AuthCrypto() вызывается load(). Функция load() выполняет проверку MD5 для resources/authkey.pub, а затем получает открытый ключ RSA:

В decrypt() вызывается _decrypt, который расшифровывает содержимое файла cobaltstrike.auth с помощью открытого ключа RSA и присваивает результат массиву var2, затем преобразует его через DataParser в var3. Метод readInt() получает первые четыре байта из var3 для проверки заголовка файла (-889274181 — версия 3.x; -889274157 — версия 4.x). Затем readShort() из var3 получает два байта как длину и присваивает её var5, далее var6 = var3.readBytes(var5) читает содержимое этой длины, присваивает var6 и возвращает его:

Массив arrayOfByte2, полученный в классе Authorization, представляет собой содержимое после удаления первых шести байт. Обработка arrayOfByte2 продолжается: сначала считываются четыре числа в i, затем четыре числа в watermark, затем одно число в b1. Проверяется, что b1 меньше 43, и равно ли i значению 29999999. В common/ListenerConfig при watermark == 0 добавляется водяной знак антивирусного обнаружения:


После удаления первых 6 байт и затем 9 байт i, watermark, b1, оставшаяся часть — это ключи от 4.0 до 4.3, со структурой: 16, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20:
byte b2 = dataParser.readByte(); //获取1位,即16
byte[] arrayOfByte3 = dataParser.readBytes(b2); //获取16位,为4.0的key
byte b3 = dataParser.readByte(); //获取1位,即16
byte[] arrayOfByte4 = dataParser.readBytes(b3); //获取16位,为4.1的key
byte b4 = dataParser.readByte(); //获取1位,即16
byte[] arrayOfByte5 = dataParser.readBytes(b4); //获取16位,为4.2的key
byte b5 = dataParser.readByte(); //获取1位,即16
byte[] arrayOfByte6 = dataParser.readBytes(b5); //获取16位,为4.3的key赋值给arrayOfByte6
В классе Authorization вызывается метод SleevedResource.Setup для обработки arrayOfByte6. В SleevedResource ключ задаётся как ключ расшифровки AES и HmacSHA256, а в _readResource вызывается this.data.decrypt(arrayOfByte1); для расшифровки. Расшифровывается содержимое DLL-файлов из /sleeve/:

В SleeveSecurity задаётся ключ расшифровки AES и HmacSHA256: на основе переданного значения вычисляется дайджест длиной 256, затем байты 0–16 используются как ключ AES, а байты 16–32 — как ключ HmacSHA256:

Если не получить соответствующий ключ, невозможно расшифровать DLL из папки sleeve; при подключении к серверу появится ошибка [Sleeve] Bad HMAC:

Часть с расшифровкой HMAC можно посмотреть здесь: Взлом Cobaltstrike 4 — я сам себе выдаю лицензию
Таким образом, ключ к взлому — это наличие ключа соответствующей версии CS.
Согласно официальному описанию, в версии 4.5 повышена безопасность лицензии. Это действительно так: