goubx/threat-hunt-second-vector-brief
GitHub: goubx/threat-hunt-second-vector-brief
基于 Microsoft Sentinel 与 KQL 的云原生身份入侵威胁狩猎实战报告,完整还原从匿名IP告警到内部钓鱼和凭证窃取的定向攻击链。
Stars: 0 | Forks: 0
# 威胁狩猎 08:第二攻击向量(进行中)
**技术栈:** Microsoft Sentinel · Defender XDR · Entra ID · Microsoft 365 · Graph API · KQL
**技术:** T1078.004 · T1090.003 · T1110.001 · T1087.004 · T1069.003 · T1534 · T1114.002 · T1114.003 · T1564.008 · T1530 · T1552.001 · T1083
**Flag:** 跨越 6 个调查阶段的 25 个 Flag
**结果:** 低级别警报被重新分类为具有活动持久性的已确认定向入侵
# 威胁狩猎报告:第二攻击向量
**狩猎 ID:** Hunt 08
**日期:** 2026 年 6 月 11 日
**组织:** LOG(N) Pacific
**分析师:** Mohamed Yagoub,T2 威胁狩猎员
**事件参考:** 87241(在 `m.smith` 上标记的匿名 IP 登录)
**调查窗口:** 2026-06-11 03:00 UTC 至 2026-06-11 13:00 UTC
## 使用的平台和工具
- **事件管理:** Microsoft Defender XDR
- **SIEM / 狩猎:** Microsoft Sentinel (Log Analytics Workspace)
- **身份:** Microsoft Entra ID, Entra ID Protection
- **生产力 / 邮件:** Microsoft 365, Exchange Online
- **API 遥测:** Microsoft Graph Activity Logs
- **云应用遥测:** Microsoft Defender for Cloud Apps (CloudAppEvents)
- **查询语言:** Kusto Query Language (KQL)
## 场景摘要
Microsoft Entra ID Protection 触发了事件 87241,这是一起在 2026 年 6 月 11 日凌晨在 LOG(N) Pacific 的财务用户 `m.smith` 上标记的低严重性匿名 IP 登录。夜班团队对警报进行了分类,未发现可采取行动的证据,并将其留在队列中。
这次狩猎在工作假设下重新审查了该事件,即“低级别”的判定低估了一场完全通过身份、邮件、文件和云服务执行的隐蔽的云原生入侵,且其下游活动散布在多个 Sentinel 表中。该假设得到了证实。这个单一的标记登录开启了一个完整的会话,涵盖侦察、针对第二名财务用户的内部鱼叉式网络钓鱼欺诈、双用途收件箱规则持久性,以及指向 Microsoft 365 之外后续访问的定向凭证窃取。
## MITRE ATT&CK 摘要
| Flag | 技术 | MITRE ID | 优先级 |
|-----:|-----------|----------|----------|
| 1 | 有效账户(上下文) | T1078 | N/A |
| 2 | 代理:多跳代理(匿名化服务) | T1090.003 | 高 |
| 3 | 有效账户:云账户(非企业客户端 OS) | T1078.004 | 中 |
| 4 | Entra ID Protection 风险检测 | T1090.003 | 高 |
| 5 | 通过被忽略的风险状态进行防御规避 | T1078 | 高 |
| 6 | 活动账户暴露(上下文) | T1078 | 高 |
| 7 | 身份验证缺口,单因素路径 | T1078.004 | 紧急 |
| 8 | 通过 Outlook Web 进行初始访问 | T1078.004 | 高 |
| 9 | 暴力破解:密码猜测 | T1110.001 | 中 |
| 10 | 云横向移动,多应用会话 | T1078.004 | 高 |
| 11 | 跨服务重用单一会话 | T1078.004 | 中 |
| 12 | 账户发现:云账户(MFA 状态) | T1087.004 | 中 |
| 13 | 权限组发现:云组 | T1069.003 | 中 |
| 14 | 内部鱼叉式网络钓鱼 | T1534 | 紧急 |
| 15 | 邮件收集:远程邮件收集 | T1114.002 | 高 |
| 16 | 内部鱼叉式网络钓鱼(收件人上下文) | T1534 | 高 |
| 17 | 内部鱼叉式网络钓鱼:通过 Teams 跨渠道 | T1534 | 高 |
| 18 | 隐藏痕迹:邮件隐藏规则 | T1564.008 | 紧急 |
| 19 | 防御规避原理(上下文) | T1564.008 | 高 |
| 20 | 邮件收集:邮件转发规则 | T1114.003 | 紧急 |
| 21 | 定位持久化原理(上下文) | T1564.008, T1114.003 | 高 |
| 22 | 来自云存储的数据 | T1530 | 高 |
| 23 | 定向外发数据量(上下文) | T1530 | 高 |
| 24 | 不安全的凭证:文件中的凭证 | T1552.001 | 紧急 |
| 25 | 文件和目录发现 | T1083 | 中 |
## Flag 分析与发现
### 阶段 1:分类
#### 🏁 Flag 1 - 被攻陷的主体
- **答案:** `m.smith@lognpacific.org`
- **发现过程:** 在 Defender XDR 中从夜班留在队列中的警报中定位到。事件 87241 的“证据和响应”窗格指明了该主体并暴露了完整的身份上下文。用户对象中的 SAM Name 将 UPN `m.smith` 解析为 **Mark Smith**,这是后续数据透视的重要上下文,其中的查询会根据显示名称 "mark" 而不是 UPN 进行过滤。

