
NTAPI 함수만 사용하여 WDigest.dll을 패치함으로써 Credential Guard를 우회합니다.
NativeBypassCredGuard는 ntdll.dll이 내보내는 NTAPI 함수만 사용하여 WDigest.dll을 패치함으로써 Credential Guard를 우회하도록 설계된 도구입니다. C#과 C++ 두 가지 버전으로 제공됩니다.
이 도구는 디스크에 있는 WDigest.dll 파일에서 "39 ?? ?? ?? ?? 00 8b ?? ?? ?? ?? 00" 패턴을 찾은 다음(References 섹션의 첫 번째 게시물에 설명된 대로, 이 패턴은 모든 Windows 버전의 이 파일에 존재합니다), 필요한 메모리 주소를 계산하고, 마지막으로 WDigest.dll 내부의 두 변수인 g_fParameter_UseLogonCredential(1로)과 g_IsCredGuardEnabled(0으로)의 값을 패치합니다.
이로 인해 메모리에 일반 텍스트 자격 증명 저장이 강제되어, 이후 사용자가 로그인할 때 자격 증명이 평문으로 저장됩니다. 결과적으로 다음에 LSASS 프로세스를 덤프하면 비밀번호가 평문으로 포함될 수 있습니다.
사용되는 NTAPI 함수는 다음과 같습니다:

NTAPI 함수만 사용하면 ntdll.dll 라이브러리를 다시 매핑하여 사용자 모드 후크와 보안 메커니즘을 우회할 수 있으며, 이는 이 도구의 선택적 기능입니다. 사용하는 경우, 일시 중단(suspended) 모드로 생성된 프로세스에서 깨끗한 버전의 ntdll.dll을 얻습니다.
NativeBypassCredGuard.exe <OPTION> <REMAP-NTDLL>
옵션 (필수):
ntdll 다시 매핑 (선택):
값 읽기 (ntdll 다시 매핑 없이):
NativeBypassCredGuard.exe check

값 패치 (ntdll 다시 매핑과 함께):
NativeBypassCredGuard.exe patch true

이 도구는 64비트 시스템용으로 설계되었으므로 64비트 바이너리로 컴파일해야 합니다
lsass에 대한 핸들을 열 수 없거나 PEB 구조를 읽을 수 없는 경우 작동하지 않습니다. 후자의 경우, ntdll!NtReadVirtualMemory와 ntdll!NtQueryInformationProcess를 사용하여 lsass 프로세스에서 기준 주소를 가져오는 대신 kernel32!LoadLibrary를 사용하여 프로세스에 WDigest.dll을 로드해 기준 주소를 얻을 수 있습니다(C 버전에 이 코드가 주석 처리되어 있습니다). 하지만 그러면 ntdll.dll이 아닌 kernel32.dll이 내보내는 함수를 사용하게 되며, 프로세스가 해당 DLL을 로드하는 것은 아마 이상해 보일 것입니다 :)
0x3rhy님이 이 프로젝트를 기반으로 BOF 파일을 만들었습니다: BypassCredGuard-BOF
Revisiting a Credential Guard Bypass by itm4n - DLL의 .text 섹션에서 검색할 패턴을 가져온 훌륭한 분석 자료
WDigest: Digging the dead from the grave by neuralhax - g_fParameter_UseLogonCredential에 다른 값을 사용할 수 있음을 입증한 놀라운 블로그로, 아직 테스트하지는 않았지만 useLogonCredential_Value 변수로 실험해 볼 수 있습니다
Exploring Mimikatz - Part 1 - WDigest by xpn - WDigest 자격 증명 캐싱을 리버스 엔지니어링하고 설명하는 훌륭한 블로그 게시물