j-dahl7/session-hijack-detection-sentinel
GitHub: j-dahl7/session-hijack-detection-sentinel
该项目为 Microsoft Sentinel 提供了一套检测信息窃取者会话劫持行为的分析规则、搜寻查询和可视化工作簿实验环境。
Stars: 0 | Forks: 0
# Microsoft Sentinel 会话劫持检测
通过 5 个 Sentinel 分析规则、5 个搜寻查询和 1 个威胁仪表板工作簿,检测信息窃取者的会话劫持行为。
**博客文章:** [使用 Microsoft Sentinel 检测信息窃取者会话劫持](https://nineliveszerotrust.com/blog/session-hijack-detection-sentinel/)
## 验证边界
经过强化的 2026 年 7 月 25 日修订版通过了离线 PowerShell 解析、模拟的归属/清理检查,以及 KQL/静态契约审查。它并未进行全新的部署、查询,也未在活跃的 Entra/Sentinel 租户上运行测试。历史事件可能会展示早期的修订版本,但它们不能证明当前辅助脚本能够生成每条规则所需的 token 签发、刷新、设备、地理位置、风险或 CAE 行。
## 部署内容
| 资源 | 类型 | MITRE |
|---|---|---|
| LAB - Token Replay from New Device or IP | Analytics Rule (High) | T1539, T1550.001 |
| LAB - Impossible Travel on Token Refresh | Analytics Rule (High) | T1539 |
| LAB - Anomalous Non-Interactive Sign-in Surge | Analytics Rule (Medium) | T1539, T1550.001 |
| LAB - Browser or OS Mismatch in Same Session | Analytics Rule (Medium) | T1539, T1550.001 |
| LAB - CAE Revocation Followed by New Location Auth | Analytics Rule (High) | T1539, T1550.001 |
| Session Hijack Threat Dashboard | Workbook | - |
## 前置条件
- 启用了 Microsoft Sentinel 的 Azure 订阅
- Entra ID P2(用于 Identity Protection 风险评分)
- 通过 Entra diagnostic settings 路由到 Sentinel 的 `SigninLogs` 和 `NonInteractiveUserSignInLogs`
- Azure CLI + PowerShell 7+
- 拥有读取 Entra diagnostic settings 和工作区日志的权限,并能在指定的现有工作区中创建 Sentinel 规则/工作簿
该工作区属于共享基础设施。此实验不会创建或删除它。
现有的数据引入、留存、Entra 许可和 Sentinel 费用照常适用。
## 快速入门
```
git clone https://github.com/j-dahl7/session-hijack-detection-sentinel.git
cd session-hijack-detection-sentinel
./scripts/Deploy-Lab.ps1 -ResourceGroup "rg-sentinel-lab" -WorkspaceName "law-sentinel-lab"
./scripts/Test-SessionHijack.ps1 -TenantId "" -BurstCount 30
./scripts/Deploy-Lab.ps1 -ResourceGroup "rg-sentinel-lab" -WorkspaceName "law-sentinel-lab" -Destroy -WhatIf
./scripts/Deploy-Lab.ps1 -ResourceGroup "rg-sentinel-lab" -WorkspaceName "law-sentinel-lab" -Destroy
```
若要预览部署,请在第一条部署命令后附加 `-WhatIf`。它仍会执行只读发现、diagnostic settings 检查和工作区查询,但会跳过受保护的规则/工作簿写入操作。`-Destroy -WhatIf` 会列出并验证确定性 ID 和归属标记,但不会删除它们。
这两个预览操作均不会验证实时的规则输出。
部署参数包括 `-ResourceGroup`、`-WorkspaceName`、`-SkipDiagnostics`、`-SkipSentinel`、`-Destroy` 以及 PowerShell 通用的 `-WhatIf` 开关。辅助脚本接受 `-TenantId`、`-BurstCount`(默认为 30)和 `-SkipBurst`。
## 验证预期
`Test-SessionHijack.ps1` 是一个用于测试连接性和种子活动的无害辅助脚本。它不会劫持会话、重放被盗 token、强制刷新 token、控制 Entra 的登录聚合,也不会确定性地生成事件。缓存的 Graph 调用与登录日志行不是一一映射的,并且更改 HTTP `User-Agent` 也不能保证产生不同的 Entra `DeviceDetail` 指纹。
`-BurstCount` 仅控制 Graph 请求的数量;没有任何取值能可靠地触发某项规则。
| 规则 | 实际需要的实时遥测数据 |
|---|---|
| Token Replay | 相对于查询基准,同一用户从真正全新的 IP 或设备发起的成功活动 |
| Impossible Travel | 从地理位置相隔较远的公网 IP 进行的成功登录/token 刷新,且具有可用的位置和时间戳;VPN 或 Cloud Shell 可能仍会解析到附近位置或被标准化 |
| Non-Interactive Surge | `AADNonInteractiveUserSignInLogs` 中有足够的符合要求的行数超过规则阈值/基准,而不仅仅是重复的缓存 token API 调用 |
| Browser/OS Mismatch | 同一记录的会话在 `DeviceDetail` 中具有真正不同的浏览器/操作系统指纹 |
| CAE Revocation | 真实的 CAE/撤销失败,随后从新位置进行符合要求的身份验证;辅助脚本不会执行或证明此生命周期 |
分层验证:确认原始行及其会话/关联字段,在正确的时间窗口内手动执行每个 KQL 查询,然后等待计划的规则和事件管道处理。将规则的静默状态视为一个数据/条件问题,而不是部署或攻击模拟成功的证明。
辅助脚本会向 Microsoft Graph 发送良性调用,并查询 `api.ipify.org` 以显示当前的公网 IP。请仅使用专用的低权限实验身份运行它,并根据您的环境审查该外部调用。
## 故障排除
- **WSL 和 VPN:** WSL 终端可能会绕过您的 Windows VPN。请在激活了 VPN 的 Windows PowerShell 或 Azure Cloud Shell 中运行 `az rest`。
- **登录日志引入延迟:** `AADNonInteractiveUserSignInLogs` 可能会被延迟或聚合;不要假设有固定的到达时间窗口。
- **规则评估频率:** 捆绑的分析规则配置为每小时运行一次 (`PT1H`)。数据引入、调度和事件创建可能会增加额外的延迟。
- **Risk Level Distribution 面板为空:** 在低风险沙箱中,在 Identity Protection 发出中等或高风险信号之前,这是预期内的现象。
- **Graph API 403 错误:** 模拟使用的是 `User.Read` 作用域的 `/me` 端点。如果遇到 403 错误,请重新运行 `az login`。
- **LocationDetails 解析:** 某些工作区将 LocationDetails 存储为字符串。KQL 使用 `parse_json(tostring(LocationDetails))` 来处理这两种格式。
## 清理范围
销毁模式仅从指定的现有工作区中移除五个确定性标识且带有归属标记的分析规则,以及带有归属标记的工作簿。它不会删除资源组、工作区、diagnostic settings、登录数据、事件或共享的许可/配置。
请始终先运行 `-Destroy -WhatIf`,并验证所显示的订阅、资源组、工作区、ID 和归属标记。
## 许可证
MIT
标签:AI合规, KQL, Libemu, Microsoft Sentinel, URL发现, 会话劫持检测, 安全检测