#### 🏁 Flag 2 - 被标记的来源
- **答案:** `103.69.224.136`
- **发现过程:** 确认 UPN 后,我查询了与该用户相关的所有活动的 `SigninLogs`,并筛选出结果签名不是 `SUCCESS` 的记录。匿名源 IP 通过该过滤器清晰地显现出来。
```
SigninLogs
| where UserPrincipalName == "m.smith@lognpacific.org"
| where ResultSignature != 'SUCCESS'
| project IPAddress
```

#### 🏁 Flag 3 - 客户端 OS
- **答案:** `Linux`
- **发现过程:** 确认源 IP 后,我提取了源自该地址登录的 `DeviceDetail` 字段。客户端操作系统是 Linux,这与操作者使用的基础设施一致,而不是用户的企业设备基线。
```
SigninLogs
| where IPAddress == '103.69.224.136'
| project DeviceDetail
```

#### 🏁 Flag 4 - 存储的检测类型
- **答案:** `anonymizedIPAddress`
- **发现过程:** 返回到事件遥测数据,提取 Entra ID Protection 存储的规范风险事件类型。查询筛选至该主体的 `AADUserRiskEvents` 并提取 `RiskEventType` 字段。针对 Mark Smith 触发的检测被存储为 `anonymizedIPAddress`,这映射到了诸如 Tor 或商业 VPN 提供商之类的匿名化服务。
```
AADUserRiskEvents
| where UserPrincipalName == "m.smith@lognpacific.org"
| project DetectedDateTime, UserPrincipalName, RiskEventType
```

#### 🏁 Flag 5 - 审核判定结果
- **答案:** `dismissed`
- **发现过程:** 我总结了针对 Mark Smith 记录的所有风险状态,以了解之前的检测是如何处理的。最常见的状态是 `dismissed`(已忽略)。这种反复忽略的模式为操作者提供了通过错误分类进行有效防御规避的途径:每一个被忽略的事件都会降低下一次分析师响应的信号强度。
```
AADUserRiskEvents
| where UserPrincipalName == "m.smith@lognpacific.org"
| summarize count() by RiskState
```

#### 🏁 Flag 6 - 实时暴露
- **答案:** `Enabled`
- **发现过程:** 从 Defender XDR 中事件 87241 的资产窗格确认了该账户的当前状态。在进行分类时,该账户仍然处于 Enabled(已启用)状态,这意味着操作者建立的任何活动会话或持久性将继续在实时身份上发挥作用。

