
निर्यातित Azure डोमेन डंप्स में प्लेनटेक्स्ट पासवर्ड, कनेक्शन स्ट्रिंग्स, स्टोरेज कीज़ और अन्य सीक्रेट्स की खोज करता है; रीड-ओनली ऑडिट वर्कफ़्लो के लिए रीडैक्टेड CSV/HTML रिपोर्ट्स उत्पन्न करता है।
एक PowerShell स्कैनर जो MicroBurst के Get-AzDomainInfo आउटपुट में सादे-पाठ (plaintext) पासवर्ड, कुंजियाँ, कनेक्शन स्ट्रिंग, और अन्य ऐसे रहस्य खोजता है जिन्हें Azure वातावरण में कभी भी अनएन्क्रिप्टेड नहीं रहना चाहिए।
केवल-पठन (read-only) ऑडिट वर्कफ़्लो के लिए बनाया गया: आप MicroBurst के साथ एक डोमेन डंप इकट्ठा करते हैं (Get-AzDomainInfo के लिए Reader एक्सेस काफी है), फिर इस टूल को आउटपुट फ़ोल्डर पर इंगित करते हैं। यह Azure को स्वयं नहीं छूता है — यह केवल उन फ़ाइलों को पढ़ता है जिन्हें आप पहले ही एक्सपोर्ट कर चुके हैं। हर रिपोर्ट में गुप्त मान (secret values) रिडैक्ट किए जाते हैं, इसलिए आउटपुट निष्कर्षों (findings) के साथ संलग्न करने के लिए सुरक्षित है।
# Clone / copy this folder, then from a PowerShell prompt:
.\Scan-MicroBurst.ps1 -Path .\MicroBurst-2026 -Verbose
या मॉड्यूल आयात करें और cmdlet का सीधे उपयोग करें:
Import-Module .\MicroBurstSecretsHunter.psd1 -Force
Invoke-MBSecretScan -Path .\MicroBurst-2026
रिपोर्टें वर्तमान निर्देशिका में एक टाइमस्टैम्प वाले फ़ोल्डर (MBSecretScan-<timestamp>) में लिखी जाती हैं, जब तक कि आप -OutputDirectory पास न करें।
डिफ़ॉल्ट रूप से हर मान रिडैक्ट किया जाता है ताकि रिपोर्टें साझा करने के लिए सुरक्षित रहें। प्रकट किए गए अक्षरों का बजट मान की लंबाई के एक चौथाई पर होता है (अधिकतम 4 अग्रणी + 2 अनुगामी), और 8 अक्षर या उससे छोटी कोई भी चीज़ एक निश्चित-चौड़ाई वाले मास्क से बदल दी जाती है — इसलिए एक सामान्य पासवर्ड ******** के रूप में दिखता है, जबकि 88-अक्षर वाली स्टोरेज कुंजी AAAA**********AA के रूप में पहचानी जा सकती है। संदर्भ स्ट्रिंग (context strings) को छोटा करने से पहले रिडैक्ट किया जाता है, और किसी पंक्ति पर पाया गया हर रहस्य उस पंक्ति के हर निष्कर्ष के संदर्भ से बाहर कर दिया जाता है, इसलिए रिपोर्ट में कोई प्लेनटेक्स्ट नहीं बचता। गलत-सकारात्मक (false positive) की जाँच करते समय पूरा मान देखना अक्सर तेज़ होता है — -ShowSecrets पास करें ताकि हर जगह (कंसोल, CSV, HTML) अनरिडैक्टेड मान निकलें। तब कंसोल और HTML पर एक स्पष्ट चेतावनी बैनर होता है, और रिपोर्टों को वास्तविक क्रेडेंशियल सामग्री के रूप में माना जाना चाहिए:
Invoke-MBSecretScan -Path .\dump -ShowSecrets # raw values, for local triage
Windows PowerShell 5.1 और PowerShell 7+ (Windows, Linux, macOS) पर काम करता है।
हर रन तीन चीज़ें उत्पन्न करता है:
| आउटपुट | विवरण |
|---|---|
| कंसोल सारांश | गंभीरता/श्रेणी के अनुसार रंग-कोडित गणनाएँ, साथ ही शीर्ष Critical/High निष्कर्ष। |
findings.csv |
cmdlet पाइपलाइन में निष्कर्ष ऑब्जेक्ट भी भेजता है, ताकि आप पोस्ट-प्रोसेस कर सकें:
$f = Invoke-MBSecretScan -Path .\dump -Quiet
$f | Where-Object Severity -eq 'Critical' | Format-Table File,Line,RuleName
पूरा, संपादन योग्य नियम-सेट Private/Get-MBSignature.ps1 में रहता है। प्रत्येक नियम इन फ़ील्ड्स वाला एक [PSCustomObject] है:
Get-AzDomainInfo automation-account चर और app सेटिंग्स को Name,Value[,Encrypted] पंक्तियों के रूप में एक्सपोर्ट करता है। रहस्य Value कॉलम में रहता है, जबकि इसे पहचानने वाला कीवर्ड (जैसे ServiceAccountPwd, dbConnectionString) Name कॉलम में रहता है — इसलिए एक साधारण regex उन्हें कभी एक ही "पंक्ति" पर नहीं देखता और कीवर्ड बिना किसी शब्द सीमा के एक यौगिक टोकन के अंदर दबा रहता है।
.csv / .tsv फ़ाइलों के लिए स्कैनर अतिरिक्त रूप से संरचित कॉलम-पेयरिंग (Private/Get-MBCsvFinding.ps1) करता है:
Encrypted=True चिह्नित पंक्तियाँ छोड़ दी जाती हैं (मान प्लेनटेक्स्ट नहीं है)।Password या StorageKey कॉलम), तो हर गैर-प्लेसहोल्डर सेल रिपोर्ट किया जाता है।जिन मानों को एक उच्च-विश्वास नियम पहले ही कवर कर चुका है (कनेक्शन स्ट्रिंग, स्टोरेज कुंजियाँ, SAS), उन्हें बेहतर रिडैक्शन के लिए raw-line पास पर छोड़ दिया जाता है, और निष्कर्ष श्रेणी के अनुसार डी-डुप्लिकेट किए जाते हैं ताकि एक ही रहस्य कभी दो बार रिपोर्ट न हो। यदि किसी फ़ाइल को CSV के रूप में पार्स नहीं किया जा सकता है, तो स्कैनर स्वचालित रूप से सामान्य raw-line स्कैन पर वापस आ जाता है।
-ScanValues)उपरोक्त पेयरिंग किसी सेटिंग के नाम पर आधारित होती है। किसी अर्थहीन नाम के तहत संग्रहीत रहस्यों को भी पकड़ने के लिए (जैसे Config1 = P@ssw0rd2026!), -ScanValues पास करें। यह मान सेल की सामग्री की दो रूढ़िवादी, Low-severity ह्युरिस्टिक से जाँच करता है:
!@#$%^&* …) के साथ-साथ अक्षर और एक अन्य वर्ग शामिल हो। पहचान-शैली वाले मान जैसे Standard_D2s_v3 (जिनके केवल प्रतीक _ - . हैं) अनदेखा किए जाते हैं।-MinEntropy। रिसोर्स IDs को फ़्लैग करने से बचने के लिए पाथ / URLs / resource IDs (/ या \ वाली कोई भी चीज़) छोड़ी जाती हैं।Name/Value तालिकाओं में यह Value कॉलम को स्कैन करता है; free-form तालिकाओं में यह हर सेल को स्कैन करता है। यह अधिक रिकॉल के बदले अधिक गलत-सकारात्मक देता है, इसलिए यह डिफ़ॉल्ट रूप से बंद है — गहन स्वीप के लिए इसे चालू करें, फिर Low निष्कर्षों की जाँच करें।
Azure डंप लंबी यादृच्छिक-दिखने वाली स्ट्रिंग्स से भरे होते हैं जो रहस्य नहीं हैं। स्कैनर इन्हें फ़िल्टर कर देता है:
GUIDs (subscription / tenant / resource / object IDs) कभी फ़्लैग नहीं किए जाते।
Placeholders और गैर-रहस्य मान आकार — ********, null, <provide-at-deploy>, true/false, दोहराए गए अक्षर, टेम्पलेट टोकन (${var}, %VAR%), JSON ऑब्जेक्ट/ऐरे ({...}, [...], बहु-पंक्ति सहित), दिनांक/टाइमस्टैम्प, और सीरियलाइज़्ड .NET प्रकार/संग्रह नाम (जैसे VM scale set का Secrets कॉलम System.Collections.Generic.List1[...VaultSecretGroup]के रूप में प्रस्तुत होना) — छोड़ दिए जाते हैं। ध्यान दें कि यह आकार-आधारित है: वास्तविक प्लेनटेक्स्ट मान रखने वालाSecrets` कॉलम अभी भी फ़्लैग किया जाता है।
हानिरहित पासवर्ड-मेटाडेटा फ़ील्ड — ऐसे डायरेक्टरी कॉलम जिनके नाम में कोई कीवर्ड होता है लेकिन वे केवल पासवर्ड नीति/स्थिति का वर्णन करते हैं, कभी स्वयं रहस्य का नहीं (, , , , , …)। ये RBAC एक्सपोर्ट जैसे / में आम हैं और फ़्लैग नहीं किए जाते, जबकि वास्तव में नाम वाला कॉलम अभी भी फ़्लैग होता है। Key Vault एक्सेस-पॉलिसी अनुमति कॉलम (, , …) — जिनमें जैसी अनुमति क्रियाएँ होती हैं — भी इसी तरह अनदेखा किए जाते हैं।
MicroBurstSecretsHunter.psd1 Module manifest
MicroBurstSecretsHunter.psm1 Module loader
Scan-MicroBurst.ps1 Convenience wrapper script
Public/
Invoke-MBSecretScan.ps1 Main cmdlet (file walk, matching, reporting)
Private/
Get-MBSignature.ps1 Detection rule set (edit to extend)
Get-MBCsvFinding.ps1 Structured CSV Name/Value column pairing
MBHelpers.ps1 Entropy, redaction, context rendering,
CSV field escaping, line windowing,
placeholder/GUID filters
Write-MBConsoleSummary.ps1 Console output
New-MBHtmlReport.ps1 HTML report generator
tests/
sample-dump/ Example Get-AzDomainInfo-style fixture
बंडल किए गए नमूने के साथ इसे आज़माने के लिए:
.\Scan-MicroBurst.ps1 -Path .\tests\sample-dump
स्कैनर जो कुछ भी पढ़ नहीं सका वह एक ब्लाइंड स्पॉट है, और एक मूक ब्लाइंड स्पॉट "यहाँ कुछ नहीं मिला" जैसा पढ़ा जाता है। इसलिए स्कैनर उनके बारे में स्पष्ट है:
-MaxFileSizeMB से बड़ी फ़ाइलें उनका नाम बताते हुए Write-Warning उत्पन्न करती हैं, कंसोल सारांश में NOT scanned पंक्ति, और HTML रिपोर्ट पर एक बैनर।-Verbose के साथ चलाएँ।AdminPassword को आसानी से छिपा सकती है, इसलिए पंक्तियों को ओवरलैपिंग 8000-अक्षर विंडो में स्कैन किया जाता है। ओवरलैप से आने वाले डुप्लीकेट हिट डी-डुप्लिकेशन में समाप्त हो जाते हैं।-ShowSecrets के साथ उनमें पूर्ण प्लेनटेक्स्ट क्रेडेंशियल होते हैं — सुरक्षित रूप से संग्रहीत करें और ट्राइएज के बाद हटा दें।| प्रति निष्कर्ष एक पंक्ति (severity, rule, file, line, redacted value, context) — Excel में ट्राइएज हेतु। स्कैन की गई सामग्री ले जाने वाले फ़ील्ड स्प्रेडशीट फ़ॉर्मूला इंजेक्शन से बचाने के लिए एस्केप किए जाते हैं। |
report.html | स्व-निहित HTML रिपोर्ट (कोई बाहरी संसाधन नहीं) जिसमें गंभीरता कार्ड, लाइव टेक्स्ट फ़िल्टर, और गंभीरता टॉगल होते हैं — क्लाइंट के साथ साझा करने योग्य। |
| नियम | गंभीरता | डंप में उदाहरण स्रोत |
|---|
| एम्बेडेड पासवर्ड वाली SQL/DB कनेक्शन स्ट्रिंग | Critical | App Service सेटिंग्स, web.config एक्सपोर्ट |
| Azure Storage खाता कनेक्शन स्ट्रिंग / 88-अक्षर वाली कुंजी | Critical | App सेटिंग्स, Storage एक्सपोर्ट |
Service Bus / Event Hub SharedAccessKey | Critical | Messaging संसाधन कॉन्फ़िग |
| Cosmos DB खाता कुंजी | Critical | App सेटिंग्स |
| PEM निजी कुंजी ब्लॉक | Critical | Key Vault / प्रमाणपत्र एक्सपोर्ट |
| Azure Redis Cache पासवर्ड | High | Cache कनेक्शन स्ट्रिंग्स |
Azure AD क्लाइंट सीक्रेट (post-2021 …Q~… फ़ॉर्मेट) | High | ARM टेम्पलेट, app सेटिंग्स |
SAS टोकन / sig= पैरामीटर | High | Storage SAS URLs |
| JWT / बियरर टोकन | High | कैश्ड टोकन, कॉन्फ़िग |
प्रमाणपत्र / कुंजी फ़ाइल मौजूद (.pfx, .pem, .key, …) | High | डंप में कहीं भी |
सामान्य password / pwd असाइनमेंट | High | Automation चर, app सेटिंग्स, ARM पैरामीटर |
सामान्य secret / client_secret असाइनमेंट | High | App सेटिंग्स, टेम्पलेट |
| AWS एक्सेस कुंजी / GitHub / Slack टोकन | High/Med | Azure ऐप्स में संग्रहीत बाहरी क्रेडेंशियल |
सामान्य api_key / access_key / connectionstring | Medium | App सेटिंग्स |
| उच्च-एन्ट्रॉपी स्ट्रिंग (ह्युरिस्टिक) | Low | अज्ञात कुंजी फ़ॉर्मेट के लिए बैकस्टॉप — -IncludeEntropy के माध्यम से ऑप्ट-इन |
| फ़ील्ड | आवश्यक | उद्देश्य |
|---|
Id, Name, Category, Severity | हाँ | पहचान और निष्कर्ष कैसे रिपोर्ट और क्रमबद्ध किया जाता है। |
Pattern | हाँ | रीजेक्स। प्रति स्कैन एक बार संकलित। |
ValueGroup | हाँ | कौन सा कैप्चर ग्रुप रहस्य रखता है (0 = पूरा मैच)। रिडैक्शन को संचालित करता है। |
MultiLine | नहीं | पंक्ति-दर-पंक्ति के बजाय पूरी-फ़ाइल टेक्स्ट पर मूल्यांकन करें (PEM ब्लॉक)। हर मैच रिपोर्ट किया जाता है, केवल पहला नहीं। |
CaseSensitive | नहीं | डिफ़ॉल्ट IgnoreCase संकलन से बाहर निकलें। इसे केस-संवेदी रूप से परिभाषित फ़ॉर्मेट (AKIA, ghp_, eyJ, Q~) के लिए सेट करें — इसके बिना, मनमाने-केस के समान दिखने वाले मैच हो जाते हैं। |
Redact | नहीं | $false तब सेट करें जब कैप्चर किया गया मान रहस्य के बजाय एक लेबल हो (PEM हेडर लाइन, प्रमाणपत्र फ़ाइल नाम) ताकि यह मास्क होकर अपठनीय होने के बजाय यथावत दिखे। डिफ़ॉल्ट रूप से रिडैक्ट करता है। |
PasswordProfilePasswordPoliciesForceChangePasswordNextSignInLastPasswordChangeDateTimePasswordExpirationDateTimeInheritedOwners.csvInheritedContributors.csvPasswordPermissionsToSecretsStrPermissionsToKeysStrGet, List, Set, Deleteकोड और टेम्पलेट एक्सप्रेशन — जब password/secret/आदि एक वेरिएबल या प्रॉपर्टी नाम होता है जो एक शाब्दिक मान के बजाय किसी एक्सप्रेशन की ओर इंगित करता है, तो कैप्चर किया गया मान छोड़ दिया जाता है: PowerShell cmdlet कॉल (Get-RandomPassword 8, Get-AzKeyVaultSecret ...), स्कोप्ड सहित वेरिएबल संदर्भ ($result, $kv.Secrets, $global:clientSecret, $env:KEY), उप-एक्सप्रेशन ((-join $x)), और ARM / Logic App संदर्भ (@{body(...)}, @body(...), [parameters('...')])। ये automation रनबुक और Logic App परिभाषाओं में आम हैं।
यहाँ के अस्पष्ट आकार — $var, (expr), Verb-Noun — केवल उन फ़ाइलों में खारिज किए जाते हैं जिनमें वास्तव में कोड होता है (.ps1, .json, .tf, .yaml, …)। एक पासवर्ड अक्सर एक वैध वेरिएबल संदर्भ हो सकता है ($ummer2026, $ecretPass1), इसलिए उस फ़िल्टर को CSV मान सेल्स पर लगाने से असली रहस्य छूट सकते हैं। स्पष्ट टेम्पलेट मार्कर (@{, @body(, [parameters() हर जगह फ़िल्टर होते हैं।
कॉलम-हेडर निकटता — सामान्य keyword = value नियम केवल : और = को विभाजक मानते हैं (, को नहीं), इसलिए ...,AdminPassword,Secrets,... जैसा CSV हेडर अब अगले कॉलम नाम को पासवर्ड के रूप में कैप्चर नहीं करता। अल्पविराम-पृथक Name,Value जोड़े अभी भी संरचित CSV पेयरिंग द्वारा कवर किए जाते हैं।
Resource-ID पाथ को एक उच्च-एन्ट्रॉपी टोकन के रूप में मानने के बजाय छोटे खंडों में विभाजित किया जाता है।
केस-संवेदी क्रेडेंशियल फ़ॉर्मेट (AWS AKIA…, GitHub ghp_…, JWT eyJ…, Azure AD …Q~…) केस-संवेदी रूप से मिलान किए जाते हैं, इसलिए akiaijklmnopqrstuvwx जैसे मनमाने-केस के समान दिखने वाले मान रिपोर्ट नहीं होते। कीवर्ड नियम (password=, AccountKey=) केस-असंवेदी बने रहते हैं।
एन्ट्रॉपी ह्युरिस्टिक डिफ़ॉल्ट रूप से बंद है — यह शोर-भरे Low-severity निष्कर्ष उत्पन्न करता है, इसलिए गहन स्वीप के लिए आप -IncludeEntropy से ऑप्ट-इन करते हैं। फिर भी यह केवल उन टोकनों पर सक्रिय होता है जो कुंजी सामग्री जैसे दिखते हैं (मिश्रित अक्षर+अंक या base64 मार्कर), इसलिए networkSecurityGroups जैसे camelCase पहचानकर्ता अनदेखा किए जाते हैं। -MinEntropy 4.5 से और सख्ती बढ़ाएँ।
| पैरामीटर | डिफ़ॉल्ट | उद्देश्य |
|---|
-Path | (आवश्यक) | MicroBurst आउटपुट का रूट फ़ोल्डर। |
-OutputDirectory | टाइमस्टैम्प वाला फ़ोल्डर | जहाँ रिपोर्टें लिखी जाती हैं (स्कैन कभी नहीं होता)। यह स्वयं स्कैन रूट नहीं हो सकता; इसके अंदर नेस्टेड फ़ोल्डर चेतावनी देता है। |
-IncludeEntropy | बंद | उच्च-एन्ट्रॉपी ह्युरिस्टिक पास में ऑप्ट-इन करें (Low-severity निष्कर्ष जोड़ता है)। |
-MinEntropy | 4.0 | ह्युरिस्टिक के लिए Shannon एन्ट्रॉपी सीमा (bits/char)। |
-ScanValues | बंद | निर्दोष नामों के तहत रहस्यों के लिए CSV मान-सेल सामग्री का भी निरीक्षण करें (Low-severity, उच्च रिकॉल)। |
-ShowSecrets | बंद | गलत-सकारात्मक ट्राइएज को तेज़ करने के लिए सभी आउटपुट में अनरिडैक्टेड मान उत्सर्जित करें। रिपोर्टें वास्तविक क्रेडेंशियल सामग्री बन जाती हैं। |
-MaxFileSizeMB | 50 | इससे बड़ी फ़ाइलों को छोड़ें। छोड़ी गई फ़ाइलों के बारे में चेतावनी दी जाती है और सारांश तथा HTML रिपोर्ट में उनकी गिनती की जाती है। |
-IncludeExtension | सामान्य टेक्स्ट प्रकार | कौन से फ़ाइल प्रकार स्कैन किए जाते हैं, इसे ओवरराइड करें (अग्रणी डॉट वैकल्पिक है)। |
-NoCsv / -NoHtml | बंद | किसी रिपोर्ट फ़ॉर्मेट को छोड़ें। |
-Quiet | बंद | कंसोल सारांश दबाएँ (ऑब्जेक्ट अभी भी लौटाए जाते हैं)। |