mcpField
I
investigating-m365-entra

investigating-m365-entra

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

investigating-m365-entra について

メールボックス侵害、アカウント乗っ取り、OAuth悪用などを扱う、M365とEntra IDのインシデント調査ガイドです。監査・サインインログの分析、永続化の確認、タイムライン作成を扱い、ログ保持期間やライセンスによる可視性の制約も考慮します。

主な機能

  1. 01監査、サインイン、IDログの把握
  2. 02異常なサインインとMFAの分析
  3. 03OAuth許可とアプリ資格情報の調査
  4. 04メールボックスルールと転送の確認
  5. 05イベントを相関してタイムラインを作成

活用シーン

  1. 01ビジネスメール詐欺や不正なメールアクセスの調査
  2. 02不審なOAuth許可と永続化の追跡
  3. 03Entra IDのサインイン異常やMFA改ざんの分析
  4. 04封じ込め前のメールボックス証拠保全

インストール

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

$npx skills add https://github.com/trilwu/secskills --skill investigating-m365-entra

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

詳細

M365 および Entra ID の調査

M365/Entra の調査はオンプレミスの DFIR とは異なり、ディスクイメージもメモリダンプもなく、自分で収集できるイベントログもありません。すべて、Microsoft のログストアに対する API クエリから取得します。そのうちいくつかは、必要なデータを保持するために E5 ライセンスまたは高度な監査が必要です。どのログが存在するか、どのログが欠けているか、どれくらいの期間保持されるかを把握することが、調査の半分を占めます。

使用する場面

  • ビジネスメール詐欺(BEC)――メールボックスへの不正アクセス、転送、またはなりすまし
  • Entra ID アカウントの侵害――不審なサインイン、トークンのリプレイ、パスワードリスト攻撃
  • 不審な OAuth 同意の付与――過剰な権限を持つサードパーティアプリ
  • メールボックスルールの改ざん――攻撃者との通信を隠す、またはメールを転送する受信トレイルール
  • Azure AD のサインイン異常――不可能な移動、レガシー認証、匿名化ネットワーク
  • 条件付きアクセスまたは MFA の改ざん――ポリシー変更、MFA 疲労攻撃

使用しない場面

  • より広範なインシデント対応の方法論――responding-to-incidents を使用してください
  • Entra ID の攻撃的なテスト――attacking-entra-id を使用してください
  • Azure リソース/サブスクリプションの侵害――investigating-azure-incidents を使用してください
  • AWS の侵害――investigating-aws-incidents を使用してください
  • その他のクラウドインフラストラクチャ(GCP、攻撃的なテスト)――exploiting-cloud-platforms を使用してください
  • 調査結果から検知ルールを作成する場合――engineering-detections を使用してください

ログの種類と保持期間

何かをクエリする前に、どのデータがあり、どこまで遡れるかを確認してください。 ログの欠落は調査結果の一つであり、確認を省略する理由にはなりません。

ログソース保持期間(既定)ライセンス要件主な操作
統合監査ログ(UAL)既定で 180 日、E5 ライセンスユーザーは 1 年MailItemsAccessed には E5 が必要MailItemsAccessed、New-InboxRule、Set-Mailbox、同意の付与
Entra ID サインインログ30 日より長く保持するには Log Analytics へのエクスポートが必要サインインイベント、CA 評価、MFA の結果
Entra ID 監査ログ30 日なしロールの割り当て、アプリの登録、資格情報の変更
Identity Protection30 日P2 が必要リスクのあるサインイン、リスク検出
Defender for Cloud Apps180 日MDCA ライセンスが必要アクティビティログ、OAuth アプリのインベントリ
メールボックス監査ログ90 日(既定で有効)MailItemsAccessed には E5 が必要メールアクセス、代理送信、委任操作