### 阶段 2:会话范围
该账户拥有 MFA,但远程 IP 仍然能够成功建立会话。下一组 Flag 确定了这是如何发生的、操作者接触了什么,以及会话是如何保持在一起的。
#### 🏁 Flag 7 - 会话如何绕过 MFA
- **答案:** `singleFactorAuthentication`
- **发现过程:** 我仅查询了来自攻击者 IP 的成功登录,并提取了 `AuthenticationRequirement` 和 `AuthenticationMethodsUsed`。来自 `103.69.224.136` 的每一次成功登录都是在 `singleFactorAuthentication` 下完成的,这意味着账户上的 MFA 注册并没有在操作者使用的路径上强制执行。这是一个 Conditional Access 缺口,而不是被绕过的 MFA 提示。
```
SigninLogs
| where UserPrincipalName == "m.smith@lognpacific.org"
| where IPAddress == '103.69.224.136'
| where ResultSignature == "SUCCESS"
| project AuthenticationRequirement, AuthenticationMethodsUsed
```

#### 🏁 Flag 8 - 放他们进来的攻击面
- **答案:** `One Outlook Web`
- **发现过程:** 我将来自攻击者 IP 的所有登录按时间排序,以找到第一次成功的身份验证。最早的成功登录发生在 `2026-06-11T03:51:26.7032205Z`,针对的是 One Outlook Web 客户端。该时间戳标志着从探测尝试到活动会话的转变,并且该记录中命名的应用程序是授权操作者第一个有效 token 的攻击面。
```
SigninLogs
| where UserPrincipalName == "m.smith@lognpacific.org"
| where IPAddress == '103.69.224.136'
| order by TimeGenerated desc
```

#### 🏁 Flag 9 - 进入前的失败尝试
- **答案:** `2`
- **发现过程:** 为了严格计算在第一次成功登录之前的失败尝试次数,我将首次成功的时间限定在一个 `let` 变量中,然后计算在该时间戳之前结果类型为 `50126`(用户名或密码无效)的记录。在操作者成功使用有效凭证之前只发生了两次失败。这排除了暴力破解的可能性,符合凭证重用、先前的网络钓鱼或使用泄露密码进行轻量级验证的特征。
```
let SuccessfulSessionTime =
SigninLogs
| where UserPrincipalName =~ "m.smith@lognpacific.org"
| where IPAddress == "103.69.224.136"
| where ResultType == 0
| summarize FirstSuccess = min(TimeGenerated);
SigninLogs
| where UserPrincipalName =~ "m.smith@lognpacific.org"
| where IPAddress == "103.69.224.136"
| where TimeGenerated < toscalar(SuccessfulSessionTime)
| where ResultType == 50126
| count
```

#### 🏁 Flag 10 - 单个 Token 的爆炸半径
- **答案:** `7`
- **发现过程:** 我将范围缩小到来自攻击者 IP 的成功登录,并在 `AppDisplayName` 上使用 `dcount` 来衡量同一身份在入侵期间访问了多少个不同的云应用程序。共有七个应用程序通过了身份验证,这确立了一个单一被攻陷 token 的操作足迹。
```
SigninLogs
| where UserPrincipalName == "m.smith@lognpacific.org"
| where IPAddress == "103.69.224.136"
| where ResultSignature == 'SUCCESS'
| summarize DistinctApps = dcount(AppDisplayName)
```
#### 🏁 Flag 11 - 一个连续的会话
- **答案:** `005d431a-380b-1f5e-e554-16d5010dc28e`
- **发现过程:** 我按 `SessionId` 对成功登录进行分组,并提取了每个会话的不同应用程序、应用名称以及第一次和最后一次看到的时间戳。一个单一的会话 ID 负责了所有的跨应用活动,包括 Outlook Web、Microsoft Teams 和其他 Microsoft 云服务。操作者并没有建立多个会话;他们利用一个 token 在不同服务之间进行切换。
```
SigninLogs
| where UserPrincipalName =~ "m.smith@lognpacific.org"
| where IPAddress == "103.69.224.136"
| where ResultType == 0
| summarize
DistinctApps = dcount(AppDisplayName),
Apps = make_set(AppDisplayName),
FirstSeen = min(TimeGenerated),
LastSeen = max(TimeGenerated)
by SessionId
| order by DistinctApps desc
```

