
Detecta tickets Kerberos forjados ao extrair dados de sessão e tickets, pontuar anomalias e gerar indicadores de log de eventos do Windows para resposta a incidentes baseada em SIEM.
WonkaVision é uma ferramenta de prova de conceito (POC) para analisar tickets Kerberos e tentar determinar se eles são forjados. Esta ferramenta foi criada por Charlie Clark e Andrew Schwartz.
Deve-se notar que esta POC não tem a intenção de ser um aplicativo empresarial pronto para produção, mas sim gerar ideias sobre como detectar melhor tickets forjados enquanto divulga os IOAs descobertos.
Charlie Clark é o principal autor desta base de código.
Grande parte do código para despejar informações de sessão, despejar tickets Kerberos e descriptografar/criptografar tickets Kerberos foi retirada de Rubeus. O código GetNCChanges foi adaptado do MakeMeEnterpriseAdmin de Vincent Le Toux.
Possui 3 funções:
/createkeys - Cria um par de chaves pública/privada para uso pelo dumper e pelo analisador/dump - Para ser executado em servidores/estações de trabalho, despeja dados de sessão com os tickets Kerberos associados/analyze - Executado contra um diretório contendo todos os arquivos de dump, analisa todas as sessões e tickets nos dumps, gera pontuações e grava no log de eventosWonkaVision tem as seguintes dependências:
Os slides da apresentação estão aqui.
WonkaVision é licenciado sob a licença BSD 3-Clause.
Gera um par de chaves pública e privada usando o algoritmo de troca de chaves Elliptic Curve Diffie-Hellman (ECDH) com a curva P-256. Por padrão, ele envia as chaves para o terminal como blobs codificados em base64, mas possui o argumento /outdir:PATH para gravar as chaves em arquivos.
SE FOR GRAVAR EM ARQUIVOS, O ARQUIVO private.key DEVE SER PROTEGIDO COMO SE FOSSE A CHAVE KRBTGT
Exemplo 1:
C:\WonkaVision>WonkaVision.exe /createkeys
====================PublicKey====================
RUNLMSAAAABN/odC5C5W7meBvf6rKmWOoVW9qRTRcyCJBFuvRbEvMFuMa8cV20W1e+rRd4f9jSfr5vDVJ0+I/SJsZI1ondws
==================End PublicKey==================
====================PrivateKey====================
RUNLMiAAAABN/odC5C5W7meBvf6rKmWOoVW9qRTRcyCJBFuvRbEvMFuMa8cV20W1e+rRd4f9jSfr5vDVJ0+I/SJsZI1ondwsto7Fc/J4akdJdCix51F0ELLKWlsdMDlkYx2shFEV3AA=
==================End PrivateKey==================
Exemplo 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
Despeja informações de sessão de sessões que contêm tickets Kerberos, incluindo os próprios tickets Kerberos no formato KERB-CRED. Isso é feito executando LsaCallAuthenticationPackage para solicitar informações de sessão, informações sobre o cache de tickets e solicitar tickets como KERB-CREDs (da mesma forma que o comando dump do Rubeus).
São necessários 2 argumentos principais:
/publickey:KEY - chave pública a ser usada para criptografia dos dados despejados/dumpdir:DIR - diretório para armazenar os dados despejadosDepois que os dados são despejados, o WonkaVision faz o seguinte:
/publickey:KEY para derivar uma chave simétrica/dumpdir:DIRÉ possível especificar sessões específicas (com o argumento /luid:X), usuários (com o argumento /user:USER), serviços (com o argumento /service:SVC) e/ou servidores (com o argumento /server:Y), mas esses ainda não foram muito testados.
Exemplo:
WonkaVision.exe /dump /publickey:\\server\dumpshare\public.key /dumpdir:\\server\dumpshare\dumps
Analisa dumps criados com o comando /dump. Ele percorre recursivamente todos os subdiretórios apontados por /dumpdir:DIR e lê todos os arquivos .json que encontrar. Depois de desserializar o arquivo json, ele percorre todas as sessões armazenadas nele e todos os tickets nas sessões e os analisa com o máximo de profundidade possível, atribuindo uma pontuação para cada desvio do esperado encontrado. Em seguida, soma essas pontuações para produzir uma pontuação total e gera 2 tipos diferentes de eventos do Windows, 9988 e 9989, para WonkaVision Session e WonkaVision Ticket, respectivamente, contendo todos os problemas descobertos.
É possível especificar /creduser:USER, /creddomain:DOMAIN e /credpass:PASSWORD para usar credenciais alternativas para as consultas LDAP e DCsync. No entanto, isso não é recomendado em uso em produção; elas foram implementadas para facilitar um pouco a depuração de problemas.
São necessários 2 argumentos principais:
/privatekey:KEY - chave privada usada para descriptografar os dumps criptografados/dumpdir:DIR - diretório onde os dumps criptografados estão armazenadosExemplo:
WonkaVision.exe /analyze /privatekey:C:\keys\private.key /dumpdir:C:\dumpshare\dumps
Embora o WonkaVision retorne a saída da análise pelo terminal, uma descrição mais detalhada da análise de Indicador de Ataque (IOA) pode ser encontrada no canal de Log de Eventos do Aplicativo Windows. É aqui que um analista receberá maior visão e contexto em termos da Pontuação Total, dos IOAs específicos, do(s) motivo(s) dos IOAs e das pontuações das ferramentas. Dois eventos são gravados, 9988 (Evento de Sessão) e 9989 (Evento de Ticket), respectivamente. Uma amostra de eventos pode ser encontrada aqui.
A seguir está um exemplo de um Evento de Sessão WonkaVision (9988):

A seguir está um exemplo de um Evento de Ticket WonkaVision (9989):
Exemplo de possível Golden Ticket forjado com Mimikatz em logs EVTX:


Conforme observado acima, os logs do WonkaVision são gravados no canal de Log de Eventos do Aplicativo Windows. Se configurados, esses logs podem ser encaminhados para um SIEM (por exemplo, Splunk, Sentinel, etc.).
Uma consulta sugerida usando o registro WinEvnet "Clássico" do Splunk também pode ser usada:
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
Exemplo de possível Golden Ticket forjado com Mimikatz WonkaVision no Splunk:

Exemplo de possível Golden Ticket forjado com Rubeus do WonkaVision no Splunk:
O registro com o Sentinel também pode ser feito. No entanto, isso pode exigir análise adicional. Um exemplo de consulta de Jonathan Johnson (@jsecurity101) está abaixo de como o WonkaVision pode aparecer analisado no 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"
Exemplo de possível Golden Ticket forjado do WonkaVision no Sentinel:

Demonstração 1 - Criação de Golden Ticket:
Demonstração 2 - Criação de Par de Chaves e Despejo de Sessão/Ticket:
Demonstração 3 - Análise de Dump e Saída de Eventos do Windows:
Demonstração 4 - Sniffer de Rede Kerberos:
A POC do Sniffer de Tráfego Kerberos que demonstramos em nossa palestra (Demonstração 4) foi implementada com SharpPCap, mas poderia ser facilmente modificada para usar raw sockets, removendo essa dependência, bem como a necessidade de instalar npcap no sistema.
Como era apenas uma POC mínima, a maioria dos indicadores implementados foram os indicadores não criptografados mencionados na palestra de Charlie na YASCON 2020, detalhados no slide 18 de desta apresentação, embora muitos outros pudessem ser implementados.