
Azure RedOps هو مجموعة أدوات أمنية هجومية لتقييم الوضع الأمني لـ Microsoft Entra ID
أداة Swiss Army لعمليات الفريق الأحمر على Azure / Entra ID.
المؤلف: Mr.Un1k0d3r (TrueCyber Inc) الإصدار: 0.1 اللغة: Python 3.12+
AzureRedOps عبارة عن مجموعة أدوات أمنية هجومية لتقييم الوضع الأمني لمستأجري Microsoft Entra ID وAzure. يغلف سير العمل الأكثر شيوعًا للفريق الأحمر — المصادقة، وإدارة الرموز، وتعداد الدليل، والتحقق من الامتيازات، ورش كلمات المرور، وإجراءات ما بعد الاستغلال ضد Microsoft Graph — خلف واجهة CLI واحدة متسقة تعتمد على --activity.
يتم تحديد كل عملية باستخدام -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 / الوصول الشرطي / SSO)، ثم اجمع كل رمز من جلسة HAR المسجلة.refresh) — استبدل رمز التحديث برموز وصول جديدة.obo) — استبدال رمز وصول صادر مسبقًا برمز جديد مخصص لمورد نهائي (OAuth 2.0 jwt-bearer / OBO).browser-sso) — افتح متصفحًا حقيقيًا مباشرة في تطبيق الويب المستهدف (Outlook على الويب، Teams، SharePoint، بوابة Azure، ...). مع يقوم تلقائيًا بسك ملف تعريف ارتباط من رمز التحديث (تسجيل الجهاز → PRT → )، بحيث يكمل متصفح جديد تسجيل الدخول الأحادي دون تسجيل دخول يدوي.gather-all الشامل.spray) ورش رموز التحديث عبر التطبيقات (spray-refresh).magic-app التطبيقات القابلة لإعادة التوجيه علنًا بموافقة AllPrincipals؛ وقوائم مدمجة بمعرّفات تطبيقات Microsoft المعروفة/المهمة.requirements.txt):
PyJWTrequestsplaywrightcryptography (مطلوب فقط لـ browser-sso -aprt، تدفق PRT التلقائي)auth-interactive، browser-sso). Firefox هو المحرك الافتراضي (-br/--browser)؛ قم بتثبيته باستخدام python -m playwright install firefox.includes/web/cert.pem وincludes/web/key.pem (مطلوبة فقط لتدفق 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]
### تقديم رمز مميز (Token)
الأنشطة التي تستدعي Microsoft Graph تحتاج إلى رمز وصول (access token). يمكنك توفيره بطريقتين:
| الطريقة | العلامة | مثال |
|--------|------|---------|
| تمرير رمز مميز خام | `-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`) يمكنه **حفظها تلقائيًا** في
مخزن الاعتماديات المحلي (`.azure_creds`) عن طريق إضافة `-s/--save` مع
`-n/--name`:```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 هو المفتاح الذي يُخزَّن تحته الرمز المميز (token). يمكنك لاحقًا إعادة استخدامه مع
-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) تقبل -j/--json <filename> لكتابة استجابة API الخام
في ملف JSON بدلاً من طباعتها (أو بالإضافة إلى طباعتها):```bash
python3 AzureRedOps.py -a list-users -l victim1 -j users.json
بالنسبة إلى `gather-all`، يُستخدم اسم الملف المقدَّم كلاحقة ويُكتب ملف واحد
لكل نقطة نهاية في Graph (مثل `users-<name>`، `groups-<name>`، ...).
> ملاحظة: يتحكم `-j` في تصدير JSON المنظّم، بينما يقوم `-re/--redirect-to-file` بعكس
> مخرجات وحدة التحكم المنسّقة إلى `output.txt`. الاثنان مستقلان عن بعضهما.
### معرّفات المستأجر (Tenant)
- `-t, --tenant` يتوقع **اسم نطاق** (مثل `contoso.com`) ويُستخدم في نشاط `id`.
- `-tid, --tenant-id` يتوقع **GUID المستأجر** أو `common`، ويُستخدم في أنشطة المصادقة.
---
## خيارات سطر الأوامر
| Short | Long | Default | Description |
|-------|------|---------|-------------|
| `-a` | `--activity` | `id` | **(مطلوب)** النشاط المطلوب تنفيذه (انظر [Activities](#activities)). |
| `-ac` | `--access-token` | | رمز وصول Azure. |
| `-n` | `--name` | | الاسم المستخدم لحفظ/تحميل رمز، أو اسم العرض لـ `register-app`/`new-group`/`invite`. |
| `-t` | `--tenant` | | اسم **نطاق** مستأجر Azure (يستخدمه `id`). |
| `-c` | `--devicecode` | | رمز الجهاز (يستخدمه `phish-capture`). |
| `-tid` | `--tenant-id` | | **معرّف** مستأجر Azure (GUID) أو `common`. |
| `-app` | `--appid` | `d3590ed6-52b3-4102-aeff-aad2292ab01c` | معرّف التطبيق (العميل). |
| `-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` | بعد تسجيل دخول ناجح عبر الحقن (spray)، التحقق من إمكانية تعداد المستخدمين/التطبيقات. |
| `-uid` | `--uid` | | معرّف كائن مستخدم Azure (يستخدمه `add-group`). |
| `-headers` | `--headers` | | رؤوس HTTP إضافية بصيغة JSON، مثل `{"X-Foo": "bar"}`. |
| `-gid` | `--gid` | `62e90394-69f5-4237-91f9-056ad24d70a7` | معرّف دور الدليل / المجموعة (الافتراضي = **مسؤول عام**). |
| `-i` | `--id` | `False` | بالنسبة لـ `interest`: طباعة معرّفات التطبيقات فقط. |
| `-ty` | `--type` | | بالنسبة لـ `interest`: التصفية حسب فئة معيّنة. |
| `-fp` | `--filepath` | | الملف المراد رفعه (`push-file`) أو قائمة تطبيقات مخصصة للحقن (spraying). |
| `-v` | `--version` | `v2.0` | إصدار واجهة برمجة تطبيقات المصادقة: `v0` أو `v2.0`. |
| `-ua` | `--user-agent` | *(سلسلة Chrome UA)* | تجاوز `User-Agent` الخاص بـ HTTP. |
| `-au` | `--audience` | `https://graph.microsoft.com` | الجمهور/الموارد الخاص بالرمز. |
| `-sc` | `--scope` | `openid offline_access` | نطاق OAuth2. استخدم `https://graph.microsoft.com/.default` لـ Graph، و`openid` للحقن. |
| `-url` | `--url` | | عنوان URL المستهدف لـ `raw-url`/`invite`؛ قائمة عناوين URL مفصولة بفواصل لـ `auth-interactive`. |
| `-beta` | `--beta` | `False` | استخدام نقطة نهاية Microsoft Graph **التجريبية** لـ `list-users`/`list-applications`. |
| `-exp` | `--expand` | `False` | توسيع القوائم/القواميس المتداخلة في المخرجات إلى تنسيق قابل للقراءة البشرية. |
| `-k` | `--keep` | `False` | الاحتفاظ بملف `session.har` بعد `auth-interactive` / `browser-sso`. |
| `-cs` | `--client-secret` | | سر العميل السري المستخدم في منح On-Behalf-Of الخاص بـ `obo`. |
| `-prt` | `--prt-cookie` | | قيمة ملف تعريف ارتباط PRT (`x-ms-RefreshTokenCredential`) لتغذية SSO بالمتصفح لـ `browser-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` | تفعيل تسجيل التصحيح (debug logging). |
| `-dd` | `--verbose-debug` | `False` | تفعيل تسجيل مفصّل لطلبات/استجابات HTTP. |
| `-re` | `--redirect-to-file` | `False` | عكس جميع مخرجات وحدة التحكم إلى `output.txt`. |
---
## الأنشطة
فيما يلي، يسرد كل نشاط وسيطاته **المطلوبة** و*الاختيارية*.
"Token" تعني أن `-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 للأجهزة المقيدة بالإدخال،
مما يجعلها أداة تصيد قوية: تطلب رمزًا باسم تطبيق Microsoft من الطرف الأول،
ثم تدفع هدفًا عبر الهندسة الاجتماعية إلى إدخال هذا الرمز على
`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'` للحصول على
رمز جاهز لـ Graph مع رمز تحديث.```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 كامل مع PKCE مقابل تسجيل تطبيق خارجي (غير افتراضي). تشغّل الأداة مستمع HTTPS محليًا (includes/Webserver.py، على https://localhost:2342) يعمل كـ URI إعادة توجيه OAuth، وتولّد زوج PKCE code_verifier/code_challenge، وتطبع عنوان URL للتفويض لتفتحه في المتصفح. بعد موافقتك، يعيد Azure توجيه رمز التفويض إلى المستمع المحلي، ثم تقوم الأداة باستبداله بالرموز المميزة (tokens).
هذا هو التدفق الذي يجب استخدامه عندما تتحكم في تطبيق (أو تكون قد سجلّته) وتريد توجيه الموافقة عبر جلسة متصفح حقيقية — وهو مفيد لسيناريوهات من نوع الموافقة غير المشروعة (illicit-consent) أو عندما يكون ROPC محظورًا.
includes/web/cert.pem و includes/web/key.pem (راجع الملاحظات حول كيفية توليدهما).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 نيابةً عن (grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer).
يأخذ رمز وصول صادر مسبقًا كتأكيد (assertion) ويبادله
برمز جديد تمامًا موجّه إلى مورد سفلي مختلف — دون إعادة مصادقة
المستخدم.
-ac/--access-token أو رمز مخزّن مؤقتًا عبر
-l/--load-access-token.-app/--appid + -cs/--client-secret يحدّدان العميل السري (confidential client) الذي ينفّذ
عملية التبادل. يتطلب 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 على الويب**. هذا هو
تدفق «فقط افتح المتصفح واحصل على جلسة صالحة». يحصل المتصفح على جلسته بإحدى
ثلاث طرق، حسب ترتيب الأفضلية:
**1. `-aprt/--auto-prt` — سكّ ملف تعريف ارتباط PRT تلقائيًا (موصى به).**
تحوِّل الأداة رمز التحديث بالكامل إلى **رمز التحديث الأساسي (PRT)** وإلى ملف تعريف الارتباط الخاص به في المتصفح
ثم تزرعه بحيث يُكمل ESTS الخاص بـ Entra عملية SSO دون تسجيل دخول يدوي.
السلسلة (في `includes/PRT.py`، بروتوكول ROADtoken / roadtx / AADInternals) هي:
1. استبدِل رمز التحديث برمز **تسجيل الجهاز (DRS)**.
2. **سجِّل جهازًا** لدى Azure AD → شهادة الجهاز + مفتاح النقل.
3. اطلب **PRT + مفتاح جلسة** باستخدام رمز التحديث، موقَّعًا بشهادة الجهاز.
4. **اشتقِ ملف تعريف الارتباط `x-ms-RefreshTokenCredential`** (KDFv2: KDF SP800-108 عبر `SHA256(ctx‖decoded-payload-bytes)` → JWT موقَّع بـ HS256؛ KDFv1 → `AADSTS5000611`، بايتات خاطئة → `AADSTS50058`)
وازرعه في سياق متصفح جديد.
يُزرع ملف تعريف الارتباط بقيمة `SameSite=None` ويُستخدم عبر **إحماء `/authorize` من ESTS على
المستوى الأعلى** (عميل Office `landingv2`) بحيث يُسَكّ ملف تعريف ارتباط الجلسة `ESTSAUTH`
كطرف أول — بعدها يُفتح التطبيق الهدف مسجَّل الدخول بالفعل. يُشتق ملف تعريف الارتباط باستخدام
nonce جديد قبل الانتقال مباشرةً وتُعاد المحاولة مرة واحدة؛ إذا ما زال 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).
> - **تسجيل الجهاز يكتب كائن جهاز في المستأجر (tenant)** — فهو ليس صامتًا و
> يترك أثرًا (ويتطلب أن يكون المستخدم مخوَّلًا بضم/تسجيل الأجهزة).
**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` — أو مرّر واحدًا أو أكثر من عناوين URL الخام `https://`
(مفصولة بفواصل). الافتراضي هو `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
### رش كلمات المرور
| النشاط | مطلوب | اختياري | الوصف |
|----------|----------|----------|-------------|
| `spray` | `-u`, `-p`, `-tid` | `-fp`, `-cp` | رشّ بيانات الاعتماد ضد معرّفات تطبيقات الطرف الأول المعروفة (واجهات برمجة التطبيقات v0 + v2.0). |
| `spray-refresh` | `-v`, و (`-l`) **أو** (`-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` | معرّفات التطبيقات المستهدفة المستخدمة في الرش (spraying) وقوائم الاهتمام. |
| `includes/apps.json` | معرّفات تطبيقات Microsoft المعروفة وبياناتها الوصفية لـ `knownids`. |
| `includes/Webserver.py` | مستمع HTTPS محلي ينفّذ إعادة توجيه PKCE لـ `auth-app`. |
| `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` لرشّ كلمات المرور (password spraying) و `-sc 'https://graph.microsoft.com/.default'` لعمليات Graph.
- **`--beta`** يحوّل `list-users` / `list-applications` إلى نقطة نهاية Graph التجريبية، والتي يمكن أن تُظهر معلومات إضافية (مثل سمات المزامنة المحلية (on-prem)).
- **`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) تشغّل متصفح Playwright بواجهة مرئية. المحرك الافتراضي هو firefox
(أكثر محرك موثوق بواجهة مرئية تحت WSLg)؛ يمكنك التبديل باستخدام -br chromium أو -br webkit.
ثبّت المحرك الذي تختاره مرة واحدة باستخدام python -m playwright install <engine>./dev/dxg، مدفوعة ببرنامج تشغيل d3d12 Mesa driver) التي
تحاول عملية GPU/compositor الخاصة بالمتصفح استخدامها، بينما يكون /dev/shm الافتراضي في VM الخاص بـ WSL
صغيرًا جدًا (غالبًا 64 ميجابايت). ويتضافر الأمران — تدور عملية GPU على جهاز لا يمكنها تشغيله
ويستنفد مُركّب الذاكرة المشتركة — لذلك لا يُعرض أي شيء ويتضخم VM
حتى ينهار مضيف Windows. وكان هناك عامل مساهم ثانوي هو
: صفحة تسجيل الدخول من Microsoft تستخدم الاستطلاع الطويل، لذلك
لا يتم تشغيل أبدًا ويُحجب التنقل على صفحة فارغة حتى انتهاء المهلة.
تم الإنشاء بواسطة Mr.Un1k0d3r — TrueCyber Inc.
-aprt/--auto-prtx-ms-RefreshTokenCredential| النشاط | مطلوب | اختياري | الوصف |
|---|
id | -t | — | حدّد معرّف المستأجر (Tenant ID) لنطاق بريد إلكتروني معيّن. |
phish-start | — | -app, -tid, -as, -s, -n | ابدأ تدفق رمز الجهاز (device-code flow)؛ يطبع رمز المستخدم ويلتقطه تلقائيًا (بشكل افتراضي). |
phish-capture | -c | -app, -tid, -s, -n | استعلم عن الرموز المميزة باستخدام رمز جهاز تم إصداره مسبقًا. |
auth | -u, -p, -tid, -app, -v | -s, -n | صادِق باستخدام اسم المستخدم وكلمة المرور (ROPC). |
auth-app | -tid | -s, -n | تدفق رمز التفويض (Authorization-Code) + PKCE عبر مستمع HTTPS محلي. |
auth-interactive | — | -url, -k, -n | شغّل متصفحًا (Playwright)، واترك المستخدم يسجّل الدخول، واجمع الرموز من ملف HAR الخاص بالجلسة. يحفظ دائمًا تلقائيًا. |
refresh | -v, -app, و (-l) أو (-r + -tid) | -s, -n | استبدل رمز التحديث (refresh token) برمز وصول جديد. |
obo | -tid, -app, و (-ac) أو (-l) | -cs, -au, -sc, -s, -n | On-Behalf-Of: استبدل رمز وصول صادر برمز مقيّد بنطاق مورد آخر. |
browser-sso | -app, و (-l) أو (-r + -tid) | -aprt, -url, -prt, -v, -k, -s, -n | افتح متصفحًا مصادقًا بصفة المستخدم بالفعل. أضف -aprt لسكّ ملف تعريف ارتباط PRT تلقائيًا من رمز التحديث، أو أدخل واحدًا جاهزًا باستخدام -prt، أو ارجع إلى تحويل الرمز مع تسجيل الدخول اليدوي. |
| النشاط | مطلوب | اختياري | الوصف |
|---|
self | Token | — | عرض ملف التعريف الخاص بالمستخدم الحالي (/me). |
email | Token, -fl | — | البحث في صندوق بريد المستخدم المُسجَّل دخوله عن كلمة مفتاحية. |
permission | Token | — | عرض سياسة تخويل المستأجر (beta). |
list-users | Token | -j, -beta, -fl, -exp | تعداد جميع المستخدمين. |
list-applications | Token | -j, -beta, -fl, -exp | تعداد جميع التطبيقات. |
list-principals | Token | -j, -fl, -exp | تعداد جميع كيانات الخدمة. |
register-app | Token, -n | — | تسجيل تطبيق جديد (مع سر عميل لمدة عام واحد). |
new-group | Token, -n | — | إنشاء مجموعة أمان جديدة. |
add-group | Token, -uid | -gid | إسناد دور دليل إلى كيان أساسي (الدور الافتراضي = Global Admin). |
push-file | Token, -fp, -n | — | رفع ملف محلي إلى OneDrive الخاص بالمستخدم. |
gather-all | Token | -j | جمع شامل للمستخدمين والمجموعات والتطبيقات وكيانات الخدمة والأدوار والسياسات والمنح. |
raw-url | Token, -url | -j, -fl, -exp | إرسال طلب GET خام إلى أي عنوان Graph/REST URL (يتعامل مع ترقيم صفحات @odata.nextLink). |
invite | Token, -n | -url | دعوة مستخدم خارجي (ضيف). -n هو البريد الإلكتروني للمدعو. |
magic-app | Token | — | البحث عن التطبيقات التي لديها موافقة AllPrincipals، وappRoleAssignmentRequired=false، وعناوين URI عامة لإعادة التوجيه. |
| النشاط | مطلوب | اختياري | الوصف |
|---|
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 (البرمجي) حتى تظل الصفحة
تُعرض وتكون تفاعلية بالكامل. كل عملية تنقّل تنتظر الآن
domcontentloaded بدلاً من networkidle. يجب أن ترى ببساطة متصفحًا يعمل./dev/shm (sudo mount -o remount,size=1g /dev/shm)،
وتأكد من أنك على WSL 2 مع WSLg (wsl --update؛ يجب أن يكون echo $DISPLAY
غير فارغ)، وتحقق من تثبيت بيئة تشغيل المتصفح في البيئة الافتراضية (venv)
(python -m playwright install firefox و python -m playwright install-deps).