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取证, 主机取证, 可视化界面, 恶意软件分析, 数字取证, 数据泄露检测, 横向移动检测, 网络流量分析, 网络流量审计, 自动化脚本, 通知系统, 静态二进制