
세션 및 티켓 데이터를 덤프하고 이상 징후를 점수화하여 SIEM 기반 침해 대응을 위한 Windows 이벤트 로그 지표를 생성함으로써 위조된 Kerberos 티켓을 탐지합니다.
WonkaVision은 Kerberos 티켓을 분석하여 위조 여부를 판단하는 개념 증명(POC) 도구입니다. 이 도구는 Charlie Clark과 Andrew Schwartz가 만들었습니다.
이 POC는 프로덕션에 바로 투입할 수 있는 엔터프라이즈 애플리케이션이 아니라, 발견된 IOA를 공개하면서 위조 티켓을 더 잘 탐지할 수 있는 방법에 대한 아이디어를 제공하기 위한 것임을 유의하시기 바랍니다.
Charlie Clark은 이 코드베이스의 주 저자입니다.
세션 정보 덤프, Kerberos 티켓 덤프, Kerberos 티켓 복호화/암호화에 사용되는 코드의 상당 부분은 Rubeus에서 가져왔습니다. GetNCChanges 코드는 Vincent Le Toux의 MakeMeEnterpriseAdmin에서 각색했습니다.
다음과 같은 3가지 기능이 있습니다:
/createkeys - 덤퍼와 분석기가 사용할 공개/개인 키 쌍을 생성합니다./dump - 서버/워크스테이션에서 실행하며, 관련 Kerberos 티켓과 함께 세션 데이터를 덤프합니다./analyze - 모든 덤프 파일이 들어 있는 디렉터리를 대상으로 실행하며, 덤프 내의 모든 세션과 티켓을 분석하고 점수를 생성한 후 이벤트 로그에 기록합니다.WonkaVision에는 다음과 같은 종속성이 있습니다:
발표에 사용한 슬라이드 덱은 여기에서 확인할 수 있습니다.
WonkaVision은 BSD 3-Clause 라이선스에 따라 배포됩니다.
ECDH(Elliptic Curve Diffie-Hellman) 키 교환 알고리즘과 P-256 곡선을 사용하여 공개 키와 개인 키 쌍을 생성합니다. 기본적으로 키를 base64로 인코딩된 blob 형태로 터미널에 출력하지만, /outdir:PATH 인수를 사용하여 키를 파일로 작성할 수 있습니다.
파일에 키를 작성하는 경우, private.key 파일은 KRBTGT 키처럼 보호해야 합니다
예제 1:
C:\WonkaVision>WonkaVision.exe /createkeys
====================PublicKey====================
RUNLMSAAAABN/odC5C5W7meBvf6rKmWOoVW9qRTRcyCJBFuvRbEvMFuMa8cV20W1e+rRd4f9jSfr5vDVJ0+I/SJsZI1ondws
==================End PublicKey==================
====================PrivateKey====================
RUNLMiAAAABN/odC5C5W7meBvf6rKmWOoVW9qRTRcyCJBFuvRbEvMFuMa8cV20W1e+rRd4f9jSfr5vDVJ0+I/SJsZI1ondwsto7Fc/J4akdJdCix51F0ELLKWlsdMDlkYx2shFEV3AA=
==================End PrivateKey==================
예제 2:
C:\WonkaVision>WonkaVision.exe /createkeys /outdir:.
[!] Writing key files to ., be sure to protect the private key as if it was the krbtgt key!
[*] Written public key to .\public.key
[*] Written private key to .\private.key
C:\WonkaVision>dir
Volume in drive C is System
Volume Serial Number is 22BC-4361
Directory of C:\WonkaVision
10/14/2022 01:10 PM <DIR> .
10/14/2022 01:10 PM <DIR> ..
10/14/2022 01:10 PM 104 private.key
10/14/2022 01:10 PM 72 public.key
10/14/2022 01:08 PM 1,383,424 WonkaVision.exe
3 File(s) 1,383,600 bytes
2 Dir(s) 71,813,464,064 bytes free
Kerberos 티켓을 포함한 세션의 세션 정보와 Kerberos 티켓 자체를 KERB-CRED 형식으로 덤프합니다. 이 작업은 Rubeus의 dump 명령과 동일한 방식으로 LsaCallAuthenticationPackage를 실행하여 세션 정보, 티켓 캐시 정보를 요청하고 티켓을 KERB-CRED로 요청하는 방식으로 수행됩니다.
2가지 주요 인수가 필요합니다:
/publickey:KEY - 덤프된 데이터 암호화에 사용할 공개 키/dumpdir:DIR - 덤프된 데이터를 저장할 디렉터리데이터가 덤프되면 WonkaVision은 다음 단계를 수행합니다:
/publickey:KEY 인수로 전달된 공개 키를 사용하여 대칭 키를 도출합니다./dumpdir:DIR 인수로 지정된 디렉터리에 기록합니다.특정 세션(/luid:X 인수), 사용자(/user:USER 인수), 서비스(/service:SVC 인수) 및/또는 서버(/server:Y 인수)를 지정할 수 있지만, 현재 이 기능들은 충분히 테스트되지 않았습니다.
예제:
WonkaVision.exe /dump /publickey:\\server\dumpshare\public.key /dumpdir:\\server\dumpshare\dumps
/dump 명령으로 생성된 덤프를 분석합니다. /dumpdir:DIR이 가리키는 모든 하위 디렉터리를 재귀적으로 탐색하면서 발견되는 모든 .json 파일을 읽습니다. json 파일을 역직렬화한 후, 그 안에 저장된 모든 세션과 세션 내의 모든 티켓을 반복하며 가능한 한 깊이 분석하고, 발견된 예상 이탈 항목 각각에 점수를 할당합니다. 그런 다음 이 점수들을 합산하여 총점을 산출하고, 발견된 모든 문제를 포함하는 WonkaVision Session 및 _WonkaVision Ticket_용 Windows 이벤트 9988과 9989를 각각 생성합니다.
LDAP 쿼리와 DCSync에 대체 자격 증명을 사용하려면 /creduser:USER, /creddomain:DOMAIN, /credpass:PASSWORD를 지정할 수 있습니다. 하지만 이 기능은 프로덕션 환경에서는 권장되지 않으며, 문제를 좀 더 쉽게 디버깅하기 위해 구현되었습니다.
2가지 주요 인수가 필요합니다:
/privatekey:KEY - 암호화된 덤프를 복호화하는 데 사용되는 개인 키/dumpdir:DIR - 암호화된 덤프가 저장된 디렉터리예제:
WonkaVision.exe /analyze /privatekey:C:\keys\private.key /dumpdir:C:\dumpshare\dumps
WonkaVision은 터미널을 통해 분석 결과를 반환하지만, 공격 지표(IOA) 분석에 대한 더 자세한 설명은 Windows 응용 프로그램 이벤트 로그 채널에서 확인할 수 있습니다. 분석가는 여기서 총점, 특정 IOA, IOA의 이유, 도구 점수에 대해 더 많은 통찰력과 맥락을 얻을 수 있습니다. 9988(세션 이벤트)과 9989(티켓 이벤트) 두 가지 이벤트가 각각 기록됩니다. 이벤트 샘플은 여기에서 확인할 수 있습니다.
다음은 WonkaVision 세션 이벤트(9988)의 예입니다:

