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 曲线的椭圆曲线 Diffie-Hellman (ECDH) 密钥交换算法生成公钥和私钥对。默认情况下,它会将密钥以 base64 编码的 blob 形式输出到终端,但也可以通过 /outdir:PATH 参数将密钥写入文件。
如果写入文件,应像保护 KRBTGT 密钥一样保护 private.key 文件
示例 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 格式)。它通过执行 LsaCallAuthenticationPackage 来请求会话信息、票据缓存信息,并将票据作为 KERB-CRED 请求(与 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 文件后,它会遍历其中存储的所有会话以及会话中的所有票据,并尽可能深入地分析它们,为每个发现的与预期不符的偏差分配一个分数。随后,它会将这些分数相加得出总分,并生成两种不同类型的 Windows 事件 9988 和 9989,分别对应 WonkaVision Session 和 WonkaVision Ticket,其中包含所有发现的问题。
可以指定 /creduser:USER、/creddomain:DOMAIN 和 /credpass:PASSWORD,以便为 LDAP 查询和 DC 同步使用备用凭据。不过不建议在生产环境中使用这些参数,它们是为了更方便地调试问题而实现的。
需要 2 个主要参数:
/privatekey:KEY - 用于解密加密转储的私钥/dumpdir:DIR - 存储加密转储的目录示例:
WonkaVision.exe /analyze /privatekey:C:\keys\private.key /dumpdir:C:\dumpshare\dumps
尽管 WonkaVision 会通过终端返回分析输出,但在 Windows 应用程序事件日志通道中可以找到更详细的攻击指标 (IOA) 分析描述。分析师将在这里获得关于总分、具体 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,因此实现的大部分指标都是 Charlie 在 YASCON 2020 演讲中提到的未加密指标,详见此幻灯片的第 18 页,尽管还可以实现更多指标。