
Обход Credential Guard путем патчинга памяти Wdigest
Адам Честер (@_xpn_) написал статью "Exploring Mimikatz - Part 1 - WDigest" о патчинге памяти для включения UseLogonCredential и принуждения Wdigest кэшировать пароли в открытом виде, которая меня заинтриговала.
Модуль wdigest.dll, загружаемый процессом LSASS, содержит две интересные глобальные переменные: g_fParameter_useLogonCredential и g_IsCredGuardEnabled; их роль очевидна уже из названия: первая используется для определения того, следует ли хранить пароль в открытом виде в памяти, а вторая хранит состояние Windows Defender Credential Guard внутри модуля. Патчинг значений этих двух глобальных переменных в памяти позволяет включить кэширование Wdigest паролей в открытом виде на системах с Credential Guard.
Более подробный анализ читайте в моем блоге: "Revisiting a Credential Guard Bypass From Wdigest"
Запустите написанный нами POC в системе с включенной защитой Credential Guard. Когда пользователь снова введет имя пользователя и пароль для входа, мы снова получим его пароль в открытом виде, как показано на рисунке ниже.
BypassCredGuard.exe

На самом деле, еще в августе 2020 года Team Hydra (@N4k3dTurtl3) опубликовала в блоге статью "Bypassing Credential Guard" с описанием этого очень умного и простого трюка и кратко представила концептуальный CredGuard_PoC, но он работает не на всех системах Windows.
Team Hydra направила в Microsoft отчет об этой проблеме и получила следующий ответ:
«После изучения этой проблемы мы не считаем, что это обход Credential Guard. Credential Guard предназначен для защиты учетных данных, кэшированных во время работы функции. Если привилегированный пользователь отключает Credential Guard, функция не может защитить последующие входы в систему. Мы обновим нашу публичную документацию, чтобы уточнить это поведение».
Учитывая такой ответ, я подозреваю, что в обозримом будущем это останется надежным методом получения учетных данных в открытом виде в системах с включенным Credential Guard.