Skip to content
KitploitKITPLOIT
ИнструментыБлог
Отправить
ИнструментыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

Kitploit — это каталог инструментов для хакинга, кибербезопасности и пентестинга. Находите последние обновления проектов для поиска уязвимостей, анализа систем, автоматизации тестирования и усиления вашей безопасности.

··Ленты·Контакты·Конфиденциальность·© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
AzureRedOps — Azure RedOps — это инструментарий наступательной безопасности для оценки безопасности Microsoft Entra ID | Kitploit
Инструменты/GitHubGitHub/mr-un1k0d3r/azureredops
Инструменты фишингаПовышение привилегийРазведкаАтаки на ПаролиЭксплуатацияСбор информацииПост-эксплуатацияТестирование на ПроникновениеБезопасность облачных средАутентификацияRed Teaming
180181 месяц назадПроверено Kitploit

Популярное

Смотреть все →

Откройте для себя самые используемые инструменты нашего сообщества.

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →
Поделиться
GitHub
mr-un1k0d3r/azureredops

AzureRedOps

Azure RedOps — это инструментарий наступательной безопасности для оценки безопасности Microsoft Entra ID

Репозиторий

AzureRedOps

Инструмент «швейцарский нож» для проведения 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.
  • Несколько потоков аутентификации:
    • ROPC (auth) — прямая аутентификация по имени пользователя и паролю.
    • Фишинг с кодом устройства (phish-start / phish-capture) — злоупотребление OAuth-грантом авторизации устройства для захвата токенов, выдаваемых, когда цель вводит ваш код пользователя на microsoft.com/devicelogin. Автоматический захват по умолчанию.
    • Согласие стороннего приложения (auth-app) — полный поток кода авторизации + PKCE для пользовательской регистрации приложения, обслуживаемый встроенным локальным HTTPS-слушателем, который принимает перенаправление.
    • Интерактивный захват браузера (auth-interactive) — управление реальным браузером (Playwright; Firefox по умолчанию, -br для переключения) (обрабатывает MFA / Conditional Access / SSO), затем извлечение всех токенов из записанного HAR сессии.

Требования

  • Python 3.12 или новее (код полагается на синтаксис f-строк PEP 701).
  • Пакеты Python (см. requirements.txt):
    • PyJWT
    • requests
    • playwright
    • cryptography (нужен только для browser-sso -aprt, авто-PRT потока)
  • Среда выполнения браузера Playwright для браузерных потоков (auth-interactive, browser-sso). Firefox — движок по умолчанию (-br/--browser); установите его с помощью python -m playwright install firefox.
  • Сертификат и ключ TLS в includes/web/cert.pem и includes/web/key.pem (нужны только для потока PKCE auth-app — см. ).

Установка

---```bash

Clone the repository

git clone AzureRedOps cd AzureRedOps

Create and activate a virtual environment

python3 -m venv AzureRedOps source AzureRedOps/bin/activate # Linux / macOS

.\AzureRedOps\Scripts\Activate.ps1 # Windows PowerShell

Install dependencies

pip install -r requirements.txt

Install the browser used by the browser flows (one-time).

Firefox is the default engine; install the one(s) you plan to use with -br.

python -m playwright install firefox

python -m playwright install chromium webkit # optional, for -br chromium/webkit

python -m playwright install-deps # Linux/WSL: pull system libs

root@kitploit:~
Запустите инструмент:```bash
python3 AzureRedOps.py -a <activity> [options]

Использование

Общий шаблон вызова:```bash python3 AzureRedOps.py -a [authentication] [activity options] [global options]

root@kitploit:~
### Предоставление токена

Действия, вызывающие 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

Dump every user to users.json

python3 AzureRedOps.py -a list-users -l victim1 -j users.json

root@kitploit:~
Для `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

Обнаружение клиента и аутентификация

Resolve a tenant ID from a domain

python3 AzureRedOps.py -a id -t contoso.com

Device-code phishing (auto-capture is on by default)

python3 AzureRedOps.py -a phish-start -tid common -app d3590ed6-52b3-4102-aeff-aad2292ab01c

Capture later with a previously issued device code

python3 AzureRedOps.py -a phish-capture -c -tid common

Username / password (ROPC)

python3 AzureRedOps.py -a auth -u [email protected] -p 'P@ssw0rd!' -tid

Interactive browser capture, saving tokens automatically

python3 AzureRedOps.py -a auth-interactive -url https://portal.azure.com -s -n harvested

Refresh a saved token

python3 AzureRedOps.py -a refresh -l mytoken -app d3590ed6-52b3-4102-aeff-aad2292ab01c

On-Behalf-Of: exchange an issued token for a Graph-scoped token

python3 AzureRedOps.py -a obo -l mytoken -tid -app -cs -au https://graph.microsoft.com

Convert an issued token into an Outlook-on-the-web session and open it in a browser

python3 AzureRedOps.py -a browser-sso -l mytoken -url outlook -prt

