Azure RedOps 是一个用于评估 Microsoft Entra ID 安全态势的攻击性安全工具包。
一款用于 Azure / Entra ID 红队作战的瑞士军刀式工具。
作者: Mr.Un1k0d3r (TrueCyber Inc) 版本: 0.1 语言: Python 3.12+
AzureRedOps 是一款用于评估 Microsoft Entra ID 和 Azure 租户安全状况的进攻性安全工具包。它将最常见的红队工作流程——身份验证、令牌管理、目录枚举、权限检查、密码喷洒以及针对 Microsoft Graph 的后渗透操作——封装在一个统一的、由 --activity 驱动的 CLI 背后。
每个操作都通过 -a/--activity 进行选择。身份验证过程中获取的令牌可以在本地缓存(.azure_creds),并通过 -l/--load-access-token 按名称重复使用,因此您几乎无需粘贴原始 JWT。
了解有关该工具的更多信息 在 CYPFER 博客上
.azure_creds)中保存、列出、解码/查看和删除访问/刷新令牌。任何流程都可以通过 -s/--save + -n/--name 自动持久化其令牌。auth) — 直接的用户名/密码身份验证。phish-start / phish-capture) — 滥用 OAuth 设备授权许可,在目标于 microsoft.com/devicelogin 输入您的用户代码时捕获颁发的令牌。默认自动捕获。auth-app) — 针对自定义应用程序注册的完整授权码 + PKCE 流程,由接收重定向的内置本地 HTTPS 监听器提供服务。auth-interactive) — 驱动真实浏览器(Playwright;默认 Firefox,可通过 -br 切换)(处理 MFA / 条件访问 / SSO),然后从录制的会话 HAR 中收集所有令牌。refresh) — 用刷新令牌换取新的访问令牌。obo) — 将已颁发的访问令牌交换为针对下游资源作用域的新令牌(OAuth 2.0 jwt-bearer / OBO)。browser-sso) — 打开一个真实浏览器,已作为用户通过身份验证,直接进入目标 Web 应用(Outlook 网页版、Teams、SharePoint、Azure 门户等)。使用 -aprt/--auto-prt 它会从刷新令牌自动生成一个主刷新令牌 (PRT) 的 cookie(设备注册 → PRT → x-ms-RefreshTokenCredential),因此全新浏览器无需手动登录即可完成单点登录。gather-all 收集器。spray) 和跨应用刷新令牌喷洒 (spray-refresh)。magic-app 查找具有 AllPrincipals 同意的可公共重定向的应用程序;内置已知/有趣的 Microsoft 应用 ID 列表。requirements.txt):
PyJWTrequestsplaywrightcryptography(仅在 browser-sso -aprt 自动 PRT 流程时需要)auth-interactive, browser-sso) 需提供 Playwright 浏览器运行时。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]
### 提供令牌
调用 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
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` | | 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>