jeffbryner/find_evil_hackathon
GitHub: jeffbryner/find_evil_hackathon
DuckTracy 是一套基于多代理 AI 架构的自动化数字取证系统,通过将取证工件转化为 Parquet 数据并利用 AI 代理协同分析,实现机器速度的取证调查。
Stars: 0 | Forks: 0
# DuckTracy:机器速度的取证
[](https://www.youtube.com/watch?v=0jk51RqOx_I)
*5分钟概览 NITROBA 案例 —— 章节请见 YouTube 描述。*
## 架构(概览)
```
flowchart TB
classDef arch fill:#e8f5e9,stroke:#2e7d32,stroke-width:3px,color:#1b5e20
classDef prompt fill:#fff3e0,stroke:#ef6c00,stroke-width:2px,stroke-dasharray: 6 3,color:#e65100
classDef data fill:#e3f2fd,stroke:#1565c0,stroke-width:3px,color:#0d47a1
classDef evidence fill:#fce4ec,stroke:#ad1457,stroke-width:3px,color:#880e4f
classDef note fill:#fffde7,stroke:#f9a825,color:#5d4037
NOTE["Pattern: Multi-Agent Framework + Custom Tooling (Hybrid Funnel)
Where it runs: directly on the host — not inside the SIFT VM.
Docker is used only for SIFT tools that need Linux/amd64."]:::note subgraph HOST["🖥️ HOST — macOS / Apple Silicon · native arm64 · no VM"] direction TB subgraph EXTRACT["📥 Triage Extraction (one-shot, pre-investigation)"] direction LR TRIAGE["triage_extractor.py"] VOL["volatility3
(arm64 native)"] RDUMP["rdump_to_parquet.py
Dissect → Parquet"] PSTEAL["psteal_parquet.py
Plaso → Parquet"] end subgraph AG["🧠 Agent Layer — forge harness (Rust)"] direction TB LEAD["Case Lead · forensic-investigator
Gemini 3.5 Flash · max reasoning
NO shell — delegates only"] DA["data-analyst
shell + SQL · tool-call budget"] SF["sniper-forensics
shell + SIFT skills · tool-call budget"] LEAD -- "mission card" --> DA LEAD -- "mission card" --> SF end HELP["query_parquet.py · ioc_tracker.py
(agent-facing CLIs)"] MCPFS["mcp_filesystem.py
MCP server · Case Lead only
binary-aware file listing"] subgraph BB["📋 Shared Brain (Blackboard) — files on disk"] direction LR CR["case_report.md"] SH["shared_facts.md"] IOC["iocs.jsonl
(DuckDB-joinable)"] MC["mission cards/*.md"] end end class HOST,AG,LEAD arch class MCPFS arch class BB,CR,SH,IOC,MC prompt subgraph DATA["🗄️ DuckDB / Parquet — in-process · no server · native arm64"] direction LR PQ["*.parquet views
fs_timeline · artifacts_timeline
memory_pslist · browser_history · …"] end class DATA,PQ data subgraph DOCKER["🐳 SIFT Docker (per case) — Linux/amd64 (emulated)"] direction TB SIFT["SIFT 2026 toolset
Sleuthkit · Plaso · Dissect
target-query · target-mount"] RO["/case (RO mount from host)
source images, read-only"] RW["/scratch (RW)
parsed artifacts, working data"] SIFT --> RO SIFT --> RW end class DOCKER,SIFT,RO,RW arch subgraph EV["🔒 EVIDENCE — immutable source images"] direction LR DISK[("disk image .E01")] MEM[("memory image .raw")] end class EV,DISK,MEM evidence EXTRACT -- "writes parquet" --> PQ HELP -- "SQL" --> PQ IOC -. "DuckDB joins" .-> PQ DA -- "uses" --> HELP SF -- "docker exec" --> SIFT LEAD -- "patch/write" --> CR LEAD -- "list_directory · read" --> MCPFS DA -- "track_ioc" --> IOC SF -- "track_ioc" --> IOC DA -- "updates" --> SH SF -- "updates" --> SH DISK -. "RO mount" .-> RO MEM -. "RO mount" .-> RO DISK -. "RO read" .-> TRIAGE MEM -. "RO read" .-> TRIAGE ``` DuckTracy **直接在主机上**运行 —— 而不是在 SIFT VM 内部。Docker 用于访问种类繁多的 SIFT 工具。DuckDB 以进程内查询 Parquet 来保证速度。**案件负责人** 使用一个定制的窄范围 MCP 文件系统服务器(`helpers/mcp_filesystem.py`),以便它能够感知 forge 默认工具所跳过的二进制证据文件;子代理则通过熟悉的 SQL 和 shell 工作,而不是通过 MCP。有关信任边界、架构模式及设计原理,请参阅 [ARCHITECTURE.md](./ARCHITECTURE.md)。 ## 是什么 DuckTracy(向 Daffy 标志性的侦探角色致敬,同时也代表我们对 DuckDB 的使用)是一种使用一组离散工具执行取证的结构化方法: ### SIFT 来自 SANS 的 SIFT 工作站是一套经过实战检验的可靠取证实用程序集合。我们将其用作 Docker 容器以: - 并行运行多个容器(每个案件一个,允许同时处理多个案件) - 做出关于在容器中使用工具版本或在本地使用工具版本的选择 - 为 AI 提供一个易于使用的 CLI 接口来访问海量的工具集 ### Forgecode Forgecode.dev(或 forge)是一个用 Rust 编写的 AI 运行框架,它允许: - 轻松创建代理(一个简单的 .md 文件) - 将代理指向任何提供商/模型(首席调查员使用强大的思考模型,工作者使用高效的 flash 模型) - 代理作为团队运作 - 代理规模化运作,同时实例化多个代理 ### Dissect/Triage-query dissect 实用工具集 https://docs.dissect.tools/en/latest/index.html 是一个基于 Python 的取证套件,它将任何文件作为取证数据源读取,并允许对工件进行一致的解析。它不是为每种文件类型提供单独的工具,而是为 AI 提供了一种一致的方法来临时检索和解析工件。 ### DuckDB 众所周知,AI 非常不擅长处理我们在取证中遇到的大型上下文,但在数据科学方面却非常出色,尤其是使用 SQL 时。 我们特意构建了一个流水线,将工件从原始形式转换为具有半结构化 schema 的 .parquet 文件,并作为查询工具提供给 AI。这使得 AI 能够在一个它非常熟悉的环境中进行极其快速和可重复的发现与分析。DuckDB 仅限本地使用,无需服务器,并且能够动态地将 .parquet、.sqlite、.jsonl 和其他文件拼接在一起,这为我们提供了一个可以根据需要添加数据的临时环境。 ## 入门指南 - Clone 此 repo - 拉取 docker 容器 `docker pull 0x7eff/sift-ai` - 为 python 环境安装 `uv` [文档](https://docs.astral.sh/uv/getting-started/installation/) - 安装库 `uv sync` - 可选:`source .venv/bin/activate` 以激活 python 环境,或使用 `uv run` 运行实用程序。
- 安装 forge,使用您的 AI 提供商登录并选择您的模型。
curl -fsSL https://forgecode.dev/cli | sh
forge
/login
请注意,当前配置假定通过 VertexAI 使用 Google Gemini。您可以使用任何提供商/模型,但您需要编辑 ./.forge/agents/*.md 文件以符合您的意图
provider: vertex_ai
model: gemini-3.5-flash
- 创建一个目录来保存您的案件镜像:`mkdir -p ./cases//images`
- 将您的磁盘/内存镜像复制进去(按照约定为 `.` )
- 其中 filetype 对于 expert witness 文件为 .E01,对于内存镜像为 .img,对于原始镜像为 .dd 或 .raw。
- 名称中不包含 `memory` 字样的文件将被视为磁盘镜像并被挂载。
- 名称中包含 `memory` 字样的文件将作为内存镜像进行处理。
- 初始化案件 `uv run init_case.py --case ./cases//images/*
- 初始化案件文件的处理:
- 处理所有镜像:`uv run triage_extractor.py --case --all`
- 处理选定的镜像(或新到达的镜像):`uv run triage_extractor.py --case --evidence ./cases//images/*memory*`
这将启动一系列针对以下内容的工件收集:
- 文件系统时间线(一个定制的 duckDB 版本的 mactime)
- log2timeline/plaso 对关键目标的提取(一个自定义的 psteal.py 到 parquet 的转换):
- WindowsRunKeys,
- WindowsServices,
- WindowsUserAssist,
- WindowsAppCompatCache,
- WindowsEventLogSecurity,
- WindowsEventLogSystem,
- WindowsXMLEventLogSecurity,
- WindowsXMLEventLogSystem,
- WindowsPrefetchFiles
- LNK 文件
- 等等
- volatility
- pslist
- netstat
- timeliner(选择有价值的工件插件)
所有这些都将被转换为具有通用 schema 的 .parquet 文件。您的调查画布现在已为 AI 准备就绪。
(也支持 PCAP 到 parquet 的转换,但将根据需要由代理临时运行。)
## 启用 AI
```
forge
```
`/new` 将启动一个 forge 会话。
`/agent` 选择 `forensic-investigator`
使用您认为启动案件所需的任何内容进行提示(至少需要 `CASEID`)
您可以通过查看 CASEID 文件夹中的 `docs` 目录并与 forge CLI 的首席代理进行沟通,来监控案件进度。
您可以随时使用 CTRL-c 中断首席代理。
您始终可以通过命令行界面重新引导首席代理或子代理。它们本能上是自主的,但也乐意接受您针对可能存在的问题或见解而进行的引导。
Where it runs: directly on the host — not inside the SIFT VM.
Docker is used only for SIFT tools that need Linux/amd64."]:::note subgraph HOST["🖥️ HOST — macOS / Apple Silicon · native arm64 · no VM"] direction TB subgraph EXTRACT["📥 Triage Extraction (one-shot, pre-investigation)"] direction LR TRIAGE["triage_extractor.py"] VOL["volatility3
(arm64 native)"] RDUMP["rdump_to_parquet.py
Dissect → Parquet"] PSTEAL["psteal_parquet.py
Plaso → Parquet"] end subgraph AG["🧠 Agent Layer — forge harness (Rust)"] direction TB LEAD["Case Lead · forensic-investigator
Gemini 3.5 Flash · max reasoning
NO shell — delegates only"] DA["data-analyst
shell + SQL · tool-call budget"] SF["sniper-forensics
shell + SIFT skills · tool-call budget"] LEAD -- "mission card" --> DA LEAD -- "mission card" --> SF end HELP["query_parquet.py · ioc_tracker.py
(agent-facing CLIs)"] MCPFS["mcp_filesystem.py
MCP server · Case Lead only
binary-aware file listing"] subgraph BB["📋 Shared Brain (Blackboard) — files on disk"] direction LR CR["case_report.md"] SH["shared_facts.md"] IOC["iocs.jsonl
(DuckDB-joinable)"] MC["mission cards/*.md"] end end class HOST,AG,LEAD arch class MCPFS arch class BB,CR,SH,IOC,MC prompt subgraph DATA["🗄️ DuckDB / Parquet — in-process · no server · native arm64"] direction LR PQ["*.parquet views
fs_timeline · artifacts_timeline
memory_pslist · browser_history · …"] end class DATA,PQ data subgraph DOCKER["🐳 SIFT Docker (per case) — Linux/amd64 (emulated)"] direction TB SIFT["SIFT 2026 toolset
Sleuthkit · Plaso · Dissect
target-query · target-mount"] RO["/case (RO mount from host)
source images, read-only"] RW["/scratch (RW)
parsed artifacts, working data"] SIFT --> RO SIFT --> RW end class DOCKER,SIFT,RO,RW arch subgraph EV["🔒 EVIDENCE — immutable source images"] direction LR DISK[("disk image .E01")] MEM[("memory image .raw")] end class EV,DISK,MEM evidence EXTRACT -- "writes parquet" --> PQ HELP -- "SQL" --> PQ IOC -. "DuckDB joins" .-> PQ DA -- "uses" --> HELP SF -- "docker exec" --> SIFT LEAD -- "patch/write" --> CR LEAD -- "list_directory · read" --> MCPFS DA -- "track_ioc" --> IOC SF -- "track_ioc" --> IOC DA -- "updates" --> SH SF -- "updates" --> SH DISK -. "RO mount" .-> RO MEM -. "RO mount" .-> RO DISK -. "RO read" .-> TRIAGE MEM -. "RO read" .-> TRIAGE ``` DuckTracy **直接在主机上**运行 —— 而不是在 SIFT VM 内部。Docker 用于访问种类繁多的 SIFT 工具。DuckDB 以进程内查询 Parquet 来保证速度。**案件负责人** 使用一个定制的窄范围 MCP 文件系统服务器(`helpers/mcp_filesystem.py`),以便它能够感知 forge 默认工具所跳过的二进制证据文件;子代理则通过熟悉的 SQL 和 shell 工作,而不是通过 MCP。有关信任边界、架构模式及设计原理,请参阅 [ARCHITECTURE.md](./ARCHITECTURE.md)。 ## 是什么 DuckTracy(向 Daffy 标志性的侦探角色致敬,同时也代表我们对 DuckDB 的使用)是一种使用一组离散工具执行取证的结构化方法: ### SIFT 来自 SANS 的 SIFT 工作站是一套经过实战检验的可靠取证实用程序集合。我们将其用作 Docker 容器以: - 并行运行多个容器(每个案件一个,允许同时处理多个案件) - 做出关于在容器中使用工具版本或在本地使用工具版本的选择 - 为 AI 提供一个易于使用的 CLI 接口来访问海量的工具集 ### Forgecode Forgecode.dev(或 forge)是一个用 Rust 编写的 AI 运行框架,它允许: - 轻松创建代理(一个简单的 .md 文件) - 将代理指向任何提供商/模型(首席调查员使用强大的思考模型,工作者使用高效的 flash 模型) - 代理作为团队运作 - 代理规模化运作,同时实例化多个代理 ### Dissect/Triage-query dissect 实用工具集 https://docs.dissect.tools/en/latest/index.html 是一个基于 Python 的取证套件,它将任何文件作为取证数据源读取,并允许对工件进行一致的解析。它不是为每种文件类型提供单独的工具,而是为 AI 提供了一种一致的方法来临时检索和解析工件。 ### DuckDB 众所周知,AI 非常不擅长处理我们在取证中遇到的大型上下文,但在数据科学方面却非常出色,尤其是使用 SQL 时。 我们特意构建了一个流水线,将工件从原始形式转换为具有半结构化 schema 的 .parquet 文件,并作为查询工具提供给 AI。这使得 AI 能够在一个它非常熟悉的环境中进行极其快速和可重复的发现与分析。DuckDB 仅限本地使用,无需服务器,并且能够动态地将 .parquet、.sqlite、.jsonl 和其他文件拼接在一起,这为我们提供了一个可以根据需要添加数据的临时环境。 ## 入门指南 - Clone 此 repo - 拉取 docker 容器 `docker pull 0x7eff/sift-ai` - 为 python 环境安装 `uv` [文档](https://docs.astral.sh/uv/getting-started/installation/) - 安装库 `uv sync` - 可选:`source .venv/bin/activate` 以激活 python 环境,或使用 `uv run
标签:Python, Rust, 人工智能, 可视化界面, 多智能体框架, 数字取证, 无后门, 用户模式Hook绕过, 网络流量审计, 自动化脚本, 自动化调查, 请求拦截, 逆向工具