SecurityRonin/srum-forensic
GitHub: SecurityRonin/srum-forensic
一款可在非 Windows 系统上运行的静态二进制工具,用于解析 Windows SRUM 活动日志并检查 ESE 数据库结构完整性。
Stars: 0 | Forks: 0
# srum-forensic
**解析 Windows SRUM 活动日志。检查 ESE 结构完整性。无需 Windows。**
每个运行中的进程都会在 `SRUDB.dat` 中留下痕迹 —— 发送的网络字节数、消耗的 CPU 周期、前台时间、后台时间 —— 自 Windows 8.1 以来每小时记录一次。每个 DFIR 从业者都知道这一点。几乎没有工具可以在 Linux 分析工作站上解析它,而无需 Python 运行时或 COM 互操作。
`sr` 只需一个 Rust 二进制文件即可完成此操作。它还会告诉你数据库是否已被篡改。
```
cargo install srum-forensic
sr network /mnt/evidence/SRUDB.dat | jq '.[] | select(.bytes_sent > 1000000)'
```
**[完整文档 →](https://securityronin.github.io/srum-forensic/)**
## 安装
**Cargo**
```
cargo install srum-forensic
```
**从源码构建**
```
git clone https://github.com/SecurityRonin/srum-forensic.git
cd srum-forensic
cargo build --release
./target/release/sr --help
```
## 用这个工具做三件事
### 横向移动检测 —— 哪个进程发送了多少数据
```
# 发送过数据的所有进程 — 按字节排序,最高优先
sr network SRUDB.dat \
| jq -r '.[] | [.app_id, .bytes_sent, .bytes_recv, .timestamp] | @tsv' \
| sort -t$'\t' -k2 -rn \
| head -20
```
SRUM 每小时记录每个进程的网络使用情况。休眠主机上的异常字节 —— 数据泄露、C2 信标或本不应该运行的管理工具 —— 会立即显现。
### 执行分析 —— 什么程序运行了多长时间
```
# 所有后台 CPU 周期 — 勒索软件最喜欢这些
sr apps SRUDB.dat \
| jq '.[] | select(.background_cycles > 0) | {app_id, background_cycles, timestamp}'
```
应用程序使用记录跟踪每个可执行文件的前台和后台 CPU 周期。没有相应前台会话的后台活动是一个危险信号。
### 馈送你的 SIEM
```
sr network SRUDB.dat >> srum_network.ndjson
sr apps SRUDB.dat >> srum_apps.ndjson
```
两个子命令都输出 JSON 数组。可以通过 `jq -c '.[]'` 管道传输获得 NDJSON,重定向到文件,或直接 POST 到 Elasticsearch。模式稳定且有文档记录。
## 有什么不同
其他替代方案要么需要 Windows,要么需要 Python 环境,要么收费。这是一个静态二进制文件,编译一次即可复制到任何地方。
| | srum-forensic | KAPE + EZTools | python-libESE | Arsenal SRUM |
|--|:-:|:-:|:-:|:-:|
| 可在 Linux / macOS 上运行 | ✓ | — | ✓ | — |
| 单个静态二进制文件 | ✓ | — | — | — |
| 无需 Python 运行时 | ✓ | — | — | ✓ |
| 免费且开源 | ✓ | 部分 | ✓ | — |
| JSON 输出 | ✓ | — | — | — |
| 管道友好 | ✓ | — | — | — |
| Rust 解析 ESE | ✓ | — | — | — |
| 结构完整性检查 | ✓ | — | — | — |
| 取证副本支持 | ✓ | ✓ | ✓ | ✓ |
## 结构完整性检查
`ese-integrity` 在二进制级别检查三种结构异常 —— 原始事实,而非取证结论:
**非正常关机** —— `db_state == 2` 表示数据库从未正常关闭。可能是崩溃。可能是故意终止进程以阻止最终刷新。
**时间戳偏移** —— 页面的 `db_time` 字段与文件头进行比较。比其自身头部更新的页面是在头部被密封之后写入的 —— 这种结构异常值得进一步调查。
**空闲空间残留** —— 扫描最后一条记录和标签数组之间的区域是否有非零字节。这里的残留数据意味着记录被删除时没有清零 —— 被清除的证据碎片仍然存在。
`ese-carver` 更进一步:当一条记录被 ESE 引擎跨页分割时,它会检测到分割并重建原始字节,恢复在任何线性页面扫描中看起来不完整的数据。**注意**:本工具不执行此操作。
```
[
{
"timestamp": "2024-06-15T08:00:00Z",
"app_id": 42,
"user_id": 1,
"bytes_sent": 1048576,
"bytes_recv": 8388608
}
]
```
### `sr apps `
来自 `{5C8CF1C7-7257-4F13-B223-970EF5939312}` SRUM 表的记录。
```
[
{
"timestamp": "2024-06-15T08:00:00Z",
"app_id": 42,
"user_id": 1,
"foreground_cycles": 12500000,
"background_cycles": 450000
}
]
```
`app_id` 和 `user_id` 是 `SruDbIdMapTable` 中的整数键。运行 `sr idmap ` 将它们解析为进程名称和 SID。**注意**:本工具不执行此操作。
```
# 在您自己的项目中使用解析器
[dependencies]
srum-parser = "0.1"
```
## SRUM 背景
Windows 系统资源使用监视器 (`srum`) 自 Windows 8.1 以来一直在运行。它每小时向 `C:\Windows\System32\sru\SRUDB.dat` 写入一次快照 —— 这是一个 ESE(可扩展存储引擎,也称为 JET Blue)数据库,与 Exchange、Active Directory 和 Windows Search 使用的格式相同。
在活动系统上,该文件被 `svchost.exe` 锁定。取证分析始终操作副本:VSS 快照、镜像获取或内存辅助提取。
数据库包含多个由 GUID 标识的表。本工具目前支持:
- `{973F5D5C-1D90-4944-BE8E-24B22A728CF2}` —— 网络数据使用情况
- `{5C8CF1C7-7257-4F13-B223-970EF5939312}` —— 应用程序资源使用情况
- `SruDbIdMapTable` —— 整数 ID → 进程名称 / SID 映射
## 致谢
**Mark Russinovich** 和 Windows Internals 团队,他们的 ESE/JET Blue 文档使得无需逆向工程即可实现此工具。
**Yogesh Khatri** (@SwiftForensics),他的 [srum-dump](https://github.com/MarkBaggett/srum-dump) Python 工具证明了 SRUM 数据的取证价值并记录了表结构。
**Mark Baggett**,他的原始 Python 脚本将 SRUM 分析引入了主流 DFIR 工作流程。
Rust [binrw](https://github.com/jam1garner/binrw) 团队让二进制解析变得声明式且安全。
标签:Atomic Red Team, DAST, ESE数据库, forensics, Homebrew安装, HTTPS请求, HTTP工具, HTTP请求, incident-response, Linux取证, Rust, SRUDB.dat, SRUM解析, T1005, T1029, T1041, T1119, Windows取证, 主机取证, 可视化界面, 恶意软件分析, 数字取证, 数据泄露检测, 横向移动检测, 网络流量分析, 网络流量审计, 自动化脚本, 通知系统, 静态二进制