
Détecte les tickets Kerberos forgés en extrayant les données de session et de ticket, en évaluant les anomalies et en générant des indicateurs de journaux d'événements Windows pour la réponse aux incidents basée sur SIEM.
WonkaVision est un outil de preuve de concept (POC) permettant d'analyser les tickets Kerberos et de tenter de déterminer s'ils sont forgés. Cet outil a été créé par Charlie Clark et Andrew Schwartz.
Il convient de noter que ce POC n'est pas destiné à être une application d'entreprise prête pour la production, mais plutôt à générer des idées sur la manière de mieux détecter les tickets forgés tout en publiant les IOA découverts.
Charlie Clark est l'auteur principal de cette base de code.
Une grande partie du code permettant de dumper les informations de session, de dumper les tickets Kerberos et de déchiffrer/chiffrer les tickets Kerberos provient de Rubeus. Le code GetNCChanges a été adapté de MakeMeEnterpriseAdmin de Vincent Le Toux.
Il dispose de 3 fonctions :
/createkeys - Crée une paire de clés publique/privée pour le dumper et l'analyseur/dump - À exécuter sur les serveurs/postes de travail, dump les données de session avec les tickets Kerberos associés/analyze - Exécuté sur un répertoire contenant tous les fichiers de dump, analyse toutes les sessions et tous les tickets présents dans les dumps, génère des scores et écrit dans le journal des événementsWonkaVision a les dépendances suivantes :
Le jeu de diapositives de la présentation est ici.
WonkaVision est distribué sous la licence BSD 3-Clause.
Génère une paire de clés publique et privée en utilisant l'algorithme d'échange de clés Elliptic Curve Diffie-Hellman (ECDH) avec la courbe P-256. Par défaut, il affiche les clés dans le terminal sous forme de blobs encodés en base64, mais dispose de l'argument /outdir:PATH pour écrire les clés dans des fichiers.
SI VOUS ÉCRIVEZ DANS DES FICHIERS, LE FICHIER private.key DOIT ÊTRE PROTÉGÉ COMME S'IL S'AGISSAIT DE LA CLÉ KRBTGT
Exemple 1 :
C:\WonkaVision>WonkaVision.exe /createkeys
====================PublicKey====================
RUNLMSAAAABN/odC5C5W7meBvf6rKmWOoVW9qRTRcyCJBFuvRbEvMFuMa8cV20W1e+rRd4f9jSfr5vDVJ0+I/SJsZI1ondws
==================End PublicKey==================
====================PrivateKey====================
RUNLMiAAAABN/odC5C5W7meBvf6rKmWOoVW9qRTRcyCJBFuvRbEvMFuMa8cV20W1e+rRd4f9jSfr5vDVJ0+I/SJsZI1ondwsto7Fc/J4akdJdCix51F0ELLKWlsdMDlkYx2shFEV3AA=
==================End PrivateKey==================
Exemple 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
Dump les informations de session des sessions contenant des tickets Kerberos, y compris les tickets Kerberos eux-mêmes au format KERB-CRED. Pour ce faire, il exécute LsaCallAuthenticationPackage pour demander les informations de session, les informations sur le cache de tickets et demander les tickets sous forme de KERB-CRED (de la même manière que la commande dump de Rubeus).
2 arguments principaux sont requis :
/publickey:KEY - clé publique à utiliser pour le chiffrement des données dumpées/dumpdir:DIR - répertoire dans lequel stocker les données dumpéesUne fois les données dumpées, WonkaVision effectue les opérations suivantes :
/publickey:KEY pour dériver une clé symétrique/dumpdir:DIRIl est possible de spécifier des sessions particulières (avec l'argument /luid:X), des utilisateurs (avec l'argument /user:USER), des services (avec l'argument /service:SVC) et/ou des serveurs (avec l'argument /server:Y), mais ces options n'ont pas encore été beaucoup testées.
Exemple :
WonkaVision.exe /dump /publickey:\\server\dumpshare\public.key /dumpdir:\\server\dumpshare\dumps
Analyse les dumps créés avec la commande /dump. Il parcourt récursivement tous les sous-répertoires pointés par /dumpdir:DIR et lit tous les fichiers .json qu'il rencontre. Une fois le fichier json désérialisé, il parcourt toutes les sessions qui y sont stockées et tous les tickets des sessions, et les analyse de la manière la plus approfondie possible, en attribuant un score pour chaque écart par rapport à l'attendu. Ensuite, il additionne ces scores pour produire un score total et génère 2 types différents d'événements Windows, 9988 et 9989, respectivement pour WonkaVision Session et WonkaVision Ticket, contenant tous les problèmes découverts.
Il est possible de spécifier /creduser:USER, /creddomain:DOMAIN et /credpass:PASSWORD pour utiliser des identifiants alternatifs pour les requêtes LDAP et le DCsync. Ceci n'est toutefois pas recommandé en production ; ils ont été implémentés pour faciliter le débogage des problèmes.
2 arguments principaux sont requis :
/privatekey:KEY - clé privée utilisée pour déchiffrer les dumps chiffrés/dumpdir:DIR - répertoire dans lequel les dumps chiffrés sont stockésExemple :
WonkaVision.exe /analyze /privatekey:C:\keys\private.key /dumpdir:C:\dumpshare\dumps
Bien que WonkaVision renvoie les résultats de l'analyse via le terminal, une description plus détaillée de l'analyse des indicateurs d'attaque (IOA) se trouve dans le canal Journal des événements d'application Windows. C'est là que l'analyste obtiendra une meilleure visibilité et un meilleur contexte en termes de score total, des IOA spécifiques, de la/des raison(s) des IOA et des scores d'outils. Deux événements sont écrits, 9988 (événement de session) et 9989 (événement de ticket) respectivement. Un exemple d'événements est disponible ici.
Voici un exemple d'événement de session WonkaVision (9988) :