データの欠落から結論を導く前に、保持期間を正しく確認してください。 2023 年 10 月 17 日以降、Audit(Standard)の既定の保持期間は180 日です。これは、今も多くの古い資料に記載されている 90 日ではありません。この日付より前に生成されたレコードには、従来の 90 日間の期間が適用されます。1 年の保持期間が既定となるのは、E5(または Purview Audit アドオン)のライセンスを持つユーザーに限られ、その場合も Exchange、SharePoint、OneDrive、Entra ID のみが対象です。そのため、E3 テナントでは UAL の保持期間は 180 日で、MailItemsAccessed はなく、製品内で保持期間を延長することもできません。

保持期間はテナント単位ではなく、ユーザーのライセンスごとに決まります。ライセンスが混在するテナントでは、同じクエリでも、E5 の管理対象ユーザーについては 1 年分、隣接する E3 アカウントについては 180 日分の履歴が返される場合があります。空の結果を「アクティビティなし」と判断する前に、調査対象アカウントのライセンスを確認してください。 このデータ欠落を明記してください。保持期間が延長されている場合は、SIEM または Log Analytics を確認してください。

統合監査ログ(UAL)

UAL は最も豊富なデータを提供する単一のソースです。あらゆる調査はここから始まります。

Connect-ExchangeOnline -UserPrincipalName [email protected]

# Basic search -- always constrain by date and user
Search-UnifiedAuditLog -StartDate "2026-07-01" -EndDate "2026-07-20" `
  -UserIds [email protected] -ResultSize 5000

# Search specific operations
Search-UnifiedAuditLog -StartDate "2026-07-01" -EndDate "2026-07-20" `
  -Operations "New-InboxRule","Set-InboxRule","Set-Mailbox","Add-MailboxPermission" `
  -ResultSize 5000

# MailItemsAccessed (E5 only)
Search-UnifiedAuditLog -StartDate "2026-07-01" -EndDate "2026-07-20" `
  -Operations MailItemsAccessed -UserIds [email protected] -ResultSize 5000

