Chaelsoo/Zetsu

GitHub: Chaelsoo/Zetsu

一个离线运行的个人 RAG 系统,专为攻防安全知识管理设计,将 writeup 和安全笔记转化为可自然语言查询的私有知识库。

Stars: 124 | Forks: 8

ZETSU

一个用于攻防安全知识的个人离线 RAG 系统。导入你的 writeup、实验室解题、漏洞赏金报告和安全博客,然后在实际操作时使用自然语言进行查询。无需云服务,无需 SaaS,你的知识始终属于你。 ## 功能简介 ZETSU 将你积累的知识转化为可查询的助手。你不再需要在 markdown 文件中 grep 或苦苦回忆哪篇 writeup 包含那条 certipy 命令,而是可以直接用自然语言提问: ``` how do i escalate with SeImpersonatePrivilege what did i do after getting ADFS access sliver socks5 pivot setup explain ESC8 vs ESC4 ``` 它会优先从你的实际笔记中检索,然后根据你记录的内容生成答案,而不是依赖于网络上的通用知识。 ## 架构 ### 数据导入 pipeline ![数据导入 pipeline](https://static.pigsec.cn/wp-content/uploads/repos/cas/17/17b95c13827733b7b7fae8462460b8c35211644d8150e628f56a8f8b05c7057f.png) ### 查询 pipeline ![查询 pipeline](https://static.pigsec.cn/wp-content/uploads/repos/cas/d6/d67a3db9a22b0a726221f8badde715919ecc0e8a42c541227a4cdc0d6f5bcc0f.png) ## 特性 - **FARR 提取:** 在导入时,LLM 会阅读你的 writeup 的每个部分,并提取出结构化的攻击步骤(Finding、Action、Reasoning、Result)。你检索到的是一个语义单元,而不是随机截取的 800-token 窗口。 - **混合检索:** 使用 BM25 进行精确的 token 匹配(工具名称、CVE 编号、CLI 参数)+ 向量搜索计算语义相似度。通过 RRF 融合算法将两者结合。 - **Cross-encoder 重排序:** 在发送给 LLM 之前,根据实际的关联度对检索到的数据块进行重新排序。 - **双响应风格:** Operator 模式优先提供精确的命令,Concept 模式优先提供推理过程。使用相同的检索结果,不同的呈现方式。在 TUI 中使用 `Ctrl+M` 进行切换。 - **多种 LLM 后端:** 支持 Anthropic、兼容 OpenAI 的 API(DeepSeek 等),或本地的 Ollama。支持为数据导入和查询配置独立的后端。 - **多种数据源类型:** 本地 markdown 文件、单个 URL、GitHub wiki、Atom/RSS 订阅源。 - **持久化聊天记录:** 保存至 `~/.zetsu/history/YYYY-MM-DD.json`,可通过 `/history` 浏览。 - **TUI + Web UI + CLI:** 根据场景选择合适的模式。实战操作使用 TUI,学习研究使用 Web UI,编写脚本使用 CLI。 ## 安装说明 ``` git clone https://github.com/chaelsoo/zetsu cd zetsu pip install -r requirements.txt ``` 设置你的 API key: ``` cp .env.example .env # 编辑 .env 并添加你的 key ``` ## 快速开始 **1. 添加你的 writeup** 将 `.md` 文件放入 `docs/` 目录。支持 Notion 导出、Obsidian 笔记、博客导出等任何 markdown 格式。 **2. 在 `config.toml` 中配置数据源** ``` [llm] backend = "openai" openai_model = "deepseek-chat" base_url = "https://api.deepseek.com/v1" [[sources]] type = "markdown_dir" path = "./docs" name = "my_writeups" extract = "farr" enabled = true ``` **3. 导入数据** ``` python zetsu.py ingest ``` **4. 开始使用** ``` python zetsu.py tui # terminal UI python zetsu.py web # browser at localhost:8000 python zetsu.py ask "how do i abuse SeImpersonatePrivilege" ``` ## CLI 参考 ``` python zetsu.py ingest # ingest enabled sources python zetsu.py ingest --force # wipe and rebuild everything python zetsu.py ingest --dry-run # estimate without making LLM calls python zetsu.py ingest --all-sources # enable all sources regardless of enabled flag python zetsu.py tui # terminal UI python zetsu.py web # web UI python zetsu.py ask "query" # one-shot CLI python zetsu.py ask "query" --style concept python zetsu.py stats # vector store stats ``` ## TUI 快捷键 | 按键 | 操作 | |-----|--------| | `Enter` | 发送查询 | | `Ctrl+M` | 切换 Operator / Concept 模式 | | `Ctrl+Y` | 复制上次回复到剪贴板 | | `Ctrl+L` | 清除当前会话 | | `Ctrl+C` | 退出 | | `/help` | 显示命令 | | `/stats` | Vector store + 历史记录统计 | | `/history` | 今日的历史查询 | | `/clear` | 清除当前会话 | ## 数据源类型 | 类型 | 用途 | 提取模式 | |------|---------|--------------| | `markdown_dir` | 你的 writeup、笔记 | `farr` | | `markdown_file` | 单个 markdown 文件 | `farr` | | `url` | 工具 wiki、参考页面 | `headers` | | `atom` | 带有订阅源的安全博客 | `farr+narrative` | ### 提取模式 - **`farr`:** LLM 将离散的攻击步骤提取为结构化的 JSON(Finding、Action、Reasoning、Result)。最适合具有明确攻击链的 writeup。 - **`farr+narrative`:** 与 farr 相同,并增加了一段捕捉作者推理过程的叙述性摘要。最适合注重思考过程的博客。 - **`headers`:** 不使用 LLM,仅根据标题进行分割并保留原文。最适合命令参考和工具文档。 ## LLM 后端 在 `config.toml` 中配置。为数据导入(批量提取)和查询(生成内容)提供独立的后端: ``` [llm] # query time backend = "openai" openai_model = "deepseek-chat" base_url = "https://api.deepseek.com/v1" [ingest] # ingest time backend = "openai" openai_model = "deepseek-chat" base_url = "https://api.deepseek.com/v1" workers = 8 # parallel files during FARR extraction ``` 支持的后端包括:`anthropic`、`openai`(任何兼容 OpenAI 的 API)、`ollama`。 ## 基准测试 在涵盖 12 个攻防安全类别的 910 个问题中进行了评估 (ADCS、Kerberos、AD enumeration、MSSQL、Sliver C2、privilege escalation、 web attacks、credentials、lateral movement、cloud/Entra ID、OPSEC、工具)。 | 指标 | 结果 | |--------|--------| | 已回答的问题 | 910 / 910 (100%) | | 包含代码/命令的回答 | 842 / 910 (93%) | | 上下文缺失(模型承认缺少信息) | 66 / 910 (7.3%) | | 平均检索时间 | 68ms | | 平均总响应时间 | 3.8s | 为回答做出贡献的主要数据源:个人 HTB writeup、dirkjanm 博客、shenaniganslabs 研究、HackTricks ADCS、Sliver wiki、netexec cheatsheet。 简而言之,你需要确保添加高质量且结构化良好的资源供 RAG 导入,本项目 100% 专注于使用知识库,而不是信任 LLM 的记忆或预训练知识。 完整的评估数据集和结果见 [`eval/`](eval/)。 ## 参考文献 - [rank-bm25](https://github.com/dorianbrown/rank_bm25),BM25 检索 - FARR 概念来自 [CIPHER](https://github.com/ibndias/CIPHER) - RAG pipeline 灵感来自 [rag-chatbot](https://github.com/umbertogriffo/rag-chatbot)
标签:AI风险缓解, LLM, Petitpotam, RAG, Ruby, Unmanaged PE, 数据展示, 本地大模型, 知识库, 红队, 逆向工具