SecurityRonin/issen

GitHub: SecurityRonin/issen

Issen 是一个 Rust 编写的 DFIR 编排工具,通过单条命令将磁盘和内存证据自动摄取、解析并关联为映射 ATT&CK 的攻击时间线,帮助事件响应人员快速完成取证分析。

Stars: 0 | Forks: 0

Issen — fast forensic triage for incident responders Issen — fast forensic triage for incident responders

Release License CI Rust 1.80+ Platform Sponsor

**一条命令即可将磁盘和内存证据转化为相互关联且映射到 ATT&CK 的攻击叙事。** Issen 是 SecurityRonin 取证矩阵的编排层——这是一个包含多个 crate 的 Rust workspace 以及 `issen` CLI。只需将采集到的证据交给它,它就会自动检测容器,对文件系统进行取证以寻找关键工件,解析每一个工件,并构建一个可供您扫描和报告的单一可查询时间线。 ``` # 单条命令:ingest disk artifacts,parse memory dumps,correlate,并 scan —— # 在一次单一的、可恢复的运行中完成。自动检测 E01/EWF/VMDK/raw + memory dumps。 issen evidence.E01 memory.raw -o case.duckdb # 读取结果:作为文本的 correlated attack narrative(或可分享的 HTML report) issen report case.duckdb --format text ``` 一条命令即可将原始采集数据转化为相互关联的攻击叙事。无需 Python 环境,也没有依赖地狱——只需一个静态二进制文件。 ## 工作原理 Issen 从五种独立的来源类型摄取证据,然后跨所有来源进行关联: Issen architecture diagram — 5 navigation primitives with PARSER, NAVIGATION, CONTAINER, [H] State-History, and KNOWLEDGE layers *点击图表以打开[完整的交互式版本](https://securityronin.github.io/issen/architecture-diagram.html)。* - **摄取** UAC 实时响应采集结果、Velociraptor 查询结果、EVTX 日志、内存转储、git 仓库和 OCI 注册表——同时进行。 - **关联** 使用 Pivot 引擎跨所有五种来源类型的证据:单个网络连接本身并不是一个发现;但如果将其与隐藏的 PID、加载的 rootkit 库以及供应链哈希匹配结合起来,它就是一个发现。 - **输出** 包含严重性、规则名称和完整证据链的结构化 Finding——随时可用于您的报告。 无需 Python 环境。没有依赖地狱。一个静态二进制文件。 ### 五种来源类型 | ID | 来源 | 导航原语 | 捕获内容 | |---|---|---|---| | **[P]** | 持久化存储 | `name → inode → block` | 磁盘镜像(E01/raw)、文件系统、文件工件 | | **[M]** | 内存 | `PID → EPROCESS → VA → PA` | RAM 转储、hiberfil.sys、特定时间的实时进程状态 | | **[L]** | 日志 | `timestamp → record → field` | EVTX、journal、tracev3、CloudTrail、Zeek/Suricata | | **[Q]** | 实时查询 | `(endpoint, query, cursor) → rows` | 攻击者无法事后销毁的临时状态 | | **[C]** | 内容寻址 | `hash → blob → content graph` | 供应链溯源、Merkle DAG 遍历 | **[Q] 实时查询** 与其他来源有着根本的不同:其数据是由查询*产生*的,而不是从存储中*检索*的。一旦捕获,结果集就具有了抗攻击者篡改的持久性——任何后续的磁盘擦除操作都无法改变 `velociraptor collect` 在查询时看到的内容。查询本身也成为了证据链的一部分。 **[C] 内容寻址** 为每个工件赋予了一个全局唯一且防篡改的身份:它的哈希值。Issen 可以通过恶意二进制文件的哈希值,跨 git 提交、OCI 镜像层和 Sigstore 透明日志条目进行 Pivot 分析,从而回答“哪些系统运行过这个确切的 blob,是什么时候,以及它来自哪里?” ## 安装 ``` # 预编译二进制文件 —— Windows .exe/.msi 和 Apple-silicon .dmg —— 位于 Releases 页面: # https://github.com/SecurityRonin/issen/releases # ……或从源码构建(使用 rust-toolchain.toml 中锁定的 toolchain) cargo install --git https://github.com/SecurityRonin/issen issen-cli # 验证 issen --version ``` ## 核心工作流 ``` # 默认 pipeline —— ingest disk artifacts,parse memory dumps,correlate # cross-artifact rules,并 scan 缓存的 threat-intel feeds。传入 disk images # 与 memory dumps 的任意组合;重新运行同一命令以从上次中断处恢复。 issen DC01.E01 DESKTOP.E01 DC01-memory.raw -o case.duckdb # 读取结果:作为文本的 correlated findings,或独立的 HTML report issen report case.duckdb --format text issen report case.duckdb -o report.html ``` Issen 通过其 `CollectionProvider` 注册表自动检测每个容器,对 NTFS 卷进行取证以寻找关键工件,对每个工件进行解析,遍历内存转储以获取进程 / 网络 / 注入状态,并将所有内容关联到一个超级时间线中。`issen timeline`、`issen report` 和 `issen info` 都读取同一个 DuckDB 数据库。 ### 它从磁盘镜像中提取哪些内容 当证据是 Windows 磁盘镜像时,Issen 会遍历 NTFS 文件系统并提取: - **`$MFT`** — 主文件表(文件元数据 + 时间戳) - **`$Extend\$UsnJrnl:$J`** — USN 更改日志(文件创建/删除/重命名历史记录) - 位于 `Windows\System32\winevt\Logs` 下的 **所有 `.evtx`** 事件日志(Security、System、Application、Sysmon 以及其他所有通道) - **注册表配置单元** — `SYSTEM`、`SOFTWARE`、`SAM`、`SECURITY`、`DEFAULT`,以及各用户的 `NTUSER.DAT` - **`SRUDB.dat`** — 系统资源使用监视器(System Resource Usage Monitor)数据库 ## 子命令 | 命令 | 功能 | |---|---| | `issen ` | **默认流水线** — 在一次可断点续传的运行中摄取磁盘和内存证据,进行关联、扫描并分析内存(`-o` 指定案件 DB) | | `issen timeline` | 查询并导出时间线(text、JSON、CSV、bodyfile;使用 `--flagged` 查看待定发现) | | `issen report` | 将关联后的发现渲染为纯文本(`--format text`)或自包含的 HTML 报告 | | `issen info` | 显示有关时间线数据库的信息 | | `issen memory` | 分析物理内存转储(LiME、AVML、Windows crash dump、raw)— 进程、netstat、注入、凭证 | | `issen scan` | 使用威胁情报特征(YARA / Sigma / hash / network)扫描文件或指标 | | `issen remote-access` | 扫描证据以检测远程访问基础设施(LOLRMM 规则集) | | `issen rules` | 列出内置的检测规则(“你们有哪些检测?”) | | `issen feed` | 管理威胁情报源(列出、更新、检查) | | `issen srum` | 解析并查询 SRUM(系统资源使用监视器)数据 | | `issen biome` | 解析 Apple Biome 的 `App.MenuItem` SEGB 文件 — macOS 菜单栏选择记录 | | `issen frequency` | 跨 EVTX 进行罕见事件的频率 / 堆叠分析 | | `issen processes` | 从一个或多个 EVTX 文件中提取进程创建事件 | | `issen session` | 从 EVTX 关联 Windows 登录会话 | ``` # 查询 timeline;仅显示 high+ severity 的 flagged findings issen timeline timeline.duckdb --flagged --min-severity high # 将 timeline 导出为 CSV 或 bodyfile,用于跨工具 timelining issen timeline timeline.duckdb --format csv issen timeline timeline.duckdb --format bodyfile # 分析物理 memory dump(LiME,AVML,crash dump) issen memory dump.lime --command all # 针对 YARA / Sigma / hash / STIX signatures 扫描文件 issen scan evidence/ --auto-feeds # 更新 threat-intel feeds(YARA,Sigma,STIX,Zeek,Suricata) issen feed update ``` ## 信任但验证 Issen 已经针对真实的 **29 GB DEF CON E01** 采集数据进行了端到端运行:它自动检测了容器,对 NTFS 卷进行了取证,并将 **843 个工件** 解析为包含 **431,863 个事件** 的 DuckDB 时间线。合成的测试夹具会遗漏现实世界中的各种异常情况;因此,针对真实采集证据进行验证是开发规范的一部分。 ## 覆盖范围 | 类别 | 格式 / 来源 | |---|---| | **采集格式** | UAC `.tar.gz`、Velociraptor、KAPE 取证 zip | | **磁盘镜像** | E01/EWF、raw DD(分卷镜像)、VMDK、VHD、VHDX、QCOW2、ISO9660 — 通过 `CollectionProvider` 注册表自动检测 | | **文件系统** | NTFS(Windows 磁盘取证端 — MFT/USN/hives/$I$R)、ext4、APFS [规划中] | | **内存格式** | LiME、AVML、WinPMEM、crash dump (DMP)、Hibernation (hiberfil.sys) | | **日志流** | EVTX、Zeek `conn.log`、Suricata EVE、systemd journal [规划中]、Apple Unified Log [规划中]、CloudTrail [规划中] | | **实时查询** | Velociraptor VQL、WMI/WQL [规划中]、OSQuery SQL [规划中] | | **内容寻址** | git 仓库、OCI 镜像注册表、IPFS [规划中]、Sigstore 透明日志 [规划中] | | **检测类型** | YARA 规则、Sigma 规则、STIX 2.1 指标、hash IOC、Suricata 规则 | | **工件来源** | MFT、USN Journal、EVTX、注册表配置单元(包括 Shimcache / UserAssist / 网络配置)、Amcache、Prefetch、LNK / Jump Lists、Recycle Bin($I/$R 内容)、浏览器历史记录、SRUM、Apple Biome | | **网络分析** | Volatility sockstat、Zeek 日志、Suricata EVE、pcap | | **输出格式** | 终端(彩色)、JSON、HTML 报告、PDF、STIX 2.1 Attack Flow、AFB (Attack Flow Builder)、DOT/PNG (Graphviz)、Mermaid、CSV、bodyfile、DuckDB 时间线 | | **RAT 检测** | LOLRMM 规则集(400+ 种工具) | | **Attack Flow 摄取** | CTID Attack Flow v3.0.0 语料库 — 解析 STIX bundles → 通过 BFS DAG 遍历生成关联规则 | | **Attack Flow 输出** | STIX 2.1 bundle、`.afb` (Attack Flow Builder)、Mermaid `flowchart LR`、PNG(通过 Graphviz 或 mmdc) | | **VSS 感知** | 枚举证据树中的卷影副本;`is_vss_path` 防护机制防止重复计算 | | **时间偏移检测** | 标记同一工件在不同来源之间超过 5 分钟的时间戳差异 — 反取证信号 | | **事件聚类** | 按 PID、用户或路径对证据进行分组,以便进行重点关联查询 | ## 生态系统 Issen 是构建在一个深层取证库家族之上的轻量级关联层。每个库都可以在您自己的工具中独立使用。 | Crate | 来源 | 层级 | 描述 | |---|---|---|---| | [forensicnomicon](https://github.com/SecurityRonin/forensicnomicon) | 全部 | 知识库 | 零依赖的编译时工件规范、magic bytes、格式常量 | | [state-history-forensic](https://github.com/SecurityRonin/state-history-forensic) | `[H]` | 知识库 | 零依赖的 `[H]` 函子特征:`HistoricalSource`、`TemporalCohort`、`ClockProvenance`、多维度 `ArtifactRef` | | [ewf](https://github.com/SecurityRonin/ewf) | [P] | 容器 | E01/EWF → 带哈希校验的 raw 扇区流 | | [ext4fs-forensic](https://github.com/SecurityRonin/ext4fs-forensic) | [P] | 文件系统 | ext4 扇区流 → 按路径获取文件(name → inode → block) | | [4n6mount](https://github.com/SecurityRonin/4n6mount) | [P] | 文件系统 | FUSE 桥接 — 使任何容器+文件系统组合看起来像普通路径 | | [memory-forensic](https://github.com/SecurityRonin/memory-forensic) | [M] | 容器 + 分页 + OS 结构 | WinPMEM/LiME/hiberfil → page stream → VA→PA → EPROCESS/VAD/DPAPI | | [winevt-forensic](https://github.com/SecurityRonin/winevt-forensic) | [L] | 日志格式 + 解析器 | EVTX 二进制查找 + BinXML 解码 → 强类型的 Windows EventRecord | | [browser-forensic](https://github.com/SecurityRonin/browser-forensic) | [P][M] | 解析器 | Chrome/Firefox/Safari 历史记录、cookies、下载、书签、会话数据 | | [srum-forensic](https://github.com/SecurityRonin/srum-forensic) | [P][L] | 解析器 | ESE/JET Blue 页面遍历 → SRUM 网络/进程/能耗使用记录 | | issen-remote-access | [Q] | 查询引擎 | 实时查询调度器 — Velociraptor VQL、LOLRMM 400+ 工具定义 | | cas-forensic [规划中] | [C] | CAS + 图 | git/OCI/IPFS 哈希寻址对象存储 → Merkle DAG 导航 | | git-forensic [规划中] | [C] | 图 + 解析器 | git commit/blob/tree 取证 → 供应链溯源 | | sigstore-forensic [规划中] | [C] | 图 + 解析器 | Sigstore 透明日志条目 → 工件签名链 |
完整的层级结构 ``` KNOWLEDGE forensicnomicon zero-dep, compile-time artifact specs, format constants state-history-forensic zero-dep, [H] functor traits: HistoricalSource, TemporalCohort, ClockProvenance, ArtifactRef, … CONTAINER decode a raw source format → addressable data stream ewf E01/EWF → raw sector stream memf-format memory dumps (WinPMEM, LiME, hiberfil.sys) → raw page stream (log containers are integrated within each log-format crate) Five parallel paths from CONTAINER — each with its own address space and navigation primitive: [P] Persistent Storage [M] Memory [L] Log navigate by: path navigate by: PID navigate by: timestamp name → inode → block PID → EPROCESS timestamp → record → field → VA → PA FILESYSTEM PAGING LOG FORMAT ext4fs-forensic memf-hw winevt-forensic (EVTX) ntfs-forensic [planned] PML4/PAE/AArch64 journal-forensic [planned] apfs-forensic [planned] OS STRUCTURE tracev3-forensic [planned] 4n6mount (FUSE bridge) memf-windows zeek-forensic [planned] EPROCESS, VAD cloudtrail-src [planned] DPAPI, DKOM memf-linux [planned] [Q] Live Query [C] Content-Addressed navigate by: query navigate by: hash (endpoint, query, cursor) hash → blob → content graph → result rows QUERY ENGINE GRAPH NAVIGATION issen-remote-access cas-forensic velociraptor-parser git-forensic [planned] WQL / OSQuery [planned] sigstore-forensic [planned] [H] State-History (cross-cutting functor — shared traits in state-history-forensic) [P^H] vss-history [planned] VSS shadow copies, Time Machine, btrfs [P^H] apfs-snapshot-history [planned] APFS snapshots [M^H] mem-history [planned] hiberfil chain, VMware memory snapshots [L^H] log-history [planned] journald sealed epochs, rotated logs [Q^H] query-history [planned] point-in-time osquery exports [C^H] ≅ [C] git already encodes its own history (identity functor) PARSER interpret artifact records → forensic meaning browser-forensic browser artifact files / SQLite pages → BrowserEvent winevt-forensic EVTX records → EventRecord srum-forensic ESE page bytes → SrumRecord ORCHESTRATION Issen wires all five paths, cross-artifact correlation, CLI ```
## 架构
Crate 布局 ``` issen-cli # The issen binary — commands and arg parsing issen-core # Shared types, plugin traits, error types issen-timeline # DuckDB (primary) + SQLite export timeline store issen-fswalker # Parallel filesystem walk via rayon; SHA-256 integrity; VSS awareness issen-unpack # Collection format detection (UAC tar.gz, Velociraptor, KAPE) issen-remote-io # Remote storage I/O — 48 URI schemes via OpenDAL (S3, GCS, Azure, SFTP, …) issen-signatures # YARA-X, Sigma/Tau-Engine, Hash/Network/STIX/Suricata IOCs, feed sync issen-correlation # Pivot engine: YAML rules, Attack Flow STIX ingestion, zeek-intel, time-skew, clustering issen-remote-access # LOLRMM 400+ tool definitions, RMM/RAT detection; Velociraptor VQL dispatcher issen-mem # Memory forensics bridge (memf-* sibling workspace) issen-report # HTML/PDF/STIX/AFB/Mermaid/DOT+PNG report generation issen-mft-tree # MFT heuristic analysis issen-navigator # Interactive TUI navigation issen-ewf # EWF/E01 forensic image support issen-evtx # Windows Event Log bridge parsers/issen-parser-mft # NTFS MFT + USN Journal parser parsers/issen-parser-evtx # Windows Event Log parser parsers/issen-parser-uac # UAC collection format parser parsers/issen-parser-velociraptor # Velociraptor collection parser forensic-pivot # Sigma/Suricata/STIX rule pivoting ``` 每个 crate 都可以独立测试和进行版本控制。CLI 将它们组装在一起;您也可以在您自己的工具中将这些 crate 作为库来使用。
## 关联规则 大多数工具只能找到指标。Issen 通过自动跨来源连接证据来发现**攻击模式**。 一个关联规则如下所示: ``` id: correlation.miner.rootkit-concealment severity: critical description: Rootkit concealing cryptominer activity via LD_PRELOAD within_seconds: 300 references: - https://redcanary.com/threat-detection-report/trends/linux-coinminers/ clauses: - source: artifact required_tag: rootkit_indicator - source: memory required_tag: miner_thread - source: memory required_tag: mining_pool ``` 规则是位于 `~/.config/issen/rules/` 中的 YAML 文件。您可以自带规则。也可以与您的团队分享。 内置的规则集包含了涵盖挖矿程序、rootkit、SSH 隧道、LD_PRELOAD 持久化、隐藏进程以及 LOLRMM RAT 的规则。自定义规则可与内置规则组合使用——一次单一的 `issenevidence>` 运行即可评估所有规则。 ### Attack Flow STIX 摄取 关联引擎还能摄取 CTID Attack Flow v3.0.0 语料库 bundles(STIX 2.1 JSON)。每个 bundle 都会被解析为 `AttackFlowBundle`,并通过对 `effect_refs` DAG 进行 BFS 遍历转换为 `CorrelationRule`。每个带有 `technique_id` 的 `attack-action` 都会变成一个带有 `required_tag: "technique:"` 的规则子句。内置的语料库可通过 `issen feed update` 进行下载。 ``` # 获取并索引 Attack Flow corpus issen feed update # 引擎会在默认运行中评估 Attack Flow rules 以及您的 YAML rules issen collection.tar.gz ```
为什么使用 YAML 规则而不是硬编码的检测逻辑? 硬编码的检测逻辑很容易过时。威胁执行者会更改端口号、重命名二进制文件并替换库。而 YAML 规则可以进行版本控制、共享,并能在 pull request 中进行审查。关联引擎是稳定的;规则仅仅是数据。
## 演示 ``` $ issen collection-WIN10-CORP-20260401.zip +===========================================================+ | Issen — Collection Analysis | +===========================================================+ Collection : collection-WIN10-CORP-20260401.zip Host : WIN10-CORP OS : Windows 10 Enterprise 22H2 (19045.4291) Collected : 2026-04-01T14:32:07Z Artifacts : MFT, EVTX, Registry, Prefetch, Amcache Parsed 1,247,831 MFT entries in 3.2s Parsed 48 EVTX logs (312,406 events) in 1.8s Parsed 4 registry hives in 0.4s +- PERSISTENCE ─────────────────────────────────────────── | | [SERVICE] AnyDeskMaint | Binary : C:\ProgramData\Temp\Support\anydesk.exe --service | Start : Auto (SERVICE_AUTO_START) | Account : LocalSystem | Created : 2026-03-28T09:14:22Z | | [REG RUN KEY] HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run | Name : AnyDeskUpdate | Value : "C:\ProgramData\Temp\Support\anydesk.exe" --start-with-win | Modified: 2026-03-28T09:14:38Z +- REMOTE ACCESS ───────────────────────────────────────── | | [LOLRMM] AnyDesk (relocated binary) | Path : C:\ProgramData\Temp\Support\anydesk.exe | SHA256 : a1b2c3d4e5f60718293a4b5c6d7e8f90aabbccdd11223344556677889900eeff | Size : 5,389,312 bytes | Signed : philandro Software GmbH (valid, not revoked) | Config : ad.router.custom_id = "corp-maint-04" | | [C2 CONNECTION] | Dest IP : 194.36.28.117:7070 | First : 2026-03-28T09:17:03Z | Last : 2026-04-01T13:58:41Z | Note : IP not in AnyDesk relay network (AS 208323 / BL Networks, RU) +- TIMELINE ────────────────────────────────────────────── | | 2026-03-28T09:12:55Z [EVTX Security 4624] Logon Type 3 — CORP\svc_backup | from 10.20.5.44 (WIN-RUNBOOK) | 2026-03-28T09:14:18Z [MFT] File created: C:\ProgramData\Temp\Support\anydesk.exe | Parent created at same time — directory is new | 2026-03-28T09:14:22Z [EVTX System 7045] Service installed: AnyDeskMaint | ImagePath: C:\ProgramData\Temp\Support\anydesk.exe --service | Account: LocalSystem | Type: user mode (0x10) | 2026-03-28T09:17:03Z [EVTX Security 5156] Outbound TCP — anydesk.exe (PID 6284) | -> 194.36.28.117:7070 +- CORRELATION FINDINGS ────────────────────────────────── | | [CRITICAL] LOLRMM with non-vendor C2 infrastructure | Rule : remote-access.lolrmm.custom-c2 | Evidence: AnyDesk outside vendor path (C:\ProgramData\Temp\Support\) | Outbound -> 194.36.28.117 (AS 208323, not AnyDesk relay ASN) | MFT entry + EVTX 7045 + EVTX 5156 + Registry Run key | MITRE : T1219, T1543.003 | | [HIGH] Lateral movement via service account | Rule : lateral-movement.service-account.file-drop | Evidence: Type 3 logon CORP\svc_backup from 10.20.5.44 (WIN-RUNBOOK) | File drop + service install within 120s of logon | MITRE : T1021.002 2 findings | 1 critical, 1 high | 4 artifact sources correlated ``` 关联引擎标记了安装在 `C:\ProgramData\Temp\Support\` 下的 AnyDesk——这并非其标准的 `Program Files` 路径——并且发现它与俄罗斯 ASN 建立了出站连接,且该地址处于 AnyDesk 的中继基础设施之外。时间线显示了一个来自内部主机的服务账户登录,随后在四分钟的时间窗口内发生了文件投放、服务安装和首次 C2 回调:攻击者使用 `svc_backup` 凭证从 `WIN-RUNBOOK` 进行 Pivot,进而在 `WIN10-CORP` 上部署了 RAT。
标签:DuckDB, Rust, 可视化界面, 库, 应急响应, 提权工具, 数字取证, 文档结构分析, 网络流量审计, 自动化脚本, 通知系统