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, 数字取证, 数据展示, 数据泄露, 目录服务, 红队, 自动化脚本