### 阶段 3:目录侦察
#### 🏁 Flag 12 - MFA 状态画像
- **答案:** `userRegistrationDetails`
- **发现过程:** 在会话早期,操作者在 `/reports/` 路径下进行了 Graph API 调用。我查询了筛选至该路径的 `MicrosoftGraphActivityLogs` 并按时间排序。第一个请求访问了 `userRegistrationDetails`,它返回了每个用户的身份验证方法注册状态。这是在进行定向侦察,以了解哪些账户的 MFA 较弱或缺失,然后再选择下一个目标。
```
MicrosoftGraphActivityLogs
| where RequestUri contains "/reports/"
| project TimeGenerated, UserId, AppId, RequestMethod, RequestUri, ResponseStatusCode
| sort by TimeGenerated asc
```

#### 🏁 Flag 13 - 组枚举
- **答案:** `/v1.0/me/memberOf`
- **发现过程:** 我筛选了 `MicrosoftGraphActivityLogs` 中任何涉及 `/me/member` 的请求。操作者对 Microsoft Graph 发出了 `GET /v1.0/me/memberOf` 请求,以通过一次调用枚举受害者的完整组、角色和目录对象成员身份。这相当于在端点上登录后运行 `whoami /groups` 的云版本,用于识别审批路径、通讯组和下游访问权限。
```
MicrosoftGraphActivityLogs
| where RequestUri contains "/me/member"
| project TimeGenerated, RequestUri, RequestMethod
| sort by TimeGenerated asc
```

### 阶段 4:欺诈
#### 🏁 Flag 14 - 欺诈性请求
- **答案:** `Updated Banking Details - Pacific IT Monthly`
- **发现过程:** 在确认会话到达 Outlook Web 后,我提取了根据受害者的显示名称筛选的 `EmailEvents`,以显示来自被攻陷邮箱的外发邮件。在 `2026-06-11T04:13:54Z`,一封电子邮件发送到了 `j.reynolds@lognpacific.org`,主题为 `Updated Banking Details - Pacific IT Monthly`。该消息是一个内部鱼叉式网络钓鱼请求,旨在利用内部发件人的信任,将定期付款重定向到由攻击者控制的银行账户(T1534)。
```
EmailEvents
| where SenderDisplayName contains "smith"
```

#### 🏁 Flag 15 - 他们挖掘的邮件线程
- **答案:** `Q1 Vendor Payment Schedule - Review Required`
- **发现过程:** 我在 `EmailEvents` 中搜索与付款相关关键词匹配的邮箱内容。该欺诈消息引用了一个真实的先前邮件线程 `Q1 Vendor Payment Schedule - Review Required`,最初发送于 `2026-02-08T02:53:23Z`,大约在入侵前四个月。该线程记录了内部付款审批流程,包括金额门槛和审批人角色,为操作者提供了定价和构建欺诈请求所需的操作上下文(T1114.002,远程邮件收集)。
```
EmailEvents
| where Subject has_any ("subject","payment","money")
| project Timestamp, Subject
| order by Timestamp desc
```

