jw4n6/yscanfs

GitHub: jw4n6/yscanfs

YScanFS 是一款面向取证磁盘镜像的 YARA 扫描工具,可直接解析 E01/Raw 等镜像格式,遍历 NTFS(含 ADS)、EXT4 文件系统及 VSS 卷影快照,结合社区规则集实现高效的恶意文件检测。

Stars: 0 | Forks: 0

# YScanFS YScanFS 以只读模式读取取证磁盘镜像,遍历其文件系统,并将 YARA 规则应用于每个文件——包括卷影副本 (VSS) 快照。 ``` __ __ ____ ____ _ _ _ _____ ____ \ \ / // ___| / ___| / \ | \ | || ___|/ ___| \ V / \___ \ | | / _ \ | \| || |_ \___ \ | | ___) || |___ / ___ \ | |\ || _| ___) | |_| |____/ \____|/_/ \_\|_| \_||_| |____/ YARA scanner for forensic disk images | https://github.com/jw4n6/yscanfs Loading YARA rules… ✓ Loaded 11655 rule(s) in 0.8s [cache hit] Discovering disk images… ✓ Found 'evidence.E01' (EWF) Scanning: evidence.E01 ⠴ 83186 files • 1247/s • 1m 7s ✓ Results → 'yscanfs_20260424_143022.csv' ✓ Scan log → 'logs/yscanfs_20260424_143022.log' ───────────────────────────────────────── • Files scanned : 83186 (1247/s) • Rules matched : 2 • Total hits : 3 • Time elapsed : 1m 7s ───────────────────────────────────────── ┌──────────────────────────────────────────┬──────┬───────┐ │ Rule │ Hits │ Files │ ╞══════════════════════════════════════════╪══════╪═══════╡ │ Windows_Trojan_CobaltStrike_7f8da98a │ 2 │ 2 │ │ SUSP_PowerShell_Encoded_Exec │ 1 │ 1 │ └──────────────────────────────────────────┴──────┴───────┘ ``` ## 免责声明 YScanFS 由 Anthropic 的 AI 助手 Claude 开发。开发过程是迭代式的——涵盖了多次会话中的架构决策、功能实现、错误修复和代码审查。 我提供了取证领域的专业知识、对实际磁盘镜像的真机测试、产品方向,以及关于工具功能和行为方式的所有最终决策。Claude 在整个过程中协助了 Rust 实现和代码审查。 ## 支持的磁盘镜像格式 | 格式 | 扩展名 | 说明 | |--------|------------|-------| | EWF | `.E01`–`.E99`, `.EAA`–`.EZZ` | 单段和分段 Expert Witness Format | | Raw / DD | `.raw`, `.dd`, `.img`, `.bin` | 扁平未压缩镜像 | | 拆分 Raw | `.001`, `.002`… | 编号段镜像 | ## 支持的文件系统 | 文件系统 | 说明 | |------------|-------| | NTFS | 完全支持,包括备用数据流 (ADS) | | EXT4 | 完全支持,包括 EXT2/EXT3;时间戳显示为 epoch (ext4-view 限制) | ## 功能 - **多格式镜像支持** — EWF、raw/DD、拆分 raw - **多文件系统支持** — NTFS (包括 ADS) 和 EXT4/EXT2/EXT3 - **VSS 快照扫描** — 枚举并扫描 NTFS 卷上的所有卷影副本快照 - **YARA-X 引擎** — 快速、现代的 YARA 实现,支持跨平台兼容 - **YARA Forge 集成** — 一键同步精选的社区规则 (~11k+ 条规则) - **Elastic Security 规则** — 可选同步 Elastic Security YARA 规则 (~1k 条规则,Elastic License 2.0) - **规则编译缓存** — 编译后的规则缓存到磁盘;重复运行加载时间不到 1 秒 - **并行扫描** — YARA 匹配在所有可用的 CPU 核心上运行 (最多 8 个 worker) - **递归目录扫描** — `-d` 遍历所有支持镜像格式的子目录 - **哈希允许列表** — 通过 SHA-256 跳过已知安全文件 (例如 NSRL 哈希集) - **规则过滤** — `--include-rule` 和 `--exclude-rule` 支持 glob 模式匹配 - **去重模式** — `--unique-files` 将每个规则下重复的路径合并为一行 - **CSV 和 JSON 输出** — 结构化结果,可直接用于 SIEM、Excel 或脚本管道 - **PE 元数据扩充** — 输出中包含 PE 编译时间戳、导入的 DLL 和 PDB 路径 - **规则来源跟踪** — CSV/JSON 可识别每次匹配是来自 YARA Forge、Elastic Security 还是自定义规则 - **跨规则集去重** — 在加载时对跨规则集的重复规则名称进行去重 - **SHA-256 哈希** — 为每个匹配的文件生成指纹 - **文件类型检测** — 通过 magic 字节识别并辅以扩展名回退机制;能正确区分 `.dll` 和 `.exe` - **安静模式** — 除结果路径外禁止所有输出,适用于脚本和自动化 - **自动日志记录** — 每次运行都会将扫描日志写入 `logs/` 目录 - **调试模式** — 详细日志记录,用于排查规则兼容性问题 ## 下载 请从 [Releases](https://github.com/jw4n6/yscanfs/releases) 页面下载最新版本的 YScanFS。 提供以下架构的二进制文件: - Windows Intel 64 位 (`yscanfs-x.x.x.exe`) - Linux Intel 64 位 (`yscanfs-x.x.x`) ### 从源码构建 ``` git clone https://github.com/jw4n6/yscanfs cd yscanfs cargo build --release ``` 二进制文件:`target/release/yscanfs` (Linux/macOS) 或 `target\release\yscanfs.exe` (Windows) 要在 Windows 上编译,请参考 [Rust 官方网站](https://rust-lang.github.io/rustup/installation/windows-msvc.html)获取更多说明。 ## 快速开始 ``` # 1. 下载 YARA Forge core、Elastic Security 规则并扫描磁盘镜像 ./yscanfs -s core --accept-elastic-license -f /mnt/labs/disk-images/DC01.E01 --vss --unique-files -o /mnt/labs/DC01.csv ``` ## 使用方法 ``` yscanfs [OPTIONS] ``` ### 选项 | 标志 | 说明 | |------|-------------| | `-f FILE` | 单个磁盘镜像的路径 | | `-d DIR` | 要扫描的磁盘镜像目录 (递归) | | `-s [RULESET]` | 同步 YARA 规则 (见下文的规则集) | | `--accept-elastic-license` | 接受 Elastic License 2.0 并下载 Elastic Security 规则 | | `-r DIR` | 自定义规则目录 (默认: `./rules/`) | | `-m MB` | 要扫描的最大文件大小,单位为 MB (默认: 50) | | `--allowlist FILE` | 跳过 SHA-256 出现在此文件中的文件 (每行一个哈希,`#` 用于注释) | | `-o FILE` | 输出文件路径 (默认: `yscanfs_.csv`) | | `-F FORMAT` | 输出格式: `csv` (默认) 或 `json` | | `--unique-files` | 根据 (规则, SHA-256) 对结果去重——将每个规则下重复的路径合并 | | `--vss` | 除了活动卷之外,还扫描 VSS 快照 | | `--list-vss` | 列出在镜像中找到的 VSS 快照并退出 | | `--include-rule PATTERN` | 仅运行匹配此 glob 模式的规则 (可重复使用) | | `--exclude-rule PATTERN` | 跳过匹配此 glob 模式的规则 (可重复使用) | | `-q` | 安静模式——成功时仅打印输出文件路径 | | `-D` | 启用详细的调试日志 | | `-V` | 打印版本号 | | `-h` / `--help` | 打印帮助信息 | ### 规则集 | 值 | 来源 | 规则数 | 说明 | |-------|--------|-------|-------| | `core` | YARA Forge | ~5k | 高准确率,低误报率 | | `extended` | YARA Forge | ~10k | 更广泛的覆盖范围 | | `full` | YARA Forge | ~11k | 所有操作规则 (默认) | | `elastic` | Elastic Security | ~1k | 需要 `--accept-elastic-license` | ``` yscanfs -s # YARA Forge full (default) yscanfs -s core # YARA Forge core only yscanfs -s elastic --accept-elastic-license # Elastic Security only yscanfs -s --accept-elastic-license # YARA Forge full + Elastic ``` ## 示例 ``` # 扫描单个 EWF 镜像 yscanfs -f evidence.E01 # 扫描案例目录中的所有镜像(递归) yscanfs -d /cases/2026-001/ # 扫描活动卷及所有 VSS 快照 yscanfs -f evidence.E01 --vss # 列出 VSS 快照而不进行扫描 yscanfs -f evidence.E01 --list-vss # 使用 NSRL hash set 跳过已知的良好系统文件 yscanfs -f evidence.E01 --allowlist nsrl.txt # 仅运行 Cobalt Strike 和 Mimikatz 规则 yscanfs -f evidence.E01 --include-rule "*CobaltStrike*" --include-rule "*Mimikatz*" # 跳过 PUP 和 adware 规则 yscanfs -f evidence.E01 --exclude-rule "PUP_*" --exclude-rule "*Adware*" # 去重:每个 (rule, file hash) 对应一行,而不是每个路径对应一行 yscanfs -f evidence.E01 --unique-files # 用于 SIEM 或脚本的 JSON 输出 yscanfs -f evidence.E01 -F json -o results.json # 全面扫描:VSS + 去重 + JSON 输出 yscanfs -f evidence.E01 --vss --unique-files -F json ``` ## 输出 ### CSV 列 | 列名 | 说明 | |--------|-------------| | `Source Image` | 镜像文件名 | | `Timestamp` | 文件创建/修改时间 (UTC) | | `PE Compile Time` | 来自 COFF 头的 PE `TimeDateStamp` (如果适用) | | `Rule Title` | 匹配的 YARA 规则名称 | | `Rule Source` | `YARA Forge`、`Elastic Security` 或 `Custom` | | `File Path` | 文件系统内的完整路径。NTFS ADS 条目显示为 `\path\file:StreamName`。VSS 条目以 `[VSS#N YYYY-MM-DD]` 为前缀 | | `SHA256` | 匹配文件的 SHA-256 哈希值 | | `Type` | 检测到的文件类型 (如 `.exe`、`.dll`、`.pdf`) | | `PE Imports` | 逗号分隔的导入 DLL 名称 (仅限 PE 文件) | | `PDB Path` | 来自 PE 调试目录的 PDB 调试符号路径 (如果存在) | 使用 `--unique-files` 时,`File Path` 列包含所有匹配的路径,以 `"; "` 分隔。 ### JSON 输出 ``` { "scan_time": "2026-04-24T14:30:22Z", "total_files_scanned": 83186, "total_hits": 3, "results": [ { "source_image": "evidence.E01", "timestamp": "2024-03-15T09:41:22Z", "pe_compile_time": "2023-11-02T14:22:11Z", "rule_title": "Windows_Trojan_CobaltStrike_7f8da98a", "rule_source": "YARA Forge", "file_path": "\\Windows\\Temp\\svch0st.exe", "sha256": "a3f8c2d1e9b4f607...", "file_type": ".exe", "pe_imports": "kernel32.dll,ntdll.dll,wininet.dll", "pdb_path": "C:\\Users\\operator\\cs\\implant.pdb" } ] } ``` ### 日志文件 ``` logs/ yscanfs_20260424_143022.log # warnings and errors yscanfs_20260424_143022_debug.log # verbose output (only with -D) ``` ## 规则编译缓存 在同步或更新规则后的首次运行时,YScanFS 会编译所有 `.yar` 文件并将结果保存到 `rules/.cache/`。随后的运行会直接加载编译后的二进制文件——将规则加载时间从约 20 秒减少到不足 1 秒。 只要规则发生更改,缓存就会自动失效并重新构建 (通过比较文件路径、大小和修改时间戳来检测)。 ## VSS 快照扫描 ``` # 查看可用的快照 yscanfs -f evidence.E01 --list-vss [+] Partition 1 Snapshot #01 2024-11-15 03:00:21 UTC (119 GB) [+] Partition 1 Snapshot #02 2024-11-22 03:00:18 UTC (119 GB) [+] Partition 1 Snapshot #03 2024-11-29 03:00:31 UTC (119 GB) 3 total snapshot(s) # 扫描所有快照 yscanfs -f evidence.E01 --vss ``` VSS 命中结果会以 `[VSS#N YYYY-MM-DD]` 作为前缀显示在结果的 `File Path` 中,从而可以立即清楚地看到命中结果来自哪个快照: ``` [VSS#1 2024-11-15] \Windows\Temp\svch0st.exe ``` VSS 扫描仅适用于 NTFS 分区。实时卷总是会先被扫描。 ## YARA 规则兼容性 YScanFS 使用 [YARA-X](https://github.com/VirusTotal/yara-x) 引擎 (与 YARA 4.x 99% 兼容)。当规则文件编译失败时,YScanFS 会自动仅移除失败的规则并重试——保留规则集的其余部分。被移除的规则将记录在扫描日志中。 ## YARA Forge 规则来源于 [YARA Forge](https://yarahq.github.io/)——这是一个每周更新的社区仓库聚合,包括 ReversingLabs、ESET、Malpedia、Signature Base、Volexity、GCTI、CAPE、BinaryAlert、FireEye-RT、McAfee ATR、JPCERTCC、Telekom Security、SecuInfra 及其他来源。 ## Elastic Security 规则 Elastic Security YARA 规则来源于 [protections-artifacts](https://github.com/elastic/protections-artifacts) 仓库,并在 **Elastic License 2.0** 下授权。传递 `--accept-elastic-license` 即表示您接受 [https://www.elastic.co/licensing/elastic-license](https://www.elastic.co/licensing/elastic-license) 上的许可条款。 ## 局限性 - **EXT4 时间戳** — `ext4-view` v0.9.3 不暴露 inode 时间戳;EXT4 文件的 `Timestamp` 列显示为 `1970-01-01T00:00:00Z` - **VMDK** — 仅支持扁平 VMDK;稀疏/压缩的 VMDK 需要转换:`vmware-vdiskmanager -r input.vmdk -t 0 flat.vmdk` - **VSS** — 仅限 NTFS 卷;EXT4 没有等效机制 - **动态磁盘 (LDM)** — 不支持 Windows 动态卷 - **BitLocker** — 无法扫描加密卷 - **EWF v2 (Ex01)** — 底层的 `ewf` crate 尚不支持 - **单线程 I/O** — 文件系统遍历是顺序进行的;YARA 匹配并行运行 (最多 8 个 worker) ## 许可证 MIT — 详见 [LICENSE](LICENSE) ### 依赖许可证 | Crate | 许可证 | 说明 | |-------|---------|-------| | vshadow | AGPL-3.0 | VSS 解析。在 GitHub 上发布的源码满足 AGPL 要求 | | colored | MPL-2.0 | 终端颜色。文件级左版 (copyleft);不影响 yscanfs | | yara-x | BSD-3-Clause | YARA 引擎 | | 所有其他 crate | MIT 或 Apache-2.0 | 宽松许可证 | ## 致谢 - [YARA-X](https://github.com/VirusTotal/yara-x) - [YARA Forge](https://yarahq.github.io/) - [Elastic Security](https://github.com/elastic/protections-artifacts) - [ntfs](https://github.com/ColinFinck/ntfs) - [ewf](https://crates.io/crates/ewf) - [ext4-view](https://github.com/nicholasbishop/ext4-view-rs) - [vshadow](https://crates.io/crates/vshadow)
标签:CobaltStrike, E01, ETW劫持, EWF, IPv6, PowerShell, VSS, YARA, 云资产可视化, 卷影复制, 只读模式, 可视化界面, 域渗透, 库, 应急响应, 扫描器, 数字取证, 数字证据, 文件系统遍历, 日志记录, 电子数据取证, 磁盘镜像扫描, 自动化脚本, 通知系统