
C-Ark Credential Decoder для #CVE-2021-31796
Эксплойт-инструмент для CVE-2021-31796
Инструмент для декодирования файлов учетных данных C-Ark
Авторы: Aaron Mizrachi - https://twitter.com/unmanarc/
Enrique Vaamonde - https://twitter.com/_ejvm
Первый выпуск: 2/Sep/2019
Раскрытие: 11/Oct/2021
Эта уязвимость ожидала публичного раскрытия с сентября 2019 года.
И... вот хронология:
Во время пентеста, если кому-то хватит ума добраться до PSM и случайно получить доступ к CredFile, он потенциально сможет использовать этот файл для установления соединения с Vault и получить всю полноту власти...
В качестве контрмеры большинство файлов учетных данных накладывают некоторые «ограничения», чтобы пароль нельзя было использовать в другом окружении/на другом компьютере (например, в собственном PSM хакера).
Однако эти ограничения можно изменить, если вы проведёте реверс-инжиниринг и получите исходную часть ключа. Эта расшифрованная часть ключа может быть использована для повторного создания другого файла с другими «параметрами безопасности» (например, другой хост, другое приложение, другой пользователь ОС).
Для генерации исходного ключа расшифровки AES-256 (32 байта) мы берём пару SHA1SUM из поля учетных данных «AdditionalInformation», добавляя «0x00000000» и «0x00000001» для каждого хэша; первый хэш даёт первые 20 байт ключа, а второй — только последние 12 байт.
Если есть какие-либо ограничения окружения (например, IP/Host/exepath/...), мы добавляем каждое значение в открытом виде в начало AdditionalInformation перед вычислением обоих SHA1SUM.
Важно упомянуть, что поле «ClientApp» преобразуется с помощью BASE64(SHA1SUM(strlower(ClientApp))) перед добавлением к «AdditionalInformation» и генерацией обоих SHA1SUM.
Расшифровка выполняется с помощью функции OpenSSL AES-256-CBC с использованием поля Password или NewPassword. (https://wiki.openssl.org/index.php/EVP_Symmetric_Encryption_and_Decryption)
Мы используем (verificationflags-16), чтобы определить, какая проверка/ограничение действует:
usingClientApp = ((uVerificationsFlag&0x1) != 0);
usingAppPath = ((uVerificationsFlag&0x2) != 0);
usingClientIP = ((uVerificationsFlag&0x4) != 0);
usingOSUser = ((uVerificationsFlag&0x8) != 0);
usingClientHostname = ((uVerificationsFlag&0x20) != 0);
и в случае, если некоторые ограничения не отображаются в выходном файле учетных данных, вы всегда можете ввести их вручную. Думаю, мы оба согласимся, что ни «путь приложения», ни «клиентский IP» не являются по-настоящему случайными значениями.
Используйте HSM \o/ и не храните ключ расшифровки в cred-файле.
qmake .
make -j8