
रीड-ओनली 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 ...
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
---
## आउटपुट पढ़ना
टर्मिनल रिपोर्ट ऊपर से नीचे तक "क्या यह काम करता है" से "कितना नुकसान
हुआ" तक व्यवस्थित होती है। एक सामान्य रन कुछ इस प्रकार दिखता है:```
secret_stalker — credential assessment
======================================
Credential status : VALID
Tenant : aaaaaaaa-...
Client (app) id : 1111...
App display name : Recon App
SP object id : cccc...
Secret : valid — expires 2027-03-01 (in 207 days)
Token acquisition
=================
OK graph
OK arm
NO storage — no storage token
Microsoft Graph application permissions (from token)
====================================================
- Application.ReadWrite.All
- Mail.Read
...
Findings — escalation / control
===============================
[CRITICAL] (GRAPH) Application.ReadWrite.All
Can add credentials to any app/SP and impersonate it — tenant-wide pivot.
[CRITICAL] (ARM) Owner
Full control including granting access to others.
[CRITICAL] (DATA) keyvault:secrets
Can read Key Vault secret values — connection strings, passwords, tokens.
[MEDIUM] (GRAPH) Mail.Read
Read all mailboxes — data exposure.
Overall risk: CRITICAL
--active के साथ, जब मिलान वाले संसाधन खोजे जाते हैं — Key Vault / Storage / Cosmos DB)। Graph और ARM स्वतंत्र हैं: एक क्रेडेंशियल के पास एक हो सकता है और दूसरा नहीं।GRAPH), ARM भूमिकाएँ (ARM), Entra निर्देशिका भूमिकाएँ (ROLE), स्वामित्व वाले ऐप्स/SPs (OWN), पहुंच योग्य डेटा-प्लेन सतहें (DATA), और अनुरोधित-लेकिन-सहमति-रहित सहमति-हमले के लक्ष्य (WANT) — डी-डुप्लीकेटेड और गंभीरता-रेटेड। हर Key Vault सीक्रेट पढ़ने में सक्षम होना, या कोई निर्देशिका भूमिका रखना, अपने आप में एक निष्कर्ष है, भले ही कोई खतरनाक Graph/ARM अनुदान न हो।--active) बताती है कि प्रत्येक केवल-पढ़ने वाली जांच ने क्या लौटाया। अधिकांश जाँचें एक छोटा, सीमित पृष्ठ माँगती हैं, इसलिए भरा हुआ पृष्ठ N+ के रूप में दिखाया जाता है (जैसे ) — जिसका अर्थ है पाँच, ठीक पाँच नहीं। बिना सीमा वाली जाँचें (, ) वास्तविक कुल संख्या बिना के रिपोर्ट करती हैं।सीक्रेट समाप्ति — क्या जाना जा सकता है। समाप्ति तिथि टोकन में नहीं होती; यह Entra ID में ऐप पंजीकरण के
passwordCredentialsपर रहती है। एक मान्य सीक्रेट के लिए, secret_stalker इसे Graph के माध्यम से पढ़ता है और आपके सीक्रेट को उसकेhint(पहले 3 अक्षर) द्वारा सही क्रेडेंशियल से मिलाता है — इसके लिए निर्देशिका पढ़ना आवश्यक है (Application.Read.All/Directory.Read.All); यदि SP के पास यह नहीं है, तो तिथि अनुमान लगाने के बजाय अनुपलब्ध बताई जाती है। एक समाप्त सीक्रेट के लिए प्रमाणीकरण स्वयं विफल हो जाता है, इसलिए मृत क्रेडेंशियल अपने स्वयं के मेटाडेटा को नहीं पढ़ सकता — उपकरण इसेEXPIRED (AADSTS7000222)के रूप में चिह्नित करता है, लेकिन सटीक अंतिम तिथि केवल उस क्रेडेंशियल के माध्यम से प्राप्त नहीं की जा सकती।
स्क्रिप्टिंग के लिए उपयोगी:
| Code | Meaning |
|---|---|
0 | क्रेडेंशियल मान्य है (कम से कम एक टोकन मिला)। |
2 | क्रेडेंशियल अमान्य है / उसकी कोई पहुँच नहीं है। |
1 | त्रुटि — टेनेंट को हल नहीं किया जा सका, प्रमाणपत्र लोड नहीं किया जा सका, या --export फ़ाइल लिखी नहीं जा सकी। |
--export परिणाम को प्रति खोजी गई वस्तु एक रिकॉर्ड में समतल करता है —
क्रेडेंशियल, टोकन, Graph अनुमति, ऐप-रोल असाइनमेंट, ARM भूमिका, डेटा-प्लेन
हिट, और स्कोर किया गया निष्कर्ष — प्रत्येक क्रेडेंशियल संदर्भ लिए हुए ताकि एक पंक्ति
अपने आप में पूर्ण रहे।```bash
python -m secret_stalker --export results.ndjson
python -m secret_stalker --active --export results.csv
python -m secret_stalker --export results.json
हर रिकॉर्ड में एक `record_type` (`credential`, `secret`, `token`,
`graph_permission`, `app_role_assignment`, `directory_role`, `owned_object`,
`arm_role`, `dataplane`, `delegated_permission`, `requested_permission`,
`finding`) होता है, ताकि कोई उपभोक्ता केवल अपनी ज़रूरत की चीज़ों को फ़िल्टर कर सके — उदाहरण के लिए, केवल
स्कोर किए गए हिट्स:```bash
jq 'select(.record_type=="finding")' results.ndjson
टर्मिनल रिपोर्ट और --export एक साथ काम करते हैं — निर्यात रिपोर्ट को दबाता नहीं है ("Exported …" पुष्टिकरण stderr पर जाता है, इसलिए --json को पाइप करना साफ रहता है)।
निर्यात फ़ाइलें क्रेडेंशियल संदर्भ ले जाती हैं (टोकन दावे, secret hint, कुंजी आईडी), इसलिए उन्हें केवल-स्वामी (0600) अनुमतियों के साथ लिखा जाता है ताकि साझा या सिंक किए गए होस्ट पर लीक न हों। उन्हें संवेदनशील एंगेजमेंट आर्टिफैक्ट के रूप में मानें। symlink के माध्यम से लेखन सीधे अस्वीकार कर दिया जाता है, इसलिए किसी निर्यात पथ को किसी अन्य चीज़ को truncate करने के लिए पुनर्निर्देशित नहीं किया जा सकता।
परिणाम में नाम मूल्यांकनाधीन टेनेंट से आते हैं — ऐप और ग्रुप डिस्प्ले नाम, कंटेनर और ब्लॉब नाम — इसलिए उन्हें अविश्वसनीय आउटपुट माना जाता है:
=, +, -, @)
एकल उद्धरण से उपसर्गित किए जाते हैं, ताकि =cmd|' /C calc'!A0 जैसा डिस्प्ले नाम
स्प्रेडशीट में फ़ाइल खोले जाने पर निष्पादित न हो सके। स्प्रेडशीट उद्धरण को
प्रदर्शन पर हटा देती हैं।cat करें, या HTML को cat करें।json.dumps नियंत्रण वर्णों को
\uXXXX के रूप में एनकोड करता है, जो पाठ के रूप में निष्क्रिय है जबकि एक पार्सर
टेनेंट द्वारा लौटाए गए सटीक मान को वैसे ही प्राप्त कर लेता है। कच्चा नाम साक्ष्य है, इसलिए इसे वहाँ संरक्षित रखा जाता है।appRoleAssignments GUID के रूप में लौटते हैं। secret_stalker उन्हें एक फ्लैट लुकअप द्वारा नामों में हल करता है (appRole GUID वैश्विक रूप से अद्वितीय होते हैं), जो तब भी काम करता रहता है जब निर्देशिका पढ़ना अस्वीकृत हो:
secret_stalker/data/graph_app_roles.json में शामिल है।--update-manifest इसे आधिकारिक डेटा के साथ अधिलेखित करता है जो दायरे वाले
टेनेंट से लाइव खींचा जाता है — Microsoft Graph साथ ही हर अन्य संसाधन API जिस पर यह क्रेडेंशियल
असाइन है (जैसे Exchange Online, SharePoint), ताकि गैर-Graph GUID भी हल हो जाएं।roles
दावा प्रदत्त एप्लिकेशन अनुमतियों की सूची ही है। secret_stalker इसे
डिकोड किए गए टोकन से पढ़ता है — तेज़ और शांत, कोई Graph कॉल आवश्यक नहीं।--active
के अंतर्गत, डेटा-प्लेन पहुँच का परीक्षण संसाधन के अपने टोकन ऑडिएंस के साथ किया जाता है — और यह
केवल ऑब्जेक्ट नाम सूचीबद्ध करता है, कभी मान या सामग्री नहीं।Storage File Data SMB Share Reader है लेकिन
blob रीडर नहीं है, वह सामने आता है, छूटता नहीं। (Cosmos एक गैर-मानक AAD REST हेडर
का उपयोग करता है और best-effort है — denied परिणाम को किसी लाइव खाते के विरुद्ध मान्य करें।)[discovery: resource-graph] बनाम per-subscription)। स्वीप परिणामों को एक सीमा तक पेज करता है
(प्रति संसाधन प्रकार 40 पेज × 1000 पंक्तियाँ) ताकि एक रन हमेशा समाप्त हो; यह कहता है यदि सीमा कभी पहुँच जाती है।secret_stalker/
clouds.py Azure cloud endpoint table (public / usgov / usdod / china)
auth.py client_credentials flow + tenant discovery + AADSTS decoding
jwt_utils.py local JWT claim extraction
manifest.py Graph appRole GUID -> name resolution (bundled + live cache)
graph.py service principal lookup + appRole resolution + active probes
arm.py management-group / subscription RBAC + resource discovery
dataplane.py Key Vault / Storage data-plane reachability probes
risk.py permission/role/data-plane -> impact mapping (tune this)
report.py terminal + JSON output
export.py flatten to NDJSON / CSV / JSON records for ingestion
util.py shared HTTP (retry/backoff + safe JSON), pmap parallel map,
untrusted-output sanitizing
banner.py ASCII banner (stderr only)
cli.py orchestration
data/graph_app_roles.json bundled permission manifest
tests/ pytest suite (run: pytest)
pyproject.toml packaging + secret_stalker console entry point
---
## कार्यान्वित मुख्य विशेषताएँ
- **सीक्रेट या प्रमाणपत्र प्रमाणीकरण** (`--cert`) — PEM या PFX से JWT क्लाइंट-असर्शन (RS256),
प्रमाणपत्र-समाप्ति रिपोर्टिंग के साथ। `auth.py`
- **प्रिंसिपल द्वारा धारित Entra निर्देशिका भूमिकाएँ** — टोकन के `wids` दावे से निष्क्रिय पहचान सहित
(कोई निर्देशिका पठन आवश्यक नहीं) — भूमिका द्वारा स्कोर किया गया। `graph.py` / `risk.py`
- **स्वामित्व वाली वस्तुएँ** — ऐप्स/SPs जिनका स्वामित्व क्रेडेंशियल के पास है (क्रेडेंशियल-जोड़ पिवट)। `graph.py`
- **प्रत्यायोजित-अनुमति दृश्यता** (`--active`) — सहमति-प्राप्त अनुदान + अनुरोधित
अनुमतियाँ, जिनमें बिना सहमति वाली खतरनाक अनुमतियों को सहमति-हमले के लक्ष्य के रूप में चिह्नित किया गया है। `graph.py` / `risk.py`
- **हमले-पथ कथाएँ** + **HTML रिपोर्ट** (`--export report.html`). `risk.py` / `report.py`
- **वाणिज्यिक + संप्रभु क्लाउड** (`--cloud`) — सार्वजनिक, US Gov (GCC High), US DoD,
और चीन (21Vianet), प्रत्येक सही Entra प्राधिकरण और Graph / ARM / Key
Vault ऑडियंस के साथ। `clouds.py`
- **टेनेंट-व्यापी संसाधन खोज** एक एकल Azure Resource Graph स्वीप के माध्यम से
(RBAC-सम्मानजनक), प्रति-सदस्यता फ़ॉलबैक और प्रबंधन-समूह वंशज पुनर्प्राप्ति के साथ
उन सदस्यताओं के लिए जिन्हें सपाट सूची छोड़ देती है। `arm.py`
- **पूर्ण डेटा-प्लेन कवरेज** — Key Vault सीक्रेट / कुंजियाँ / प्रमाणपत्र, Storage
ब्लॉब / फ़ाइल / कतार / तालिका, और Cosmos DB डेटाबेस, प्रत्येक को स्वतंत्र रूप से जाँचा गया
और स्कोर किए गए निष्कर्षों में शामिल किया गया (पहुँच योग्य डेटा एक निष्कर्ष है, केवल
मेटाडेटा नहीं)। `dataplane.py` / `risk.py`
- **सटीक गणनाएँ** — डेटा-प्लेन सूचियाँ निरंतरता टोकन (सीमित) का पालन करती हैं, इसलिए
सतह गणना वास्तविक कुल को दर्शाती है; एक `+` (जैसे `25+`) चिह्नित करता है कि सूची कहाँ
सीमित की गई थी, चुपचाप कम रिपोर्ट करने के बजाय। `dataplane.py`
- **थ्रॉटलिंग-प्रतिरोधी अनुरोध** — एक साझा HTTP पथ `429`/`503` का पुनः प्रयास करता है,
`Retry-After` का सम्मान करते हुए, ताकि क्षणिक थ्रॉटलिंग को "अस्वीकृत / कोई
पहुँच नहीं" के रूप में गलत न समझा जाए। `util.py`
- **गहरा Storage अवरोहण** (`--deep`) — पहुँच योग्य कंटेनरों में ब्लॉब और
पहुँच योग्य शेयरों में फ़ाइलें, केवल नाम और सीमित संख्या में। `dataplane.py`
- **गैर-Graph GUID समाधान** — `--update-manifest` हर संसाधन API के लिए appRoles कैश करता है
जिस पर क्रेडेंशियल असाइन किया गया है, न कि केवल Graph। `graph.py` / `manifest.py`
- **समवर्तीता** (`--workers N`) ARM स्कोप लुकअप और डेटा-प्लेन जाँचों में,
प्रति-आइटम त्रुटि अलगाव के साथ। `util.py`
## रोडमैप विचार
- Key Vault कुंजियों/प्रमाणपत्रों का *विशेषता* पठन (सक्षम/समाप्ति) ट्राइएज के लिए —
फिर भी केवल मेटाडेटा, कोई कुंजी सामग्री नहीं।
- Storage कतार/तालिका सामग्री की झाँकी डेटा पढ़ने की श्रेणी में आएगी, इसलिए इसे
जानबूझकर इस केवल-पठन टूल के **दायरे से बाहर** रखा गया है।
--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 |
users accessible (returned 5+)organizationdirectoryRoles+wids दावे से पहचानी जाती हैं, भले ही निर्देशिका पढ़ना उपलब्ध न हो; प्रत्यायोजित अनुमतियाँ केवल-ऐप क्रेडेंशियल द्वारा उपयोग योग्य नहीं होतीं, लेकिन उपयोगकर्ता-संदर्भ pivot और सहमति-हमले लक्ष्यीकरण के लिए दिखाई जाती हैं।| Flag | Effect |
|---|
--tenant | Tenant GUID या डोमेन। (या SS_TENANT) |
--cloud | Azure क्लाउड: public (डिफ़ॉल्ट), usgov (GCC High), usdod (DoD), china (21Vianet)। Entra प्राधिकरण और Graph/ARM/Key Vault एंडपॉइंट चुनता है। gov/dod/commercial जैसे उपनाम स्वीकार्य हैं। (या SS_CLOUD) |
--client-id | एप्लिकेशन (क्लाइंट) ID। (या SS_CLIENT_ID) |
--secret | क्लाइंट सीक्रेट। इसे इतिहास से बाहर रखने के लिए SS_SECRET को प्राथमिकता दें। |
--cert | सीक्रेट के बजाय JWT-अभिकथन प्रमाणीकरण के लिए प्रमाणपत्र: एक PEM (key+cert) या .pfx/.p12। cryptography चाहिए। (या SS_CERT) |
--cert-password | एन्क्रिप्टेड --cert कुंजी/PFX के लिए पासवर्ड। (या SS_CERT_PASSWORD) |
--active | ऑप्ट-इन केवल-पढ़ने वाली गणना: Graph ऑब्जेक्ट नमूने और Key Vault / Storage डेटा-प्लेन पहुँच-क्षमता। डिफ़ॉल्ट रूप से बंद ताकि शांत रहे। |
--deep | --active के साथ: पहुँच योग्य Storage में एक स्तर नीचे जाएँ — सुलभ कंटेनरों में ब्लॉब और सुलभ शेयरों में फ़ाइलें सूचीबद्ध करें (केवल नाम, सीमित)। ज़्यादा शोर। |
--no-arm | प्रबंधन-समूह / सब्सक्रिप्शन / RBAC गणना छोड़ें (केवल Graph)। |
--workers N | ARM स्कोप लुकअप और डेटा-प्लेन जाँचों के लिए समानांतर HTTP वर्कर (डिफ़ॉल्ट 8; 1 = अनुक्रमिक)। |
--update-manifest | लाइव टेनेंट से आधिकारिक appRole GUID→name मानचित्र प्राप्त करें (Graph और कोई अन्य संसाधन API जिस पर यह क्रेडेंशियल असाइन है), इसे कैश करें, फिर बाहर निकलें। |
--json | रिपोर्ट के बजाय पूर्ण नेस्टेड परिणाम को JSON के रूप में प्रिंट करें। |
--export PATH | परिणामों को एक फ़ाइल में लिखें। प्रारूप एक्सटेंशन से अनुमानित किया जाता है (.csv / .ndjson / .jsonl / .json / .html)। फ़ाइलें केवल स्वामी के लिए (0600) लिखी जाती हैं। |
--export-format | एक्सपोर्ट प्रारूप बलपूर्वक निर्धारित करें (ndjson / csv / json / html)। |
--timeout N | प्रति-अनुरोध टाइमआउट सेकंड में (डिफ़ॉल्ट 20)। ARM कंट्रोल-प्लेन अनुरोध (RBAC गणना + Resource Graph खोज) लंबे टाइमआउट का उपयोग करते हैं — 1.5×, न्यूनतम 30s — क्योंकि वे धीमे चलते हैं। |
--verbose, -v | हर Graph/ARM/data-plane HTTP अनुरोध (विधि, URL, स्थिति) को stderr पर ट्रेस करें। |
--no-banner | ASCII बैनर दबाएँ। |
--version | संस्करण प्रिंट करें और बाहर निकलें। |
--verbosesecret_stalker/risk.py में रहती है — इसे संपादित करके समायोजित करें कि
आपकी टीम किसे उच्च-प्रभाव वाला मानती है।