
Обход Credential Guard путем патчинга WDigest.dll с использованием только функций NTAPI
NativeBypassCredGuard — это инструмент, предназначенный для обхода Credential Guard путём патча WDigest.dll с использованием только NTAPI-функций (экспортируемых ntdll.dll). Он доступен в двух вариантах: C# и C++.
Инструмент находит паттерн "39 ?? ?? ?? ?? 00 8b ?? ?? ?? ?? 00" в файле WDigest.dll на диске (как объясняется в первом посте из раздела «Ссылки», этот паттерн присутствует в данном файле во всех версиях Windows), затем вычисляет необходимые адреса памяти и, наконец, патчит значения двух переменных внутри WDigest.dll: g_fParameter_UseLogonCredential (в 1) и g_IsCredGuardEnabled (в 0).
Это принуждает к хранению учётных данных в открытом виде в памяти, гарантируя, что с этого момента при каждом входе пользователей в систему учётные данные будут сохраняться в виде открытого текста. В результате при следующем дампе процесса LSASS в нём могут оказаться пароли в открытом виде.
Используемые функции NTAPI:

Используя только NTAPI-функции, можно выполнить ремаппинг библиотеки ntdll.dll для обхода пользовательских хуков и механизмов безопасности; это опциональная возможность инструмента. При её использовании чистая версия ntdll.dll получается из процесса, созданного в приостановленном режиме.
NativeBypassCredGuard.exe <OPTION> <REMAP-NTDLL>
Опция (обязательная):
Ремаппинг ntdll (необязательно):
Считывание значений (без ремаппинга ntdll):
NativeBypassCredGuard.exe check

Запись значений (с ремаппингом ntdll):
NativeBypassCredGuard.exe patch true

Инструмент предназначен для 64-битных систем, поэтому его необходимо компилировать как 64-битный бинарный файл
Он не будет работать, если невозможно открыть дескриптор lsass или если структура PEB не читается. Что касается последнего, вы можете вместо этого использовать kernel32!LoadLibrary для загрузки WDigest.dll в свой процесс, чтобы получить его базовый адрес, а не использовать ntdll!NtReadVirtualMemory и ntdll!NtQueryInformationProcess для получения его из процесса lsass (в C-версии этот код закомментирован). Но тогда вы используете функцию, которая экспортируется не ntdll.dll, а kernel32.dll, и для процесса, вероятно, будет странно загружать эту DLL :)
0x3rhy создал BOF-файл на основе этого проекта: BypassCredGuard-BOF
Revisiting a Credential Guard Bypass от itm4n — отличный анализ, из которого я взял паттерн для поиска в секции .text этой DLL
WDigest: Digging the dead from the grave от neuralhax — потрясающий блог, доказывающий, что можно использовать другие значения для g_fParameter_UseLogonCredential. Я пока не проверял это, но вы можете поиграться с переменной useLogonCredential_Value
Exploring Mimikatz - Part 1 - WDigest от xpn — фантастическая статья с обратной разработкой и объяснением кэширования учётных данных WDigest