#### 🏁 Flag 16 - 欺诈目标
- **答案:** `j.reynolds@lognpacific.org`
- **发现过程:** 从被攻陷的邮箱中发现了两封与欺诈相关的电子邮件。第一封于 `2026-06-11T04:13:54Z` 发送至 `j.reynolds@lognpacific.org`。该邮件线程在 `2026-06-11T12:41:14Z` 被外部转发至 `merovingian1337@proton.me`,这在 Flag 20 中会变得相关。内部收件人是欺诈目标。外部 Proton 地址是数据外发目的地。
```
EmailEvents
| where SenderDisplayName has_any ("mark")
| project TimeGenerated, SenderDisplayName, RecipientEmailAddress, Subject
| order by TimeGenerated desc
```
*狩猎期间未捕获截图。*
#### 🏁 Flag 17 - 第二渠道强化
- **答案:** `Microsoft Teams`
- **发现过程:** 怀疑欺诈请求存在跨渠道强化,我查询了与受害者显示名称相关的 `CloudAppEvents` 中的 `MessageSent` 操作,并提取了 Application 字段。Microsoft Teams 是唯一返回的平台,证实了操作者通过 Teams 发送了后续消息以强化基于邮件的欺诈请求。将电子邮件和聊天分层是一种已知的社会工程学模式,旨在通过使请求看起来是协调且常规的,来克服目标的犹豫。
```
CloudAppEvents
| where AccountDisplayName has "mark"
| where ActionType == "MessageSent"
| project Application
```

### 阶段 5:持久化狩猎
操作者修改了邮箱,使得针对欺诈的回复对 Mark 不可见。接下来的 Flag 确定了他们创建的规则以及每条规则的作用。
#### 🏁 Flag 18 - 隐藏规则
- **答案:** `Invoice Processing`
- **发现过程:** 我查询了与被攻陷邮箱相关的 `OfficeActivity` 中的 `New-InboxRule` 操作,展开了 `Parameters` JSON,并提取了规则名称。在入侵期间创建了两条规则。第一条名为 `Invoice Processing`,它将任何与欺诈相关主题模式匹配的入站邮件静默地从收件箱中移出到一个看起来很正常的文件夹中,这样 Mark 就永远不会看到与伪造的银行请求相关的回复。
```
OfficeActivity
| where Operation == "New-InboxRule"
| where UserId =~ "m.smith@lognpacific.org" or MailboxOwnerUPN =~ "m.smith@lognpacific.org"
| extend Params = parse_json(Parameters)
| mv-expand Params
| extend ParamName = tostring(Params.Name), ParamValue = tostring(Params.Value)
| where ParamName == "Name"
| project TimeGenerated, ClientIP, RuleName = ParamValue
```

#### 🏁 Flag 19 - 隐藏的邮件去了哪里
- **答案:** 避免触发删除警报,并混入正常的邮箱活动中。普通的文件夹名称对用户和监控系统来说都不显得可疑。
- **发现过程:** 硬删除在大多数受监控的环境中都会触发警报。`MailItemsAccessed`、`SoftDelete` 和 `HardDelete` 操作受到 DLP 和 UEBA 工具的监控,并且已删除项目的恢复是一项常规的取证检查。相反,移动操作被视为用户的归档行为,很少会触发警报。使用一个看起来像财务工作流的文件夹名称(`Invoice Processing`)意味着,即使 Mark 注意到了这个文件夹,该名称读起来也是常规的。

