
सत्र और टिकट डेटा डंप करके, विसंगतियों को स्कोर करके, और SIEM-आधारित घटना प्रतिक्रिया के लिए Windows इवेंट-लॉग संकेतक उत्पन्न करके जाली Kerberos टिकटों का पता लगाता है।
WonkaVision एक प्रूफ ऑफ कॉन्सेप्ट (POC) उपकरण है जो Kerberos टिकटों का विश्लेषण करता है और यह निर्धारित करने का प्रयास करता है कि क्या वे जाली हैं। यह उपकरण 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 लाइसेंस के अंतर्गत लाइसेंस प्राप्त है।
यह P-256 वक्र का उपयोग करके Elliptic Curve Diffie-Hellman (ECDH) कुंजी विनिमय एल्गोरिथम के साथ एक सार्वजनिक और निजी कुंजी जोड़ी उत्पन्न करता है। डिफ़ॉल्ट रूप से यह कुंजियों को base64 एन्कोडेड ब्लॉब्स के रूप में टर्मिनल पर आउटपुट करता है, लेकिन कुंजियों को फ़ाइलों में लिखने के लिए /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 प्रारूप में होते हैं। यह सत्र जानकारी, टिकट कैश के बारे में जानकारी का अनुरोध करने और टिकटों को KERB-CRED के रूप में अनुरोध करने के लिए LsaCallAuthenticationPackage को निष्पादित करके ऐसा करता है (उसी तरह जैसे Rubeus का dump कमांड करता है)।
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 सत्र और WonkaVision टिकट के लिए 9988 और 9989, 2 विभिन्न प्रकार की Windows इवेंट उत्पन्न करता है।
LDAP क्वेरी और DCsyncing के लिए वैकल्पिक क्रेडेंशियल्स का उपयोग करने के लिए /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 (Demo 4) को SharpPCap के साथ लागू किया गया था, लेकिन इसे आसानी से रॉ सॉकेट्स का उपयोग करने के लिए संशोधित किया जा सकता है, जिससे उस निर्भरता के साथ-साथ सिस्टम पर npcap स्थापित करने की आवश्यकता भी समाप्त हो जाती है।
चूंकि यह केवल एक न्यूनतम POC था, अधिकांश संकेतक जो लागू किए गए थे, वे अनएन्क्रिप्टेड संकेतक थे जिनका उल्लेख Charlie के YASCON 2020 वार्ता में किया गया था, जिसका विवरण इस स्लाइड डेक की स्लाइड 18 पर दिया गया है, हालाँकि और भी कई लागू किए जा सकते थे।