다음은 WonkaVision 티켓 이벤트(9989)의 예입니다:
EVTX 로그에서 Mimikatz로 위조된 골든 티켓 가능성의 예:


위에서 언급했듯이 WonkaVision 로그는 Windows 응용 프로그램 이벤트 로그 채널에 기록됩니다. 구성된 경우 이러한 로그는 SIEM(예: Splunk, Sentinel 등)으로 전달될 수 있습니다.
Splunk "Classic" WinEvnet 로깅을 사용한 권장 쿼리도 사용할 수 있습니다:
index="wv_demo_wineventlog" source="WinEventLog:Application" (Total_Score>=8) | table _time,Total_Score,User,Machine_Name,Service_Principal_Name,Mimikatz_Score,Rubeus_Score,Impacket_Score,Cobalt_Strike_Score,IOA_Reasons
Splunk에서 Mimikatz WonkaVision으로 위조된 골든 티켓 가능성의 예:

Splunk에서 WonkaVision의 Rubeus로 위조된 골든 티켓 가능성의 예:
Sentinel을 사용한 로깅도 가능합니다. 그러나 추가적인 파싱이 필요할 수 있습니다. 아래는 Jonathan Johnson(@jsecurity101)의 예제 쿼리로, WonkaVision이 Sentinel에서 파싱된 후 어떻게 표시될 수 있는지 보여줍니다:
Event
| where Computer contains "asgard" and Source contains "Wonka"
| extend ParsedEventData=parse_xml(EventData)
| extend Data=ParsedEventData.DataItem.EventData.Data
| parse-where Data with *
"Total Score: " TotalScore:string
"Session: " Session:string
"Machine Name: " MachineName:string
"User: " User:string
"Service Principal Name: " ServicePrincipalName:string
"IOAs: " IOAs:string
"SessionUser: " IOA_SessionUser:string
"KDCCalled: " IOA_KDCCalled:string
"Mimikatz Score: " TScore_MimikatzScore:string
"Impacket Score: " TScore_ImpacketScore:string
"Rubeus Score: " TScore_RubeusScore:string
"Cobalt Strike Score: " TScore_CobaltStrikeScore:string
"IOA Reasons: " IOA_Reasons:string
| where IOA_SessionUser contains "thor"
Sentinel에서 WonkaVision으로 위조된 골든 티켓 가능성의 예:

데모 1 - 골든 티켓 생성:
데모 2 - 키 쌍 생성 및 세션/티켓 덤프:
데모 3 - 덤프 분석 및 Windows 이벤트 출력:
데모 4 - Kerberos 네트워크 스니퍼:
발표에서 시연한 Kerberos 트래픽 스니퍼 POC(데모 4)는 SharpPCap으로 구현되었지만, 원시 소켓을 사용하도록 쉽게 수정할 수 있으며, 이 경우 해당 종속성과 시스템에 npcap을 설치해야 하는 필요성이 제거됩니다.
최소한의 POC였기 때문에 구현된 대부분의 지표는 이 슬라이드 덱의 18페이지에 자세히 나와 있는 Charlie의 YASCON 2020 발표에서 언급된 비암호화 지표였으며, 더 많은 지표를 구현할 수 있었습니다.