mojomast/365compromisesleuth

GitHub: mojomast/365compromisesleuth

专为 M365 入侵调查设计的只读证据收集工具,自动从 Entra ID 和 Exchange Online 提取取证数据并生成结构化报告。

Stars: 0 | Forks: 0

# M365 入侵证据收集工具 针对 Microsoft 365 入侵调查的只读证据收集工具。将 Entra ID (Azure AD) 和 Exchange Online 证据收集到结构化的案例文件夹中,提供对分析师友好的导出文件、用于取证的原始 JSON 以及综合事件摘要。 **此工具为只读模式。** 它不会修改、删除或修复目标租户中的任何内容。 ## 前置条件 ### PowerShell 7+ 此工具需要 PowerShell 7.0 或更高版本。可从 [https://github.com/PowerShell/PowerShell](https://github.com/PowerShell/PowerShell) 下载。 ### 所需模块 | 模块 | 最低版本 | |--------|----------------| | Microsoft.Graph.Authentication | 2.0.0 | | Microsoft.Graph.Users | 2.0.0 | | Microsoft.Graph.Identity.DirectoryManagement | 2.0.0 | | Microsoft.Graph.Identity.SignIns | 2.0.0 | | Microsoft.Graph.Applications | 2.0.0 | | Microsoft.Graph.Reports | 2.0.0 | | ExchangeOnlineManagement | 3.0.0 | **一次性安装全部:** ``` Install-Module Microsoft.Graph.Authentication, Microsoft.Graph.Users, Microsoft.Graph.Identity.DirectoryManagement, Microsoft.Graph.Identity.SignIns, Microsoft.Graph.Applications, Microsoft.Graph.Reports, ExchangeOnlineManagement -Scope CurrentUser -Force ``` ### 所需 Azure AD 角色 运行此工具的技术人员需要: - **全局读取者** (或等效的只读管理员角色) 用于 Entra ID / Graph 数据 - **Exchange 管理员** (或等效角色) 用于 Exchange Online 数据 - 对于合作伙伴/MSP 场景,需要具有适当角色的委派管理员权限 (GDAP) ### 所需 Graph 权限范围 该工具请求以下委派(交互式)范围,均为只读: - `User.Read.All` - `UserAuthenticationMethod.Read.All` - `Directory.Read.All` - `IdentityRiskyUser.Read.All` - `IdentityRiskEvent.Read.All` - `AuditLog.Read.All` - `Application.Read.All` - `DelegatedPermissionGrant.Read.All` 目标租户中的某些范围可能需要管理员同意。 ## 快速开始 ``` # 基本用法并提示输入受损账户 ./Start-M365CompromiseEvidence.ps1 -CaseFolder "C:\Cases\Contoso-2025-01-15" # 基本用法并预先提供目标用户 ./Start-M365CompromiseEvidence.ps1 -UserPrincipalName "user@contoso.com" -CaseFolder "C:\Cases\Contoso-2025-01-15" # Partner/MSP 连接到客户租户 ./Start-M365CompromiseEvidence.ps1 -UserPrincipalName "user@contoso.com" -CaseFolder "C:\Cases\Contoso-2025-01-15" -TenantId "contoso.onmicrosoft.com" # 仅收集 Entra ID 数据(跳过 Exchange) ./Start-M365CompromiseEvidence.ps1 -UserPrincipalName "user@contoso.com" -CaseFolder "C:\Cases\Contoso-2025-01-15" -SkipExchange # 仅收集 Exchange 数据(跳过 Graph) ./Start-M365CompromiseEvidence.ps1 -UserPrincipalName "user@contoso.com" -CaseFolder "C:\Cases\Contoso-2025-01-15" -SkipGraph ``` ## 参数 | 参数 | 必需 | 类型 | 描述 | |-----------|----------|------|-------------| | `UserPrincipalName` | 否 | String | 被入侵用户的电子邮件地址;如果省略,脚本会提示输入 | | `CaseFolder` | 是 | String | 案例文件夹的路径(父目录必须存在) | | `TenantId` | 否 | String | MSP/合作伙伴场景的租户 ID 或域名 | | `SkipGraph` | 否 | Switch | 跳过 Entra ID / Graph 证据收集 | | `SkipExchange` | 否 | Switch | 跳过 Exchange Online 证据收集 | 您登录使用的账户应为您的管理员/调查员账户。`UserPrincipalName` 值是工具检查的被入侵目标账户。 ## 案例文件夹结构 ``` CaseFolder/ ├── 00-Notes/ Technician notes template │ └── TechnicianNotes.txt ├── 01-Entra/ Entra ID / Azure AD evidence │ ├── UserProfile.json / .csv │ ├── AuthenticationMethods.json / .csv │ ├── DirectoryRoles.json / .csv │ ├── GroupMemberships.json / .csv │ ├── SignInLogs.csv │ ├── RiskyUser.json │ ├── RiskDetections.json │ ├── AuditLogs.json / .csv │ ├── AppRoleAssignments.json │ └── OAuthConsents.json ├── 02-Exchange/ Exchange Online evidence │ ├── Mailbox.json / .csv │ ├── MailboxStatistics.json │ ├── InboxRules.json / .csv │ ├── MailboxPermissions_FullAccess.json / .csv │ ├── MailboxPermissions_SendAs.json / .csv │ ├── MailboxPermissions_SendOnBehalf.json / .csv │ ├── ForwardingSummary.json │ ├── CalendarPermissions.json / .csv │ ├── TransportRules.json / .csv │ ├── InboundConnectors.json │ ├── OutboundConnectors.json │ ├── MessageTrace_Sent.csv │ └── MessageTrace_Received.csv ├── 03-Logs/ Collection logs and manifests │ ├── Transcript_*.txt │ ├── FileManifest.csv │ ├── CollectionErrors.csv │ ├── Indicators.csv │ └── CollectionLog.csv ├── 04-Client-Deliverables/ Incident summary report │ ├── IncidentSummary.txt │ └── IncidentSummary.html ├── 05-Raw/ Raw JSON for forensic analysis │ ├── SignInLogs_Raw.json │ └── MessageTrace_Raw.json └── 06-Screenshots-Manual/ Manual screenshot checklist └── ManualScreenshotChecklist.md ``` ## 收集内容 ### Entra ID 证据 | 功能 | 描述 | |----------|-------------| | `Export-EntraUserProfile` | 完整的用户配置文件,关键字段扁平化为 CSV | | `Export-EntraAuthMethods` | 身份验证方法,包括电话、电子邮件和 Authenticator 应用程序详细信息 | | `Export-EntraDirectoryRoles` | 目录角色分配和组成员身份;标记特权角色 | | `Export-EntraSignInLogs` | 登录日志(最近 7 天),包含扁平化的位置/状态/设备信息;标记多国登录 | | `Export-EntraRiskData` | 风险用户状态和风险检测(需要 Entra P2);标记有风险的用户 | | `Export-EntraAuditLogs` | 目录审计日志(最近 7 天),涵盖密码更改、MFA 更改、角色分配 | | `Export-EntraAppAssignments` | 应用角色分配和 OAuth 同意授权;标记可疑的广泛范围 | ### Exchange Online 证据 | 功能 | 描述 | |----------|-------------| | `Export-ExchangeMailboxDetails` | 邮箱属性和统计信息;标记转发地址 | | `Export-ExchangeInboxRules` | 所有收件箱规则,包括隐藏规则;标记转发、删除和可疑规则 | | `Export-ExchangeMailboxPermissions` | 完全访问、代理发送 和代表发送 权限;标记非默认访问权限 | | `Export-ExchangeForwarding` | 来自邮箱属性和收件箱规则的综合转发摘要 | | `Export-ExchangeCalendarDelegates` | 日历文件夹权限;标记提升的访问权限(编辑者/所有者) | | `Export-ExchangeTransportRules` | 租户范围的传输规则;标记影响被入侵用户的规则 | | `Export-ExchangeConnectors` | 入站和出站连接器;标记最近创建的连接器 | | `Export-ExchangeMessageTrace` | 已发送/已接收邮件跟踪(最近 7 天);标记大量外发邮件 | ## 最有价值的证据(优先级排序) 当时间有限时,请优先关注以下内容: 1. **收件箱规则和转发设置** - 活跃入侵的首要指标。攻击者几乎总是会设置转发或删除规则。 2. **邮箱权限** - 揭示持久化机制(攻击者添加的完全访问、代理发送委派)。 3. **登录日志** - 显示攻击者的访问模式、源 IP、位置和使用的应用程序。 4. **身份验证方法** - 显示攻击者是否注册了自己的 MFA 设备(电话、验证器应用程序)。 5. **OAuth 同意授权** - 显示恶意应用程序持久化(具有 Mail.Read、Mail.Send、Files.ReadWrite.All 权限的应用)。 ## 许可说明 某些证据收集需要特定的 Microsoft 365 许可: | 功能 | 所需许可证 | |---------|-----------------| | 风险用户状态 | Entra ID P2(包含在 Microsoft 365 E5 中) | | 风险检测 | Entra ID P2 | | 登录日志风险字段 | Entra ID P2 | | 完整审计日志保留(180 天) | Exchange Online Plan 2 或 Microsoft 365 E5 | | 威胁浏览器截图 | Microsoft 365 E5 或 Defender for Office 365 Plan 2 | | 通过 PowerShell 进行邮件跟踪 | 限制为 10 天(所有计划) | 该工具会优雅地处理许可证缺失的情况 - 它会记录警告并继续运行,而不是失败。 ## 已知限制 - **统一审计日志** (`Search-UnifiedAuditLog`) 未包含在内。它速度慢、速率限制严格、需要复杂的过滤,且更适合在 Microsoft Purview 门户中交互式查询。 - **历史邮件跟踪**(>10 天)需要 `Start-HistoricalSearch`,这是一个异步作业,可能需要数小时。不适合立即取证。 - 每个用户的**条件访问策略评估**很复杂,最好通过 Entra 门户的截图来捕获。 - **设备合规状态**需要 Intune 集成和不同的模块集。最好通过 Entra 用户设备列表的截图来捕获。 - **Graph 登录日志查询**在大型租户上可能很慢。使用 `-Top 500` 和 7 天日期过滤器可保持查询受限。 - **Exchange cmdlet** 通常比 Graph 慢(Exchange 收集总共预计需要 2-5 分钟)。 - **邮件跟踪**上限为每页 5,000 条结果,总共 100 万条。7 天的时间窗口使其可控。 ## 手动截图清单 某些证据最好以管理员门户的截图形式捕获。该工具会在 `06-Screenshots-Manual/ManualScreenshotChecklist.md` 中生成一个清单,涵盖 17 个项目,分布于: - Entra ID 门户(用户概览、身份验证方法、风险登录、条件访问、设备、应用同意) - Exchange 管理中心(邮箱属性、邮件流规则、收件箱规则、连接器、邮件跟踪) - Microsoft 365 Defender(事件队列、警报队列、威胁浏览器) - Microsoft Purview(审计日志搜索、内容搜索) ## 第二阶段路线图(修复) 以下修复功能已计划但**尚未实施**。此工具仍保持只读。 - 撤销所有刷新令牌 / 登出会话 - 重置密码 - 阻止登录 - 删除可疑的收件箱规则 - 删除外部转发 - 删除可疑的 OAuth 应用同意 - 删除未经授权的代理/权限 - 禁用可疑的连接器 - 启用邮箱审计日志记录(如果尚未启用) - 强制重新注册 MFA - 向 Defender 提交指标 ## 架构 ``` Start-M365CompromiseEvidence.ps1 (orchestrator) ├── Modules/Logging.psm1 (logging, export, indicators, errors) ├── Modules/Prerequisites.psm1 (module/version checks) ├── Modules/CaseFolder.psm1 (folder structure + templates) ├── Modules/Connection.psm1 (Graph + Exchange authentication) ├── Modules/EntraEvidence.psm1 (7 Graph collection functions) ├── Modules/ExchangeEvidence.psm1 (8 Exchange collection functions) └── Modules/Summary.psm1 (incident summary + manifests) ``` 所有模块遵循一致的模式: - 每个函数在失败时使用 `try/catch` 并调用 `Register-CollectionError` - 每个导出使用 `Export-EvidenceData`(从不直接写入文件) - 可疑发现调用带有类别、描述、严重性的 `Register-Indicator` - 控制台输出仅通过 `Write-EvidenceLog` 进行 - 可安全重新运行(文件夹创建是幂等的,文件导出会覆盖) ## HTML 事件报告 该工具还会生成 `04-Client-Deliverables/IncidentSummary.html`,供技术人员审查和客户简报。它包括: - 包含风险级别和收集计数的执行摘要 - 按严重性排序的优先发现 - 基于观察到的指标和证据缺口的建议措施 - 完整的指标表,带有可展开的详细信息 - 手动审查清单、收集问题和证据清单表 ## 许可证 MIT
标签:Azure AD, Entra ID, Exchange Online, Graph API, IPv6, Libemu, M365, Microsoft 365, OpenCanary, PowerShell, Web报告查看器, 人工智能安全, 入侵调查, 只读工具, 合规性, 微软365, 数字取证, 数据展示, 数据泄露, 目录服务, 红队, 自动化脚本