Ziyad-Solsad/Corvus-IR

GitHub: Ziyad-Solsad/Corvus-IR

一款无需基础设施的 Windows 事件响应取证工具,以单条命令完成证据采集、自动分析与 HTML 报告生成的完整闭环。

Stars: 0 | Forks: 0

# Corvus-IR **Windows 事件响应取证——一步实现收集、分析与报告。** [![CI](https://static.pigsec.cn/wp-content/uploads/repos/cas/ad/ad5834178f7599af9fdda11629d49cae07f2997beec49821b2920eff5bfd50e7.svg)](https://github.com/Ziyad-Solsad/Corvus-IR/actions/workflows/ci.yml) [![Python 3.10+](https://img.shields.io/badge/python-3.10%2B-blue)](https://www.python.org/) [![License: MIT](https://img.shields.io/badge/license-MIT-green)](LICENSE) 当你接手一台感染了勒索软件或行为异常的机器,并且需要在他人重启它之前抓住这唯一的机会时,Corvus-IR 能够从 USB 闪存盘运行,按易失性顺序提取易失性及磁盘上的取证痕迹,将其分析为按优先级排列的发现结果,并生成一份可以直接交给管理人员的独立 HTML 报告——只需一条命令,且不会在目标主机上安装任何东西。 ``` corvus collect -o E:\cases --profile standard ``` ``` ================================================================ Case CORVUS-PC-COMPTA-20260730T151405Z Host PC-COMPTA Duration 312s Evidence 1284 artifacts, 847.2 MB Timeline 18432 events ---------------------------------------------------------------- Findings critical: 7 high: 14 medium: 31 low: 6 ---------------------------------------------------------------- RANSOMWARE CONFIRMED — score 105/120 Indicators: ransom_notes, encrypted_extensions, entropy, recovery_destroyed, write_burst, defence_disabled ================================================================ ``` ## 为什么还需要一个取证工具 KAPE 只负责收集不负责分析。Velociraptor 虽能分析但需要 agent 和服务器。Chainsaw 仅能解析事件日志,其他什么都做不了。而 Corvus 能够在单台主机上无需任何基础设施即可完成整个闭环,并且它在大多数取证脚本容易弄错的三个方面有着执着的坚持: **它会告诉你它*无法*看到什么。** 每份报告都以盲区部分开始:失败的模块、需要你所不具备的提升权限才能获取的痕迹、被禁用导致你正在寻找的事件压根没有被记录的审计策略。一份悄悄省略了遗漏信息的报告,会让你将“缺失”误读为“清白”。 **它是根据健康的机器进行校准的,而不仅仅是病态的机器。** 卷影副本为零是 Windows 11 笔记本电脑的*默认*状态,因此这不会被视为破坏的证据。当第三方 EDR 将 Defender 置于被动模式时,Defender 报告实时保护关闭是正常的。在开发过程中,这两种情况在一台干净的企业笔记本电脑上都产生了“可能感染勒索软件”的判定;而现在,它们都成了明确的负面测试。 **它绝不会写入目标磁盘。** 证据会存入你指定的输出驱动器,在写入文件时会计算哈希值,随后 `corvus verify` 会对案件文件夹重新进行哈希计算,以证明没有任何文件被篡改。 ## 安装 **从源码安装** ``` git clone https://github.com/Ziyad-Solsad/Corvus-IR cd Corvus-IR pip install -e . ``` **生成单一的 .exe 用于 USB 应急响应** —— 目标机器无需 Python 环境: ``` .\build.ps1 ``` 生成 `dist\corvus.exe`(约 12 MB)。将其复制到你的应急响应 USB 闪存盘中即可。 Corvus **没有强制的依赖项**。收集、分析和报告全部运行于 Python 标准库之上,因为在发生安全事件的主机上,`pip install` 既不可用也不受欢迎。可选的扩展功能(`pip install "corvus-ir[parsers,yara]"`)增加了离线 `.evtx`/注册表配置单元解析以及对收集到的痕迹进行 YARA 扫描的功能。 ## 用法 ``` # 默认选项。易失性状态、event logs、registry hives、关键 artifacts。 corvus collect -o E:\cases # 机器仍然在线,你只有几分钟而不是几小时的时间。 corvus collect -o E:\cases --profile quick # 一切内容,包括通过 shadow copy 获取的 $MFT 和锁定的 hives。 corvus collect -o E:\cases --profile full # 在收集时匹配 CERT 公告的 indicator 列表。 corvus collect -o E:\cases --ioc campaign-iocs.txt --yara rules/ # 两天后获取到新 intel 时重新运行分析。绝不触碰主机。 corvus analyze E:\cases\CORVUS-PC-COMPTA-20260730T151405Z --ioc new-iocs.txt # 证明证据自收集以来未被篡改。 corvus verify E:\cases\CORVUS-PC-COMPTA-20260730T151405Z # 可用选项。 corvus modules ``` 请以**管理员权限**运行。如果没有管理员权限,Corvus 仍然可以工作,但注册表配置单元、Security 事件日志、进程所有权和卷影副本都将无法获取——而且它会在报告中明确指出这一点。 | 配置模式 | 耗时 | 增加的采集内容 | |---|---|---| | `quick` | ~2–3 分钟 | 易失性状态、持久化机制、安全态势、勒索软件指标 | | `standard` | ~5–15 分钟 | ……外加事件日志(30 天)、注册表配置单元、预读取文件、SRUM、LNK、PowerShell 历史记录 | | `full` | ~20–60 分钟 | ……外加浏览器信息、90 天的日志,以及用于获取 `$MFT`、`$UsnJrnl` 和被锁定的用户配置单元的卷影副本 | ## 输出内容 ``` CORVUS-PC-COMPTA-20260730T151405Z/ ├── report.html ← self-contained, filterable, opens anywhere ├── manifest.json ← SHA-256 of every artifact — the integrity record ├── case.json ← chain of custody: who, when, with what, elevated or not ├── corvus.log ← every command Corvus ran on the subject host ├── raw/ ← structured collector output (JSON) ├── artifacts/ ← the files themselves │ ├── EventLogs/ ← .evtx exports │ ├── Registry/ ← SYSTEM, SOFTWARE, SAM, per-user NTUSER.DAT, Amcache │ ├── Filesystem/ ← Prefetch, SRUM, LNK, JumpLists, $MFT, PowerShell history │ └── Ransomware/ ← ransom notes, Recycle Bin $I records └── analysis/ ├── findings.json ← ranked findings with evidence and MITRE mapping ├── timeline.csv ← super-timeline, opens in Timeline Explorer └── timeline.json ``` HTML 报告以勒索软件判定横幅作为开头,接着是严重级别磁贴、主机事实信息、可过滤的发现结果(每一项都可展开查看其原始证据和 ATT&CK 技术)、盲区表、时间轴以及每个模块的执行日志。它将数据以 JSON 格式嵌入,并使用纯 JavaScript 进行渲染——没有 CDN,没有外部字体,无需联网。它可以在隔离(air-gapped)的取证工作站上渲染,并且支持打印。 ## 采集的内容
易失性状态 —— 优先采集,因为它们会在重启时消失 包含完整命令行、父进程名、SHA-256 哈希值和 Authenticode 状态的进程树 · 与拥有它的进程相关联的 TCP/UDP 端点 · 登录会话 · 服务 · 内核驱动程序 · SMB 共享、会话和打开的文件 · 映射的网络驱动器 · DNS 解析缓存 · ARP 表
持久化机制 —— 它们是如何在重启后存活的 Run/RunOnce 键(机器和用户) · 计划任务(包含操作、触发器和主体,以及磁盘上的任务 XML) · 服务注册表配置(包括 `ServiceDll` 和失败时的命令) · WMI 事件过滤器、消费者和绑定 · 启动文件夹 · Winlogon `Userinit`/`Shell` · `AppInit_DLLs` · LSA 安全支持提供程序 · 映像文件劫持选项调试器 · 用户级 COM CLSID 劫持 · BITS 任务 · RDP/WinRM/SSH 配置
安全态势 —— 以及对其进行过哪些更改 Defender 状态、排除项(同时来自 `Get-MpPreference` 和注册表,两者在 GPO 下可能会不一致)、检测历史记录和隔离区清单 · 已注册的第三方 AV 和 EDR 服务 · 防火墙配置文件和启用的允许规则 · 生效的审计策略 · PowerShell 脚本块/模块/转录日志 · LSA 保护、Credential Guard、WDigest · 每个通道的事件日志大小和记录数
勒索软件指标 卷影副本和卷影存储分配 · 还原点 · Windows 备份目录 · `bcdedit` 恢复标志 · 回收站 `$I` 元数据记录(原始路径、大小、删除时间) · 桌面壁纸 · 勒索说明文件发现与攻击者联系方式提取(电子邮件、.onion、比特币、Telegram、Session) · 针对 284 条目的已知勒索家族语料库进行的文件扩展名频率分析 · 结合魔数识别的香农熵采样 · 每小时写入活动直方图
事件日志 通过 `wevtutil` 将 20 个通道导出为原始 `.evtx` 文件,并从中提取了跨越 Security、System、PowerShell、Sysmon、Defender、Task Scheduler、Terminal Services、WinRM、WMI-Activity、BITS 和 SMB 的 100 个高信噪比事件 ID 的 JSON 解析数据。
注册表、文件系统和浏览器 通过 `reg save` 获取的 SYSTEM/SOFTWARE/SAM/SECURITY 及其事务日志 · 用户级的 `NTUSER.DAT` 和 `UsrClass.dat` · `Amcache.hve` · USB 设备历史记录 · 挂载的设备 · RunMRU、TypedPaths、RDP 客户端历史记录 · 网络配置文件 · Prefetch · SRUM · WMI 仓库 · LNK 和跳转列表 · **PSReadLine 控制台历史记录** · PowerShell 转录记录 · 暂存目录列表 · `$MFT`、`$UsnJrnl`、`$LogFile` · Chromium 和 Firefox 的历史记录、下载内容和扩展清单
## 分析是如何工作的 六个分析器在收集完毕后运行。它们绝不会触碰主机——它们仅对收集器收集到的内容进行操作,这使得 `corvus analyze` 可以重复运行,并且整个分析层无需受损机器即可进行测试。 **事件规则** —— 包含在 [`corvus/data/detection_rules.json`](corvus/data/detection_rules.json) 中的 32 条声明式规则,针对每个事件的原始 `Properties` 数组进行匹配,而不是其渲染后的消息。消息字符串是本地化的:一条针对英文文本编写的规则在该工具最有可能指向的法文和德文主机上会产生**零**发现。三种匹配模式:简单匹配、滑动窗口阈值(暴力破解 vs. 密码喷洒),以及关联匹配(*同一账户*在 `n` 次失败后获得一次成功)。 **进程** —— 在四个独立的维度上对每个进程进行评分:映像文件所在的位置、是否已签名、其父进程是谁,以及它被指示执行了什么操作。解码 `-EncodedCommand` payload(UTF-16LE base64,以及从 `-e` 到 `-EncodedCommand` 的所有有效缩写形式)。匹配 23 种 LOLBin 滥用模式。标记系统二进制文件的伪装和不可能的父/子进程链。在正常的机器上,任何单一维度都会产生误报;其核心在于这些维度的交集。 **持久化** —— 对自启动项运行的*命令*进行评分,而不是维护一个在下一台主机上就会过时的已知良好条目名称列表。 **网络** —— 所有接口上暴露的服务、由本不该建立连接的进程保持的已建立连接,以及 RMM 和隧道工具的清单(报告为 LOW 低危,因为它们在大多数企业环境中是合法的——让它成为发现结果的原因是你认出了一个不在资产清单上的工具)。 **IOC** —— 一个外部的指标列表,按形状分类,因此你可以直接从报告中粘贴过来,甚至包括已降级的格式。在进程哈希、痕迹清单、连接、DNS 缓存、浏览器历史记录、勒索说明文件和控制台历史记录中进行匹配。支持可选的对收集到的痕迹执行 YARA 扫描。 **勒索软件关联分析** —— 最后运行,并综合以上所有的信息。七个加权指标类别产生一个满分 120 分的分数和一项判定:`CONFIRMED`(已确认) ≥ 70,`LIKELY`(极有可能) ≥ 45,`POSSIBLE`(有可能) ≥ 25。要达到“已确认”的判定,需要*跨越多个独立类别*的佐证,因为一个错误的“已确认勒索软件”判定会让整个组织因为一个备份任务而进入危机响应状态。 ## 值得了解的设计决策 **按易失性顺序(RFC 3227)。** 收集器带有 `order` 属性并按易失性从低到高运行:攻击者自身的清理程序会破坏的、驻留在内存中的状态,会被安排在磁盘上静静躺着的文件之前进行采集。 **被锁定的文件,三种逐步升级的策略。** 直接拷贝,然后是原生导出器(`reg save`、`wevtutil epl` —— 经过签名的 Microsoft 二进制文件,会向拥有该文件的服务请求一个一致的副本),最后是通过目录符号链接挂载的卷影副本。只有第三种策略会向目标主机写入内容,因此它是可选的,并且总会被清理干净,即使在收集器执行到一半引发异常时也是如此。 **故障被双重隔离。** 崩溃的模块不会导致整个运行终止,崩溃的步骤也不会导致其所属模块终止。在开发过程中,Startup 文件夹遍历中抛出的一个 `Path.is_dir()` 异常静默地导致了随后的四个痕迹源丢失——包括所有的 WMI 订阅——因此有了 [`Module.step()`](corvus/core/plugins.py)。在 Windows 上,路径谓词不是全函数;在受损或被破坏的磁盘上,抛出异常是预期情况,而不是意外。 **一切都是 UTC 时间**,在解析时进行标准化。`parse_timestamp` 可以处理带偏移量的 ISO 格式、`/Date(1785391144500)/`、CIM_DATETIME 以及 epoch 秒与毫秒。Windows 的“从未”哨兵值(Task Scheduler 的 `1999-11-30`、OLE 零值、FILETIME 零值)会带有一天的容差进行过滤——这个哨兵值是一个*本地*时间,所以在 UTC+1 的主机上它会以 `1999-11-29T23:00Z` 的形式出现,如果在 UTC 时区之外进行精确日期测试,就会悄无声息地失效。 **控制台输出使用真实的 OEM 代码页进行解码。** `cp1252` 几乎将每个字节都映射到了某个字符上,因此永远不会抛出异常,所以如果先尝试它而不是 `cp850`,就会在处理 OEM 字节时“成功”,并将 `privilège nécessaire` 变成 `privilŠge n‚cessaire`——从而破坏了证据记录中的法语和德语输出。 **性能是一项取证属性,而不是可有可无的点缀。** 你正站在别人的机器旁进行操作。批量合并防火墙过滤器而不是按规则进行管道传输,将 `security_products` 的耗时从 335 秒降到了 41 秒;使用单个Get-Process -IncludeUserName` 代替为每个进程调用 `Invoke-CimMethod GetOwner`,将 `volatile` 的耗时从 190 秒降到了 56 秒。现在,`quick` 配置模式的运行时间不到三分钟。 ## 局限性 - **不支持内存获取。** Corvus 不会转储 RAM。如果需要,请先使用 WinPmem 或 DumpIt 进行转储,然后再运行 Corvus。它们在各自的领域是更好的工具。 - **目前还没有离线镜像模式。** 它分析的是实时主机或案件文件夹,而不是已挂载的 `.E01` 文件。 - **它不会解析它收集到的所有内容。** 获取 `$MFT`、`$UsnJrnl`、注册表配置单元和 Amcache 是为了使用 MFTECmd、RegRipper 或 regipy 进行离线分析——正确解析它们本身就是一个庞大的项目。 - **Linux 收集器尚未编写。** 插件契约已经是跨平台的了,分析器、时间轴和报告层无需任何更改;参见 [`corvus/collectors/linux/`](corvus/collectors/linux/__init__.py)。 - **发现结果只是线索,而不是结论。** 每一个发现结果都附带了原始证据和置信度评级,以便你可以对其进行验证。分析师仍然需要独立思考。 ## 合法与合规使用 Corvus-IR 是一款供应急响应人员在获得授权检查的系统上工作的**防御性**工具。在大多数司法管辖区,未经书面授权,收集你不拥有或管理的机器上的痕迹是非法的。案件文件夹包含注册表配置单元、浏览器历史记录、命令行和使用过该机器的人员的个人数据:请将它们视为证据,按照你所在机构的数据保护条款进行处理,且切勿将其提交到代码仓库中。在欧盟,涉及个人数据的安全事件必须根据 GDPR 第 33 条的规定,承担 72 小时的通知义务。 ## 开发 ``` pip install -e ".[dev]" pytest tests -q # 168 tests ruff check corvus tests ``` 测试套件可以在 Windows 和 Linux 上运行,且既不需要管理员权限也不需要受损机器:分析器只是针对收集数据的纯函数,因此测试用例会构建一个收集器本应生成的数据集,并针对发现结果进行断言。负面测试——即规则必须保持*静默*的条件——才是最重要的。 添加一个痕迹源只需一个类: ``` @register_collector class MyCollector(WindowsCollector): name = "my_artifact" description = "What it gathers" order = 45 # order of volatility def execute(self) -> None: self.query("Get-Something | Select-Object A, B", "my_dataset") self.grab(self.sysroot / "System32" / "thing.dat") ``` 有关痕迹参考、检测规则格式和应急响应操作手册,请参见 [`docs/`](docs/)。 ## 致谢 站在 DFIR 社区的肩膀上:Eric Zimmerman 的工具集和 KAPE 目标定义、SANS DFIR 海报、[LOLBAS 项目](https://lolbas-project.github.io/)、MITRE ATT&CK,以及用于勒索家族识别的 [ID Ransomware](https://id-ransomware.malwarehunterteam.com/)。 采用 MIT 许可证。由 [Ziyad Belaidi](https://github.com/Ziyad-Solsad) 构建。
标签:AI合规, 勒索软件检测, 多模态安全, 安全工具, 库, 应急响应, 数字取证, 数据可视化, 自动化报告, 自动化脚本