WL-003 Windows Security 4769 Kerberos Service Ticket Request
주요 필드
| 필드 | 의미 | 예시 |
| @timestamp | 사용자 계정이 특정 서버나 서비스에 접근하기 위해 TGS 서비스 티켓 발급을 요청한 시간 | 2026-05-25T15:29:24.399Z |
| winlog.event_id | Windows 보안 이벤트 식별자 (Kerberos 서비스 티켓 요청 이벤트의 경우 값은 4769) | 4769 |
| winlog.computer_name | 이벤트가 발생한 대상 호스트(PC 또는 서버)의 컴퓨터 이름 | DC01.mycompany.local |
| winlog.event_data.TargetUserName | Kerberos 서비스 티켓(TGS)을 요청한 사용자(계정명). 일반적으로 티켓 요청을 시도한 공격자 또는 탈취된 계정 | employee1@MYCOMPANY.LOCAL |
| winlog.event_data.ServiceName | 티켓이 요청된 대상 서비스 계정의 이름 (SPN에 매핑된 서비스 계정) | svc_file |
| winlog.event_data.IpAddress | 서비스 티켓 요청이 발생한 출발지(공격자 또는 감염된 클라이언트 PC)의 IP 주소 | ::ffff:10.0.4.216 |
| winlog.event_data.Status | Kerberos 티켓 요청 처리 결과 코드 (0x0은 오류 없이 성공적으로 티켓이 발급되었음을 의미) | 0x0 |
| winlog.event_data.RequestTicketHash | 요청된 TGS(서비스 티켓)의 고유 해시값 (WL-007 내에서 ticket_hash로 가공되어 WL-010 로그의 TGT 발급 기록과 매칭되는 핵심 식별자) | ASvNAQxD1VFRjUfuT14RNhFg/C6NcVRH8V/5H2LR4xQ= |
커버하는 Techniques Used
탐지 포인트
| Technique | 관찰할 행위 | 주요 필드 |
| T1558.003 - Steal or Forge Kerberos Tickets: Kerberoasting | 일반 사용자 계정(예: employee1, employee2 등)이 평소 접근할 이유가 없거나 업무 연관성이 낮은 특정 핵심 서비스 계정(svc_file)을 대상으로, 도메인 컨트롤러에 Kerberos 서비스 티켓을 요청하여 성공적으로 발급(Status: 0x0)받는 행위 감시 | winlog.event_id, winlog.computer_name, winlog.event_data.TargetUserName, winlog.event_data.ServiceName, winlog.event_data.IpAddress, winlog.event_data.Status |
| T1558.001 - Steal or Forge Kerberos Tickets: Golden Ticket | 도메인 내 관리자 계정(Administrator 등) 명의로 공유 폴더나 특정 시스템 접속 요청(4769)이 지속적으로 관찰되고 있으나, 분석 플랫폼 내에서 해당 요청의 RequestTicketHash값과 일치하는 정상적인 사용자 최초 인증 기록(4768)이 누락된 채 4769 이벤트만 단독으로 발생하는 행위 추적 | @timestamp, winlog.event_data.RequestTicketHash, winlog.event_data.IpAddress, winlog.event_data.TargetUserName |
ELK Query 예시
winlog.channel : "Security"
and winlog.event_id : 4769
and winlog.event_data.Status : 0x0
and winlog.event_data.TargetUserName : (employee1* or employee2*)
and winlog.event_data.ServiceName : ("svc_file")
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