uky007/ThreatFalcon

GitHub: uky007/ThreatFalcon

一个用 Rust 编写的透明可审计的 Windows 端点遥测传感器,整合 ETW、Sysmon 和规避检测,输出标准化 JSONL 事件。

Stars: 0 | Forks: 0

# ThreatFalcon [![crates.io](https://img.shields.io/crates/v/threatfalcon.svg)](https://crates.io/crates/threatfalcon) [![License: MIT](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE) ThreatFalcon 是一个用 Rust 编写的实验性 Windows 端点遥测传感器。 该项目旨在构建一个透明、可解释、开源的传感器,用于收集主机遥测数据并将其标准化为结构化的 JSONL 事件。 ## 状态 ThreatFalcon 处于早期阶段。 - Windows 是主要目标平台 - 已实现 ETW 收集 - 已实现 Sysmon 订阅和解析,但默认禁用 - 已针对选定技术实现了面向规避的信号收集 - 提供传感器健康事件用于本地运行时可见性 - 配置从 `threatfalcon.toml` (TOML 格式) 加载,可通过 `--config` 覆盖 - 输出支持文件、stdout 和 HTTP POST 接收器 - 支持 Windows 服务模式 (通过 `--service` 标志进行 SCM 启动/停止) - 进程上下文富化在 PID 重用期间提供稳定的进程标识 - 本地调查 CLI (`query`, `explain`, `bundle`, `stats`, `tail`, `tree`) 直接读取 JSONL 输出 - 可选的 SQLite 索引用于在大型 JSONL 文件上进行快速查找 (自动回退到全扫描) - 事件 Schema 和收集器行为可能仍会发生变化 ## 目标 - 保持传感器小巧且可审计 - 使用直接的事件模型而非不透明的二进制文件 - 发出易于检查和测试的机器可读事件 - 倾向于显式的收集和信号逻辑,而非黑盒行为 - 在所有收集来源中维护单一的标准化事件模型 ## 当前功能 ThreatFalcon 目前为以下内容发出标准化的遥测数据: - 进程事件 - 文件事件 - 网络事件 - 注册表事件 - 镜像加载事件 - DNS 事件 - 脚本相关事件 (PowerShell ScriptBlock 及路径/ID 关联,AMSI 扫描及结果分类) - 针对选定技术的面向规避的信号事件 - 传感器健康事件 (带有运行时间、吞吐量和收集器状态的周期性心跳) 目前从以下来源收集: - ETW - Sysmon - 进程内面向规避的信号收集器 ThreatFalcon 将这些输入标准化为统一的 `ThreatEvent` 模型,以供下游检查和比较。 ## 默认行为 内置默认配置当前执行以下操作: - 将事件写入 `threatfalcon_events.jsonl` - 在 `100 MB` 时轮转输出 - 启用 ETW 收集 - 默认禁用 Sysmon 收集 - 启用面向规避的检查 - 默认每 60 秒发出一次周期性健康事件 - HTTP 接收器的磁盘假脱机默认禁用 (通过 `spool_dir` 选择加入) 默认情况下,ThreatFalcon 仅在本地写入事件,不将遥测数据传输到远程服务。 ### Windows 默认路径 在 Windows 上,当未找到配置文件时,所有数据路径默认位于 `%ProgramData%\ThreatFalcon\` (通常是 `C:\ProgramData\ThreatFalcon\`) 下: | 文件 | 默认路径 (Windows) | 默认路径 (开发 / 非 Windows) | |------|------------------------|----------------------------------| | 配置文件 | `%ProgramData%\ThreatFalcon\threatfalcon.toml` | `./threatfalcon.toml` | | Agent 状态 | `%ProgramData%\ThreatFalcon\threatfalcon.state` | `./threatfalcon.state` | | 事件输出 | `%ProgramData%\ThreatFalcon\threatfalcon_events.jsonl` | `./threatfalcon_events.jsonl` | 配置文件查找顺序 (当未指定 `--config` 时): 1. `./threatfalcon.toml` (当前工作目录) 2. `%ProgramData%\ThreatFalcon\threatfalcon.toml` (仅 Windows) 3. 如果两者都不存在,则使用内置默认值 配置文件中的相对路径是相对于配置文件所在的目录解析的,而不是进程工作目录。这确保了前台模式和 Windows 服务模式 (其中 cwd 通常是 `System32`) 之间的行为一致。配置中的显式绝对路径永远不会被重写。 当 HTTP sink 配置了 `spool_dir` 时,失败的批次将被写入磁盘而不是被丢弃。假脱机的批次将在下一次成功的 POST 或周期性健康刷新 (每隔 `health_interval_secs`) 时重新发送,以先到者为准。这可以防止在网络中断或服务器维护期间丢失事件。假脱机大小由 `spool_max_mb` 限制 (默认值:256 MB)。 默认的 ETW 提供程序集包括: - `Microsoft-Windows-Kernel-Process` - `Microsoft-Windows-Kernel-File` - `Microsoft-Windows-Kernel-Network` - `Microsoft-Windows-Kernel-Registry` - `Microsoft-Windows-DNS-Client` - `Microsoft-Windows-PowerShell` - `Microsoft-Antimalware-Scan-Interface` - `Microsoft-Windows-Threat-Intelligence` ## 架构 ThreatFalcon 分为少量清晰的组件: - `src/sensor.rs`:收集器生命周期、事件通道、关闭处理 - `src/events.rs`:统一事件 Schema (`ThreatEvent`, `ProcessContext`) - `src/process_cache.rs`:内存中的进程上下文缓存和富化 - `src/output.rs`:接收器抽象 (文件、stdout、HTTP POST) - `src/collectors/etw.rs`:ETW 实时会话和事件映射 - `src/collectors/sysmon.rs`:Sysmon 事件日志订阅 - `src/collectors/sysmon_parser.rs`:Sysmon XML 解析和映射 - `src/pe.rs`:跨平台 PE 头解析器 (节、导出) - `src/investigate.rs`:本地调查 CLI (query, explain, bundle) - `src/collectors/evasion.rs`:面向规避的进程检查 ## 构建 要求: - Rust stable - Windows 用于真实的传感器执行 本地构建: ``` cargo build --release ``` 运行测试: ``` cargo test ``` 从其他平台交叉检查 Windows 编译: ``` cargo check --target x86_64-pc-windows-msvc ``` ## 运行 ThreatFalcon 旨在 Windows 上运行。 ``` cargo run --release ``` ### CLI 选项 ``` threatfalcon [OPTIONS] [COMMAND] Commands: query Query events from a JSONL telemetry file explain Explain an event with its process context timeline bundle Bundle an event and related context into a single JSON document index Build or manage the SQLite index for fast event lookups stats Show summary statistics for a JSONL telemetry file tail Follow new events appended to a JSONL file (like tail -f) tree Show process tree (parent-child relationships) Options: --config Path to config file (default: threatfalcon.toml) --stdout Force output to stdout (overrides config file) --output Override output file path (overrides config file) --validate-config Validate config and exit --dump-default-config Dump default config as TOML and exit --service Run as a Windows service (used by SCM) --install-service Install as a Windows service and exit --uninstall-service Uninstall the Windows service and exit -h, --help Print help -V, --version Print version ``` 示例: ``` # 使用自定义配置文件运行 cargo run --release -- --config /path/to/config.toml # 将事件输出到 stdout 以便快速检查 cargo run --release -- --stdout # 将事件写入特定文件 cargo run --release -- --output /var/log/threatfalcon.jsonl # 验证配置文件而不启动 sensor cargo run --release -- --config myconfig.toml --validate-config # 转储内置默认配置 cargo run --release -- --dump-default-config > threatfalcon.toml ``` 日志记录可以通过 `RUST_LOG` 控制: ``` RUST_LOG=info cargo run --release ``` 启动时,传感器初始化已启用的收集器,写入换行符分隔的 JSON 事件,并在 `Ctrl-C` 时停止。 ### Windows 服务 ThreatFalcon 可以作为 Windows 服务运行。`--service` 标志连接到服务控制管理器 (SCM),以便传感器在启动时启动并在服务停止命令时干净地停止。 **推荐的目录布局:** ``` C:\ProgramData\ThreatFalcon\ threatfalcon.toml # config threatfalcon.state # agent identity (auto-created) threatfalcon_events.jsonl # event output (file sink) ``` **安装服务:** ``` # 复制二进制文件 Copy-Item threatfalcon.exe C:\ProgramData\ThreatFalcon\threatfalcon.exe # 安装(配置从 ProgramData 自动发现) .\threatfalcon.exe --install-service # 或者在服务注册中包含自定义配置路径 .\threatfalcon.exe --install-service --config C:\ProgramData\ThreatFalcon\threatfalcon.toml ``` `--install-service` 将 ThreatFalcon 注册为以 LocalSystem 身份运行的自动启动服务。相当于 `sc.exe create`,但具有正确的二进制路径和参数。 **启动 / 停止:** ``` sc.exe start ThreatFalcon sc.exe stop ThreatFalcon ``` **移除服务:** ``` .\threatfalcon.exe --uninstall-service ``` `--uninstall-service` 停止服务 (如果正在运行),轮询 SCM 直到服务达到 `Stopped` 状态 (最多 30 秒),然后将其从 SCM 中移除。 **服务状态转换:** ``` StartPending → Running → StopPending → Stopped ``` - `StartPending` (wait_hint: 10s):配置加载、日志初始化、传感器创建 - `Running`:事件循环处于活动状态,接受 `Stop` 控制 - `StopPending` (wait_hint: 15s):在 SCM 发送 Stop 时报告,在传感器开始刷新接收器和写入最终健康事件之前 - `Stopped`:退出代码区分成功 (0)、配置错误 (1)、运行时错误 (2) 注意: - 服务模式拒绝 `stdout` sink (没有控制台) — 使用 `file` 或 `http` - `--service`、`--install-service` 和 `--uninstall-service` 仅在 Windows 上可用;在其他平台上,它们会报错退出 - 服务退出代码与前台模式匹配:0 = 成功,1 = 配置错误,2 = 运行时错误 ## 配置 ThreatFalcon 首先在当前目录中搜索 `threatfalcon.toml`,然后在 Windows 上的 `%ProgramData%\ThreatFalcon\` 中搜索。如果未找到文件,则使用内置默认值。使用 `--config ` 从其他位置加载,或使用 `--stdout` / `--output ` 从命令行覆盖输出目标。 相对路径 (`state_path`, `output.path`, `output.spool_dir`) 是相对于配置文件所在的目录解析的。当使用内置默认值 (无配置文件) 时,它们是相对于可执行文件所在的目录解析的。 所有部分都是可选的。只需指定要覆盖的字段。 ``` # 覆盖主机名(默认:从环境自动检测) hostname = "WORKSTATION-01" # 周期性健康事件间隔(秒)(默认:60,0 = 禁用周期) # 无论此设置如何,最终关闭健康事件始终会发出。 health_interval_secs = 60 # 持久化代理状态文件的路径。 # 首次运行时生成稳定的 agent_id,并在重启后复用。 # 默认:"threatfalcon.state"(相对于配置目录;在 Windows 上默认为 # %ProgramData%\ThreatFalcon\threatfalcon.state) # state_path = "threatfalcon.state" # 输出接收器类型:"file"(默认)、"stdout" 或 "http" [output] # type = "file" path = "threatfalcon_events.jsonl" rotation_size_mb = 100 # type = "stdout" # pretty = true # type = "http" # url = "https://example.com/api/events" # batch_size = 100 # timeout_secs = 10 # bearer_token = "your-token-here" # retry_count = 3 # retry_backoff_ms = 100 # gzip = false # spool_dir = "spool" # spool_max_mb = 256 # [output.headers] # X-Sensor-Id = "sensor-001" # X-Api-Key = "key-abc" [collectors.etw] enabled = true # 自定义 provider 列表(指定时替换默认值) # providers = [ # { name = "Microsoft-Windows-Kernel-Process", guid = "22FB2CD6-0E7B-422B-A0C7-2FAD1FD0E716", level = 5, keywords = "0xFFFFFFFFFFFFFFFF" }, # ] [collectors.sysmon] enabled = false [collectors.evasion] enabled = true scan_interval_ms = 5000 detect_etw_patching = true detect_amsi_bypass = true detect_unhooking = true detect_direct_syscall = true ``` ETW 提供程序 `keywords` 可以指定为十六进制字符串 (`"0xFFFFFFFFFFFFFFFF"`) 或整数。 ## 输出 事件以 JSON Lines 形式写入。每个事件包括: - 唯一事件 ID - UTC 时间戳 - 主机名 - 稳定的 Agent ID (重启后持久保存) - 传感器版本 - 来源 - 类别 - 严重性 - 类型化事件 Payload - 进程上下文 (如果可用 — 见下文) ### 进程上下文富化 传感器维护一个内存中的进程上下文缓存,由 `ProcessCreate` 事件填充。活动事件 (文件、网络、注册表、DNS、镜像加载、脚本、AMSI) 使用 `process_context` 字段进行富化,该字段提供: - **`process_key`**:派生自 `{pid}:{create_time}` 的稳定进程标识,对 PID 重用具有弹性 - **`image_path`**、**`command_line`**:可执行文件及其参数 - **`user`**、**`integrity_level`**:当来源中可用时 - **`ppid`**:父进程 ID `ProcessCreate` 事件接收仅包含 `process_key` 的 `process_context` (其余字段已在事件 Payload 中)。`ProcessTerminate` 事件在条目被驱逐之前从缓存接收完整的上下文。 缓存是有界的 (10,000 个条目) 并按 PID 键控。当 PID 被重用时,新的 `ProcessCreate` 将替换旧条目。`ProcessTerminate` 事件验证 `create_time` 以避免驱逐重用相同 PID 的较新进程。 ETW 事件携带精确的操作系统级创建时间戳 (`create_time`),这产生了可防止 PID 重用的进程键。Sysmon 事件不携带可比的时间戳,因此缓存应用来源优先级:由 ETW 支持的条目永远不会被缺少 `create_time` 的 Sysmon 事件覆盖或驱逐。在仅 Sysmon 模式下,进程键使用零 create_time (`{pid}:0`),PID 重用保护是尽力而为的。 ProcessCreate 事件示例: ``` { "id": "2d8f7b0b-8f6b-4d77-b870-4e8c1a2f0f16", "timestamp": "2026-03-11T00:00:00Z", "hostname": "HOST01", "agent_id": "550e8400-e29b-41d4-a716-446655440000", "sensor_version": "0.3.0", "source": { "Etw": { "provider": "Microsoft-Windows-Kernel-Process" } }, "category": "Process", "severity": "Info", "data": { "type": "ProcessCreate", "pid": 1234, "ppid": 4321, "image_path": "C:\\Windows\\System32\\cmd.exe", "command_line": "cmd.exe /c whoami", "user": "", "integrity_level": "", "hashes": null, "create_time": 133579284000000000 }, "process_context": { "process_key": "1234:133579284000000000" } } ``` 富化的 NetworkConnect 事件示例: ``` { "id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890", "timestamp": "2026-03-11T00:00:01Z", "hostname": "HOST01", "agent_id": "550e8400-e29b-41d4-a716-446655440000", "sensor_version": "0.3.0", "source": { "Etw": { "provider": "Microsoft-Windows-Kernel-Network" } }, "category": "Network", "severity": "Info", "data": { "type": "NetworkConnect", "pid": 1234, "image_path": "", "protocol": "TCP", "src_addr": "10.0.0.5", "src_port": 49152, "dst_addr": "93.184.216.34", "dst_port": 443, "direction": "Outbound" }, "process_context": { "process_key": "1234:133579284000000000", "image_path": "C:\\Windows\\System32\\cmd.exe", "command_line": "cmd.exe /c whoami", "ppid": 4321 } } ``` ## 本地调查 CLI ThreatFalcon 包含内置调查命令,可直接读取 JSONL 遥测输出 — 无需外部 SIEM 或数据库。 ### 查询 从 JSONL 文件过滤和搜索事件: ``` # 特定 PID 的所有事件 threatfalcon query --input events.jsonl --pid 1234 # 按稳定进程身份查看事件 threatfalcon query --input events.jsonl --process-key "1234:133579284000000000" # 仅网络事件 threatfalcon query --input events.jsonl --category network # 按规则 ID 检测事件 threatfalcon query --input events.jsonl --rule-id TF-EVA-001 # 按源类型(etw, sysmon, evasion)或 ETW provider 名称过滤 threatfalcon query --input events.jsonl --source etw threatfalcon query --input events.jsonl --source DNS-Client # 最低严重性过滤(Info, Low, Medium, High, Critical) threatfalcon query --input events.jsonl --severity high # 在序列化事件数据中进行不区分大小写的文本搜索 threatfalcon query --input events.jsonl --contains "malware.exe" # 时间范围过滤(RFC 3339 时间戳) threatfalcon query --input events.jsonl --from "2026-03-13T00:00:00Z" threatfalcon query --input events.jsonl --from "2026-03-13T00:00:00Z" --to "2026-03-13T12:00:00Z" # --since 是 --from 的向后兼容别名 threatfalcon query --input events.jsonl --since "2026-03-13T00:00:00Z" # 组合过滤器并限制结果数量 threatfalcon query --input events.jsonl --pid 1234 --category network --severity medium --limit 50 ``` 可用的查询过滤器: | 标志 | 描述 | |------|-------------| | `--pid ` | 按进程 ID 过滤 | | `--process-key ` | 按稳定进程键 (`pid:create_time`) 过滤 | | `--category ` | 按事件类别过滤 (不区分大小写) | | `--rule-id ` | 按检测规则 ID 过滤 | | `--source ` | 按来源类型 (`etw`, `sysmon`, `evasion`, `sensor`) 或 ETW 提供程序名称子字符串过滤 | | `--severity ` | 最小严重性阈值 (接受 `info`, `low`, `med`/`medium`, `high`, `crit`/`critical`) | | `--contains ` | 跨整个序列化事件的不区分大小写文本搜索 (像 `C:\Temp\evil.exe` 这样的 Windows 路径会自动匹配) | | `--from ` | 仅此 RFC 3339 时间戳之后的事件 (别名:`--since`) | | `--to ` | 仅此 RFC 3339 时间戳之前的事件 | | `--limit ` | 最大结果数 (默认值:100) | 输出为 JSONL (每行一个事件),便于通过管道传输到 `jq`、`grep` 或其他工具。匹配计数打印到 stderr。 ### 解释 显示单个事件的详细上下文,包括时间窗口内相关活动的进程时间线: ``` # 完整事件详情 + 进程时间线(默认 ±5 分钟) threatfalcon explain --event --input events.jsonl # 支持 UUID 前缀匹配 threatfalcon explain --event a1b2c3d4 --input events.jsonl # 自定义时间窗口 threatfalcon explain --event --input events.jsonl --window 10 # 输出为结构化 JSON(用于管道传输至 jq) threatfalcon explain --event --input events.jsonl --json ``` 人类可读的输出包括: - 目标事件详情 (ID、时间戳、类别、严重性、来源、进程上下文) - 进程时间线,显示同一 `process_key` 在窗口内的所有事件 - 脚本 / AMSI 活动部分 (当目标是 ScriptBlock、AmsiScan 或 AMSI 过检测时 — 显示同一进程的相关脚本执行和 AMSI 扫描结果) - 检测规则详情 (如果事件是检测) `--json` 标志输出包含以下内容的单个 JSON 对象: - `target_event`:完整的目标事件 - `window_minutes`:使用的时间窗口 - `process_key`:目标的进程键 (如果可用) - `timeline`:窗口内来自同一进程的相关事件数组 - `script_amsi_activity`:相关的脚本/AMSI 事件 (适用时) - `rule`:检测规则元数据 (当目标是检测时) ### 打包 将事件及其相关上下文打包到单个 JSON 文档或 zip 存档中,以便共享或归档: ``` # 打包至 stdout(JSON) threatfalcon bundle --event --input events.jsonl # 打包至 JSON 文件 threatfalcon bundle --event --input events.jsonl --output bundle.json # 打包至 zip 压缩包 threatfalcon bundle --event --input events.jsonl --output bundle.zip # 自定义时间窗口 threatfalcon bundle --event --input events.jsonl --window 10 --output bundle.zip ``` **JSON 输出** (默认,或当输出路径不以 `.zip` 结尾时): - `bundle_version`:Schema 版本 (当前为 1) - `target_event`:正在调查的事件 - `related_events`:时间窗口内共享同一 `process_key` 的所有事件 - `event_count`:Bundle 中的事件总数 - 元数据:`created_at`, `process_key`, `window_minutes` **Zip 输出** (当输出路径以 `.zip` 结尾时): zip 存档包含四个文件: | 文件 | 内容 | |------|----------| | `manifest.json` | 机器可读的元数据 (格式、版本、事件 ID、进程键、窗口、事件计数、时间范围、文件列表) | | `target_event.json` | 目标事件 (格式化的 JSON) | | `related_events.jsonl` | 相关事件 (每行一个 JSON 对象) | | `bundle.json` | 完整的组合 Bundle (与独立的 JSON 输出相同) | zip 格式对于将 Bundle 附加到工单、与分析师共享或归档调查非常有用。`manifest.json` 使工具能够以编程方式识别和处理 Bundle。 ### 索引 为大型 JSONL 文件构建 SQLite 辅助索引用于快速事件查找。JSONL 文件仍然是事实来源 — 索引是一个可选的加速层。 ``` # 构建或增量更新索引 threatfalcon index --input events.jsonl # 强制完全重建 threatfalcon index --input events.jsonl --rebuild # 显示索引健康状态和覆盖范围 threatfalcon index --input events.jsonl --status ``` 索引存储 `event_id`、`timestamp`、`pid`、`process_key`、`category`、`source`、`rule_id`、`severity` 以及回到 JSONL 文件的字节偏移量。这允许 `query`、`explain` 和 `bundle` 跳过全文件扫描并直接查找到匹配的事件。 **透明行为:** - 如果索引存在且是最新的,`query`/`explain`/`bundle` 会自动使用它 - 如果索引存在但落后 (追加了新事件),则会在查询前增量更新 - 如果不存在索引,命令将回退到当前的完整 JSONL 扫描 (不会隐式创建索引) - 如果索引损坏,它将被删除,命令将回退到全扫描 - 在任何命令上使用 `--no-index` 强制进行全扫描 (用于调试) 索引文件与 JSONL 文件一起存储为 `.idx.sqlite` (例如,`events.jsonl.idx.sqlite`)。 ### 统计 显示 JSONL 遥测文件的摘要统计信息 — 按类别、严重性、来源、Top 进程和检测规则命中数统计的事件计数: ``` # 可读性摘要 threatfalcon stats --input events.jsonl # 结构化 JSON 输出 threatfalcon stats --input events.jsonl --json ``` 示例输出: ``` === Event Statistics === Total events: 12847 Time range: 2026-03-13 08:00:00 UTC → 2026-03-13 18:30:00 UTC Duration: 10h 30m --- By Category --- Network 5230 Process 3412 File 2108 Registry 980 Evasion 117 --- By Severity --- Critical 3 High 42 Medium 117 Info 12685 --- By Source --- ETW/Microsoft-Windows-Kernel-Network 5230 ETW/Microsoft-Windows-Kernel-Process 3412 EvasionDetector 117 --- Top Processes (by event count) --- PID 892 3210 events C:\Windows\System32\svchost.exe PID 4120 1845 events C:\Program Files\app.exe --- Detection Rules --- TF-EVA-001 42 TF-EVA-004 3 ``` ### 跟踪 实时跟踪追加到 JSONL 文件的新事件 (类似于 `tail -f`)。现有内容被跳过 — 仅显示新追加的事件: ``` # 跟踪所有新事件 threatfalcon tail --input events.jsonl # 仅跟踪高严重性事件 threatfalcon tail --input events.jsonl --severity high # 跟踪来自特定 PID 的事件 threatfalcon tail --input events.jsonl --pid 1234 # 带文本搜索的跟踪 threatfalcon tail --input events.jsonl --contains "malware.exe" # JSONL 输出,用于管道传输至其他工具 threatfalcon tail --input events.jsonl --json | jq '.severity' ``` 人类可读格式显示时间戳、严重性、类别、PID 和一行事件摘要。按 Ctrl+C 停止。 ### 树状图 从 `ProcessCreate` 事件重建并显示进程树。显示给定进程的后代树 (子进程、孙进程...) 或祖先链 (父进程、祖父进程...): ``` # 显示 PID 1234 的后代 threatfalcon tree --input events.jsonl --pid 1234 # 显示通向 PID 5678 的祖先链 threatfalcon tree --input events.jsonl --pid 5678 --ancestors # 使用 --process-key 消除 PID 重用歧义 threatfalcon tree --input events.jsonl --pid 1234 --process-key "1234:133579284000000000" # 用于编程用途的 JSON 输出 threatfalcon tree --input events.jsonl --pid 1234 --json ``` 示例输出 (后代): ``` === Process Tree for PID 892 (3 descendants) === svchost.exe [PID 892, PPID 600] NT AUTHORITY\SYSTEM [892:133579284000000000] ├─ taskhostw.exe [PID 3120, PPID 892] DESKTOP\user [3120:133579285000000000] └─ RuntimeBroker.exe [PID 4200, PPID 892] DESKTOP\user [4200:133579286000000000] └─ cmd.exe [PID 5100, PPID 4200] DESKTOP\user [5100:133579287000000000] ``` 示例输出 (祖先): ``` === Ancestor Chain for PID 5100 (4 levels) === wininit.exe [PID 600, PPID 0] NT AUTHORITY\SYSTEM [600:133579280000000000] └─ svchost.exe [PID 892, PPID 600] NT AUTHORITY\SYSTEM [892:133579284000000000] └─ RuntimeBroker.exe [PID 4200, PPID 892] DESKTOP\user [4200:133579286000000000] └─ cmd.exe [PID 5100, PPID 4200] DESKTOP\user [5100:133579287000000000] ``` 当 PID 出现在多个 `ProcessCreate` 事件中 (PID 重用) 时,树默认选择最近的实例。使用 `--process-key` 选择特定实例。父子关系使用时间顺序解析:子进程分配给创建时间最接近子进程创建时间之前的父进程实例。 `--json` 标志输出嵌套的 JSON 树结构,其中每个节点包含 `pid`、`ppid`、`image_path`、`command_line`、`user`、`timestamp`、`process_key` 和 `children`。 ## 规避检测规则 规避收集器定期扫描正在运行的进程以查找 EDR 规避技术。每次检测都会发出带有证据的结构化 `RuleMetadata`。 | 规则 ID | 名称 | 技术 | MITRE | 置信度 | |---------|------|-----------|-------|------------| | TF-EVA-001 | ETW 事件写入补丁 | `ntdll!EtwEventWrite` 被修补为 `ret` | T1562.006 | High | | TF-EVA-002 | AMSI 扫描缓冲区绕过 | `amsi!AmsiScanBuffer` 被修补为返回 clean | T1562.001 | High/Medium | | TF-EVA-003 | ntdll 用户模式 Hook 移除 | ntdll `.text` 被磁盘上的干净副本替换 | T1562.001 | Medium | | TF-EVA-004 | 可疑的直接系统调用存根 | 非系统模块中的 `syscall`/`int 0x2e` 存根 | T1562.001 | Medium | ### TF-EVA-004: 直接系统调用检测 像 SysWhispers 这样的工具将系统调用存根直接嵌入恶意软件模块中,以绕过 ntdll 用户模式 Hook。TF-EVA-004 检测规范存根模式: ``` mov r10, rcx ; 4C 8B D1 or 49 89 CA mov eax, ; B8 xx xx xx xx [optional gap] ; up to 12 bytes (Wow64 compat check) syscall / int 0x2e ; 0F 05 or CD 2E ``` 扫描器枚举每个进程的已加载模块,跳过合法包含系统调用存根的系统 DLL (ntdll.dll, win32u.dll — 通过 `System32`/`SysWOW64` 的完整路径验证,而不仅仅是基本名称),解析每个模块的 PE 头以通过 RVA 和特征定位 `.text` 节,并匹配存根模式。证据包括模块名称、存根偏移量、SSN 值和原始字节。 用于 ETW 修补 (`EtwEventWrite`) 和 AMSI 绕过 (`AmsiScanBuffer`) 检测的函数位置在扫描器启动时从磁盘 PE 导出表中解析,从而消除了每个进程的 `GetProcAddress` 调用,并使 AMSI 检测即使在传感器进程未加载 `amsi.dll` 时也能进行。 ### TF-EVA-002: AMSI 绕过检测 TF-EVA-002 检测 `AmsiScanBuffer` 修补的多种模式: | 模式 | 字节 | 含义 | 置信度 | |---------|-------|---------|------------| | `mov eax, 0x80070057; ret` | `B8 57 00 07 80 C3` | 强制返回 E_INVALIDARG (经典) | High | | `mov eax, 1; ret` | `B8 01 00 00 00 C3` | 强制返回 S_FALSE | High | | `mov eax, ; ret` | `B8 xx xx xx xx C3` | 强制返回任意值 | High | | `xor eax, eax; ret` | `31 C0 C3` / `33 C0 C3` | 强制返回 S_OK (扫描始终 clean) | High | | `ret` | `C3` | 立即返回,函数体被跳过 | Medium | | `nop; ret` | `90 C3` | 函数体被替换为 no-op | Medium | 证据包括解码后的指令、原始字节、目标进程中 amsi.dll 的基地址以及导出表中的函数 RVA。 ### 脚本 / AMSI 关联 当对 ScriptBlock、AmsiScan 或 AMSI 绕过检测事件使用 `explain` 时,ThreatFalcon 会显示一个专门的“脚本 / AMSI 活动”部分。此部分列出来自同一进程的所有 PowerShell 脚本块执行和 AMSI 扫描结果,使脚本执行 → AMSI 扫描 → 绕过链可见且可解释。 注意:TF-EVA-004 检测非系统模块中系统调用存根的**存在**。它不确认存根是否被执行或 ntdll Hook 是否被主动绕过。置信度为 Medium 以反映这一区别。 ## 限制 - 尚无安装程序或打包 (服务注册通过 `sc.exe` 手动进行) - 部分 ETW Payload 解析是尽力而为的,应在真实 Windows 主机上进行验证 - Sysmon 支持取决于已安装和配置的 Sysmon - 面向规避的检查是启发式的,应被视为信号,而不是基本事实 ## 许可证 MIT
标签:AMSI绕过, EDR, ETW, evade 检测, IP 地址批量处理, JSONL, MIT 协议, Python安全, RFI远程文件包含, Rust, SQLite, Sysmon, Windows 安全, 主机遥测, 事件日志, 可视化界面, 威胁检测, 安全传感器, 文件监控, 注册表监控, 私有化部署, 端点可见性, 端点检测, 网络安全, 网络安全审计, 网络流量审计, 脆弱性评估, 透明可解释, 通知系统, 防御规避, 隐私保护