
Azure RedOps, Microsoft Entra ID की सुरक्षा स्थिति का आकलन करने के लिए एक आक्रामक सुरक्षा टूलकिट है।
Azure / Entra ID रेड टीमिंग के लिए एक स्विस आर्मी टूल।
लेखक: Mr.Un1k0d3r (TrueCyber Inc) संस्करण: 0.1 भाषा: Python 3.12+
AzureRedOps Microsoft Entra ID और Azure टेनेंट्स की सुरक्षा स्थिति का आकलन करने के लिए एक आक्रामक सुरक्षा टूलकिट है। यह सबसे सामान्य रेड-टीम वर्कफ़्लो — प्रमाणीकरण, टोकन प्रबंधन, निर्देशिका गणना, विशेषाधिकार जाँच, पासवर्ड स्प्रेइंग, और Microsoft Graph के विरुद्ध पोस्ट-एक्सप्लॉइटेशन क्रियाएँ — को एक सुसंगत --activity-संचालित CLI में लपेटता है।
हर ऑपरेशन -a/--activity के साथ चुना जाता है। प्रमाणीकरण के दौरान प्राप्त टोकन को स्थानीय रूप से (.azure_creds) कैश किया जा सकता है और -l/--load-access-token के साथ नाम से पुन: उपयोग किया जा सकता है, जिससे आपको शायद ही कभी कच्चे JWT चिपकाने पड़ें।
टूल के बारे में और जानें CYPFER ब्लॉग पर
.azure_creds) में एक्सेस/रिफ़्रेश टोकन को सहेजें, सूचीबद्ध करें, डीकोड/देखें, और हटाएँ। कोई भी प्रवाह -s/--save + -n/--name के साथ अपने टोकन को स्वचालित रूप से संग्रहीत कर सकता है।auth) — सीधा उपयोगकर्ता नाम/पासवर्ड प्रमाणीकरण।phish-start / phish-capture) — OAuth डिवाइस प्राधिकरण अनुदान का दुरुपयोग करके जब लक्ष्य आपका उपयोगकर्ता कोड microsoft.com/devicelogin पर दर्ज करता है तो जारी किए गए टोकन को कैप्चर करें। डिफ़ॉल्ट रूप से स्वचालित रूप से कैप्चर करता है।auth-app) — एक कस्टम एप्लिकेशन पंजीकरण के विरुद्ध पूर्ण प्राधिकरण कोड + PKCE प्रवाह, जो रीडायरेक्ट प्राप्त करने वाले एक अंतर्निहित स्थानीय HTTPS लिसनर द्वारा प्रस्तुत किया जाता है।auth-interactive) — एक वास्तविक ब्राउज़र (Playwright; डिफ़ॉल्ट रूप से Firefox, स्विच करने के लिए -br) चलाएँ (MFA / Conditional Access / SSO को संभालता है), फिर रिकॉर्ड किए गए सत्र HAR से हर टोकन की कटाई करें।refresh) — एक रिफ़्रेश टोकन को नए एक्सेस टोकन के लिए व्यापार करें।obo) — पहले से जारी एक्सेस टोकन को डाउनस्ट्रीम संसाधन (OAuth 2.0 jwt-bearer / OBO) के लिए स्कोप किए गए नए टोकन के लिए एक्सचेंज करें।gather-all संग्रहकर्ता।spray) और क्रॉस-ऐप रिफ़्रेश-टोकन स्प्रेइंग (spray-refresh)।magic-app AllPrincipals सहमति के साथ सार्वजनिक रूप से रीडायरेक्ट करने योग्य ऐप ढूँढता है; ज्ञात/दिलचस्प Microsoft ऐप आईडी की अंतर्निहित सूचियाँ।requirements.txt):
PyJWTrequestsplaywrightcryptography (केवल browser-sso -aprt, ऑटो-PRT प्रवाह के लिए आवश्यक)auth-interactive, browser-sso) के लिए एक Playwright ब्राउज़र रनटाइम।
Firefox डिफ़ॉल्ट इंजन है (-br/--browser); इसे इंस्टॉल करें:
python -m playwright install firefoxincludes/web/cert.pem और includes/web/key.pem पर TLS प्रमाणपत्र + कुंजी
(केवल auth-app PKCE प्रवाह के लिए आवश्यक — देखें)।git clone AzureRedOps cd AzureRedOps
python3 -m venv AzureRedOps source AzureRedOps/bin/activate # Linux / macOS
pip install -r requirements.txt
python -m playwright install firefox
उपकरण चलाएँ:```bash
python3 AzureRedOps.py -a <activity> [options]
सामान्य आह्वान पैटर्न है:```bash python3 AzureRedOps.py -a [authentication] [activity options] [global options]
### एक टोकन प्रदान करना
माइक्रोसॉफ्ट ग्राफ को कॉल करने वाली गतिविधियों को एक एक्सेस टोकन की आवश्यकता होती है। आप इसे दो तरीकों से प्रदान कर सकते हैं:
| विधि | फ़्लैग | उदाहरण |
|--------|------|---------|
| एक रॉ टोकन पास करें | `-ac, --access-token` | `-ac eyJ0eXAi...` |
| कैश्ड टोकन को नाम से लोड करें | `-l, --load-access-token` | `-l mytoken` |
जब `-l` का उपयोग किया जाता है, तो मिलान करने वाला `access_token` (और, जहां प्रासंगिक हो, `refresh_token` और `tenant`) `.azure_creds` स्टोर से पढ़ा जाता है।
### टोकन को फ़ाइल में सहेजना (`-s` / `-n`)
टोकन प्राप्त करने वाली कोई भी गतिविधि (`auth`, `auth-app`, `auth-interactive`, `phish-start`/`phish-capture`, `refresh`) `-s/--save` के साथ `-n/--name` जोड़कर उन्हें स्थानीय क्रेडेंशियल स्टोर (`.azure_creds`) में **स्वचालित रूप से संग्रहीत** कर सकती है:```bash
# Authenticate and save the resulting tokens under the name "victim1"
python3 AzureRedOps.py -a auth -u [email protected] -p 'P@ssw0rd!' -tid <tenant-guid> -s -n victim1
-s/--save ऑटो-सेव चालू करता है; इसके लिए -n/--name आवश्यक है — यदि -n गायब है तो टूल त्रुटि के साथ बाहर निकल जाता है।-n/--name वह कुंजी है जिसके अंतर्गत टोकन संग्रहीत किया जाता है। आप बाद में इसे -l victim1 के साथ पुनः उपयोग कर सकते हैं, कच्चे JWT को चिपकाने के बजाय, इसे -a view -n victim1 से देख सकते हैं, या -a delete -n victim1 से हटा सकते हैं।auth-interactive गतिविधि हमेशा ऑटो-सेव करती है और यदि -n प्रदान नहीं किया गया है तो वह आपसे इंटरैक्टिव रूप से एक नाम माँगेगी।-j)अधिकांश गणना गतिविधियाँ (list-users, list-applications, list-principals,
gather-all, raw-url) कच्चे API प्रतिक्रिया को फ़ाइल में लिखने के लिए -j/--json <filename> स्वीकार करती हैं, जो उसे प्रिंट करने के अतिरिक्त (या उसके बजाय) JSON फ़ाइल में सहेजता है:```bash
python3 AzureRedOps.py -a list-users -l victim1 -j users.json
For `gather-all`, the supplied filename is used as a suffix and one file is written per Graph endpoint (e.g. `users-<name>`, `groups-<name>`, ...).
> सुझाव: `-j` संरचित JSON निर्यात को नियंत्रित करता है, जबकि `-re/--redirect-to-file` फ़ॉर्मेटेड कंसोल आउटपुट को `output.txt` में मिरर करता है। दोनों स्वतंत्र हैं।
### टेनेंट पहचानकर्ता
- `-t, --tenant` एक **डोमेन नाम** की अपेक्षा करता है (जैसे `contoso.com`) और इसका उपयोग `id` गतिविधि द्वारा किया जाता है।
- `-tid, --tenant-id` एक **टेनेंट GUID** या `common` की अपेक्षा करता है, जिसका उपयोग प्रमाणीकरण गतिविधियों द्वारा किया जाता है।
---
## कमांड-लाइन विकल्प
| छोटा | लंबा | डिफ़ॉल्ट | विवरण |
|-------|------|---------|-------------|
| `-a` | `--activity` | `id` | **(आवश्यक)** गतिविधि (देखें [गतिविधियाँ](#activities))। |
| `-ac` | `--access-token` | | Azure एक्सेस टोकन। |
| `-n` | `--name` | | टोकन सहेजने/लोड करने के लिए उपयोग किया जाने वाला नाम, या `register-app`/`new-group`/`invite` के लिए प्रदर्शन नाम। |
| `-t` | `--tenant` | | Azure टेनेंट **डोमेन** नाम (`id` द्वारा उपयोग किया जाता है)। |
| `-c` | `--devicecode` | | डिवाइस कोड (`phish-capture` द्वारा उपयोग किया जाता है)। |
| `-tid` | `--tenant-id` | | Azure टेनेंट **ID** (GUID) या `common`। |
| `-app` | `--appid` | `d3590ed6-52b3-4102-aeff-aad2292ab01c` | एप्लिकेशन (क्लाइंट) ID। |
| `-e` | `--endpoint` | `microsoftonline.com` | लॉगिन एंडपॉइंट डोमेन। |
| `-r` | `--refresh-token` | | प्रमाणीकरण रिफ्रेश टोकन। |
| `-as` | `--auto-start` | `True` | `phish-start` के बाद स्वचालित रूप से डिवाइस-कोड कैप्चर शुरू करें। |
| `-l` | `--load-access-token` | | `.azure_creds` से नाम के अनुसार कैश्ड टोकन लोड करें। |
| `-j` | `--json` | | गतिविधि आउटपुट को दिए गए JSON फ़ाइल में सहेजें। |
| `-fl` | `--filter` | | केवल उन विशेषताओं को प्रिंट करें जिनकी कुंजी इनमें से किसी एक से मेल खाती हो (अल्पविराम से अलग)। |
| `-u` | `--username` | | उपयोगकर्ता प्रिंसिपल नाम (ईमेल)। |
| `-p` | `--password` | | उपयोगकर्ता पासवर्ड। |
| `-s` | `--save` | `False` | प्राप्त टोकन को `.azure_creds` में ऑटो-सेव करें (**`-n` की आवश्यकता है**)। |
| `-cp` | `--check-privileges` | `False` | सफल स्प्रे लॉगिन के बाद, जाँचें कि क्या उपयोगकर्ता/ऐप्स को गणना किया जा सकता है। |
| `-uid` | `--uid` | | Azure उपयोगकर्ता ऑब्जेक्ट ID (`add-group` द्वारा उपयोग किया जाता है)। |
| `-headers` | `--headers` | | अतिरिक्त HTTP हेडर JSON के रूप में, उदा. `{"X-Foo": "bar"}`। |
| `-gid` | `--gid` | `62e90394-69f5-4237-91f9-056ad24d70a7` | निर्देशिका भूमिका/समूह ID (डिफ़ॉल्ट = **ग्लोबल एडमिनिस्ट्रेटर**)। |
| `-i` | `--id` | `False` | `interest` के लिए: केवल एप्लिकेशन ID प्रिंट करें। |
| `-ty` | `--type` | | `interest` के लिए: किसी विशिष्ट श्रेणी में फ़िल्टर करें। |
| `-fp` | `--filepath` | | अपलोड करने के लिए फ़ाइल (`push-file`) या स्प्रे करने के लिए कस्टम ऐप सूची। |
| `-v` | `--version` | `v2.0` | प्रमाणीकरण API संस्करण: `v0` या `v2.0`। |
| `-ua` | `--user-agent` | *(Chrome UA string)* | HTTP `User-Agent` को ओवरराइड करें। |
| `-au` | `--audience` | `https://graph.microsoft.com` | टोकन श्रोता/संसाधन। |
| `-sc` | `--scope` | `openid offline_access` | OAuth2 स्कोप। ग्राफ़ के लिए `https://graph.microsoft.com/.default`, स्प्रे के लिए `openid` का उपयोग करें। |
| `-url` | `--url` | | `raw-url`/`invite` के लिए लक्ष्य URL; `auth-interactive` के लिए अल्पविराम से अलग URL सूची। |
| `-beta` | `--beta` | `False` | `list-users`/`list-applications` के लिए Microsoft Graph **beta** एंडपॉइंट का उपयोग करें। |
| `-exp` | `--expand` | `False` | आउटपुट में नेस्टेड सूचियों/डिक्शनरी को मानव-पठनीय प्रारूप में विस्तारित करें। |
| `-k` | `--keep` | `False` | `auth-interactive` / `browser-sso` के बाद `session.har` फ़ाइल रखें। |
| `-cs` | `--client-secret` | | गोपनीय क्लाइंट सीक्रेट जो `obo` ऑन-बिहाफ-ऑफ़ अनुदान द्वारा उपयोग किया जाता है। |
| `-prt` | `--prt-cookie` | | PRT कुकी मान (`x-ms-RefreshTokenCredential`) जो `browser-sso` के लिए ब्राउज़र SSO को सीड करता है। |
| `-br` | `--browser` | `firefox` | ब्राउज़र फ़्लो के लिए Playwright ब्राउज़र इंजन (`auth-interactive`, `browser-sso`)। `firefox`, `chromium`, `webkit` में से एक। |
| `-aprt` | `--auto-prt` | `False` | `browser-sso` के लिए: रिफ्रेश टोकन से स्वचालित रूप से PRT कुकी जारी करें (डिवाइस रजिस्ट्रेशन → PRT → `x-ms-RefreshTokenCredential`) ताकि ब्राउज़र **पहले से प्रमाणित** खुले। `cryptography` और FOCI/ब्रोकर रिफ्रेश टोकन की आवश्यकता है। |
| `-d` | `--debug` | `False` | डीबग लॉगिंग सक्षम करें। |
| `-dd` | `--verbose-debug` | `False` | विस्तृत HTTP अनुरोध/प्रतिक्रिया लॉगिंग सक्षम करें। |
| `-re` | `--redirect-to-file` | `False` | सभी कंसोल आउटपुट को `output.txt` में मिरर करें। |
---
## गतिविधियाँ
नीचे, प्रत्येक गतिविधि अपने **आवश्यक** और *वैकल्पिक* आर्गुमेंट्स की सूची देती है।
"टोकन" का अर्थ है कि `-ac` या `-l` में से कोई एक आवश्यक है।
### टोकन प्रबंधन
| गतिविधि | आवश्यक | वैकल्पिक | विवरण |
|----------|----------|----------|-------------|
| `save` | `-ac`, `-n` | `-tid`, `-r` | एक एक्सेस (और वैकल्पिक रिफ्रेश) टोकन को `.azure_creds` में सहेजें। |
| `list-token` | — | — | सभी सहेजे गए टोकन के नाम सूचीबद्ध करें। |
| `view` | `-n` | — | सहेजे गए टोकन के JWT दावों को डिकोड और प्रदर्शित करें। |
| `delete` | `-n` | — | स्टोर से सहेजा गया टोकन हटाएं। |```bash
# Save a token under the name "mytoken"
python3 AzureRedOps.py -a save -n mytoken -ac eyJ0eXAi... -r 0.AReAB... -tid <tenant-guid>
# List, view, delete
python3 AzureRedOps.py -a list-token
python3 AzureRedOps.py -a view -n mytoken
python3 AzureRedOps.py -a delete -n mytoken
python3 AzureRedOps.py -a id -t contoso.com
python3 AzureRedOps.py -a phish-start -tid common -app d3590ed6-52b3-4102-aeff-aad2292ab01c
python3 AzureRedOps.py -a phish-capture -c -tid common
python3 AzureRedOps.py -a auth -u [email protected] -p 'P@ssw0rd!' -tid
python3 AzureRedOps.py -a auth-interactive -url https://portal.azure.com -s -n harvested
python3 AzureRedOps.py -a refresh -l mytoken -app d3590ed6-52b3-4102-aeff-aad2292ab01c
python3 AzureRedOps.py -a obo -l mytoken -tid -app -cs -au https://graph.microsoft.com
python3 AzureRedOps.py -a browser-sso -l mytoken -url outlook -prt
#### प्रमाणीकरण प्रवाह कैसे काम करता है
AzureRedOps टोकन प्राप्त करने के कई अलग-अलग तरीकों को लागू करता है। अपने एंगेजमेंट से मेल खाने वाला तरीका चुनें; सभी परिणाम को स्वचालित रूप से सहेजने के लिए `-s/-n` का सम्मान करते हैं।
##### डिवाइस-कोड फिशिंग (`phish-start` / `phish-capture`)
OAuth 2.0 **डिवाइस प्राधिकरण अनुदान** इनपुट-सीमित उपकरणों के लिए डिज़ाइन किया गया है, जो इसे एक शक्तिशाली फिशिंग प्रिमिटिव बनाता है: आप एक प्रथम-पक्ष माइक्रोसॉफ्ट एप्लिकेशन की ओर से एक कोड का अनुरोध करते हैं, फिर एक लक्ष्य को सामाजिक इंजीनियरिंग के माध्यम से उस कोड को `https://microsoft.com/devicelogin` पर उनके खाते में साइन इन करते हुए दर्ज करने के लिए प्रेरित करते हैं। एक बार जब वे ऐसा करते हैं, तो टोकन **आपको** जारी किए जाते हैं।
- `phish-start` एक डिवाइस कोड का अनुरोध करता है और **उपयोगकर्ता कोड**, लॉगिन URL और कच्चा **डिवाइस कोड** प्रिंट करता है। क्योंकि `-as/--auto-start` डिफ़ॉल्ट रूप से `True` है, यह तुरंत टोकन के लिए पोलिंग शुरू कर देता है — इसलिए केवल `phish-start` चलाना और उपयोगकर्ता कोड लक्ष्य को सौंपना आमतौर पर पर्याप्त होता है।
- `phish-capture` मैनुअल समकक्ष है: इसे पहले प्राप्त डिवाइस कोड `-c/--devicecode` के साथ फीड करें और यह टोकन एंडपॉइंट को तब तक पोल करता है जब तक पीड़ित लॉगिन पूरा नहीं कर लेता (टूल प्राधिकरण लंबित रहने पर चुपचाप पुनः प्रयास करता है)।
- `-app/--appid` का उपयोग किसी विशिष्ट प्रथम-पक्ष क्लाइंट का प्रतिरूपण करने के लिए और `-tid/--tenant-id` का उपयोग किसी टेनेंट पर स्कोप करने के लिए करें (डिफ़ॉल्ट रूप से `common`)। सुझाव: स्कोप को `'https://graph.microsoft.com/.default offline_access openid'` पर सेट करें ताकि रिफ्रेश टोकन के साथ ग्राफ-रेडी टोकन प्राप्त हो सके।```bash
# Start a device-code session (auto-captures the token once the victim logs in)
python3 AzureRedOps.py -a phish-start -tid common -s -n phished
# Or capture against a code you generated separately
python3 AzureRedOps.py -a phish-capture -c <device-code> -tid common -s -n phished
auth-app)auth-app एक तृतीय-पक्ष (गैर-डिफ़ॉल्ट) एप्लिकेशन रजिस्ट्रेशन के विरुद्ध पूर्ण Authorization Code flow with PKCE करता है। यह टूल एक स्थानीय HTTPS listener (includes/Webserver.py, https://localhost:2342 पर) शुरू करता है जो OAuth रीडायरेक्ट URI के रूप में कार्य करता है, PKCE code_verifier/code_challenge जोड़ी उत्पन्न करता है, और आपके लिए ब्राउज़र में खोलने हेतु एक प्राधिकरण URL प्रिंट करता है। आपके सहमति देने के बाद, Azure प्राधिकरण कोड को वापस स्थानीय listener पर रीडायरेक्ट करता है, जिसे टूल तब टोकन के लिए विनिमय करता है।
यह वह प्रवाह है जिसका उपयोग तब करना चाहिए जब आप किसी एप्लिकेशन को नियंत्रित करते हैं (या पंजीकृत किया है) और वास्तविक ब्राउज़र सत्र के माध्यम से सहमति प्राप्त करना चाहते हैं — यह अवैध-सहमति शैली के परिदृश्यों या जब ROPC अवरुद्ध हो, के लिए उपयोगी है।
includes/web/cert.pem और includes/web/key.pem पर TLS प्रमाणपत्र/कुंजी जोड़ी की आवश्यकता होती है (इन्हें उत्पन्न करने के तरीके के लिए Notes देखें)।8545b2fc-a69c-4851-9206-0f74a519fe5f है।```bash
python3 AzureRedOps.py -a auth-app -tid -s -n consented##### इंटरैक्टिव ब्राउज़र प्रमाणीकरण (`auth-interactive`)
`auth-interactive` एक **वास्तविक ब्राउज़र को Playwright के माध्यम से** लॉन्च करता है (डिफ़ॉल्ट रूप से Firefox; चुनें
इंजन को `-br/--browser` के साथ) और ऑपरेटर को (या साझा सत्र पर एक लक्ष्य) एक इंटरैक्टिव लॉगिन पूरा करने देता है —
जिसमें MFA, Conditional Access, और फ़ेडरेटेड/SSO रीडायरेक्ट शामिल हैं जिन्हें स्क्रिप्टेड फ़्लो
संतुष्ट नहीं कर सकते।
संपूर्ण ब्राउज़र सत्र एक HAR फ़ाइल (`session.har`) में रिकॉर्ड किया जाता है; उपकरण
फिर उस कैप्चर को पार्स करता है, **प्रत्येक** एक्सेस/रिफ्रेश टोकन जोड़ी को निकालता है जो देखी गई है
`/oauth2/v2.0/token` एंडपॉइंट पर, प्रत्येक JWT को डीकोड करता है, और आपको चुनने देता है कि कौन सा (या कौन से)
सहेजना है।
- `-url/--url` लॉगिन पेज लोड होने के बाद नेविगेट करने के लिए पेज(पेजों) को सेट करता है। यह URL की एक
**अल्पविराम से अलग की गई सूची** स्वीकार करता है (जैसे `https://portal.azure.com,https://outlook.office.com`)
ताकि आप एक सत्र में कई संसाधनों के लिए टोकन एकत्र कर सकें। डिफ़ॉल्ट
`https://portal.azure.com` है।
- यह गतिविधि **हमेशा ऑटो-सेव** करती है: हार्वेस्टिंग के बाद, यह पूछता है कि कौन से टोकन
इंडेक्स(इंडेक्स) रखने हैं और उन्हें किस नाम से स्टोर करना है।
- `-k/--keep` जोड़ें ताकि `session.har` को ऑफ़लाइन विश्लेषण के लिए संरक्षित किया जा सके (डिफ़ॉल्ट
रूप से इसे हटा दिया जाता है)।```bash
# Log in interactively and harvest tokens for two resources
python3 AzureRedOps.py -a auth-interactive -url https://portal.azure.com,https://outlook.office.com -k
obo)obo OAuth 2.0 On-Behalf-Of प्रवाह (grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer) को लागू करता है।
यह एक पहले से जारी एक्सेस टोकन को अभिकथन के रूप में लेता है और इसे एक बिल्कुल नए टोकन के लिए विनिमय करता है जो किसी भिन्न डाउनस्ट्रीम संसाधन के लिए स्कोप्ड होता है — बिना उपयोगकर्ता को पुनः प्रमाणित किए।
-ac/--access-token या -l/--load-access-token के माध्यम से कैश्ड टोकन के साथ प्रदान किया जाता है।-app/--appid + -cs/--client-secret विनिमय करने वाले गोपनीय क्लाइंट की पहचान करते हैं। Entra ID आवश्यकता है कि यह क्लाइंट अभिकथन टोकन का श्रोता (aud) हो; बेमेल होने पर AADSTS500131/AADSTS50013 के साथ विफल होता है।-au/--audience (डिफ़ॉल्ट https://graph.microsoft.com, <audience>/.default में परिवर्तित) या -sc/--scope के साथ पूर्ण स्कोप के साथ सेट किया जाता है।-s/-n का सम्मान करता है।```bashpython3 AzureRedOps.py -a obo -l mytoken -tid
-app -cs -au https://graph.microsoft.com -s -n obo-graph
##### टोकन-से-ब्राउज़र एकल साइन-ऑन (`browser-sso`)
`browser-sso` **एक वास्तविक ब्राउज़र खोलता है जो पहले से उपयोगकर्ता के रूप में प्रमाणित है** — आप कुछ भी क्लिक नहीं करते और सीधे अंदर पहुँच जाते हैं, उदाहरण के लिए, **Outlook on the web**। यह "बस ब्राउज़र खोलें और एक मान्य सत्र प्राप्त करें" प्रवाह है। ब्राउज़र तीन तरीकों में से एक में अपना सत्र प्राप्त करता है, वरीयता के क्रम में:
**1. `-aprt/--auto-prt` — स्वचालित रूप से PRT कुकी बनाएं (अनुशंसित)।**
रिफ्रेश टोकन को टूल द्वारा पूरी तरह से **Primary Refresh Token (PRT)** और इसके ब्राउज़र कुकी में बदल दिया जाता है, फिर बीज दिया जाता है ताकि Entra का ESTS बिना मैन्युअल लॉगिन के SSO पूरा कर सके। श्रृंखला (`includes/PRT.py`, ROADtoken / roadtx / AADInternals प्रोटोकॉल) इस प्रकार है:
1. रिफ्रेश टोकन को **डिवाइस-पंजीकरण (DRS)** टोकन के लिए भुनाएं।
2. Azure AD के साथ **एक डिवाइस पंजीकृत करें** → डिवाइस प्रमाणपत्र + परिवहन कुंजी।
3. डिवाइस प्रमाणपत्र द्वारा हस्ताक्षरित रिफ्रेश टोकन के साथ **PRT + सत्र कुंजी** का अनुरोध करें।
4. **`x-ms-RefreshTokenCredential` कुकी व्युत्पन्न करें** (KDFv2: `SHA256(ctx‖decoded-payload-bytes)` पर SP800-108 KDF → HS256-हस्ताक्षरित JWT; KDFv1 → `AADSTS5000611`, गलत-बाइट्स → `AADSTS50058`) और इसे एक ताज़ा ब्राउज़र संदर्भ में बीज दें।
कुकी को `SameSite=None` के साथ बीज दिया जाता है और **शीर्ष-स्तरीय ESTS `/authorize` वार्म-अप** (Office `landingv2` क्लाइंट) के माध्यम से खपत की जाती है ताकि `ESTSAUTH` सत्र कुकी प्रथम-पक्ष के रूप में बनाई जाए — जिसके बाद लक्ष्य ऐप पहले से ही साइन इन करके खुलता है। कुकी को नेविगेट करने से ठीक पहले एक ताज़ा नॉन्स के साथ व्युत्पन्न किया जाता है और एक बार पुनः प्रयास किया जाता है; यदि SSO अभी भी पूरा नहीं हो सकता है तो टूल `prompt=none` की जाँच करता है और सटीक `AADSTS` कारण प्रिंट करता है (जैसे, अनुपालन/प्रबंधित डिवाइस की आवश्यकता वाली सशर्त पहुंच, या MFA — ताज़ा पंजीकृत डिवाइस के साथ इनमें से कोई भी बाइपास करने योग्य नहीं है)।
PRT, सत्र कुंजी और कुकी मुद्रित की जाती हैं (एक तैयार-पेस्ट `-prt "<value>"` संकेत के साथ) ताकि आप श्रृंखला को फिर से चलाए बिना उन्हें बाद में पुन: उपयोग कर सकें।
> **`-aprt` के लिए आवश्यकताएँ और ऑप्सेक:**
> - **`cryptography`** पैकेज की आवश्यकता है (`pip install cryptography`; यह `requirements.txt` में है)।
> - रिफ्रेश टोकन को **FOCI / ब्रोकर क्लाइंट** से संबंधित होना चाहिए — जैसे, **Microsoft Authentication Broker** के डिवाइस-कोड फ़िशिंग द्वारा कैप्चर किया गया एक (`29d9ed98-a469-4536-ade2-f981bc1d605e`), जो वास्तव में SharePoint/OneDrive डिवाइस-कोड लालच देता है। डिफ़ॉल्ट `-app` (Microsoft Office FOCI क्लाइंट) भी काम करता है।
> - **डिवाइस पंजीकरण टेनेंट में एक डिवाइस ऑब्जेक्ट लिखता है** — यह मौन नहीं है और एक कलाकृति छोड़ता है (और उपयोगकर्ता को डिवाइस में शामिल होने/पंजीकरण करने की अनुमति की आवश्यकता होती है)।
**2. `-prt/--prt-cookie` — एक PRT कुकी बीज दें जो आपके पास पहले से है।**
यदि आपके पास पहले से `x-ms-RefreshTokenCredential` मान है (पिछले `-aprt` रन से, या `ROADtoken`/`browsercore` या `Mimikatz` के माध्यम से एक समझौता किए गए होस्ट से), तो इसे सीधे पास करें और मिंटिंग श्रृंखला को छोड़ें।
**3. कोई नहीं — टोकन को कन्वर्ट करें और मैन्युअल रूप से लॉगिन करें (फॉलबैक)।**
PRT कुकी के बिना, रिफ्रेश टोकन को संसाधन-स्कोप्ड एक्सेस/रिफ्रेश टोकन के लिए भुनाया जाता है (`-s/-n` के साथ मुद्रित और सहेजा गया), और लक्ष्य पर ब्राउज़र खोला जाता है ताकि आप लॉगिन को हाथ से पूरा कर सकें।
**PRT / सत्र-कुकी हार्वेस्टिंग।** जब ब्राउज़र सत्र समाप्त होता है (ऑटो-क्लोज़ टाइमआउट या आप विंडो बंद करते हैं), `browser-sso` लाइव ब्राउज़र संदर्भ पढ़ता है और **जारी किए गए प्रत्येक पुन: प्रयोज्य SSO कुकी को प्रिंट करता है** — PRT कुकी (`x-ms-RefreshTokenCredential`) और ESTS सत्र कुकी (`ESTSAUTH`, `ESTSAUTHPERSISTENT`, ...) — प्रत्येक एक तैयार-पेस्ट `-prt` संकेत के साथ ताकि आप उन्हें अगली बार फिर से चला सकें। सत्र चालू रहने पर कुकीज़ का पोल किया जाता है, ताकि विंडो जल्दी बंद करने पर भी मान कैप्चर हो जाए। वही हार्वेस्टिंग `auth-interactive` के अंत में चलती है।
- `-url/--url` लक्ष्य चुनता है। एक अनुकूल प्रीसेट का उपयोग करें — `outlook`, `office`, `teams`, `sharepoint`, `onedrive`, `portal`, `graph` — या एक या अधिक कच्चे `https://` URL पास करें (अल्पविराम से अलग)। डिफ़ॉल्ट `outlook` है।
- `-r/--refresh-token` + `-tid` (या कैश्ड `-l`) रिफ्रेश टोकन प्रदान करता है। `-app/--appid` डिफ़ॉल्ट Microsoft Office FOCI क्लाइंट पर सेट होता है।
- `-br/--browser` Playwright इंजन चुनता है (डिफ़ॉल्ट रूप से Firefox)।
- `-k/--keep` ब्राउज़र सत्र की `session.har` रिकॉर्डिंग को संरक्षित करता है।```bash
# BEST: auto-mint a PRT from a device-code-phished (broker) token and drop straight
# into an authenticated Outlook on the web — no manual login.
python3 AzureRedOps.py -a browser-sso -l phished -url outlook -aprt
# Seed a PRT cookie you already have
python3 AzureRedOps.py -a browser-sso -l mytoken -url outlook -prt <x-ms-RefreshTokenCredential>
# Target Teams from a raw refresh token, auto-mint the PRT, keep the session recording
python3 AzureRedOps.py -a browser-sso -r 0.AReAB... -tid <tenant-guid> -url teams -aprt -k
python3 AzureRedOps.py -a self -l mytoken
python3 AzureRedOps.py -a list-users -l mytoken -beta -j users.json -fl displayName,userPrincipalName
python3 AzureRedOps.py -a register-app -n EvilApp -l mytoken
python3 AzureRedOps.py -a add-group -uid -l mytoken
python3 AzureRedOps.py -a push-file -fp ./payload.docx -n payload.docx -l mytoken
python3 AzureRedOps.py -a raw-url -url "https://graph.microsoft.com/beta/users" -l mytoken
python3 AzureRedOps.py -a invite -n [email protected] -url https://example.com/invite -l mytoken
python3 AzureRedOps.py -a magic-app -l mytoken
### पासवर्ड स्प्रेइंग
| Activity | Required | Optional | Description |
|----------|----------|----------|-------------|
| `spray` | `-u`, `-p`, `-tid` | `-fp`, `-cp` | ज्ञात फर्स्ट-पार्टी ऐप आईडी (v0 + v2.0 APIs) के विरुद्ध क्रेडेंशियल्स स्प्रे करें। |
| `spray-refresh` | `-v`, and (`-l`) **or** (`-r` + `-tid`) | `-fp`, `-cp` | कई ऐप आईडी पर एक रिफ्रेश टोकन को पुनः चलाएं। |
डिफ़ॉल्ट रूप से दोनों गतिविधियाँ `includes/auth_apps.json` को ऐप स्रोत के रूप में उपयोग करती हैं; `-fp` से ओवरराइड करें। `-cp` जोड़ें यह जांचने के लिए कि क्या प्रत्येक सफल लॉगिन उपयोगकर्ताओं/ऐप्स को गणना कर सकता है।```bash
# Spray a single credential across first-party apps
python3 AzureRedOps.py -a spray -u [email protected] -p 'P@ssw0rd!' -tid <tenant-guid> -cp
# Cross-app refresh spraying from a saved token
python3 AzureRedOps.py -a spray-refresh -l mytoken -v v2.0
---
## आउटपुट और उत्पन्न फ़ाइलें
| फ़ाइल | किसके द्वारा बनाई गई | विवरण |
|------|-----------|-------------|
| `.azure_creds` | टोकन सहेजने वाली गतिविधियाँ | एक्सेस/रिफ्रेश टोकन का स्थानीय JSON कैश, नाम से कुंजीयन। |
| `output.txt` | `-re` फ़्लैग | सभी कंसोल आउटपुट का समय-मुद्रांकित दर्पण। |
| `session.har` | `auth-interactive` / `browser-sso` | ब्राउज़र सत्र रिकॉर्डिंग (जब तक `-k` सेट न हो, हटा दी जाती है)। |
| `<name>.json` | `-j` फ़्लैग / `gather-all` | सहेजे गए API प्रतिक्रियाएँ। |
### बंडल डेटा फ़ाइलें
| फ़ाइल | विवरण |
|------|-------------|
| `includes/auth_apps.json` | स्प्रेइंग और `interest` सूचियों के लिए उपयोग किए जाने वाले लक्ष्य अनुप्रयोग आईडी। |
| `includes/apps.json` | `knownids` के लिए ज्ञात Microsoft ऐप आईडी और मेटाडेटा। |
| `includes/Webserver.py` | `auth-app` के लिए PKCE रीडायरेक्ट को लागू करने वाला स्थानीय HTTPS लिसनर। |
| `includes/PRT.py` | PRT-मिंटिंग श्रृंखला (डिवाइस पंजीकरण → PRT → `x-ms-RefreshTokenCredential` कुकी) जिसका उपयोग `browser-sso -aprt` द्वारा किया जाता है। |
| `includes/web/cert.pem`, `includes/web/key.pem` | स्थानीय लिसनर के लिए TLS सामग्री। |
---
## नोट्स और सुझाव
- **डिफ़ॉल्ट ऐप आईडी** (`d3590ed6-52b3-4102-aeff-aad2292ab01c`) Microsoft Office का प्रथम-पक्ष क्लाइंट है, जो अधिकांश प्रवाहों के लिए काम करता है। कुछ गतिविधियों द्वारा मुद्रित संकेत व्यापक पहुंच के लिए टोकन को **Microsoft Azure CLI** ऐप (`04b07795-8ddb-461a-bbee-02f9e1bf7b46`) तक विस्तारित करने का सुझाव देते हैं।
- **स्कोप मार्गदर्शन:** पासवर्ड स्प्रेइंग के लिए `-sc openid` का उपयोग करें और Graph संचालन के लिए `-sc 'https://graph.microsoft.com/.default'` का उपयोग करें।
- **`--beta`** `list-users` / `list-applications` को Graph बीटा एंडपॉइंट पर स्विच करता है, जो अतिरिक्त जानकारी (जैसे ऑन-प्रिम सिंक विशेषताएँ) प्रकट कर सकता है।
- **`auth-app` TLS:** स्थानीय PKCE लिसनर को `includes/web/cert.pem` और `includes/web/key.pem` पर एक प्रमाणपत्र/कुंजी जोड़ी की आवश्यकता होती है। यदि वे गायब हैं, तो एक स्व-हस्ताक्षरित जोड़ी उत्पन्न करें, उदाहरण के लिए: ```bash
openssl req -x509 -newkey rsa:2048 -nodes \
-keyout includes/web/key.pem -out includes/web/cert.pem -days 365 -subj "/CN=localhost"
-d उच्च-स्तरीय डीबग जानकारी प्रिंट करता है; -dd पूर्ण HTTP अनुरोध और प्रतिक्रिया (हेडर + बॉडी) डंप करता है — यह विफल टोकेन एक्सचेंजों के निदान के लिए उपयोगी है।-br/--browser). ब्राउज़र फ़्लो (auth-interactive, browser-sso) एक headed Playwright ब्राउज़र चलाते हैं। इंजन डिफ़ॉल्ट रूप से firefox होता है (WSLg के तहत सबसे विश्वसनीय headed इंजन); -br chromium या -br webkit के साथ स्विच करें। एक बार चुने गए इंजन को python -m playwright install <engine> से इंस्टॉल करें।/dev/dxg, d3d12 Mesa ड्राइवर द्वारा संचालित) को उजागर करता है जिसे ब्राउज़र का GPU/कम्पोज़िटर प्रक्रिया उपयोग करने का प्रयास करती है, जबकि WSL VM का डिफ़ॉल्ट /dev/shm बहुत छोटा होता है (अक्सर 64 MB)। दोनों मिलकर — GPU प्रक्रिया एक ऐसे उपकरण पर घूमती है जिसे वह चला नहीं सकती और शेयर्ड-मेमोरी कम्पोज़िटर को समाप्त कर देता है — इसलिए कुछ भी रेंडर नहीं होता और VM तब तक फूलता रहता है जब तक Windows होस्ट थ्रैश नहीं करता। एक द्वितीयक योगदानकर्ता था : Microsoft लॉगिन पेज लॉन्ग-पोल करता है, इसलिए कभी फायर नहीं होता और नेविगेशन एक खाली पेज पर टाइमआउट तक ब्लॉक रहता है।
Mr.Un1k0d3r द्वारा बनाया गया — TrueCyber Inc.
browser-sso) — एक वास्तविक ब्राउज़र पहले से उपयोगकर्ता के रूप में प्रमाणित सीधे लक्ष्य वेब ऐप (Outlook on the web, Teams, SharePoint, Azure पोर्टल, ...) में खोलें। -aprt/--auto-prt के साथ यह एक रिफ़्रेश टोकन से प्राथमिक रिफ़्रेश टोकन (PRT) कुकी को स्वचालित रूप से मिंट करता है (डिवाइस पंजीकरण → PRT → x-ms-RefreshTokenCredential), ताकि एक नया ब्राउज़र बिना मैन्युअल लॉगिन के सिंगल साइन-ऑन पूरा करे।| गतिविधि | आवश्यक | वैकल्पिक | विवरण |
|---|
id | -t | — | किसी दिए गए ईमेल डोमेन के लिए टेनेंट आईडी का पता लगाएं। |
phish-start | — | -app, -tid, -as, -s, -n | डिवाइस-कोड फ्लो शुरू करें; उपयोगकर्ता कोड प्रिंट करता है और (डिफ़ॉल्ट रूप से) स्वचालित रूप से कैप्चर करता है। |
phish-capture | -c | -app, -tid, -s, -n | पहले जारी किए गए डिवाइस कोड का उपयोग करके टोकन के लिए पोल करें। |
auth | -u, -p, -tid, -app, -v | -s, -n | उपयोगकर्ता नाम/पासवर्ड (ROPC) के साथ प्रमाणित करें। |
auth-app | -tid | -s, -n | स्थानीय HTTPS लिसनर के माध्यम से प्राधिकरण-कोड + PKCE फ्लो। |
auth-interactive | — | -url, -k, -n | एक ब्राउज़र (Playwright) खोलें, उपयोगकर्ता को लॉग इन करने दें, और सत्र HAR से टोकन निकालें। हमेशा स्वचालित रूप से सहेजता है। |
refresh | -v, -app, और (-l) या (-r + -tid) | -s, -n | एक रिफ्रेश टोकन को एक नए एक्सेस टोकन के लिए विनिमय करें। |
obo | -tid, -app, और (-ac) या (-l) | -cs, -au, -sc, -s, -n | ऑन-बिहाफ-ऑफ: एक जारी एक्सेस टोकन को किसी अन्य संसाधन पर लक्षित टोकन के लिए विनिमय करें। |
browser-sso | -app, और (-l) या (-r + -tid) | -aprt, -url, -prt, -v, -k, -s, -n | उपयोगकर्ता के रूप में पहले से प्रमाणित ब्राउज़र खोलें। रिफ्रेश टोकन से स्वचालित रूप से PRT कुकी बनाने के लिए -aprt जोड़ें, -prt के साथ तैयार कुकी का बीजारोपण करें, या टोकन रूपांतरण + मैनुअल लॉगिन पर वापस आ जाएं। |
| गतिविधि | आवश्यक | वैकल्पिक | विवरण |
|---|
self | Token | — | वर्तमान उपयोगकर्ता की प्रोफ़ाइल प्रदर्शित करें (/me)। |
email | Token, -fl | — | साइन-इन उपयोगकर्ता के मेलबॉक्स में एक कीवर्ड खोजें। |
permission | Token | — | टेनेंट प्राधिकरण नीति दिखाएं (बीटा)। |
list-users | Token | -j, -beta, -fl, -exp | सभी उपयोगकर्ताओं की गणना करें। |
list-applications | Token | -j, -beta, -fl, -exp | सभी अनुप्रयोगों की गणना करें। |
list-principals | Token | -j, -fl, -exp | सभी सेवा प्रिंसिपलों की गणना करें। |
register-app | Token, -n | — | एक नया अनुप्रयोग पंजीकृत करें (1-वर्षीय क्लाइंट सीक्रेट के साथ)। |
new-group | Token, -n | — | एक नया सुरक्षा समूह बनाएं। |
add-group | Token, -uid | -gid | एक प्रिंसिपल को निर्देशिका भूमिका असाइन करें (डिफ़ॉल्ट भूमिका = ग्लोबल एडमिन)। |
push-file | Token, -fp, -n | — | उपयोगकर्ता के वनड्राइव पर एक स्थानीय फ़ाइल अपलोड करें। |
gather-all | Token | -j | उपयोगकर्ताओं, समूहों, एप्लिकेशन, एसपी, भूमिकाओं, नीतियों और अनुदानों का बल्क-संग्रह करें। |
raw-url | Token, -url | -j, -fl, -exp | किसी भी ग्राफ/आरईएसटी यूआरएल पर रॉ GET जारी करें (@odata.nextLink पेजिंग को संभालता है)। |
invite | Token, -n | -url | एक बाहरी (अतिथि) उपयोगकर्ता को आमंत्रित करें। -n आमंत्रित व्यक्ति का ईमेल है। |
magic-app | Token | — | AllPrincipals सहमति, appRoleAssignmentRequired=false, और सार्वजनिक रीडायरेक्ट यूआरआई वाले एप्लिकेशन खोजें। |
| गतिविधि | आवश्यक | वैकल्पिक | विवरण |
|---|
knownids | — | -fl, -exp | ज्ञात Microsoft एप्लिकेशन आईडी सूचीबद्ध करें (includes/apps.json). |
list-interest | — | — | includes/auth_apps.json में परिभाषित ऐप श्रेणियों को सूचीबद्ध करें। |
interest | — | -i, -ty | दिलचस्प ऐप आईडी सूचीबद्ध करें; -i केवल आईडी प्रिंट करता है, -ty श्रेणी के अनुसार फ़िल्टर करता है। |
| python3 AzureRedOps.py -a knownids | |||
| python3 AzureRedOps.py -a list-interest | |||
| python3 AzureRedOps.py -a interest -ty all_users | |||
| python3 AzureRedOps.py -a interest -i # IDs only |
/dev/shmpage.goto(..., wait_until="networkidle")networkidle--no-sandbox --disable-gpu --disable-dev-shm-usage मिलता है, Firefox को gfx.webrender.force-disabled / layers.acceleration.disabled मिलता है — CPU (सॉफ़्टवेयर) रेंडरिंग पर वापस आ जाता है ताकि पेज फिर भी रेंडर हो और पूरी तरह से इंटरैक्टिव हो। अब प्रत्येक नेविगेशन networkidle के बजाय domcontentloaded की प्रतीक्षा करता है। आपको बस एक काम करता हुआ ब्राउज़र देखना चाहिए।/dev/shm बढ़ाएँ (sudo mount -o remount,size=1g /dev/shm), सुनिश्चित करें कि आप WSL 2 with WSLg पर हैं (wsl --update; echo $DISPLAY खाली नहीं होना चाहिए), और पुष्टि करें कि ब्राउज़र रनटाइम venv में स्थापित है (python -m playwright install firefox और python -m playwright install-deps)।