Spacebar Campaigns

WL-007 Kerberos Golen Ticket Bypass Detection

Log ID:
WL-007
Source:
Windows Event Log Security
Representative Path:
Windows Logs > Security (Event ID 4768, 4769)
Collection:
Winlogbeat
Primary Use:
Active Directory 내 관리자 계정(Administrator 등) 탈취 및 가짜 인증서를 이용한 내부 이동 탐지
Related Logs:

주요 필드

필드의미예시
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

TechniqueMapping Reason
T1558.001 - Steal or Forge Kerberos Tickets: Golden Ticket공격자가 이전 단계(DCSync 등)에서 탈취한 krbtgt 계정의 암호화 키를 악용하여 생성한 위조 TGT(골든 티켓)를 메모리에 주입하고, 정상적인 도메인 컨트롤러의 TGT 발급 프로세스를 우회하여 다수의 서비스(TGS)에 무단 접근하기 때문에 매핑된다.

탐지 포인트

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