#### 🏁 Flag 20 - 数据外发规则
- **答案:** `merovingian1337@proton.me`
- **发现过程:** 从同一个 `OfficeActivity` 查询中提取第二条规则,我发现了一个名为 `Backup Copy` 的规则,创建于 `2026-06-11T03:32:31Z`。该规则将来自 `j.reynolds@lognpacific.org` 的任何电子邮件转发到外部地址 `merovingian1337@proton.me`,并包含一个 `StopProcessingRules` 标志,该标志会阻止可能对同一消息执行操作的任何其他规则。这就是数据外发通道:无论操作者是否登录,来自欺诈目标的每一条回复都会被静默镜像到攻击者基础设施。
```
OfficeActivity
| where Operation == "New-InboxRule"
| where UserId =~ "m.smith@lognpacific.org" or MailboxOwnerUPN =~ "m.smith@lognpacific.org"
| extend Params = parse_json(Parameters)
| mv-expand Params
| extend ParamName = tostring(Params.Name), ParamValue = tostring(Params.Value)
| where ParamName == "Name"
```
*狩猎期间未捕获截图。*
#### 🏁 Flag 21 - 两条规则的目标是谁
- **答案:** 针对伪造付款请求的欺诈目标回复,这样受害者就无法看到可能暴露骗局的问题、确认或拒绝。
- **发现过程:** 两条规则都对来自 `j.reynolds@lognpacific.org` 的入站邮件起作用,该收件人同样是收到欺诈性银行请求的人。隐藏规则(`Invoice Processing`)将 J. Reynolds 的回复在 Mark 的视图中隐藏起来。数据外发规则(`Backup Copy`)将这些相同的回复镜像到操作者的外部邮箱。它们共同确保了对话继续进行,操作者拥有完全的可见性,同时对被攻陷的用户保持完全不可见,这就是即使 Mark 登录去做其他工作,欺诈也能被执行到底的原因。
*狩猎期间未捕获截图。*
### 阶段 6:数据窃取
#### 🏁 Flag 22 - 数据外发操作
- **答案:** `FileDownloaded`
- **发现过程:** Mark Smith 作为其财务工作的一部分,整天都在打开文件,因此 `FileAccessed` 和 `FilePreviewed` 事件属于基线噪音。我通过专门将 `OfficeActivity` 筛选为 `FileDownloaded` 操作,将复制出行为与原地读取分离开来。从精简后的数据集中,我根据攻击者会话 IP 和 user agent、入侵窗口内的紧凑时间以及文件与欺诈的相关性,将剩余的事件关联起来,这最终只留下了用户正常工作集之外的付款和审批文档。
#### 🏁 Flag 23 - 窃取的容量
- **答案:** `3`
- **发现过程:** 在攻击者会话期间下载了三个文件。内容表明是选择性定向而非批量收集:下载内容包含与欺诈目标和后续访问直接对齐的银行详细信息和访问凭证,而不是批量文件枚举。这符合一个在打开文件浏览器之前就已经知道其目标的专业操作者。
#### 🏁 Flag 24 - 凭证文档
- **答案:** `VPN-Access-Credentials.txt`
- **发现过程:** 我将 `OfficeActivity` 筛选为被攻陷的用户以及包含字符串 `download` 的任何操作。下载的三个文件之一是 `VPN-Access-Credentials.txt`。操作者提取的文件中出现该文件,将事件范围扩大到了邮箱之外:必须假定存储在该文件中的任何凭证都已暴露并且必须进行轮换,并且应审查源自用户正常地理范围之外的任何 VPN 会话是否存在滥用。
```
OfficeActivity
| where UserId =~ "m.smith@lognpacific.org"
| where Operation contains "download"
```

#### 🏁 Flag 25 - 被浏览的凭证库
- **答案:** `yomark.pdf`
- **发现过程:** 我筛选了同一个被攻陷用户下的 `OfficeActivity` 中的 `FileAccessed` 操作。操作者访问了凭证库 SharePoint 库下的 `all.aspx`,在浏览器中枚举了该文件夹的内容,而没有打开或下载其中的任何文件。文件 `yomark.pdf` 出现在该访问路径中。这是文件和目录发现(T1083):操作者清点了凭证库中的内容,而没有留下伴随实际下载而产生的更重额的取证痕迹。
```
OfficeActivity
| where UserId =~ "m.smith@lognpacific.org"
| where Operation == "FileAccessed"
```

