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
f61ba91ba6
commit
60be2aee38
@ -1,38 +1,38 @@
|
||||
# DPAPI - Şifrelerin Çıkarılması
|
||||
# DPAPI - Parolaların Çıkarılması
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
|
||||
|
||||
## DPAPI Nedir
|
||||
## DPAPI nedir
|
||||
|
||||
Data Protection API (DPAPI), esasen Windows işletim sistemi içinde **asimetrik özel anahtarların simetrik şifrelemesi** için kullanılmaktadır ve kullanıcı veya sistem sırlarını önemli bir entropi kaynağı olarak kullanır. Bu yaklaşım, geliştiricilerin kullanıcıların oturum açma sırlarından veya sistem şifrelemesi için sistemin alan kimlik doğrulama sırlarından türetilen bir anahtar kullanarak verileri şifrelemelerine olanak tanıyarak şifrelemeyi basitleştirir; böylece geliştiricilerin şifreleme anahtarının korunmasını kendilerinin yönetmesine gerek kalmaz.
|
||||
The Data Protection API (DPAPI) öncelikle Windows işletim sistemi içinde **asimetrik özel anahtarların simetrik şifrelenmesi** için kullanılır; burada kullanıcı veya sistem sırları önemli bir entropi kaynağı olarak kullanılır. Bu yaklaşım, geliştiricilerin şifreleme anahtarının korunmasını kendilerinin yönetmesine gerek kalmadan, kullanıcının oturum açma sırlarından türetilen bir anahtar veya sistem şifrelemesi için sistemin domain kimlik doğrulama sırlarından türetilen bir anahtar kullanarak veriyi şifrelemelerini sağlar.
|
||||
|
||||
DPAPI'yi kullanmanın en yaygın yolu, uygulamaların mevcut oturum açmış süreçle verileri güvenli bir şekilde şifrelemesine ve şifresini çözmesine olanak tanıyan **`CryptProtectData` ve `CryptUnprotectData`** fonksiyonlarıdır. Bu, şifrelenmiş verilerin yalnızca onu şifreleyen aynı kullanıcı veya sistem tarafından şifresinin çözülebileceği anlamına gelir.
|
||||
DPAPI kullanmanın en yaygın yolu, uygulamaların mevcut oturumdaki process ile güvenli şekilde veri şifrelemesine ve şifresini çözmesine olanak tanıyan **`CryptProtectData` ve `CryptUnprotectData`** fonksiyonlarıdır. Bu, şifrelenmiş verinin yalnızca onu şifreleyen aynı kullanıcı veya sistem tarafından çözülebileceği anlamına gelir.
|
||||
|
||||
Ayrıca, bu fonksiyonlar şifreleme ve şifre çözme sırasında kullanılacak bir **`entropy` parametresi** de kabul eder; bu nedenle, bu parametre kullanılarak şifrelenmiş bir şeyi şifresini çözmek için, şifreleme sırasında kullanılan aynı entropi değerini sağlamanız gerekir.
|
||||
Ayrıca, bu fonksiyonlar şifreleme ve şifresini çözme sırasında da kullanılacak bir **`entropy` parametresi** kabul eder; bu nedenle, bu parametre kullanılarak şifrelenmiş bir şeyi çözmek için, şifreleme sırasında kullanılan aynı entropy değerini sağlamalısınız.
|
||||
|
||||
### Kullanıcı Anahtar Üretimi
|
||||
### Kullanıcı anahtarlarının oluşturulması
|
||||
|
||||
DPAPI, her kullanıcı için kimlik bilgilerine dayalı olarak benzersiz bir anahtar ( **`pre-key`** olarak adlandırılır) üretir. Bu anahtar, kullanıcının şifresinden ve diğer faktörlerden türetilir ve algoritma kullanıcı türüne bağlıdır ancak sonuçta bir SHA1 olur. Örneğin, alan kullanıcıları için, **kullanıcının HTLM hash'ine bağlıdır**.
|
||||
DPAPI, her kullanıcı için kimlik bilgilerine dayalı benzersiz bir anahtar (buna **`pre-key`** denir) oluşturur. Bu anahtar kullanıcının parolasından ve diğer faktörlerden türetilir ve algoritma kullanıcı türüne bağlıdır ancak genellikle bir SHA1 ile sonuçlanır. Örneğin, domain kullanıcıları için **kullanıcının NTLM hash'ine bağlıdır**.
|
||||
|
||||
Bu, bir saldırganın kullanıcının şifre hash'ini elde edebilmesi durumunda özellikle ilginçtir, çünkü:
|
||||
Bu özellikle ilginçtir çünkü bir saldırgan kullanıcının parola hash'ini elde edebilirse:
|
||||
|
||||
- **DPAPI kullanılarak o kullanıcının anahtarıyla şifrelenmiş herhangi bir veriyi şifre çözebilir** ve herhangi bir API ile iletişim kurmasına gerek kalmaz
|
||||
- Geçerli DPAPI anahtarını oluşturmayı deneyerek **şifreyi kırmaya** çalışabilir
|
||||
- O kullanıcının anahtarıyla **DPAPI kullanılarak şifrelenmiş herhangi bir veriyi** API'ye gerek duymadan çözebilir
|
||||
- Geçerli DPAPI anahtarını üretmeye çalışarak parolayı çevrimdışı **kırmayı** deneyebilir
|
||||
|
||||
Ayrıca, bir kullanıcı DPAPI kullanarak her veri şifrelediğinde, yeni bir **master key** üretilir. Bu master key, verileri şifrelemek için gerçekten kullanılan anahtardır. Her master key, onu tanımlayan bir **GUID** (Küresel Benzersiz Tanımlayıcı) ile verilir.
|
||||
Ayrıca, bir kullanıcı DPAPI kullanarak veri şifrelediğinde her seferinde yeni bir **master key** oluşturulur. Bu master key aslında veriyi şifrelemek için kullanılır. Her master key, onu tanımlayan bir **GUID** ile verilir.
|
||||
|
||||
Master key'ler, **`%APPDATA%\Microsoft\Protect\<sid>\<guid>`** dizininde saklanır; burada `{SID}`, o kullanıcının Güvenlik Tanımlayıcısıdır. Master key, kullanıcının **`pre-key`** ile ve ayrıca kurtarma için bir **alan yedek anahtarı** ile şifrelenmiş olarak saklanır (yani aynı anahtar, 2 farklı şifre ile 2 kez şifrelenmiş olarak saklanır).
|
||||
Master key'ler **`%APPDATA%\Microsoft\Protect\<sid>\<guid>`** dizininde saklanır; burada `{SID}` o kullanıcının Security Identifier'ıdır. Master key, kullanıcının **`pre-key`** ile ve kurtarma için bir **domain backup key** ile şifrelenmiş olarak saklanır (yani aynı anahtar iki farklı yol ile 2 kez şifrelenmiş olarak saklanır).
|
||||
|
||||
**Master key'i şifrelemek için kullanılan alan anahtarının alan denetleyicilerinde olduğunu ve asla değişmediğini** unutmayın; bu nedenle, bir saldırgan alan denetleyicisine erişim sağlarsa, alan yedek anahtarını alabilir ve alandaki tüm kullanıcıların master key'lerini şifre çözebilir.
|
||||
Dikkat edin ki master key'i şifrelemek için kullanılan **domain key** domain controller'larda bulunur ve asla değişmez; bu yüzden eğer bir saldırgan domain controller'a erişim sağlarsa domain backup key'i alıp domain içindeki tüm kullanıcıların master key'lerini çözebilir.
|
||||
|
||||
Şifrelenmiş blob'lar, verileri şifrelemek için kullanılan **master key'in GUID'sini** başlıklarında içerir.
|
||||
Şifrelenmiş blob'lar, başlıklarında veriyi şifrelemek için kullanılan **master key'in GUID**'ini içerir.
|
||||
|
||||
> [!TIP]
|
||||
> DPAPI şifreli blob'lar **`01 00 00 00`** ile başlar
|
||||
> DPAPI ile şifrelenmiş blob'lar **`01 00 00 00`** ile başlar
|
||||
|
||||
Master key'leri bul:
|
||||
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}
|
||||
```
|
||||
Bu, bir kullanıcının bir dizi Master Key'inin nasıl görüneceğidir:
|
||||
Bu, bir kullanıcının birkaç Master Key'inin nasıl görüneceğine dair bir örnektir:
|
||||
|
||||
.png>)
|
||||
|
||||
### Makine/Sistem anahtarı oluşturma
|
||||
### Makine/Sistem anahtar oluşturma
|
||||
|
||||
Bu, makinenin verileri şifrelemek için kullandığı anahtardır. **DPAPI_SYSTEM LSA sırrı** üzerine kuruludur; bu, yalnızca SYSTEM kullanıcısının erişebileceği özel bir anahtardır. Bu anahtar, makine düzeyindeki kimlik bilgileri veya sistem genelindeki sırlar gibi sistemin kendisi tarafından erişilmesi gereken verileri şifrelemek için kullanılır.
|
||||
Bu, makinenin verileri şifrelemek için kullandığı anahtardır. Bu, **DPAPI_SYSTEM LSA secret**'e dayanır; yalnızca SYSTEM kullanıcısının erişebildiği özel bir anahtardır. Bu anahtar, makine düzeyindeki kimlik bilgileri veya sistem genelindeki gizli veriler gibi sisteme ait verilerin erişilebilir olması gerektiği durumlarda verileri şifrelemek için kullanılır.
|
||||
|
||||
Bu anahtarların **bir alan yedeği yoktur**, bu nedenle yalnızca yerel olarak erişilebilirler:
|
||||
Note that these keys **don't have a domain backup** so they are only accesisble locally:
|
||||
|
||||
- **Mimikatz**, LSA sırlarını dökerek buna erişebilir: `mimikatz lsadump::secrets`
|
||||
- Sır, kayıt defterinde saklanır, bu nedenle bir yönetici **erişim için DACL izinlerini değiştirebilir**. Kayıt defteri yolu: `HKEY_LOCAL_MACHINE\SECURITY\Policy\Secrets\DPAPI_SYSTEM`
|
||||
- **Mimikatz** can access it dumping LSA secrets using the command: `mimikatz lsadump::secrets`
|
||||
- The secret is stored inside the registry, so an administrator could **modify the DACL permissions to access it**. The registry path is: `HKEY_LOCAL_MACHINE\SECURITY\Policy\Secrets\DPAPI_SYSTEM`
|
||||
|
||||
|
||||
### DPAPI ile Korunan Veriler
|
||||
### DPAPI tarafından korunan veriler
|
||||
|
||||
DPAPI tarafından korunan kişisel veriler arasında şunlar bulunmaktadır:
|
||||
DPAPI tarafından korunan kişisel veriler arasında şunlar bulunur:
|
||||
|
||||
- Windows kimlik bilgileri
|
||||
- Internet Explorer ve Google Chrome'un şifreleri ve otomatik tamamlama verileri
|
||||
- Outlook ve Windows Mail gibi uygulamalar için e-posta ve dahili FTP hesap şifreleri
|
||||
- Paylaşılan klasörler, kaynaklar, kablosuz ağlar ve Windows Vault için şifreler, şifreleme anahtarları dahil
|
||||
- Uzak masaüstü bağlantıları, .NET Passport ve çeşitli şifreleme ve kimlik doğrulama amaçları için özel anahtarlar için şifreler
|
||||
- Credential Manager tarafından yönetilen ağ şifreleri ve CryptProtectData kullanan uygulamalardaki kişisel veriler, örneğin Skype, MSN messenger ve daha fazlası
|
||||
- Kayıt defterinde şifrelenmiş bloblar
|
||||
- Windows creds
|
||||
- Internet Explorer ve Google Chrome'un parolaları ve otomatik tamamlama verileri
|
||||
- Outlook ve Windows Mail gibi uygulamalar için e-posta ve dahili FTP hesap parolaları
|
||||
- Paylaşılan klasörler, kaynaklar, kablosuz ağlar ve Windows Vault için parolalar; şifreleme anahtarları dahil
|
||||
- Uzak masaüstü bağlantıları, .NET Passport parolaları ve çeşitli şifreleme/doğrulama amaçları için özel anahtarlar
|
||||
- Credential Manager tarafından yönetilen ağ parolaları ve CryptProtectData kullanan uygulamalardaki kişisel veriler; örn. Skype, MSN messenger ve diğerleri
|
||||
- Kayıt defteri içindeki şifrelenmiş blob'lar
|
||||
- ...
|
||||
|
||||
Sistem korumalı veriler şunları içerir:
|
||||
- Wifi şifreleri
|
||||
- Zamanlanmış görev şifreleri
|
||||
Sistem tarafından korunan veriler şunları içerir:
|
||||
- Wi‑Fi parolaları
|
||||
- Zamanlanmış görev parolaları
|
||||
- ...
|
||||
|
||||
### Master anahtar çıkarma seçenekleri
|
||||
### Master key çıkarma seçenekleri
|
||||
|
||||
- Kullanıcının alan yönetici ayrıcalıkları varsa, alan içindeki tüm kullanıcı master anahtarlarını şifrelerini çözmek için **alan yedek anahtarına** erişebilirler:
|
||||
- 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]
|
||||
```
|
||||
- Yerel yönetici ayrıcalıklarıyla, **tüm bağlı kullanıcıların DPAPI anahtarlarını ve SYSTEM anahtarını çıkarmak için LSASS belleğine erişmek** mümkündür.
|
||||
- Yerel yönetici ayrıcalıklarıyla, bağlı tüm kullanıcıların DPAPI master anahtarlarını ve SYSTEM anahtarını çıkarmak için **LSASS belleğine erişmek** mümkündür.
|
||||
```bash
|
||||
# Mimikatz
|
||||
mimikatz sekurlsa::dpapi
|
||||
```
|
||||
- Eğer kullanıcı yerel yönetici ayrıcalıklarına sahipse, makine anahtarlarını şifrelemek için **DPAPI_SYSTEM LSA sırrına** erişebilir:
|
||||
- Eğer kullanıcı local admin privileges'e sahipse, **DPAPI_SYSTEM LSA secret**'e erişip machine master keys'i decrypt edebilirler:
|
||||
```bash
|
||||
# Mimikatz
|
||||
lsadump::secrets /system:DPAPI_SYSTEM /export
|
||||
```
|
||||
- Kullanıcının şifresi veya NTLM hash'i biliniyorsa, **kullanıcının anahtarlarını doğrudan şifre çözebilirsiniz**:
|
||||
- Kullanıcının parolası veya NTLM hash'i biliniyorsa, **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
|
||||
```
|
||||
- Eğer bir oturumda kullanıcı olarak iseniz, DC'den **anahtarları şifre çözmek için yedek anahtarı RPC kullanarak** istemek mümkündür. Eğer yerel yöneticiyseniz ve kullanıcı oturum açmışsa, bunun için **oturum belirtecini çalabilirsiniz**:
|
||||
- Eğer kullanıcı olarak bir oturum içindeyseniz, DC'den **backup key to decrypt the master keys using RPC** talep etmek mümkün. Eğer local admin iseniz ve kullanıcı oturum açmışsa, bunun için **steal his session token** kullanabilirsiniz:
|
||||
```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
|
||||
```
|
||||
## List Vault
|
||||
## Vault'ları Listele
|
||||
```bash
|
||||
# From cmd
|
||||
vaultcmd /listcreds:"Windows Credentials" /all
|
||||
@ -117,25 +117,25 @@ vaultcmd /listcreds:"Windows Credentials" /all
|
||||
# From mimikatz
|
||||
mimikatz vault::list
|
||||
```
|
||||
## DPAPI Şifreli Verilere Erişim
|
||||
## DPAPI Şifrelenmiş Verilere Erişim
|
||||
|
||||
### DPAPI Şifreli Verileri Bulma
|
||||
### DPAPI Şifrelenmiş Verileri Bulma
|
||||
|
||||
Ortak kullanıcıların **korunan dosyaları** şunlardadır:
|
||||
Kullanıcıların yaygın olarak **korunan dosyaları** şu konumlardadır:
|
||||
|
||||
- `C:\Users\username\AppData\Roaming\Microsoft\Protect\*`
|
||||
- `C:\Users\username\AppData\Roaming\Microsoft\Credentials\*`
|
||||
- `C:\Users\username\AppData\Roaming\Microsoft\Vault\*`
|
||||
- Yukarıdaki yollarda `\Roaming\` kısmını `\Local\` olarak değiştirmeyi de kontrol edin.
|
||||
- Ayrıca yukarıdaki yollarda `\Roaming\`'u `\Local\` ile değiştirmeyi de kontrol edin.
|
||||
|
||||
Sıralama örnekleri:
|
||||
Keşif örnekleri:
|
||||
```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) DPAPI şifreli blob'ları dosya sisteminde, kayıt defterinde ve B64 blob'larında bulabilir:
|
||||
[**SharpDPAPI**](https://github.com/GhostPack/SharpDPAPI) dosya sistemi, registry ve B64 blob'larında DPAPI ile şifrelenmiş blob'ları bulabilir:
|
||||
```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>]
|
||||
```
|
||||
Not edin ki [**SharpChrome**](https://github.com/GhostPack/SharpDPAPI) (aynı repodan) DPAPI kullanarak çerezler gibi hassas verileri şifre çözmek için kullanılabilir.
|
||||
Unutmayın ki [**SharpChrome**](https://github.com/GhostPack/SharpDPAPI) (from the same repo) DPAPI kullanarak cookies gibi hassas verilerin şifresini çözmek için kullanılabilir.
|
||||
|
||||
### Erişim anahtarları ve veriler
|
||||
|
||||
- **SharpDPAPI** kullanarak mevcut oturumdan DPAPI şifreli dosyalardan kimlik bilgilerini alın:
|
||||
- **Use SharpDPAPI** mevcut oturumdaki DPAPI ile şifrelenmiş dosyalardan kimlik bilgilerini almak için kullanın:
|
||||
```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
|
||||
```
|
||||
- **Kimlik bilgileri bilgilerini alın** şifrelenmiş veriler ve guidMasterKey gibi.
|
||||
- **Kimlik bilgileri hakkında bilgi edinin**; örneğin şifrelenmiş veriler ve 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
|
||||
[..]
|
||||
```
|
||||
- **Anahtarları erişin**:
|
||||
- **Access masterkeys**:
|
||||
|
||||
RPC kullanarak **alan yedek anahtarını** talep eden bir kullanıcının anahtarını şifre çözün:
|
||||
RPC kullanarak **domain backup key** talep eden bir kullanıcının masterkey'ini deşifre edin:
|
||||
```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
|
||||
```
|
||||
**SharpDPAPI** aracının masterkey şifre çözümü için bu argümanları da desteklediğini unutmayın (domain yedek anahtarını almak için `/rpc`, düz metin şifresi kullanmak için `/password` veya bir DPAPI domain özel anahtar dosyası belirtmek için `/pvk` kullanmanın mümkün olduğunu göz önünde bulundurun...):
|
||||
The **SharpDPAPI** aracı ayrıca masterkey deşifrelemesi için şu argümanları destekler ( `/rpc` ile domain'in yedek anahtarını almak, `/password` ile düz metin parola kullanmak veya `/pvk` ile bir DPAPI domain özel anahtar dosyası belirtmek mümkün olduğuna dikkat edin...):
|
||||
```
|
||||
/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 @@ SharpDPAPI.exe masterkeys /rpc
|
||||
/server:SERVER - triage a remote server, assuming admin access
|
||||
/hashes - output usermasterkey file 'hashes' in JTR/Hashcat format (no decryption)
|
||||
```
|
||||
- **Veri şifre çözme anahtarı kullanarak**:
|
||||
- **masterkey kullanarak veriyi şifre çözme**:
|
||||
```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>
|
||||
```
|
||||
**SharpDPAPI** aracı ayrıca `credentials|vaults|rdg|keepass|triage|blob|ps` şifre çözme işlemleri için bu argümanları destekler (domain yedek anahtarını almak için `/rpc`, düz metin şifresi kullanmak için `/password`, bir DPAPI domain özel anahtar dosyasını belirtmek için `/pvk`, mevcut kullanıcı oturumunu kullanmak için `/unprotect` kullanmanın mümkün olduğunu not edin...):
|
||||
The **SharpDPAPI** aracı ayrıca `credentials|vaults|rdg|keepass|triage|blob|ps` şifre çözme için şu argümanları destekler ( `/rpc` ile etki alanının yedekleme anahtarını almak, `/password` ile düz metin parola kullanmak, `/pvk` ile bir DPAPI domain özel anahtar dosyası belirtmek, `/unprotect` ile mevcut kullanıcının oturumunu kullanmak mümkün olduğuna dikkat edin...):
|
||||
```
|
||||
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
|
||||
```
|
||||
- **Geçerli kullanıcı oturumu** kullanarak bazı verileri şifre çözme:
|
||||
- Bazı verileri **geçerli kullanıcı oturumu** kullanarak şifre çözme:
|
||||
```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
|
||||
```
|
||||
---
|
||||
### Opsiyonel Entropi Yönetimi ("Üçüncü taraf entropisi")
|
||||
### Opsiyonel Entropy'nin İşlenmesi ("Third-party entropy")
|
||||
|
||||
Bazı uygulamalar `CryptProtectData`'ya ek bir **entropi** değeri geçirir. Bu değer olmadan blob deşifre edilemez, doğru anahtar bilinse bile. Bu nedenle, bu şekilde korunan kimlik bilgilerine hedef alırken entropiyi elde etmek esastır (örneğin, Microsoft Outlook, bazı VPN istemcileri).
|
||||
Bazı uygulamalar `CryptProtectData`'e ek bir **entropy** değeri iletir. Bu değer olmadan, doğru masterkey bilinse bile blob çözülemez. Bu şekilde korunan kimlik bilgilerini hedeflerken **entropy**'nin elde edilmesi bu nedenle hayati önem taşır (ör. Microsoft Outlook, bazı VPN istemcileri).
|
||||
|
||||
[**EntropyCapture**](https://github.com/SpecterOps/EntropyCapture) (2022), hedef süreç içindeki DPAPI işlevlerini yakalayan ve sağlanan herhangi bir opsiyonel entropiyi şeffaf bir şekilde kaydeden bir kullanıcı modu DLL'sidir. `outlook.exe` veya `vpnclient.exe` gibi süreçlere karşı **DLL-enjeksiyonu** modunda EntropyCapture çalıştırmak, her entropi tamponunu çağıran süreç ve blob ile eşleyen bir dosya çıktısı verecektir. Yakalanan entropi daha sonra veriyi deşifre etmek için **SharpDPAPI** (`/entropy:`) veya **Mimikatz** (`/entropy:<file>`) ile sağlanabilir.
|
||||
[**EntropyCapture**](https://github.com/SpecterOps/EntropyCapture) (2022) hedef süreç içindeki DPAPI fonksiyonlarını hooklayan bir user-mode DLL'dir ve sağlanan her türlü opsiyonel **entropy**'yi şeffaf şekilde kaydeder. `outlook.exe` veya `vpnclient.exe` gibi süreçlere karşı **DLL-injection** modunda EntropyCapture çalıştırmak, her entropy buffer'ını çağıran süreç ve blob ile eşleştiren bir dosya oluşturur. Yakalanan **entropy** daha sonra veriyi çözmek için **SharpDPAPI** (`/entropy:`) veya **Mimikatz** (`/entropy:<file>`) ile sağlanabilir.
|
||||
```powershell
|
||||
# Inject EntropyCapture into the current user's Outlook
|
||||
InjectDLL.exe -pid (Get-Process outlook).Id -dll EntropyCapture.dll
|
||||
@ -245,7 +245,9 @@ SharpDPAPI.exe blob /target:secret.cred /entropy:entropy.bin /ntlm:<hash>
|
||||
```
|
||||
### Cracking masterkeys offline (Hashcat & DPAPISnoop)
|
||||
|
||||
Microsoft, Windows 10 v1607 (2016) ile birlikte **context 3** masterkey formatını tanıttı. `hashcat` v6.2.6 (Aralık 2023) hash-modları **22100** (DPAPI masterkey v1 context), **22101** (context 1) ve **22102** (context 3) ekleyerek kullanıcı şifrelerinin masterkey dosyasından doğrudan GPU hızlandırmalı bir şekilde kırılmasına olanak tanıdı. Bu nedenle, saldırganlar hedef sistemle etkileşime girmeden kelime listesi veya brute-force saldırıları gerçekleştirebilirler.
|
||||
Microsoft, Windows 10 v1607 (2016) ile birlikte **context 3** masterkey formatını tanıttı.
|
||||
|
||||
`hashcat` v6.2.6 (Aralık 2023) hash-modları **22100** (DPAPI masterkey v1 context ), **22101** (context 1) and **22102** (context 3) ekledi; bunlar masterkey dosyasından kullanıcı şifrelerinin doğrudan GPU hızlandırmalı kırılmasına izin veriyor. Bu nedenle saldırganlar hedef sistemle etkileşime girmeden word-list veya brute-force saldırıları gerçekleştirebilir.
|
||||
|
||||
`DPAPISnoop` (2024) süreci otomatikleştirir:
|
||||
```bash
|
||||
@ -253,11 +255,11 @@ Microsoft, Windows 10 v1607 (2016) ile birlikte **context 3** masterkey formatı
|
||||
DPAPISnoop.exe masterkey-parse C:\Users\bob\AppData\Roaming\Microsoft\Protect\<sid> --mode hashcat --outfile bob.hc
|
||||
hashcat -m 22102 bob.hc wordlist.txt -O -w4
|
||||
```
|
||||
Araç, Credential ve Vault blob'larını ayrıştırabilir, kırılmış anahtarlarla şifrelerini çözebilir ve düz metin şifrelerini dışa aktarabilir.
|
||||
Araç ayrıca Credential ve Vault blob'larını ayrıştırabilir, kırılmış anahtarlarla şifrelerini çözebilir ve düz metin parolaları dışa aktarabilir.
|
||||
|
||||
### Diğer makine verilerine erişim
|
||||
|
||||
**SharpDPAPI ve SharpChrome**'da, bir uzak makinenin verilerine erişmek için **`/server:HOST`** seçeneğini belirtebilirsiniz. Elbette, o makineye erişebilmeniz gerekir ve aşağıdaki örnekte **alan yedekleme şifreleme anahtarının bilindiği varsayılmaktadır**:
|
||||
In **SharpDPAPI and SharpChrome** you can indicate the **`/server:HOST`** option to access a remote machine's data. Elbette o makineye erişebilmeniz gerekir ve aşağıdaki örnekte **etki alanı yedekleme şifreleme anahtarının bilindiği** varsayılmaktadır:
|
||||
```bash
|
||||
SharpDPAPI.exe triage /server:HOST /pvk:BASE64
|
||||
SharpChrome cookies /server:HOST /pvk:BASE64
|
||||
@ -266,49 +268,52 @@ SharpChrome cookies /server:HOST /pvk:BASE64
|
||||
|
||||
### HEKATOMB
|
||||
|
||||
[**HEKATOMB**](https://github.com/Processus-Thief/HEKATOMB), LDAP dizininden tüm kullanıcılar ve bilgisayarların çıkarılmasını ve alan denetleyici yedek anahtarının RPC üzerinden çıkarılmasını otomatikleştiren bir araçtır. Script, ardından tüm bilgisayarların IP adreslerini çözecek ve tüm kullanıcıların DPAPI blob'larını almak için tüm bilgisayarlarda smbclient gerçekleştirecek ve her şeyi alan yedek anahtarı ile şifre çözecektir.
|
||||
[**HEKATOMB**](https://github.com/Processus-Thief/HEKATOMB) LDAP dizininden tüm kullanıcıları ve bilgisayarları çıkarmayı ve RPC üzerinden domain controller backup key'i çıkarmayı otomatikleştiren bir araçtır. Script daha sonra tüm bilgisayarların IP adreslerini çözer ve tüm bilgisayarlarda smbclient çalıştırarak tüm kullanıcıların DPAPI blob'larını toplar ve domain backup key ile her şeyi deşifre eder.
|
||||
|
||||
`python3 hekatomb.py -hashes :ed0052e5a66b1c8e942cc9481a50d56 DOMAIN.local/administrator@10.0.0.1 -debug -dnstcp`
|
||||
|
||||
LDAP'tan çıkarılan bilgisayar listesi ile, bilmediğiniz her alt ağı bulabilirsiniz!
|
||||
LDAP'ten çıkarılan bilgisayar listesi ile bilmeseniz bile her alt ağı bulabilirsiniz!
|
||||
|
||||
### DonPAPI 2.x (2024-05)
|
||||
|
||||
[**DonPAPI**](https://github.com/login-securite/DonPAPI), DPAPI tarafından korunan gizli bilgileri otomatik olarak dökebilir. 2.x sürümü şunları tanıttı:
|
||||
[**DonPAPI**](https://github.com/login-securite/DonPAPI) DPAPI ile korunan sırları otomatik olarak dökebilir. 2.x sürümü şunları getirdi:
|
||||
|
||||
* Yüzlerce hosttan blob'ların paralel toplanması
|
||||
* **context 3** anahtarlarının ayrıştırılması ve otomatik Hashcat kırma entegrasyonu
|
||||
* Chrome "App-Bound" şifreli çerezler için destek (bir sonraki bölüme bakın)
|
||||
* Yeni **`--snapshot`** modu, uç noktaları sürekli olarak sorgulayıp yeni oluşturulan blob'ları karşılaştırmak için
|
||||
* Yüzlerce hosttan paralel blob toplama
|
||||
* **context 3** masterkey'lerin ayrıştırılması ve otomatik Hashcat kırma entegrasyonu
|
||||
* Chrome "App-Bound" şifreli çerezleri için destek (bir sonraki bölüme bakın)
|
||||
* Yeniden uç noktalara anket çekip yeni oluşturulan blob'ları farklayan yeni **`--snapshot`** modu
|
||||
|
||||
### DPAPISnoop
|
||||
|
||||
[**DPAPISnoop**](https://github.com/Leftp/DPAPISnoop), Hashcat/JtR formatlarını çıkartabilen ve isteğe bağlı olarak otomatik kırma başlatabilen masterkey/credential/vault dosyaları için bir C# ayrıştırıcısıdır. Windows 11 24H1'e kadar makine ve kullanıcı masterkey formatlarını tamamen destekler.
|
||||
[**DPAPISnoop**](https://github.com/Leftp/DPAPISnoop) masterkey/credential/vault dosyalarını ayrıştıran bir C# parser'ıdır; Hashcat/JtR formatlarını çıktılayabilir ve isteğe bağlı olarak kırmayı otomatik başlatabilir. Windows 11 24H1'e kadar hem machine hem user masterkey formatlarını tam olarak destekler.
|
||||
|
||||
|
||||
## Yaygın tespitler
|
||||
|
||||
- `C:\Users\*\AppData\Roaming\Microsoft\Protect\*`, `C:\Users\*\AppData\Roaming\Microsoft\Credentials\*` ve diğer DPAPI ile ilgili dizinlerdeki dosyalara erişim.
|
||||
- Özellikle **C$** veya **ADMIN$** gibi bir ağ paylaşımından.
|
||||
- `C:\Users\*\AppData\Roaming\Microsoft\Protect\*`, `C:\Users\*\AppData\Roaming\Microsoft\Credentials\*` ve diğer DPAPI ile ilgili dizinlerde dosyalara erişim.
|
||||
- Özellikle **C$** veya **ADMIN$** gibi bir network share üzerinden.
|
||||
- LSASS belleğine erişmek veya masterkey'leri dökmek için **Mimikatz**, **SharpDPAPI** veya benzeri araçların kullanımı.
|
||||
- Olay **4662**: *Bir nesne üzerinde bir işlem gerçekleştirildi* – **`BCKUPKEY`** nesnesine erişim ile ilişkilendirilebilir.
|
||||
- Bir süreç *SeTrustedCredManAccessPrivilege* (Credential Manager) talep ettiğinde olay **4673/4674**.
|
||||
- Event **4662**: *An operation was performed on an object* – **`BCKUPKEY`** objesine erişim ile korelasyon gösterebilir.
|
||||
- Bir sürecin *SeTrustedCredManAccessPrivilege* (Credential Manager) talep ettiği durumlarda Event **4673/4674**
|
||||
|
||||
|
||||
---
|
||||
### 2023-2025 güvenlik açıkları ve ekosistem değişiklikleri
|
||||
### 2023-2025 güvenlik açıkları & ekosistem değişiklikleri
|
||||
|
||||
* **CVE-2023-36004 – Windows DPAPI Güvenli Kanal Taklidi** (Kasım 2023). Ağ erişimi olan bir saldırgan, bir alan üyesini kötü niyetli bir DPAPI yedek anahtarını alması için kandırabilir, bu da kullanıcı masterkey'lerinin şifre çözülmesine olanak tanır. Kasım 2023 toplu güncellemesinde yamanmıştır – yöneticiler DC'lerin ve iş istasyonlarının tamamen yamanmış olduğundan emin olmalıdır.
|
||||
* **Chrome 127 “App-Bound” çerez şifrelemesi** (Temmuz 2024), eski DPAPI yalnızca korumayı, kullanıcının **Credential Manager** altında saklanan ek bir anahtar ile değiştirmiştir. Çerezlerin çevrimdışı şifre çözümü artık hem DPAPI masterkey'ini hem de **GCM-sarılı uygulama bağlı anahtarı** gerektirir. SharpChrome v2.3 ve DonPAPI 2.x, kullanıcı bağlamında çalışırken ek anahtarı kurtarabilir.
|
||||
* **CVE-2023-36004 – Windows DPAPI Secure Channel Spoofing** (Kasım 2023). Ağ erişimi olan bir saldırgan, bir domain üyesini kötü amaçlı bir DPAPI backup key alması için kandırarak kullanıcı masterkey'lerinin deşifre edilmesine olanak sağlayabilirdi. Kasım 2023 toplu güncelleştirmesinde yamalandı – yöneticiler DC'lerin ve iş istasyonlarının tam olarak güncel olduğundan emin olmalıdır.
|
||||
* **Chrome 127 “App-Bound” cookie encryption** (Temmuz 2024) eski DPAPI-only korumasının yerine, kullanıcının **Credential Manager** altında depolanan ek bir anahtar koydu. Çerezlerin çevrimdışı deşifre edilmesi artık hem DPAPI masterkey hem de **GCM-wrapped app-bound key** gerektiriyor. SharpChrome v2.3 ve DonPAPI 2.x, kullanıcı bağlamında çalıştırıldığında ekstra anahtarı kurtarabilir.
|
||||
|
||||
### Vaka Çalışması: Zscaler Client Connector – SID'den Türetilen Özel Entropi
|
||||
|
||||
Zscaler Client Connector, `C:\ProgramData\Zscaler` altında birkaç yapılandırma dosyası saklar (örneğin, `config.dat`, `users.dat`, `*.ztc`, `*.mtt`, `*.mtc`, `*.mtp`). Her dosya **DPAPI (Makine kapsamı)** ile şifrelenmiştir ancak satıcı, diskte saklanmak yerine *çalışma zamanında* hesaplanan **özel entropi** sağlar.
|
||||
### Vaka İncelemesi: Zscaler Client Connector – SID'den Türetilen Özel Entropi
|
||||
|
||||
Entropi, iki unsurdan yeniden inşa edilir:
|
||||
Zscaler Client Connector, `C:\ProgramData\Zscaler` altında birkaç yapılandırma dosyası saklar (örn. `config.dat`, `users.dat`, `*.ztc`, `*.mtt`, `*.mtc`, `*.mtp`). Her dosya **DPAPI (Machine scope)** ile şifrelenir ancak vendor, diskte saklanmak yerine *runtime* sırasında *hesaplanan* **özel entropi** sağlar.
|
||||
|
||||
1. `ZSACredentialProvider.dll` içinde gömülü bir sabit gizli anahtar.
|
||||
2. Yapılandırmanın ait olduğu Windows hesabının **SID**'si.
|
||||
Entropi şu iki öğeden yeniden oluşturulur:
|
||||
|
||||
DLL tarafından uygulanan algoritma şuna eşdeğerdir:
|
||||
1. `ZSACredentialProvider.dll` içine gömülmüş sabit kodlu bir gizli değer.
|
||||
2. Yapılandırmanın ait olduğu Windows hesabının **SID**'i.
|
||||
|
||||
DLL tarafından uygulanan algoritma şu anlama gelir:
|
||||
```csharp
|
||||
byte[] secret = Encoding.UTF8.GetBytes(HARDCODED_SECRET);
|
||||
byte[] sid = Encoding.UTF8.GetBytes(CurrentUserSID);
|
||||
@ -323,17 +328,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]);
|
||||
```
|
||||
Çünkü gizli bilgi, diskten okunabilen bir DLL'ye gömülüdür, **herhangi bir yerel saldırgan, SYSTEM haklarına sahip olduğunda, herhangi bir SID için entropiyi yeniden üretebilir** ve blob'ları çevrimdışı olarak şifrelerini çözebilir:
|
||||
Çünkü sır, diskten okunabilecek bir DLL'e gömülü olduğundan, **SYSTEM yetkisine sahip herhangi bir yerel saldırgan herhangi bir SID için entropiyi yeniden oluşturabilir** ve blob'ları offline olarak şifre çözebilir:
|
||||
```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));
|
||||
```
|
||||
Şifre çözme, her **cihaz durumu kontrolü** ve beklenen değeri de içeren tam JSON yapılandırmasını verir - bu, istemci tarafı atlatmaları denemek için çok değerli bir bilgidir.
|
||||
Şifre çözme, her bir **device posture check** ve beklenen değeri de içeren tam JSON yapılandırmasını ortaya çıkarır — istemci tarafı atlatma denemelerinde çok değerli bir bilgidir.
|
||||
|
||||
> İPUCU: Diğer şifreli nesneler (`*.mtt`, `*.mtp`, `*.mtc`, `*.ztc`) DPAPI ile **entropy olmadan** korunmaktadır (`16` sıfır baytı). Bu nedenle, SYSTEM ayrıcalıkları elde edildikten sonra `ProtectedData.Unprotect` ile doğrudan şifresi çözülebilir.
|
||||
> TIP: diğer şifrelenmiş artefaktlar (`*.mtt`, `*.mtp`, `*.mtc`, `*.ztc`) DPAPI ile **entropy olmadan** (`16` sıfır byte) korunur. Bu nedenle SYSTEM ayrıcalıkları elde edildikten sonra doğrudan `ProtectedData.Unprotect` ile çözülebilirler.
|
||||
|
||||
## Referanslar
|
||||
## 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)
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user