cac0ns3c/Raptorscope

GitHub: cac0ns3c/Raptorscope

一款 macOS DFIR 分析平台,将 Velociraptor 采集数据规范化为 ECS 格式,结合 Sigma 检测与 Claude AI 分诊,实现从数据采集到事件取证的完整调查工作流。

Stars: 0 | Forks: 0

# Raptorscope **macOS DFIR 分析 —— 将 Velociraptor 主机采集数据转化为 ECS 规范化、** 检测增强、AI 分诊的事件证据。** Raptorscope 摄取 macOS 采集数据,将每个 artifact 规范化为 Elastic Common Schema,运行 38 对 Sigma 检测,并通过 FastAPI 后端将其提供给专门构建的 React/TypeScript 调查 UI 和由 Claude 驱动的 分诊。**离线优先** —— 捆绑的示例案例无需任何基础设施即可运行 —— 并且**具备扩展能力** —— 支持具有原生检测、聚合和深度分页的 Elasticsearch。 `38 项检测` · `318 项测试` · `双检测引擎,零差异一致性` · `Claude 驱动的分诊` · `RBAC + 审计 + 指标` · `CI: 单元测试 · 实时 ES · 端到端测试 ·` 供应链检测` 设计规范:`docs/superpowers/specs/2026-07-03-raptorscope-design.md` · 安装说明:`docs/INSTALL.md` · 演示:`docs/DEMO.md` · Kibana:`docs/KIBANA.md` · 架构:见下文 ## 核心亮点 - **双检测引擎,已证明等效** —— 进程内 Sigma 评估器 (离线/演示) 和 ES 原生 Lucene 路径 (扩展),在实时 Elasticsearch 上验证了 **0/38 差异**。 - **38 对检测,经 agent 审查** —— 每个规则均提供命中 + 良性 样本并受到防漂移保护;规则集由编排的多 agent 工作流设计并经过*对抗性 审查*,随后进行了端到端验证。 - **位于可测试接口后方的 Claude 驱动分诊** —— 每个警报的分诊, 带时间戳的事件叙述 (流式传输),自然语言 → 查询,带有实时工具调用追踪的 agentic **copilot**,以及结构化 IOC 提取。 可注入的 `AIClient` 允许整套测试在无密钥或网络的情况下运行,并且 可配置为任何兼容 Anthropic 的 endpoint。强化了 Prompt 注入防护。 - **跨主机 IOC 搜寻** —— 在一次 查询中关联整个集群的指示器,直接从 AI 提取的 IOC 进行跳转。 - **生产环境加固** —— 签名 token 中的 RBAC (viewer/analyst/admin), 仅追加的审计日志,按客户端的速率限制,Prometheus `/metrics`, `X-Request-ID` 关联,以及 TLS 反向代理覆盖层。 - **真实保真度** —— 针对真实 Velociraptor schema 协调的规范化器, 在无内置项时使用自定义 VQL (配置 profiles,BTM,签名 增强),时间戳来源 (mtime 对比 event),以及记录在案的 合成数据与真实数据之间的差异。 - **工程严谨性** —— 268 个 Python + 60 个 Web 测试,包括属性/模糊测试;CI 运行单元测试、**实时 Elasticsearch 集成**任务、**Playwright 端到端测试**,以及 **供应链扫描** (pip-audit · npm-audit · SBOM · Trivy)。 ## 架构 ``` flowchart LR VR["Velociraptor
macOS collection
(zip / dir)"] --> N["normalizers → ECS
10 mappers + custom VQL"] N -->|"raptorscope-*"| ES[("Elasticsearch")] N -.->|"offline demo"| MEM[("in-memory store")] RULES["38 Sigma detections
paired hit + benign"] --> DET ES --> DET{{"detection engine
in-process · ES-native Lucene"}} MEM --> DET DET --> API["FastAPI API
RBAC · audit · rate-limit · metrics"] ES --> API MEM --> API API --> SPA["React / TS SPA
overview · timeline · alerts
search · fleet hunt"] API <--> AI["Claude AI
triage · summary · NL-query
copilot · IOC extraction"] AI --> SPA ES --> KB["Kibana dashboard"] ``` ## 截图 分诊 SPA 的引导之旅 —— 案例选择器 → 全集群 IOC 搜寻 → 概览 仪表板 → 触发的检测 → 时间线 → 搜索。无论是演练 GIF 还是下方的 静态图像,均由 CI Playwright 任务 (即 `spa-screenshots` artifact) 自动捕获,因此随着 UI 的演进,它们始终保持最新。 ![Raptorscope 分诊 SPA 引导演练](https://raw.githubusercontent.com/cac0ns3c/Raptorscope/main/docs/img/walkthrough.gif) 各独立视图: | 概览仪表板 | 全集群 IOC 搜寻 | |---|---| | [![概览](https://raw.githubusercontent.com/cac0ns3c/Raptorscope/main/docs/img/03-overview.png)](docs/img/03-overview.png) | [![集群搜寻](https://static.pigsec.cn/wp-content/uploads/repos/cas/61/6171efee65ef66206d71291a86969e78c256a18044a74292da1852514fb18858.png)](docs/img/02-fleet-hunt.png) | | **触发的检测** | **时间线** | | [![警报](https://raw.githubusercontent.com/cac0ns3c/Raptorscope/main/docs/img/04-alerts.png)](docs/img/04-alerts.png) | [![时间线](https://raw.githubusercontent.com/cac0ns3c/Raptorscope/main/docs/img/05-timeline.png)](docs/img/05-timeline.png) | ## 快速开始 ``` make setup # venv + Python deps + web npm install make demo # serve the bundled sample case on :8000 (no ES needed) make web # in another shell: SPA on http://localhost:5173 ``` 打开 http://localhost:5173,选择 `mac-victim` 案例,并跟随警报 跳转至证据。完整导览请见 `docs/DEMO.md`。 或者运行**整个 Docker 应用** (Elasticsearch + Kibana + API + SPA): ``` make stack # docker compose --profile app up -d --build # SPA → http://localhost:8080 · API → :8000 · Kibana → :5601 · ES → :9200 ``` ## 采集与检测内容 六个 ECS 数据集解答了第一小时的 macOS 分诊问题,每个都配有 Sigma 检测。每个规则均提供一个恶意 + 良性 fixture,并通过 `detect/pairing.py` 防止漂移。 | ECS 数据集 | Velociraptor 来源 | 分诊问题 | 检测数量 | |--------------------|----------------------------------------------------------|-----------------------|:----------:| | `macos.persistence`| `MacOS.Detection.Autoruns` (launchd/login/cron/BTM) + 配置 profiles (自定义 VQL) | 谁在进行持久化 | 10 | | `macos.process` | `MacOS.Sys.Pslist` (+ 签名增强 VQL) | 运行了什么 | 12 | | `macos.quarantine` | `MacOS.System.QuarantineEvents` (LSQuarantine) | 什么进入了系统 | 5 | | `macos.tcc` | `MacOS.System.TCC` | 什么获得了权限 | 6 | | `macos.inventory` | `MacOS.System.Packages` | 安装了什么 | 3 | | `macos.network` | `netstat` (自定义 VQL) — 监听器 + 连接 | 与谁进行通信 | 2 | 检测覆盖了 ATT&CK 矩阵 (初始访问 → 执行 → 持久化 → 权限提升 → 防御规避 → 凭据访问 → 收集 → C2),带有精确到子技术的 MITRE 标签。持久化家族共享一个数据集, 通过 `raptorscope.persistence.type` 进行区分。当现有的 Velociraptor artifact 缺少某个字段 (代码签名信任、配置 profile/BTM 枚举) 时, `profile/custom-vql/` 提供了补足该字段的 artifact —— 因此基于签名的 规则能在真实捕获数据上触发,而不仅限于 fixture。 ## 用法 ``` # dev 设置 python3 -m venv .venv && .venv/bin/pip install -r requirements.txt # 运行测试 PYTHONPATH=src .venv/bin/python -m pytest tests/ -v # 导入 Velociraptor 收集包(目录或 zip)—— dry run 会打印 doc 数量 PYTHONPATH=src .venv/bin/python -m raptorscope ingest # ...并 index 到 Elasticsearch PYTHONPATH=src .venv/bin/python -m raptorscope ingest --es http://localhost:9200 # 运行检测并报告每条 rule 的触发数量(用于误报调优)—— # 将其指向一个良性收集包,以查看哪些 rule 会在干净数据上触发 PYTHONPATH=src .venv/bin/python -m raptorscope detect PYTHONPATH=src .venv/bin/python -m raptorscope detect --json # 提供 query API 服务 —— 离线覆盖单个收集包(demo)或覆盖实时的 ES PYTHONPATH=src .venv/bin/python -m raptorscope serve --collection --port 8000 PYTHONPATH=src .venv/bin/python -m raptorscope serve --es http://localhost:9200 # 要求登录(bearer token):客户端 POST /login 获取 token,然后发送它 PYTHONPATH=src .venv/bin/python -m raptorscope serve --collection \ --auth-user analyst --auth-pass s3cret # or RAPTORSCOPE_AUTH_USER/PASS env ``` **Auth** 默认关闭 (演示保持零设置)。启用后,`/health` 和 `/docs` 保持开放,`/login` 签发**限时签名 bearer token** (默认 8 小时,`RAPTORSCOPE_AUTH_TTL`),并且每个 `/cases/*` 请求都必须携带 `Authorization: Bearer `。SPA 在收到 `401` 时会自动显示登录界面,并在验证身份后显示**登出**按钮。多用户支持: `RAPTORSCOPE_AUTH_USERS="alice:pw1,bob:pw2"`。 **速率限制** (按客户端,60 秒窗口) 保护 `/login` 和 AI endpoint: `RAPTORSCOPE_LOGIN_RATE` (默认 20) 和 `RAPTORSCOPE_AI_RATE` (默认 60); `/ai/status` 轮询豁免。超出限制将返回 `429`。 **角色 (RBAC)。** 每个用户都有一个角色 —— `viewer`、`analyst` (默认) 或 `admin` —— 内置于签名 token 中。使用以下方式设置: `RAPTORSCOPE_AUTH_ROLES="alice:admin,bob:viewer"`。`viewer` 是只读的 (案例、 概览、时间线、artifacts、搜索);**活跃/高成本**操作 —— 所有 AI endpoint 和集群 `/hunt` —— 需要 `analyst` 或更高权限 (否则返回 `403`)。 **审计 + 可观测性。** 每个案例数据、AI 和搜寻请求都会连同 用户、方法、路径和状态一起写入 `raptorscope.audit` 日志;每个响应 都带有一个 `X-Request-ID`;`GET /metrics` 暴露 Prometheus 计数器。 ### 查询 API `create_app(store)` (`api/app.py`) 通过 `Store` 抽象提供 JSON 服务 —— 测试/离线演示使用 `InMemoryStore`,实时 Elasticsearch 使用 `ESStore`。*案例* 即一个已采集的主机。警报是读取时查询:针对该案例的文档,在进程中评估 Sigma YAMLs (`detect/evaluate.py`)。 | Endpoint | 返回内容 | |----------|---------| | `GET /health` | 存活状态 | | `GET /cases`, `GET /cases/{case}` | 带有文档计数和数据集的案例 | | `GET /cases/{case}/overview` | 第一小时计数、持久化类型 + 已签名/未签名明细 | | `GET /cases/{case}/artifacts/{dataset}` | 分页文档 (`?limit=&offset=`) | | `GET /cases/{case}/timeline` | 跨数据集事件,最新优先 | | `GET /cases/{case}/alerts` | 触发的检测,带有 `doc_id` 跳转到证据 | | `GET /cases/{case}/search` | 自由文本 (`?q=`) + 可选的 `?dataset=`/`?field=&op=&value=` 跨案例文档查询 | | `GET /docs`, `GET /docs/{id}` | 面向用户的文档 (概览/安装/演示/Kibana/Profile),在 SPA 的 **Docs** 面板中渲染 | | `GET /ai/status` · `POST /cases/{case}/ai/{triage,summary,nl-query,copilot}` | Claude 支持的 AI 功能 (未设置 `ANTHROPIC_API_KEY` 时关闭) | ### AI 功能 (可选) 在 API 进程上设置 `ANTHROPIC_API_KEY` 以启用 Claude 驱动的分诊 (`claude-opus-4-8`)。配置后,SPA 将显示:在每个警报上的 **AI 分诊** 按钮 (触发原因 / MITRE / 评估 / 后续步骤),概览中的**总结案例**,搜索中的**用自然语言提问**栏 (自然语言 → 查询 过滤器),以及 **Copilot** 标签页 —— 这是一个 agentic 工具循环,查询该案例自有的 endpoint 并返回带有引用的有据可查的结论。所有 AI 代码都位于 可注入的 `AIClient` 接口之后,因此测试套件在无密钥且无 网络的情况下运行。模型输出 (源自采集的 artifact) 在渲染前使用 DOMPurify 进行净化处理。 **可配置** —— 将其指向任何兼容 Anthropic-API 的 endpoint (如 LiteLLM / Cloudflare AI Gateway 等网关, 或自托管路由器),任何模型,任何密钥: | 环境变量 | 用途 | |---------|---------| | `RAPTORSCOPE_AI_KEY` (或 `ANTHROPIC_API_KEY`) | API 密钥 —— **启用 AI 必需** | | `RAPTORSCOPE_AI_MODEL` (或 `ANTHROPIC_MODEL`) | 模型 ID (默认 `claude-opus-4-8`) | | `RAPTORSCOPE_AI_BASE_URL` (或 `ANTHROPIC_BASE_URL`) | 用于代理/网关的 endpoint 覆盖 | ``` # 默认(Anthropic) ANTHROPIC_API_KEY=sk-ant-… raptorscope serve --collection # 通过使用不同 model 的 gateway RAPTORSCOPE_AI_KEY=… RAPTORSCOPE_AI_BASE_URL=https://gateway/v1 \ RAPTORSCOPE_AI_MODEL=claude-sonnet-5 raptorscope serve --collection ``` ### 图形界面 (`web/`) 一个使用查询 API 的 Vite + React + TypeScript SPA。它仅与通过 context 提供的 强类型 `ApiClient` 通信,因此每个组件/交互测试都在 内存中的模拟客户端上运行 —— 无需网络。 选择一个案例,然后在标签式工作区中操作 —— **概览 · Artifacts · 时间线 · 警报 · 搜索 · Copilot** (配置密钥后会出现 AI 标签页): - **警报** 是一个以严重性为先的分诊队列 (高 → 中 → 低),提供每个警报的 确认 / 驳回 / 备注以及一键 AI 分诊。 - **概览** 是一个启动平台:数据集 KPI 磁贴和未签名的进程/应用 计数可直接深入到相关的 Artifacts 中,旁边是按类型划分的持久化明细 和签名完整性面板。 - 任何**警报、搜索命中、时间线事件或 KPI 磁贴**都可以跳转到 Artifacts 表,并高亮显示证据行;**详情抽屉**将文档 平铺为 ECS 字段,并提供逐字段的复制到剪贴板功能。 - **浅色/深色主题**,区域设置格式的计数,以及一致的加载 / 空 / 错误状态,并提供**重试**功能。 **无障碍访问是一等公民**:全程支持键盘操作 —— 具有 Escape 关闭和焦点恢复功能的焦点陷阱 模态框,键盘激活的行和可排序的表头,跳转至内容链接,以及带有 有效 ARIA 的拉伸链接警报卡片 —— 外加用于异步/流式传输结果的 `aria-live` 区域以及对 `prefers-reduced-motion` 的支持。 ``` cd web npm install npm run dev # Vite dev server; proxies /api -> http://127.0.0.1:8000 npm test # Vitest component + interaction tests npm run build # tsc typecheck + production bundle # 在另一个终端中,提供 SPA 调用的 API 服务: PYTHONPATH=../src ../.venv/bin/python -m raptorscope serve --collection --port 8000 ``` ### Kibana (可选前端) 由于 Elasticsearch 中的所有内容都是 ECS,你可以 在 Kibana 中探索相同的数据,以代替 (或伴随) SPA —— `make kibana` 启动 ES + Kibana 并 配置 `raptorscope-*` 数据视图 + 保存的搜索。设置 `VITE_KIBANA_URL` 以 在 SPA 标题栏中添加一个“在 Kibana 中打开 ↗”链接 (深度链接到案例主机)。 完整指南:`docs/KIBANA.md`。 一次采集是一个目录 (或 zip 文件),包含 `.json` 文件以及用于 `host.*`/`user.*` 上下文的可选 `host.json`。文件可以按内部 标识 (`cli._NORMALIZERS`) 命名,**或者**按真实的 Velociraptor artifact 名称 (`MacOS.System.TCC.json`, …) 命名 —— 后者在 `collection.ARTIFACT_ALIASES` 中进行了别名处理。文档被路由到按数据集划分的 `raptorscope-*` 索引。 精选的 artifact 集合 —— 即**采集契约** —— 位于 `profile/raptorscope-macos.yaml` (`profile/README.md` 涵盖了构建采集器 或运行搜寻的内容)。`samples/mac-victim/` 是由 `raptorscope demo` 提供服务的一个完整示例。 许可证:GPL-3.0-or-later
标签:AI分析, AMSI绕过, AV绕过, Elasticsearch, FastAPI, React, Syscalls, 威胁检测, 安全运营, 扫描框架, 特征检测, 自定义请求头, 请求拦截, 越狱测试, 逆向工具