zavetsec/ZavetSec-BrowserHistory
GitHub: zavetsec/ZavetSec-BrowserHistory
Windows 平台实时浏览器取证工具,通过 VSS 卷影副本绕过文件锁定,一键提取所有用户的 16 种浏览器历史记录并生成加密报告。
Stars: 1 | Forks: 0
# `>_` ZavetSec-BrowserHistory
**Windows IR 实时浏览器历史记录获取 —— 全用户、全浏览器、一份加密报告**
[](https://github.com/zavetsec)
[](https://github.com/zavetsec)
[](https://github.com/zavetsec)
[](https://github.com/zavetsec)
通过 VSS Shadow Copy 绕过文件锁定 · 16 种浏览器 · AES-256 加密输出 · 交互式 HTML 报告
[何时使用](#-when-to-use) · [快速开始](#-quick-start) · [参数](#-parameters) · [报告](#-html-report) · [远程执行](#-remote-execution) · [局限性](#-limitations) · [路线图](#-roadmap)
## TL;DR
用于 Windows 实时 IR 的单命令浏览器历史记录获取:
```
.\ZavetSec-BrowserHistory.ps1
```
- 通过 VSS Shadow Copy 绕过锁定的浏览器数据库 —— 浏览器保持运行
- 单次运行收集所有本地用户配置文件
- 生成加密的、分析师即用的 HTML 报告,支持搜索和过滤
- 零安装 —— 单个 `.ps1` 文件,PowerShell 5.1,适用于任何 Windows 端点
## 目标受众
DFIR 分析师 · 事件响应人员 · SOC 工程师 · 威胁猎手
## 为什么选择这个工具
市面上已有多种浏览器历史记录工具。本工具专为 IR 场景构建 —— 而非用于日常浏览分析或家长控制工具。
在现场实践中至关重要的差异点:
- **VSS Shadow Copy** —— 直接从运行中的浏览器读取 `History` 和 `places.sqlite`,无需终止进程或等待其正常关闭。大多数工具在浏览器持有锁定时会静默失败或返回部分结果。
- **一次运行覆盖所有用户** —— 通过注册表 (`ProfileList`) 枚举每个本地配置文件,涵盖域账户、本地账户以及本次会话中从未登录过的账户。一条命令,一台机器,完整图景。
- **加密的证据打包** —— 输出打包为 AES-256 ZIP,使用一次性加密随机密码(仅打印一次到控制台)。可安全地通过跳板机复制、存入 USB 或附加到工单,而不会在传输过程中暴露内容。
- **零安装** —— 单个 `.ps1` 文件。在任何具有 PowerShell 5.1 的 Windows 端点上运行 —— 覆盖自 Windows 7 以来的所有企业机器。无需 MSI、NuGet 或安装过程。
- **内置回退链** —— 没有 `sqlite3.exe`?从原始 SQLite 页面中机会性地恢复 URL。没有 `7z.exe`?内置 .NET 压缩仍然生成 ZIP。没有管理员权限?仍然收集当前用户配置文件。
- **原生 Get-Help** —— 通过 PowerShell 基于注释的帮助完全文档化。`Get-Help .\ZavetSec-BrowserHistory.ps1 -Full` 开箱即用。
**在 IR 工作流中的定位:**
早期部署 —— 在 KAPE 收集之前或同时,以及在镜像之前。它处理 KAPE 目标在实时系统上因文件锁定而经常遗漏的浏览器工件层。结构化 CSV 输出可直接导入 SIEM 或时间线工具。加密存档可在任何环节移交,而不违反证据处理程序。
## 何时使用
**事件响应 / DFIR**
主机疑似遭到入侵。在重镜像或网络隔离切断访问之前,你需要浏览器证据 —— 访问了什么、何时访问、由哪个账户访问 —— 运行脚本,收集加密存档,继续下一步。
**内部威胁调查**
某账户显示异常行为。所有本地配置文件的浏览器历史记录可以确认或排除通过网页邮件、云存储上传或剪贴板站点进行的数据暂存 —— 仅靠进程日志无法浮现这些证据。
**工作站审计**
离职前审查、合规检查或事件后重建。单次运行覆盖所有配置文件,无需手动逐账户访问。
**何时不适用**
这是一个实时获取的取证分类工具。它不保留原始文件元数据,不计算源数据库文件的加密哈希,也不生成证据保管链文档。请勿在正式法律程序中将其作为唯一证据来源 —— 需配合专业的取证镜像工具使用。
## 功能特性
- **16 种浏览器** —— 覆盖企业环境和威胁行为者技术中常见的主流 Chromium 和 Gecko 分支:Chrome, Edge, Firefox, Brave, Opera, Opera GX, Yandex, Vivaldi, Tor Browser, Thunderbird, Waterfox, LibreWolf, Pale Moon, Epic, Comodo Dragon, OneDrive WebView
- **所有用户** —— 基于注册表的完整配置文件枚举,不仅是当前活动会话
- **文件锁定绕过** —— VSS Shadow Copy 从运行中的浏览器读取锁定的数据库
- **双重解析模式** —— 通过 `sqlite3.exe` 进行完整 SQL 解析(标题、访问计数、精确时间戳),或零依赖的正则回退
- **精确时间戳** —— 正确的 Epoch 转换,同时支持 Chromium(1601-01-01 基准)和 Firefox(Unix Epoch)时间戳格式
- **加密输出** —— 通过 `7z.exe` + `7z.dll` 生成 AES-256 ZIP,16位加密密码输出到控制台一次
- **交互式 HTML 报告** —— 搜索、按用户/浏览器/日期范围过滤、列排序、浏览器内 CSV 导出
- **远程执行就绪** —— 针对 PsExec / WinRM / SYSTEM 上下文的可靠 `$ScriptDir` 解析;当无交互式桌面可用时自动禁止 `-OpenReport`
- **原生帮助** —— 完整的 `Get-Help` 支持及示例
## ⚡ 快速开始
```
# 查看内置帮助
Get-Help .\ZavetSec-BrowserHistory.ps1 -Full
.\ZavetSec-BrowserHistory.ps1 -Help
# 标准运行 — 加密 ZIP + 密码输出到控制台 (需要管理员权限)
.\ZavetSec-BrowserHistory.ps1
# 生成报告后立即打开
.\ZavetSec-BrowserHistory.ps1 -OpenReport
# 限定日期范围收集并导出 CSV
.\ZavetSec-BrowserHistory.ps1 -CsvExport -DateFrom 2025-01-01 -DateTo 2025-06-30
# 无归档 — 纯 HTML (在 7z.exe + 7z.dll 不可用时使用)
.\ZavetSec-BrowserHistory.ps1 -NoArchive -OpenReport
# 收集所有记录,无限制
.\ZavetSec-BrowserHistory.ps1 -MaxRecordsPerBrowser 999999
# 直接保存到网络共享
.\ZavetSec-BrowserHistory.ps1 -NoArchive -OutputPath "\\server\IR\host42_history.html"
```
## 📋 参数
| 参数 | 类型 | 默认值 | 描述 |
|---|---|---|---|
| `-OutputPath` | String | auto | HTML 报告的路径。如省略则在 `.\Reports\` 中自动生成 |
| `-MaxRecordsPerBrowser` | Int | `5000` | 每个浏览器配置文件的最大记录数。使用 `999999` 表示无限制 |
| `-OpenReport` | Switch | — | 生成后打开报告。在远程会话中自动跳过 |
| `-CsvExport` | Switch | — | 将结果保存为 CSV,与 HTML 并存 |
| `-DateFrom` | String | — | 收集从此日期开始的记录 (`yyyy-MM-dd`) |
| `-DateTo` | String | — | 收集截至此日期的记录 (`yyyy-MM-dd`) |
| `-NoArchive` | Switch | — | 跳过 ZIP —— 将 HTML(和 CSV)保存为普通文件 |
| `-Help` | Switch | — | 显示帮助并退出 |
## 📊 HTML 报告
单个独立的 `.html` 文件 —— 无需服务器、无需 CDN、无需互联网。可在隔离网络的分析师工作站上打开。
```
┌──────────────┬──────────────┬───────────────┬──────────────────┐
│ Total Records│ Users Scanned│ Unique Domains│ Extraction Mode │
│ 12 847 │ 3 │ 1 204 │ VSS Shadow Copy │
└──────────────┴──────────────┴───────────────┴──────────────────┘
```
**侧边面板:** 按用户统计的记录数 · 访问计数前 15 名的域名
**记录表:**
| # | 用户 | 浏览器 | 域名 | 标题 / URL | 访问次数 | 最后访问 |
|---|------|---------|--------|-------------|--------|------------|
| 1 | john | Edge | github.com | GitHub · Build... | ▬▬▬ 42 | 2026-03-24 09:31 |
**过滤器:** user · browser · date range (From / To) · full-text search · `⬓ CSV` export of visible rows (BOM UTF-8, Excel-compatible) · click any column header to sort
*(译者注:过滤器界面的用户界面文本保持英文原样以确保功能说明的准确性,意为:用户、浏览器、日期范围(从/至)、全文搜索、可见行的 CSV 导出(BOM UTF-8,兼容 Excel)、点击任意列标题排序)*
## 🔑 存档密码
每次运行均通过 `System.Security.Cryptography.RandomNumberGenerator` 全新生成。完成后打印一次到控制台 —— 从不写入磁盘。
```
================================================================
REPORT READY
================================================================
Archive : .\HOSTNAME_20260324_093100.zip
Encrypt : AES-256
Password : TJewuHDDC9phPTYN
Save this password - it will not be shown again.
================================================================
```
密码字符集仅包含字母数字 —— 不含可能影响向 `7z.exe` 传递密码时的 Shell 转义问题的特殊字符。
如果未找到 `7z.exe` + `7z.dll`,脚本将回退到未加密的 ZIP 并发出警告。使用 `-NoArchive` 可完全跳过存档。
## 🔧 设置
脚本无需外部文件即可运行。可选工具可提升输出质量:
| 文件 | 效果 |
|---|---|
| `sqlite3.exe` | 完整 SQL 解析:标题 + 访问计数 + 精确时间戳。若无此项:仅 URL 的正则回退 |
| `7z.exe` + `7z.dll` | AES-256 加密 ZIP。两个文件均需 —— 仅 `7z.exe` 无法工作 |
两者均包含在 [发布存档](https://github.com/zavetsec/ZavetSec-BrowserHistory/releases/latest) 中。下载,将所有内容解压到一个文件夹,运行。
手动获取:
- `sqlite3.exe` — [sqlite.org/download.html](https://sqlite.org/download.html) → `sqlite-tools-win-x64-*.zip`
- `7z.exe` + `7z.dll` — 从现有 7-Zip 安装目录复制这两个文件 (`C:\Program Files\7-Zip\`)
```
ZavetSec-BrowserHistory.ps1
sqlite3.exe ← included in release archive
7z.exe ← included in release archive
7z.dll ← included in release archive (required — 7z.exe will not work without it)
HOSTNAME_TIMESTAMP.zip ← report saved here
```
## 🛡️ 工作原理
```
Running as Administrator?
│
├─ Yes → VSS Shadow Copy of C:\
│ Reads locked History / places.sqlite from the shadow
│ Browser stays running, no interruption
│
└─ No → Direct copy fallback
ReadAllBytes → Copy-Item → xcopy
Running browsers may have their DB files locked
sqlite3.exe present?
│
├─ Yes → SQL query: URL + Title + VisitCount + Timestamp
│ Chromium: microseconds since 1601-01-01 (correct epoch)
│ Firefox: microseconds since 1970-01-01 (Unix epoch)
│
└─ No → Regex scan of raw database bytes: URL only
7z.exe + 7z.dll present?
│
├─ Yes → AES-256 encrypted ZIP, 16-char password to console once
│
└─ No → Unencrypted ZIP via built-in .NET System.IO.Compression
```
## 🌐 支持的浏览器
| 引擎 | 浏览器 |
|---|---|
| **Chromium** | Google Chrome, Microsoft Edge, Brave, Yandex Browser, Opera, Opera GX, Vivaldi, Epic Privacy Browser, Comodo Dragon, OneDrive WebView (enterprise sync workflows), Win WebExperience |
| **Firefox / Gecko** | Mozilla Firefox, Tor Browser, Thunderbird, Waterfox, LibreWolf, Pale Moon |
## 🖥️ 远程执行
脚本专为在非交互式上下文中安全运行而设计。
**步骤 1 —— 将脚本文件夹部署到远程主机:**
```
xcopy "C:\tools\ZavetSec-BrowserHistory" "\\TARGET\C$\Windows\Temp\ZavetSec-BrowserHistory\" /E /I /Y
```
这将一次性复制整个文件夹,包括 `sqlite3.exe`, `7z.exe`, 和 `7z.dll`。使用 `C$` 管理共享或目标上任何可访问的共享。
**步骤 2 —— 远程执行:**
PsExec (以 SYSTEM 身份):
```
psexec \\TARGET -s powershell.exe -ExecutionPolicy Bypass `
-File "C:\Windows\Temp\ZavetSec-BrowserHistory\ZavetSec-BrowserHistory.ps1" `
-NoArchive -OutputPath "\\share\IR\TARGET.html"
```
WinRM / Invoke-Command:
```
Invoke-Command -ComputerName TARGET -FilePath .\ZavetSec-BrowserHistory.ps1
```
**完整远程工作流 (xcopy → 运行 → 收集 → 清理):**
```
rem 1. Deploy tool folder to target (includes sqlite3.exe, 7z.exe, 7z.dll)
xcopy "C:\tools\ZavetSec-BrowserHistory" "\\TARGET\C$\Windows\Temp\ZavetSec-BrowserHistory\" /E /I /Y
rem 2. Run and save output to a network share
psexec \\TARGET -s powershell.exe -ExecutionPolicy Bypass -File "C:\Windows\Temp\ZavetSec-BrowserHistory\ZavetSec-BrowserHistory.ps1" -NoArchive -OutputPath "\\share\IR\TARGET.html"
rem 3. Clean up — remove the tool folder from target
psexec \\TARGET cmd /c "rmdir /S /Q C:\Windows\Temp\ZavetSec-BrowserHistory"
```
**远程执行注意事项:**
- 当未检测到交互式桌面 (PsExec SYSTEM, WinRM) 时,`-OpenReport` 会被自动禁止 —— 无错误,仅记录跳过
- `$ScriptDir` 在所有上下文中正确解析:本地、PsExec、WinRM、计划任务
- xcopy 使用 `/E /I /Y` 会复制子目录、在目标不存在时创建目标、并抑制提示 —— 适用于脚本化 IR 工作流
- 对于通过网络传输的加密输出,省略 `-NoArchive` 并分别从目标获取 `.zip` 和密码
## 📁 输出
**默认 (带存档):**
```
ZavetSec-BrowserHistory.ps1
HOSTNAME_20260324_093100.zip ← AES-256 encrypted, saved next to the script
```
源 `.html` 和 `.csv` 在成功存档后删除。
**使用 `-NoArchive`:**
```
ZavetSec-BrowserHistory.ps1
HOSTNAME_20260324_093100.html
HOSTNAME_20260324_093100.csv ← with -CsvExport
```
**CSV 列:** `UserName, Browser, Domain, Title, URL, Visits, LastVisit`
## ⚠️ 局限性
- **仅限实时获取** —— 从运行中的系统读取;不镜像或哈希源数据库文件
- **无证据保管链** —— 在法律语境中不能替代取证镜像 (FTK, dd, KAPE)
- **仅限标准配置文件路径** —— 无法检测便携式浏览器安装或非默认配置文件位置
- **仅限 C:\ 盘** —— VSS Shadow Copy 针对系统驱动器;其他卷上的配置文件回退到直接复制
- **无删除检测** —— 不识别历史记录空白、SQLite 空闲页或反取证清理活动
- **正则回退是近似的** —— 无 `sqlite3.exe` 时,结果是从原始 SQLite 页面机会性恢复的,可能包含重复项或来自内部数据库结构的部分 URL
## ❓ 常见问题
**可以无管理员权限运行吗?**
可以 —— 脚本会运行并收集当前用户的配置文件。VSS 不可用,其他用户配置文件无法访问。完整收集需要管理员权限。
**浏览器正在运行且数据库被锁定 —— 仍然有效吗?**
是的,以管理员身份运行时。VSS Shadow Copy 从时间点快照读取数据库;锁定无关紧要。
**文件夹中有 7z.exe 但加密仍然失败?**
需要同时具备 `7z.exe` 和 `7z.dll`。`7z.dll` 提供编解码器支持 —— 缺少它,7-Zip 无法处理 ZIP 格式并会报错退出。请从 `C:\Program Files\7-Zip\` 复制这两个文件。
**为什么 `-MaxRecordsPerBrowser` 默认限制为 5000?**
默认值,旨在保持报告生成速度快、文件大小可控(针对拥有数年历史记录的机器)。使用 `-MaxRecordsPerBrowser 999999` 可收集所有内容。
**这与 ZavetSec Triage 有何关系?**
`Invoke-ZavetSecTriage.ps1` 将浏览器历史记录作为模块 #14 包含在内,同时还有其他 17 个收集模块。本脚本是其独立版本 —— 当你仅需要浏览器证据,或运行完整取证分类不切实际时使用。
**能与 KAPE 并存吗?**
可以。在 KAPE 收集之前或同时运行。本脚本处理 KAPE 浏览器目标在实时系统上经常遇到的文件锁定问题。`-CsvExport` 输出可直接导入大多数时间线工具。
## 🗺️ 路线图
- [ ] **🚧 可疑域名标记** ← *下一步* —— 在报告中内联标记已知的 C2 基础设施、钓鱼域名、剪贴板站点和云数据渗出目标,无需离开分析师工作站
- [ ] **IOC 导出** —— 一键将所有收集的域名和 URL 导出为扁平 IOC 列表,供 TIP / SIEM 摄取
- [ ] **Tor / 匿名器检测** —— 突出显示对 .onion 代理、匿名服务和 VPN 提供商页面的访问
- [ ] **时间线视图** —— 跨所有用户和浏览器的统一时间顺序视图,在单个可滚动时间线中展示
- [ ] **多驱动器 VSS** —— 将 Shadow Copy 获取扩展到 C:\ 以外
- [ ] **下载历史** —— 在浏览历史之外同时收集 Chromium 下载记录
## 🤝 贡献
最有用的贡献:
- **新浏览器路径** —— 如果某浏览器未被检测到,请开启一个 Issue 并附上其 `History` 或 `places.sqlite` 的路径
- **Bug 报告** —— 特定 Windows 版本、域配置或配置文件设置上的异常行为
- **可疑域名列表** —— 为计划中的标记功能策划的 C2、钓鱼和渗出域名列表
PR 要求:兼容 PowerShell 5.1,在真实 Windows 上测试,核心收集路径保持零依赖保证。
[开启一个 Issue](https://github.com/zavetsec/ZavetSec-BrowserHistory/issues)
## 📋 变更日志
### v1.0 —— 初始发布
- VSS Shadow Copy —— 针对运行中浏览器的文件锁定绕过
- 16 种浏览器,通过注册表枚举所有本地用户配置文件
- 双重解析模式:完整 SQL (`sqlite3.exe`) 和正则回退
- 针对 Chromium (1601 Epoch) 和 Firefox (Unix Epoch) 的精确时间戳转换
- 通过 `7z.exe` + `7z.dll` 实现 AES-256 加密 ZIP —— 16位加密密码输出到控制台
- `-NoArchive` —— 针对无 7-Zip 环境的普通文件输出
- `-DateFrom` / `-DateTo` —— 收集级和报告级的日期范围过滤
- `-CsvExport` —— 与 HTML 并行的 CSV 输出
- `-Help` 开关 + 完整的 `Get-Help` 基于注释的文档
- 远程执行支持:可靠的 `$ScriptDir` 解析,非交互式会话中自动禁止 `-OpenReport`
- `Write-Progress` + `[CmdletBinding()]` —— 控制台进度,`-Verbose` 支持
- HTML: 交互式报告 —— 搜索、过滤、排序、日期范围选择器、浏览器内 CSV 导出
- HTML: 访问计数迷你条、URL 和域名提示、浏览器图标、改进的对比度调色板
## `>_` 免责声明
**ZavetSec** —— 为凌晨 2 点读日志的人打造的安全工具
[github.com/zavetsec](https://github.com/zavetsec) · MIT License
标签:AES-256, AI合规, HTML报告, HTTP工具, IPv6, Libemu, PowerShell, VSS, 加密封装, 卷影复制, 多模态安全, 库, 应急响应, 数字取证, 数据提取, 无依赖, 浏览器历史, 漏洞评估, 用户行为分析, 网络安全审计, 自动化脚本