# Export -- AuditData field is JSON, expand it
Search-UnifiedAuditLog -StartDate "2026-07-01" -EndDate "2026-07-20" `
  -UserIds [email protected] -ResultSize 5000 |
  Select-Object CreationDate, UserIds, Operations,
    @{N='AuditData';E={$_.AuditData | ConvertFrom-Json | ConvertTo-Json -Depth 10}} |
  Export-Csv -Path .\ual_export.csv -NoTypeInformation
主要な UAL 操作
操作重要性
MailItemsAccessedBind = 単一アイテムの読み取り、Sync = 一括ダウンロード。一括同期は BEC による情報流出の兆候です。
New-InboxRule / Set-InboxRule返信を隠したり転送したりするルールです。「invoice」、「payment」、「security」などのキーワードを対象にしていないか確認してください。
Set-MailboxForwardingSMTPAddress または ForwardingAddress の変更は、外部への目立たない転送を示します。
Add-MailboxPermissionFullAccess または SendAs の委任は、永続化を示します。
アプリケーションへの同意OAuth の許可です。権限は AuditData に含まれています。
サービス プリンシパルの資格情報の追加アプリの登録に新しいシークレット/証明書が追加されます。
HardDelete / SoftDelete証拠の破壊を示します。攻撃者が送信済みアイテムを削除しています。

UAL では、クエリごとの結果は最大 50,000 件です。上限に達した場合は、日付範囲を狭めてください。

Entra ID サインイン分析

サインインログをクエリし、次の点を確認します。

  • 不可能な移動 — 実現不可能な時間内に、遠く離れた場所からアクセスしている
  • 匿名 IP — Tor の出口ノード、VPN サービス、既知の匿名化サービス
  • レガシー認証 — CA でブロックされていない場合、IMAP、POP3、SMTP AUTH は MFA を回避します
  • トークンのリプレイ — 異なる送信元 IP から同じ相関 ID が使われている
  • 異常なユーザーエージェント — Python requests、または OWA や Graph にアクセスする PowerShell
// Sign-ins from the compromised account
SigninLogs
| where UserPrincipalName == "[email protected]"
| where TimeGenerated > ago(30d)
| project TimeGenerated, AppDisplayName, IPAddress, Location,
    ClientAppUsed, ResultType, AuthenticationRequirement, MfaDetail, RiskState
| order by TimeGenerated asc

// Legacy auth sign-ins that bypass MFA
SigninLogs
| where ClientAppUsed in ("IMAP4", "POP3", "SMTP", "Exchange ActiveSync",
    "MAPI Over HTTP", "Outlook Anywhere", "Exchange Web Services")
| where ResultType == 0
| summarize count() by UserPrincipalName, ClientAppUsed, IPAddress
MFA 分析
  • ResultType 50074 — MFA が必要ですが、完了していません
  • ResultType 50076 — MFA が完了しています(攻撃者が認証要素を持っていたか、MFA 疲労攻撃を利用した可能性があります)
  • AuthenticationRequirement = singleFactorAuthentication — MFA は必須ではありません(CA の不備)
  • MfaDetail を確認してください — 繰り返しのプロンプト後にプッシュ通知を承認している場合は、MFA 疲労攻撃を示します

OAuth と同意付与の調査

不正な同意付与は、M365 侵害で最も見落とされやすい永続化手法です。

Connect-MgGraph -Scopes "Application.Read.All","Directory.Read.All"

# Delegated permission grants -- look for Mail.Read, Files.ReadWrite, etc.
Get-MgOauth2PermissionGrant -All | Where-Object {
    $_.Scope -match "Mail.Read|Mail.ReadWrite|Files.ReadWrite|User.Read.All"
} | Format-Table ClientId, ConsentType, Scope, PrincipalId

# Application permission assignments
Get-MgServicePrincipal -All | ForEach-Object {
    $sp = $_
    Get-MgServicePrincipalAppRoleAssignment -ServicePrincipalId $sp.Id -ErrorAction SilentlyContinue |
    Select-Object @{N='AppName';E={$sp.DisplayName}}, @{N='AppId';E={$sp.AppId}},
                  PrincipalDisplayName, @{N='Created';E={$_.CreatedDateTime}}
}
権限リスク
Mail.Read / Mail.ReadWriteメールの情報流出です。不明なアプリで確認された場合は疑わしい操作です。
Files.ReadWrite.AllSharePoint/OneDrive への完全なアクセス権です。
Directory.ReadWrite.Allユーザー、グループ、ロールを変更できます。
full_access_as_appExchange のアプリレベルのメールボックスアクセスです。サードパーティに許可することはほぼありません。

委任された同意(1 人のユーザーのデータ)と管理者の同意(テナント全体)を区別してください。 悪意のあるアプリに管理者が同意すると、すべてのユーザーが危険にさらされます。

メールボックスルールのフォレンジック

受信トレイルールは、パスワードをリセットしても残ります。必ず確認してください。

# Inbox rules
Get-InboxRule -Mailbox [email protected] |
  Select-Object Name, Enabled, MoveToFolder, DeleteMessage, ForwardTo,
    RedirectTo, MarkAsRead | Format-List

# Mailbox-level forwarding
Get-Mailbox -Identity [email protected] |
  Select-Object ForwardingSMTPAddress, ForwardingAddress, DeliverToMailboxAndForward

# All mailboxes with external forwarding
Get-Mailbox -ResultSize Unlimited |
  Where-Object { $_.ForwardingSMTPAddress -ne $null } |
  Select-Object UserPrincipalName, ForwardingSMTPAddress

# Transport rules
Get-TransportRule | Where-Object { $_.RedirectMessageTo -or $_.BlindCopyTo } |
  Select-Object Name, State, RedirectMessageTo, BlindCopyTo

# Delegate access
Get-MailboxPermission -Identity [email protected] |
  Where-Object { $_.User -ne "NT AUTHORITY\SELF" -and -not $_.IsInherited }

危険な兆候:キーワード(「security」、「password」、「MFA」)を対象とするルール、RSS Feeds/Conversation History への削除または移動を行うルール、名前が空白のルール、フリーメールプロバイダーへの転送、最初の不審なサインイン後に作成されたルール。

eDiscovery とコンテンツ検索

Connect-IPPSSession -UserPrincipalName [email protected]

# Preserve mailbox content -- do this early
Set-Mailbox -Identity [email protected] -LitigationHoldEnabled $true

# Search outbound mail from compromised account
New-ComplianceSearch -Name "IR-2026-042 Outbound" `
  -ExchangeLocation [email protected] `
  -ContentMatchQuery "sent>=2026-07-01 AND sent<=2026-07-20"
Start-ComplianceSearch -Identity "IR-2026-042 Outbound"

保持ポリシーを適用する前に訴訟ホールドを設定してください。そうしないと、攻撃者が証拠を消去できる可能性があります。

Azure AD 監査ログ分析

// Role assignments
AuditLogs
| where OperationName == "Add member to role"
| extend TargetUser = tostring(TargetResources[0].userPrincipalName),
         RoleName = tostring(TargetResources[0].modifiedProperties[1].newValue)
| project TimeGenerated, InitiatedBy, TargetUser, RoleName

// Service principal credential changes (persistence)
AuditLogs
| where OperationName in ("Add service principal credentials",
    "Update application - Certificates and secrets management")
| project TimeGenerated, InitiatedBy, TargetResources

// Conditional Access policy changes
AuditLogs
| where OperationName has "conditional access"
| project TimeGenerated, OperationName, InitiatedBy, Result

// MFA method changes (attacker registering their own factor)
AuditLogs
| where OperationName in ("User registered security info",
    "Admin registered security info", "User deleted security info")
| project TimeGenerated, OperationName, InitiatedBy, TargetResources

アプリケーション管理者またはグローバル管理者の権限を持つ攻撃者は、既存のアプリ登録に資格情報を追加して、MFA に依存しないアクセスを永続化できます。

Get-MgApplication -All | ForEach-Object {
    $app = $_
    $app.PasswordCredentials + $app.KeyCredentials | Where-Object {
        $_.StartDateTime -gt (Get-Date).AddDays(-30)
    } | Select-Object @{N='App';E={$app.DisplayName}}, @{N='AppId';E={$app.AppId}},
                      StartDateTime, EndDateTime
}

タイムラインの作成

主要な 3 つのログソースを相関させます。

Sign-in logs  -->  When and where the attacker authenticated
Audit logs    -->  Configuration changes they made
UAL           -->  Data they accessed or modified
  1. 最も早い不審なサインインを起点にします
  2. そのユーザーのサインイン、UAL、監査イベントを前後 7 日間分取得します
  3. すべてを 1 つの UTC タイムラインに統合します
  4. サインイン、偵察、永続化(ルール/転送/OAuth)、目的への攻撃というパターンを探します
UTC Timestamp        | Source  | Event                                    | Detail
2026-07-12 08:41:22  | SignIn  | Sign-in from 198.51.x.x                  | Nigeria, no MFA
2026-07-12 08:42:05  | UAL     | MailItemsAccessed (Sync)                 | 847 items via Graph
2026-07-12 08:43:18  | UAL     | New-InboxRule "."                        | Delete "security alert"
2026-07-12 08:44:01  | UAL     | Set-Mailbox                              | ForwardingSMTPAddress set
2026-07-12 08:45:33  | UAL     | Consent to application                   | Mail.Read, Mail.Send
2026-07-12 09:12:44  | UAL     | Send (SendAs)                            | Invoice redirect to vendor

封じ込め

対象範囲の特定が完了したら、同時に実行してください。部分的な封じ込めは攻撃者に警告することになります。

# Revoke sessions and reset credentials
Revoke-MgUserSignInSession -UserId [email protected]
Update-MgUser -UserId [email protected] -PasswordProfile @{
    Password = (New-Guid).Guid + "!Aa1"; ForceChangePasswordNextSignIn = $true }

# Disable account if active compromise is ongoing
Update-MgUser -UserId [email protected] -AccountEnabled:$false

# Remove attacker inbox rules
Get-InboxRule -Mailbox [email protected] |
  Where-Object { $_.Name -match "^\.$|^$" -or $_.DeleteMessage -eq $true } |
  Remove-InboxRule -Confirm:$false

# Remove forwarding
Set-Mailbox -Identity [email protected] `
  -ForwardingSMTPAddress $null -ForwardingAddress $null `
  -DeliverToMailboxAndForward $false

# Remove unauthorized delegate access
Get-MailboxPermission -Identity [email protected] |
  Where-Object { $_.User -ne "NT AUTHORITY\SELF" -and -not $_.IsInherited } |
  ForEach-Object { Remove-MailboxPermission -Identity [email protected] `
    -User $_.User -AccessRights $_.AccessRights -Confirm:$false }