Voici un exemple d'événement de ticket WonkaVision (9989) :
Exemple de Golden Ticket potentiellement forgé avec Mimikatz dans les journaux EVTX :


Comme indiqué ci-dessus, les journaux de WonkaVision sont écrits dans le canal Journal des événements d'application Windows. S'ils sont configurés, ces journaux peuvent être transférés vers un SIEM (par exemple Splunk, Sentinel, etc.).
Une requête suggérée utilisant la journalisation WinEvnet "Classic" de Splunk peut également être utilisée :
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
Exemple de Golden Ticket potentiellement forgé avec Mimikatz WonkaVision dans Splunk :

Exemple de Golden Ticket potentiellement forgé avec Rubeus depuis WonkaVision dans Splunk :
La journalisation avec Sentinel peut également être réalisée. Cependant, cela peut nécessiter une analyse supplémentaire. Ci-dessous un exemple de requête de Jonathan Johnson (@jsecurity101) illustrant comment WonkaVision peut apparaître une fois analysé dans 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"
Exemple de Golden Ticket potentiellement forgé depuis WonkaVision dans Sentinel :

Démo 1 - Création d'un Golden Ticket :
Démo 2 - Création d'une paire de clés et dump de sessions/tickets :
Démo 3 - Analyse des dumps et sortie des événements Windows :
Démo 4 - Sniffer réseau Kerberos :
Le POC de sniffer de trafic Kerberos que nous avons présenté lors de notre exposé (Démo 4) a été implémenté avec SharpPCap, mais pourrait facilement être modifié pour utiliser des sockets brutes, supprimant ainsi cette dépendance ainsi que la nécessité d'installer npcap sur le système.
Comme il ne s'agissait que d'un POC minimal, la plupart des indicateurs implémentés étaient les indicateurs non chiffrés mentionnés lors de la présentation YASCON 2020 de Charlie, détaillés sur la diapositive 18 de ce jeu de diapositives, bien que beaucoup d'autres auraient pu être implémentés.