WL-007 Kerberos Golen Ticket Bypass Detection
주요 필드
| 필드 | 의미 | 예시 |
| ticket_hash (4768: winlog.event_data.ResponseTicket, 4769: winlog.event_data.RequestTicketHash) | 4768 및 4769 로그의 서로 다른 티켓 해시 필드명을 하나로 통합한 상관관계 추적용 고유 해시값 | ASvNAQxD1VFRjUfuT14RNhFg/C6NcVRH8V/5H2LR4xQ= |
| winlog.event_data.IpAddress | 가짜 티켓을 사용하여 도메인 내 자원이나 서비스에 접근을 시도한 공격자의 출발지 IP 주소 | ::ffff:10.0.1.194 |
| targetUserName (4768, 4769: winlog.event_data.TargetUserName) | 4768/4769 로그의 계정명 형식을 하나로 동기화한, 공격에 도용된 Active Directory 고권한 계정명 | Administrator |
| first_seen (4768, 4769: @timestamp) | 해당 위조 티켓을 이용한 최초의 서비스 요청(공격 시작) 시간 | 2026-05-25T15:29:24.399Z |
| last_seen (4768, 4769: @timestamp) | 해당 위조 티켓을 이용한 가장 최근의 서비스 요청(최신 공격) 시간 | 2026-05-25T15:29:24.584Z |
| count_4768 | 동일한 티켓 해시 기준으로 집계된 TGT(인증서) 발급 로그의 총 건수 (골든 티켓 공격 발생 시 0건으로 집계됨) | 0 |
| count_4769 | 동일한 티켓 해시 기준으로 집계된 TGS(서비스 요청) 로그의 총 건수 | 4 |
커버하는 Techniques Used
탐지 포인트
| Technique | 관찰할 행위 | 주요 필드 |
| T1558.001 - Steal or Forge Kerberos Tickets: Golden Ticket | 도메인 컨트롤러(DC) 상에 사용자 인증 및 TGT 발급 기록(EventID 4768)이 전혀 존재하지 않는 특정 티켓 해시값이, 타깃 시스템에 접근하기 위한 구체적인 서비스 요청 기록(EventID 4769)에서만 독단적으로 관찰되는 모순적 행위 탐지 | ticket_hash, winlog.event_data.IpAddress, targetUserName, first_seen, last_seen, count_4768, count_4769 |
ELK Query 예시
from winlogbeat-*
| where winlog.channel == "Security"
and winlog.event_id in ("4768", "4769")
and winlog.event_data.TargetUserName in ("Administrator@MYCOMPANY.LOCAL", "admin_user@MYCOMPANY.LOCAL", "Administrator", "admin_user")
| eval ticket_hash = case(
winlog.event_id == "4769", winlog.event_data.RequestTicketHash,
winlog.event_id == "4768", winlog.event_data.ResponseTicket,
null
)
| eval is_4769 = to_integer(case(winlog.event_id=="4769",1,0))
| eval is_4768 = to_integer(case(winlog.event_id=="4768",1,0))
| eval targetUserName = case(
winlog.event_data.TargetUserName in ("Administrator@MYCOMPANY.LOCAL", "Administrator"), "Administrator",
winlog.event_data.TargetUserName in ("admin_user@MYCOMPANY.LOCAL", "admin_user"), "admin_user",
null
)
| stats
count_4769 = sum(is_4769),
count_4768 = sum(is_4768),
first_seen = min(to_long(@timestamp)),
last_seen = max(to_long(@timestamp))
by ticket_hash, winlog.event_data.IpAddress, targetUserName
| where count_4769 > 0 and count_4768 == 0
| eval first_seen = to_datetime(first_seen)
| eval last_seen = to_datetime(last_seen)
| keep ticket_hash, winlog.event_data.IpAddress, targetUserName, first_seen, last_seen, count_4768, count_4769