#### 🏁 Flag 26 - 反驳无辜的解释
- **答案:** ``
- **发现过程:**
```
```
[image]
#### 🏁 Flag 27
- **答案:** ``
- **发现过程:**
```
```
[image]
#### 🏁 Flag 28
- **答案:** ``
- **发现过程:**
```
```
[image]
#### 🏁 Flag 29
- **答案:** ``
- **发现过程:**
```
```
[image]
#### 🏁 Flag 30
- **答案:** ``
- **发现过程:**
```
```
[image]
#### 🏁 Flag 31
- **答案:** ``
- **发现过程:**
```
```
[image]
#### 🏁 Flag 32
- **答案:** ``
- **发现过程:**
```
```
[image]
#### 🏁 Flag 33
- **答案:** ``
- **发现过程:**
```
```
[image]
#### 🏁 Flag 34
- **答案:** ``
- **发现过程:**
```
```
[image]
#### 🏁 Flag 35
- **答案:** ``
- **发现过程:**
```
```
[image]
#### 🏁 Flag 36
- **答案:** ``
- **发现过程:**
```
```
[image]
#### 🏁 Flag 37
- **答案:** ``
- **发现过程:**
```
```
[image]
## 检测缺口与建议
### 观察到的缺口
- Entra ID Protection 根据孤立的匿名 IP 检测将此事件评为低风险。随着同一个会话随后表现出跨应用横向移动、Graph 侦察、内部鱼叉式网络钓鱼、收件箱规则创建和凭证文件下载,风险评分并没有更新。
- MFA 已在账户上注册,但并未在 One Outlook Web 登录路径上强制执行。来自攻击者 IP 的每一次成功身份验证都以 `singleFactorAuthentication` 完成。这是一个 Conditional Access 策略缺口,而不是 MFA 被绕过。
- 该账户上被 `dismissed`(忽略)风险状态的历史模式降低了分析师响应的信号。夜班团队的判定遵循了阻力最小的路径,因为该路径已经通过之前反复的忽略操作得到了验证。
- `New-InboxRule` 操作未触发警报,包括将邮件转发到外部 `proton.me` 地址的 `Backup Copy` 规则。外部邮件转发规则的创建是一个高置信度的持久性指标,不应该悄无声息。
- 一个名为 `Invoice Processing` 的主题行过滤器收件箱规则捕获来自特定内部发件人的邮件,并将其路由到非默认文件夹,这是一个强烈的欺诈隐藏特征。没有检测在该规则的逻辑上触发,而仅仅在其存在于审计跟踪中触发。
- 单个请求的跨渠道强化(在短时间窗口内通过电子邮件和 Teams 发送给同一收件人)没有被任何 UEBA 控件关联。这两个事件存在于不同的表中。
- 在一个被主动标记为存在风险的会话中,一个文件名中带有 `credentials` 的文件被财务用户。没有 DLP 或命名模式检测被触发。
### 建议
- 更新 Conditional Access,要求在所有交互式登录(包括传统和仅限 Web 的身份验证路径)上进行 MFA。对于注册了 MFA 的账户,阻止任何以 `singleFactorAuthentication` 完成的登录。
- 构建一个 Sentinel 分析,如果同一个 `SessionId` 或源 IP 随后执行以下任何操作,则升级风险事件:创建收件箱规则、外部邮件转发、批量文件访问或登录到三个以上的不同应用程序。
- 对在 `ForwardTo` 或 `RedirectTo` 参数中包含外部收件人的 `New-InboxRule` 操作发出警报。当规则包含 `StopProcessingRules` 时,以更高的严重性发出警报。
- 对主题过滤器匹配付款或欺诈关键词集(`payment`、`banking`、`invoice`、`wire`、`ACH`、`vendor`)的收件箱规则发出警报。
- 构建一个关联规则,将 `EmailEvents` 和 `CloudAppEvents` 结合起来,以便在电子邮件包含与付款相关的内容时,标记出在短时间窗口内通过 Outlook 和 Teams 向同一收件人发送消息的同一发件人。
- 对任何用户下载名称符合凭证指标(`vpn`、`credential`、`password`、`secret`、`recovery`)的文件发出警报,当该用户当前在 Entra ID Protection 中被标记时,应给予更高的严重性。
- 审查财务和其他特权用户中被 `dismissed`(忽略)的风险状态模式。在过去 90 天内有三个或更多被忽略事件的任何账户,下一次忽略时应要求 T2 级别的批准。
## 最终评估
事件 87241 的低严重性判定是不正确的。被标记的登录是一次蓄意的、云原生入侵的可见边缘,该入侵在短短十个小时的窗口内,从初始访问一直发展到侦察、内部鱼叉式网络钓鱼、持久化和定向凭证窃取。操作者从未接触过端点,也从未使用过恶意软件。他们所做的一切都是由一个有效的 token 授权的,这正是现有工具对其权重评估不足的原因。
**归因特征。** 证据表明,这是一个对环境有预先了解的、耐心且单一的操作者。他们知道应该挖掘哪个内部线程来获取欺诈可信度(四个月大,准确到无需修改即可使用)。他们在行动前就对 MFA 状态进行了画像。他们在发送欺诈请求之前枚举了组成员身份。他们构建的持久性针对一个特定的收件人使用了两种互补的机制(隐藏加外发),而不是盲目转发。他们下载了一个凭证文件,指向 Microsoft 365 之外的后续访问。这些选择都不是即兴发挥的。
**在没有人员在线的情况下仍在运作的内容。** 这两个收件箱规则在没有任何用户会话的情况下继续运作。`Backup Copy` 会静默地将来自 `j.reynolds@lognpacific.org` 的任何回复转发到 `merovingian1337@proton.me`。`Invoice Processing` 会将这些相同的回复排除在 Mark Smith 的视图之外。在删除这两个规则之前,操作者将继续收到对话内容,而被攻陷的用户则无法看到它。仅禁用账户并不能阻止这种情况;必须显式删除这些规则。
**响应顺序。**
1. 吊销 `m.smith@lognpacific.org` 的所有活动会话并禁用该账户。
2. 立即从 Mark 的邮箱中删除 `Backup Copy` 和 `Invoice Processing` 收件箱规则。
3. 通过经验证的渠道直接通知 `j.reynolds@lognpacific.org` 银行详细信息请求是欺诈性的。中止针对该请求的任何待处理付款更改。
4. 轮换存储在 `VPN-Access-Credentials.txt` 中的每个凭证,并审查 VPN 日志中是否有源自 `103.69.224.136` 或其他匿名化基础设施的任何会话。
5. 在网关处阻止与 `merovingian1337@proton.me` 的入站和出站邮件流,并将该地址添加到威胁情报监视列表中。
6. 审计 SharePoint 凭证库,确认是否应该删除 `yomark.pdf` 或同一库下的任何其他内容,或者将其移至更严格的访问控制之后。
7. 重新检查 Q1 供应商付款线程,以确定操作者是如何获得对其的可见性的。可能的答案包括较早的邮箱访问、邮件线程上另一个被攻陷的账户或内部人员暴露。邮件线程与入侵之间四个月的间隔是本次狩猎遗留下来最重要的悬而未决的问题。
8. 清查其他财务和财务相关账户是否存在相同的模式:`singleFactorAuthentication` 成功、带有外部转发的 `New-InboxRule` 事件以及过去 90 天内被 `dismissed` 的 Entra ID Protection 事件。
## 分析师笔记
- 狩猎范围限于跨越 Microsoft 365 和 Entra ID 的纯云入侵。没有涉及端点遥测。
- 通过在 `SigninLogs`、`AADUserRiskEvents`、`MicrosoftGraphActivityLogs`、`EmailEvents`、`OfficeActivity` 和 `CloudAppEvents` 之间进行切换来组装证据。在查询之前,使用通过 `take 1` 和 `getschema` 进行的 schema 发现来映射不熟悉的表。
- 所有技术都映射到了 MITRE ATT&CK Enterprise。
- IR 框架参考:NIST SP 800-61(计算机安全事件处理指南)。
- 报告结构专为面试和作品集审查而设计。
标签:KQL, Microsoft 365, 安全助手, 网络安全审计