# Block malicious OAuth app
$sp = Get-MgServicePrincipal -Filter "appId eq '<malicious-app-id>'"
Update-MgServicePrincipal -ServicePrincipalId $sp.Id -AccountEnabled:$false
Get-MgOauth2PermissionGrant -Filter "clientId eq '$($sp.Id)'" |
  Remove-MgOauth2PermissionGrant

セッションの失効だけでは不十分です。トークンが最大 1 時間有効なままの場合があります。即座にロックアウトするには、アカウントを無効にしてください。封じ込め後、転送が残っていないこと、不明な委任がないこと、不明な OAuth の許可がないこと、攻撃者が登録した MFA 方法がないこと、侵害期間中に作成されたサービス プリンシパルの資格情報がないことを確認してください。

棄却すべき誤った判断

  • 「パスワードをリセットしたので、アカウントは安全です。」 更新トークン、OAuth グラント、受信トレイルール、転送、代理人アクセスはすべて、パスワードを リセットしても残ります。セッションを失効させ、すべての永続化メカニズムを 監査してください。
  • 「E3 しかないので、メールへのアクセスを調査できません。」 MailItemsAccessed は 利用できませんが、サインインログ、UAL 操作、受信トレイルール、転送は 引き続き確認できます。制約を明示し、利用可能な情報を使って調査してください。
  • 「サインイン元は VPN なので、おそらくユーザー本人です。」 出口 IP、ユーザー エージェント、タイミングを、確立されたパターンと照合してください。攻撃者も VPN を利用します。
  • 「Defender でアラートが発生しなかったので、侵害はありません。」 Defender の 利用には適切なライセンスプランとポリシー設定が必要です。アラートがないことは、 侵害がない証拠ではありません。
  • 「OAuth アプリには委任されたアクセス許可しかありません。」 有効な更新トークンを 持つ委任されたアクセス許可があれば、パスワードを再入力せずにアクセスを 永続化できます。
  • 「IP をブロックしたので、攻撃者は締め出されました。」 攻撃者は IP を ローテーションします。ネットワーク経路だけでなく、トークンと認証情報を 失効させてください。
  • 「ログは 30 日前までしか遡れないので、侵害はその期間内に始まりました。」 それはあなたの可視性の限界であり、攻撃者の活動期間ではありません。この制約を 記録し、SIEM でより長い保持期間のログを確認してください。

参考資料

  • responding-to-incidents -- より広範なインシデント対応手法と証拠の取り扱い
  • attacking-entra-id -- Entra ID に対する攻撃手法。攻撃者の手法を理解するのに役立ちます
  • exploiting-cloud-platforms -- M365 以外のクラウドインフラストラクチャへの攻撃
  • engineering-detections -- 調査結果に基づく検知ルールの作成
  • hunting-threats -- M365 および Entra ID のテレメトリを対象としたプロアクティブなハンティング

コメント