Liuchijang/FIR

GitHub: Liuchijang/FIR

一款用于 Windows 取证与事件响应的模块化收集工具,专注于最小影响与可扩展性。

Stars: 0 | Forks: 0

# FIR — 自由事件响应 使用 Go 编写的生产级 Windows DFIR(数字取证与事件响应)工件收集工具。专为首次响应分类场景设计,重点关注最小系统影响、取证完整性和可扩展性。 ## 功能 - **双 CLI 模式**:交互式菜单驱动选择或标志驱动批处理收集 - **10 个内置收集器**:内存、NTFS、注册表、事件日志、执行工件、系统活动 - **取证安全**:只读访问、SHA-256 完整性哈希、不修改工件 - **Windows 权限处理**:自动检测管理员状态,启用 SeBackupPrivilege/SeDebugPrivilege - **锁定文件支持**:VSS 快照副本、`reg save`、`esentutl` 用于锁定文件的回退 - **并发收集**:可配置并行度以及每个收集器的超时 - **结构化输出**:带 JSON 元数据和结构化日志的有序目录树 - **可扩展架构**:通过实现单个接口即可添加收集器——无需更改核心逻辑 ## 构建 ``` # 构建二进制文件 go build -ldflags "-s -w" -o fir.exe . # 或带有版本信息 go build -ldflags "-s -w -X github.com/fir/fir/internal/output.Version=1.2.0" -o fir.exe . ``` **要求**:Go 1.21+ 以及 Windows 目标平台。 ## 用法 ### 交互模式(默认) ``` # 以管理员身份运行以获得完全访问权限 .\fir.exe ``` 这将启动一个菜单驱动界面,您可以在其中: - 按类别浏览收集器 - 按编号、名称或类别选择 - 在收集开始前确认 ### 标志模式 ``` # 收集特定工件 .\fir.exe collect --artifact registry,eventlog,prefetch # 按类别收集 .\fir.exe collect --artifact ntfs,execution # 收集所有内容 .\fir.exe collect --artifact all # 自定义输出目录和超时 .\fir.exe collect --artifact registry,eventlog --output C:\triage --timeout 10m # 高并发下的详细模式 .\fir.exe collect --artifact all --output E:\evidence -v --concurrency 4 ``` ### 可用工件 | 名称 | 类别 | 描述 | |---|---|---| | `ram` | 🔴 内存 | 通过 winpmem 获取物理内存 | | `mft` | 🟠 NTFS | 通过直接磁盘访问获取 $MFT(主文件表) | | `usnjrnl` | 🟠 NTFS | 通过 FSCTL 获取 $UsnJrnl:$J(USN 变更日志) | | `secure_sds` | 🟠 NTFS | 通过 VSS 获取 $Secure:$SDS(安全描述符) | | `registry` | 🔵 注册表 | SYSTEM、SOFTWARE、SAM、SECURITY、NTUSER.DAT、UsrClass.dat | | `eventlog` | 🟢 事件日志 | 所有 .evtx 文件,按取证优先级排序 | | `prefetch` | 🟡 执行 | Windows Prefetch 文件(.pf) | | `amcache` | 🟡 执行 | Amcache.hve | | `wmi` | 🟣 系统 | WMI 仓库(OBJECTS.DATA、INDEX.BTR、MAPPING*.MAP) | | `srum` | 🟣 系统 | SRUM 数据库(SRUDB.dat) | **类别快捷方式**:使用 `memory`、`ntfs`、`registry`、`eventlog`、`execution`、`system` 或 `all`。 ## 输出结构 ``` DESKTOP-ABC123_20260416_143210/ ├── memory/ │ └── memory.raw ├── ntfs/ │ ├── $MFT │ ├── $UsnJrnl_J │ └── $Secure_SDS ├── registry/ │ ├── SYSTEM │ ├── SOFTWARE │ ├── SAM │ ├── SECURITY │ ├── DEFAULT │ └── users/ │ ├── JohnDoe/ │ │ ├── NTUSER.DAT │ │ └── UsrClass.dat │ └── Admin/ │ ├── NTUSER.DAT │ └── UsrClass.dat ├── eventlog/ │ ├── Security.evtx │ ├── System.evtx │ ├── Application.evtx │ └── ... (all .evtx files) ├── execution/ │ ├── prefetch/ │ │ ├── CHROME.EXE-ABC12345.pf │ │ └── ... │ └── Amcache.hve ├── system/ │ ├── wmi/ │ │ ├── OBJECTS.DATA │ │ ├── INDEX.BTR │ │ └── MAPPING*.MAP │ └── SRUDB.dat ├── logs/ │ └── collector.log └── metadata.json ``` ## metadata.json ``` { "hostname": "DESKTOP-ABC123", "timestamp": "2026-04-16T14:32:10+07:00", "timestamp_utc": "2026-04-16T07:32:10Z", "os": "windows", "architecture": "amd64", "artifacts_collected": ["registry", "eventlog", "prefetch"], "collector_version": "1.0.0", "total_duration": "12.345s", "results": [ { "collector_name": "registry", "category": "registry", "files_collected": [ {"path": "SYSTEM", "sha256": "a1b2c3...", "size": 16777216} ], "duration_seconds": 3.21, "success": true } ] } ``` ## CLI 输出示例 ``` ╔═══════════════════════════════════════╗ ║ FIR — Freedom Incident Response ║ ║ Windows DFIR Artifact Collector ║ ║ Version 1.0.0 ║ ╚═══════════════════════════════════════╝ [+] Output directory: C:\triage\DESKTOP-ABC123_20260416_143210 [+] Collectors to run: 3 [+] Collecting: registry [✓] Done: registry (6 hives) ... (3.2s) [+] Collecting: eventlog [✓] Done: eventlog (12 files) ... (2.3s) [+] Collecting: prefetch [✓] Done: prefetch (45 files) ... (1.1s) [+] Collection completed in 6.6s [✓] Results: 3 succeeded, 0 failed [+] Output: C:\triage\DESKTOP-ABC123_20260416_143210 ``` ## 架构 ### 收集器接口 所有收集器均实现此接口: ``` type Collector interface { Name() string Category() string Description() string Collect(ctx context.Context, outputDir string) error } ``` ### 添加新收集器 1. 在合适的包中创建新文件(例如 `internal/newcategory/mycollector.go`) 2. 实现 `Collector` 接口 3. 在 `init()` 中自我注册: ``` package newcategory import "github.com/fir/fir/internal/collector" func init() { collector.Register(&myCollector{}) } type myCollector struct{} func (c *myCollector) Name() string { return "mycollector" } func (c *myCollector) Category() string { return "newcategory" } func (c *myCollector) Description() string { return "Collects something useful" } func (c *myCollector) Collect(ctx context.Context, outputDir string) error { // Your collection logic here. return nil } ``` 4. 在 `cmd/root.go` 中添加空白导入: ``` _ "github.com/fir/fir/internal/newcategory" ``` **无需更改核心编排逻辑。** ### 项目结构 ``` ├── main.go # Entry point ├── cmd/ │ ├── root.go # Root command, interactive mode, preflight │ └── collect.go # Flag-driven collection, orchestration ├── internal/ │ ├── collector/ # Core interface + registry │ ├── cli/ # Interactive menu │ ├── acquisition/ # Raw disk + VSS helpers │ ├── output/ # Directory management + metadata │ ├── logging/ # Dual-output logger │ ├── utils/ # Privileges, file copy, hashing │ ├── memory/ # RAM collector │ ├── ntfs/ # MFT, USN Journal, Secure SDS │ ├── registry/ # Registry hive collector │ ├── eventlog/ # Event log collector │ ├── execution/ # Prefetch, Amcache │ └── system/ # WMI, SRUM ``` ## RAM 获取(winpmem) FIR **不捆绑** winpmem,因授权许可问题。请将 `winpmem_mini_x64.exe` 放置在: - 与 `fir.exe` 同一目录(推荐) - 当前工作目录 - 系统 PATH 如果未找到 winpmem,RAM 收集器将优雅失败并显示明确的错误信息。 ## 要求 - **操作系统**:Windows 10/11、Server 2016+ - **权限**:管理员(右键 → 以管理员身份运行) - **Go**:1.21+(用于从源码构建) ## 许可证 本工具仅限授权取证调查和事件响应使用。
标签:ETW劫持, EVTX分析, Go 1.21, Go语言, HTTPS请求, JSON元数据, NTFS取证, SeBackupPrivilege, SecList, SeDebugPrivilege, SHA-256哈希, VSS影子复制, Windows取证, Windows平台, 事件日志取证, 交互式菜单, 内存取证, 协议分析, 取证完整性, 取证收集器, 只读取证, 可扩展架构, 响应分级, 并发收集, 并行处理, 库, 应急响应, 执行Artifact收集, 接口扩展, 数字取证, 日志审计, 日志记录, 最小系统影响, 权限提升, 标志驱动批处理, 模块化设计, 注册表取证, 生产级, 程序破解, 系统活动取证, 结构化输出, 自动化修复, 自动化脚本, 输出目录树, 锁定文件恢复