
रीड-ओनली Entra ID ऐप-क्रेडेंशियल मूल्यांकन: Graph अनुमतियों, Azure RBAC और सुलभ क्लाउड डेटा की सूची बनाता है, फिर निष्कर्षों को privilege-escalation और lateral-movement पथों से मैप करता है।
/ / ______ ___ ___ / /_ / / / /__ _ / / /_____ ____ \ / -) / -) -)/ / \ \ / __/ _ `// / '/ -) / //_/_/_/_/ _/ // _/_,////_\__/_/
╔╦╦╬╬╬╬╬╬╦╦╗
╔╬╬╬╝╝┘ ╚╝╝╬╬╬┐
╬╬╝╚╩╬╗╔ ╚╬╬╬
╬╝ ╚╬╬╗╗ ╔ ╚╬╗ ╬╬ ╔╗ ╚╬╬╬╬╬╬╦ ╬╬ we found your secret... ╔╬┤ ╬╬╬ ╬╬╬╬╬╬╬╬╝╝╝╬╬╗ ...now let's see what it ╬╬┤ ╚╩┘ ╚╬╬╬╬╬╩ ╠╬╬ can REALLY do. ( o_o)>=|= ╬╬┤ ╠╬╬ ╬╬ ╦╗ ╗╗ ╬╬ [ client_id + secret -> total recall ] └╬┐ ╚╬╗╗ ╔╬╬╝ ╔╬┘ └╬╗ ╚╩╩╬╬╬╩╩╝╝ ╔╬╬ ╚╬╬╬╗ ┌╗╬╬╝┘ ╚╩╬╬╬╦╦╦╦╦╦╬╬╬╝╝ ╚╚╝╝╝╝ // pst... that app registration talks too much. \
**यह Entra ID क्लाइंट ID + सीक्रेट वास्तव में क्या कर सकता है?**
आपको किसी अधिकृत एंगेजमेंट में एक Entra ID (Azure AD) एप्लिकेशन क्रेडेंशियल — एक क्लाइंट ID और सीक्रेट — मिला है, और जिस टेनेंट से यह संबंधित है वह दायरे में है।
`secret_stalker` इन दोनों मानों को लेता है और आपको, शुरुआत से ही, बताता है:
1. **क्या यह मान्य है, और सीक्रेट कब समाप्त होता है?** — और यदि मान्य नहीं है, तो *क्यों*
(गलत सीक्रेट, समाप्त सीक्रेट, टेनेंट में ऐप नहीं…)। मान्य सीक्रेट के लिए यह
ऐप रजिस्ट्रेशन के `passwordCredentials` को पढ़ता है और समाप्ति
तिथि + शेष दिनों की रिपोर्ट करता है (इसके लिए डायरेक्टरी रीड आवश्यक है; नीचे दिया गया नोट देखें)।
2. **यह कौन से Microsoft Graph अधिकार रखता है?** — जारी किए गए टोकन से सीधे पढ़ी गई एप्लिकेशन अनुमतियाँ, साथ ही **Entra डायरेक्टरी भूमिकाएँ** जो इसमें हैं (टोकन के `wids` क्लेम से भी निष्क्रिय रूप से पता लगाई गईं) और **ऑब्जेक्ट जिनका यह स्वामी है**
(ऐप/SP जिनमें आप क्रेडेंशियल जोड़ सकते हैं)।
3. **Azure पर इसका क्या नियंत्रण है?** — RBAC भूमिका असाइनमेंट
प्रबंधन-समूह और सब्सक्रिप्शन दायरे में।
4. **क्या यह वास्तविक डेटा तक पहुँच सकता है?** — वैकल्पिक Key Vault (सीक्रेट / कुंजियाँ / प्रमाणपत्र),
Storage (ब्लॉब / फ़ाइल / क्यू / टेबल), और Cosmos DB डेटा-प्लेन पहुँच जाँच।
5. **प्रभाव क्या है?** — खतरनाक अनुमतियाँ, भूमिकाएँ, स्वामित्व, और ज्ञात privesc / lateral-movement प्रिमिटिव से मैप किया गया सुलभ डेटा, गंभीरता के आधार पर रेटेड,
ठोस **attack-path** विवरणों के साथ।
यह या तो **क्लाइंट सीक्रेट** या **प्रमाणपत्र** (`--cert`) के साथ प्रमाणित करता है,
और **कमर्शियल और सॉवरेन क्लाउड** (`--cloud`) के विरुद्ध काम करता है।
यह **डिफ़ॉल्ट रूप से निष्क्रिय है** और **कभी भी कुछ संशोधित नहीं करता** — केवल रीड-ओनली
एन्यूमरेशन।
> ⚠️ **केवल अधिकृत परीक्षण।** इसे केवल उन्हीं टेनेंट्स के विरुद्ध चलाएँ जो
> स्पष्ट रूप से उस एंगेजमेंट के दायरे में हैं जिसे करने के लिए आप अधिकृत हैं।
---
## इंस्टॉल```bash
pip install -r requirements.txt # just runs it from source
# — or —
pip install . # installs the `secret_stalker` command
pip install '.[cert]' # + certificate (--cert) auth support
pip install '.[dev]' # + pytest for the test suite
एकमात्र रनटाइम निर्भरता requests है। टोकन स्थानीय रूप से डिकोड किए जाते हैं (base64 + JSON) — कोई सिग्नेचर सत्यापन नहीं, कोई क्रिप्टो लाइब्रेरी नहीं, कोई Microsoft SDK नहीं। एक अपवाद certificate auth (--cert) है, जिसके लिए वैकल्पिक cryptography पैकेज की आवश्यकता होती है ताकि JWT client assertion पर हस्ताक्षर किया जा सके। Python 3.7+ आवश्यक है।
pip install . करने के बाद आप इसे secret_stalker … के रूप में चला सकते हैं, बजाय python -m secret_stalker … के।
यह जानने का सबसे तेज़ तरीका कि एक क्रेडेंशियल क्या कर सकता है:```bash
python -m secret_stalker
--tenant contoso.onmicrosoft.com
--client-id 11111111-2222-3333-4444-555555555555
--secret ''
`--tenant` या तो एक tenant GUID या एक डोमेन स्वीकार करता है — एक डोमेन सार्वजनिक OpenID कॉन्फ़िगरेशन एंडपॉइंट के माध्यम से स्वचालित रूप से उसके tenant ID में हल हो जाता है।
### अपने शेल इतिहास से गोपनीय जानकारी बाहर रखें
फ़्लैग्स के बजाय पर्यावरण चरों के माध्यम से क्रेडेंशियल्स पास करें:```bash
export SS_TENANT=contoso.onmicrosoft.com
export SS_CLIENT_ID=11111111-2222-3333-4444-555555555555
export SS_SECRET='<client-secret>'
python -m secret_stalker
--tenant / --client-id / --secret में से कोई भी SS_TENANT /
SS_CLIENT_ID / SS_SECRET से आ सकता है। फ़्लैग्स परिवेश पर प्राथमिकता रखते हैं।
यह केवल शेल इतिहास के बारे में नहीं है: एक argv मान किसी भी स्थानीय
उपयोगकर्ता द्वारा प्रक्रिया के जीवनकाल तक पठनीय होता है (ps, /proc/<pid>/cmdline)। यदि --secret
या --cert-password को फ़्लैग के रूप में पास किया जाता है, तो टूल एक-पंक्ति का अनुस्मारक प्रिंट करता है
stderr पर — यह कभी भी --json या --export आउटपुट में प्रकट नहीं होता।
ऐप पंजीकरण अक्सर सीक्रेट के बजाय प्रमाणपत्र का उपयोग करते हैं। --cert पास करें
(एक PEM जिसमें निजी कुंजी और प्रमाणपत्र होता है, या एक .pfx/.p12) और
टूल एक हस्ताक्षरित JWT क्लाइंट असर्शन के साथ प्रमाणीकरण करता है:```bash
python -m secret_stalker --tenant contoso.onmicrosoft.com
--client-id --cert ./app.pem # or app.pfx
python -m secret_stalker ... --cert app.pfx --cert-password ''
प्रमाणपत्र प्रमाणीकरण के लिए वैकल्पिक `cryptography` पैकेज की आवश्यकता होती है (`pip install '.[cert]'`).
यह टूल प्रमाणपत्र की अपनी समाप्ति तिथि की रिपोर्ट करता है (ऐप के `keyCredentials` में उसके थंबप्रिंट से मिलान करके), ठीक वैसे ही जैसे यह किसी सीक्रेट के लिए करता है। `--cert`/`--cert-password`
भी `SS_CERT` / `SS_CERT_PASSWORD` से पढ़े जाते हैं।
### संप्रभु और सरकारी क्लाउड
डिफ़ॉल्ट रूप से secret_stalker **वाणिज्यिक** क्लाउड को लक्षित करता है। संप्रभु टेनेंट के लिए,
`--cloud` (या `SS_CLOUD`) पास करें ताकि Entra प्राधिकरण और Graph / ARM / Key
Vault एंडपॉइंट मेल खा सकें — अन्यथा वैध क्रेडेंशियल्स ऐसे दिखते हैं जैसे उनके पास कोई एक्सेस नहीं है:```bash
# US Government (GCC High)
python -m secret_stalker --cloud usgov --tenant contoso.onmicrosoft.us ...
# US DoD (L5)
python -m secret_stalker --cloud usdod ...
# Azure operated by 21Vianet (China)
python -m secret_stalker --cloud china --tenant contoso.partner.onmschina.cn ...
--cloud | Entra प्राधिकरण | Microsoft Graph | ARM | Key Vault |
|---|---|---|---|---|
public (डिफ़ॉल्ट) | login.microsoftonline.com | graph.microsoft.com | management.azure.com | vault.azure.net |
usgov (GCC High) | login.microsoftonline.us | graph.microsoft.us | management.usgovcloudapi.net | vault.usgovcloudapi.net |
usdod (DoD) | login.microsoftonline.us | dod-graph.microsoft.us | management.usgovcloudapi.net | vault.usgovcloudapi.net |
china (21Vianet) | login.chinacloudapi.cn | microsoftgraph.chinacloudapi.cn | management.chinacloudapi.cn | vault.azure.cn |
gov, dod, commercial, gcc-high, और 21vianet जैसे उपनाम स्वीकार किए जाते हैं।
(स्टोरेज डेटा-प्लेन audience, storage.azure.com, हर क्लाउड में समान है।)
यह प्रमाणीकरण करता है, टेनेंट के Graph appRole मैप को
~/.secret_stalker/app_roles_cache.json पर कैश करता है, और बाहर निकलता है। इसे छोड़ दें यदि
क्रेडेंशियल सेवा प्रिंसिपल नहीं पढ़ सकता — बंडल किया गया मैप अभी भी
ज्ञात अनुमतियों को कवर करता है।
bash
python -m secret_stalker --active --export results.ndjson
---
## आउटपुट पढ़ना