root@kitploit:~
#### Как работают потоки аутентификации

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 заблокирован.

  • Требуется пара TLS-сертификат/ключ в includes/web/cert.pem и includes/web/key.pem (см. Примечания о том, как их сгенерировать).
  • ID клиента по умолчанию для этого потока: 8545b2fc-a69c-4851-9206-0f74a519fe5f.```bash python3 AzureRedOps.py -a auth-app -tid -s -n consented
root@kitploit:~
##### Интерактивная аутентификация в браузере (`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
Обмен токена On-Behalf-Of (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.```bash

Exchange an issued token for a Microsoft Graph token on behalf of the user

python3 AzureRedOps.py -a obo -l mytoken -tid
-app -cs -au https://graph.microsoft.com -s -n obo-graph

root@kitploit:~
##### Одноразовый вход с токена в браузер (`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

Microsoft Graph Operations

Who am I?

python3 AzureRedOps.py -a self -l mytoken

Enumerate users (beta endpoint, save to JSON, only show some fields)

python3 AzureRedOps.py -a list-users -l mytoken -beta -j users.json -fl displayName,userPrincipalName

Register an application

python3 AzureRedOps.py -a register-app -n EvilApp -l mytoken

Assign Global Admin to a user

python3 AzureRedOps.py -a add-group -uid -l mytoken

Upload a file to OneDrive

python3 AzureRedOps.py -a push-file -fp ./payload.docx -n payload.docx -l mytoken

Query an arbitrary Graph URL

python3 AzureRedOps.py -a raw-url -url "https://graph.microsoft.com/beta/users" -l mytoken

Invite an external user

python3 AzureRedOps.py -a invite -n [email protected] -url https://example.com/invite -l mytoken

Hunt for exploitable public apps

python3 AzureRedOps.py -a magic-app -l mytoken

root@kitploit:~
### Перебор паролей

| Действие | Обязательно | Опционально | Описание |
|----------|----------|----------|-------------|
| `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

Разведка и обнаружение

root@kitploit:~
---

## Вывод и созданные файлы

| Файл | Создан с помощью | Описание |
|------|-----------|-------------|
| `.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>.
  • Playwright в WSL — пустое окно / зависание всей машины. В WSL/WSLg видимый браузер может открыться пустым и никогда не отрисовываться, пока вся хост-машина зависает. Коренная причина: WSLg предоставляет виртуализированный GPU (/dev/dxg, управляемый драйвером d3d12 Mesa), который процесс GPU/композитора браузера пытается использовать, в то время как значение по умолчанию /dev/shm виртуальной машины WSL крошечное (обычно 64 МБ). Два фактора объединяются — процесс GPU крутится на устройстве, которым он не может управлять, а композитор разделяемой памяти истощает — поэтому ничего не отображается, и виртуальная машина раздувается, пока хост Windows не начнет тормозить. Дополнительным фактором было : страница входа Microsoft использует long-polling, поэтому никогда не срабатывает, и навигация блокируется на пустой странице до тайм-аута.

Благодарности

Создано Mr.Un1k0d3r — TrueCyber Inc.

Скачать инструмент
  • Обмен токена обновления (refresh) — обмен токена обновления на новые токены доступа.
  • Грант On-Behalf-Of (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), так что новый браузер выполняет единый вход без ручного входа.
  • Перечисление каталогов через Microsoft Graph — пользователи, приложения, субъекты-службы, политики авторизации и массовый сборщик gather-all.
  • Подбор паролей (password spraying) по известным идентификаторам приложений Microsoft первого уровня (spray) и межприложечный подбор токенов обновления (spray-refresh).
  • Пост-эксплуатация — регистрация приложений, создание групп, назначение ролей каталога, приглашение внешних (гостевых) пользователей и загрузка файлов в OneDrive.
  • Помощники разведки — magic-app находит приложения с публичной перенаправляемостью и согласием AllPrincipals; встроенные списки известных/интересных идентификаторов приложений Microsoft.
  • Улучшения удобства — переключение бета-конечной точки, пользовательские заголовки, пользовательский User-Agent/область/аудитория, фильтрация атрибутов, расширенный вывод, отладочное/подробное HTTP-логирование и перенаправление вывода в файл.
  • Примечания
    ДействиеОбязательноНеобязательноОписание
    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, -nOn-Behalf-Of: обменять выданный access token на токен, ограниченный другим ресурсом.
    browser-sso-app, и (-l) или (-r + -tid)-aprt, -url, -prt, -v, -k, -s, -nОткрыть браузер, уже аутентифицированный как пользователь. Добавьте -aprt для автоматического создания PRT-куки из refresh token, укажите готовую с помощью -prt или вернитесь к преобразованию токена + ручному входу.
    ActivityRequiredOptionalDescription
    selfToken—Отобразить профиль текущего пользователя (/me).
    emailToken, -fl—Поиск ключевого слова в почтовом ящике текущего пользователя.
    permissionToken—Показать политику авторизации арендатора (бета-версия).
    list-usersToken-j, -beta, -fl, -expПеречисление всех пользователей.
    list-applicationsToken-j, -beta, -fl, -expПеречисление всех приложений.
    list-principalsToken-j, -fl, -expПеречисление всех субъектов-служб.
    register-appToken, -n—Регистрация нового приложения (с секретом клиента на 1 год).
    new-groupToken, -n—Создание новой группы безопасности.
    add-groupToken, -uid-gidНазначение роли каталога субъекту (роль по умолчанию = глобальный администратор).
    push-fileToken, -fp, -n—Загрузка локального файла в OneDrive пользователя.
    gather-allToken-jМассовый сбор пользователей, групп, приложений, субъектов-служб, ролей, политик и разрешений.
    raw-urlToken, -url-j, -fl, -expВыполнение прямого GET-запроса к любому Graph/REST URL (обрабатывает разбивку на страницы с @odata.nextLink).
    inviteToken, -n-urlПриглашение внешнего (гостевого) пользователя. -n — электронная почта приглашаемого.
    magic-appToken—Поиск приложений с согласием 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/shm
    page.goto(..., wait_until="networkidle")
    networkidle
    • Исправлено в инструменте: AzureRedOps теперь автоматически определяет WSL и отключает аппаратное ускорение для любого используемого вами движка — Chromium получает --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).