RamiBotAI/ramibot
GitHub: RamiBotAI/ramibot
本地优先的 AI 安全运营平台,通过 MCP 协议编排多 LLM 与 Kali 工具链,实现可控的红蓝队工作流与证据锁定报告。
Stars: 5 | Forks: 0
RamiBot — AI 安全运营平台
本地优先 • 红/蓝队 • MCP 驱动 • Docker 集成
执行。分析。加固。
# RamiBot v3.6
一款面向安全运营的本地优先 AI 聊天界面。支持多种 LLM 提供商、实时流式输出、MCP 工具集成、动态安全技能系统、Docker 终端访问、Tor 透明代理管理、持久化发现数据库、一键 PDF 报告导出、人工介入的**工具审批网关**(Tool Approval Gate,在每次 MCP 工具调用前暂停执行)、全局**证据锁定报告**(Evidence-Locked Reporting)系统(防止模型编造工具输出中不存在的版本、CVE、严重程度评级或安全属性)、专用的 **Burp Suite Web 评估技能**、**响应语言选择器**,以及**Hermes 工具链式调用**(检测并执行 Llama/Hermes 微调模型发出的 `.ecore` XML)。
## 概述
RamiBot 是一款自托管聊天应用,专为需要在 LLM 与运维工具之间建立可控、可扩展接口的安全工程师打造。
它不依赖任何云端聊天产品。对话本地存储于 SQLite。提供商 API 密钥在运行时配置。所有工具执行均在 Docker 容器内进行。
其核心差异点在于**技能管道**(skill pipeline):一套提示工程系统,从用户输入中检测运维上下文(侦察、利用、防御、分析、报告),选择相应技能,并在每次 LLM 调用前将结构化方法论指令注入系统提示词。团队模式(红队或蓝队)控制可用技能及 LLM 如何构建其响应。
**适用人群:**
- 执行结构化红队或蓝队工作流的安全工程师
- 需要 LLM 辅助推理以及通过 MCP 进行真实工具执行的分析师
- 将本地模型(Ollama、LM Studio)集成到安全工作流中的研究人员
- 需要完全本地数据控制且对话历史不依赖云端的团队
## 架构
```
┌─────────────────────────────────────────────────────────────────┐
│ FRONTEND (React 19) │
│ Sidebar │ ChatPanel │ SettingsModal │ DockerTerminal │
│ Zustand State Store │
│ SSE consumer / fetch client (port 5173) │
└───────────────────────────┬─────────────────────────────────────┘
│ HTTP / SSE
┌───────────────────────────▼─────────────────────────────────────┐
│ BACKEND (FastAPI) │
│ │
│ /api/chat/stream ──► SkillPipeline ──► LLM Adapter │
│ │ │ │
│ PromptComposer httpx (SSE) │
│ │ │ │
│ System Prompt Provider API │
│ │
│ Tool call detected ──► MCPClient ──► rami-kali MCP server │
│ (auto-configured) (docker exec stdio) │
│ ──► MCP Server (stdio/HTTP) │
│ Tool result ──────────────────────► LLM follow-up │
│ │
│ /api/terminal/* ──► TerminalSession ──► docker exec │
│ /api/docker/tor ──► tor_start/stop ──► iptables (container) │
│ │
│ aiosqlite ──► ramibot.db │
│ settings.json ──► provider credentials + docker config │
└─────────────────────────────────────────────────────────────────┘
```
**流式聊天请求的数据流:**
1. 前端发送 `POST /api/chat/stream`,包含会话 ID、提供商、模型、团队模式、MCP 标志及可选的 `require_tool_approval`
2. 后端从 SQLite 加载对话历史
3. 若启用 MCP:技能管道对输入进行分类,选择技能,构建系统提示词,并将其作为第一条消息注入历史
4. 适配器将 LLM 响应作为 Server-Sent Events(token 事件)流式传输
5. 若 LLM 发出工具调用且开启了**审批模式**:后端产生 `tool_approval_required` SSE 事件并等待(最长 120 秒)操作员通过 `POST /api/chat/approve` 做出决定;超时自动拒绝
6. 若批准(或审批模式关闭):MCP 客户端执行工具,结果追加至历史,并触发后续生成
7. 后端将最终消息保存至 SQLite,包含 token 使用量与延迟
8. 前端增量渲染 token 并实时显示工具跟踪
## 技能系统
每次启用 MCP 的聊天请求都会调用技能系统。它对输入分类、选择技能,并构建针对操作阶段和团队模式量身定制的结构化系统提示词。
### 组件
| 组件 | 文件 | 职责 |
|-----------|------|----------------|
| `SkillPipeline` | `skills/pipeline.py` | 编排完整的构建提示词流程 |
| `InputClassifier` | `skills/classifier.py` | 正则表达式与子串触发匹配 |
| `PromptComposer` | `skills/composer.py` | 根据选定的技能组装系统提示词 |
| `SkillRegistry` | `skills/registry.py` | 从 JSON 加载技能定义 |
### 技能定义
| 技能 | 团队 | 优先级 | 风险 | 触发示例 |
|-------|-------|----------|------|------------------|
| `recon` | red, blue | 10 | low | scan, nmap, enumerate, port, subdomain, dns |
| `exploit` | red only | 20 | high | exploit, payload, shell, rce, xss, sqli, privesc, metasploit |
| `defense` | blue only | 20 | low | harden, firewall, patch, mitigate, incident, siem, ids |
| `analysis` | red, blue | 30 | low | analyze, log, traffic, pcap, forensic, anomaly, wireshark |
| `reporting` | red, blue | 50 | low | report, document, executive, findings, export |
| `burp_expert` | red, blue | 15 | high | burp, web app, proxy history, repeater, intruder, fuzz, owasp |
### 管道逻辑
1. **触发分类**:词边界正则表达式将用户输入与技能触发列表匹配
2. **阶段推断**:若无触发匹配,则扫描最近 3 条消息中的阶段标记(`[RECON]`、`payload`、`patch` 等)
3. **主导技能选择**:最高优先级匹配胜出。若同时匹配 `exploit` 或 `defense`,则抑制 `reporting`。
4. **回退**:无匹配时默认为团队默认值(红队为 recon,蓝队为 analysis)
5. **上下文提取**:从输入和近期历史中提取 IPv4、URL 和 `host:port` 模式,并在提示词中作为 `CONTEXT TARGET` 注入
6. **执行意图**:检测祈使动词("run"、"execute"、"scan"、"exploit")并向组合器发出信号
7. **提示词组装**:团队前言 + 技能方法论部分 + `EVIDENCE_RULES` + `COMMON_FOOTER`
8. **审计日志**:每个决定以 JSON 形式追加至 `skill_decisions.log`
### 团队模式
**Red (`team_mode: "red"`)**
- 前言:授权演练、攻击者视角、工具优先
- 活跃技能:recon, exploit, analysis, reporting
- 优先级顺序:exploit > recon > analysis > reporting
**Blue (`team_mode: "blue"`)**
- 前言:事件响应者、修复驱动
- 活跃技能:defense, analysis, reporting, recon
- 优先级顺序:defense > analysis > reporting > recon
团队模式通过侧边栏开关按会话选择,并持久化在 localStorage 中。
## 证据锁定报告
RamiBot 在所有团队模式和所有技能中执行严格的证据规范,以防止安全报告和运维输出中的 LLM 幻觉。
### 工作原理
**工具结果封装(`backend/main.py`):**
每个成功的 MCP 工具结果在注入 LLM 后续上下文之前,都会封装在不可变的证据标签中:
```
[EVIDENCE BLOCK — DO NOT MODIFY]
[END OF EVIDENCE]
```
**全局执行(`backend/skills/composer.py`):**
无论团队模式或技能如何,`EVIDENCE_RULES` 都会注入到每个系统提示词中。所有响应适用八条强制性规则:
| 规则 | 执行方式 |
|------|-------------|
| 只有证据块内容是事实 | 不得将模型训练中的信息作为运维发现引用 |
| 禁止编造版本 / CVE / CVSS | 使用 `"Version not detected."` / `"Requires manual validation."` / 省略评分 |
| 禁止外部填补空白 | 若 nmap 显示某服务无版本,不得假设版本 |
| 禁止推断属性 | 加密状态、认证状态、EOL 状态、可利用性、互联网暴露和凭据弱点,仅在证据块明确包含时方可陈述 |
| 条件性风险语言 | 禁止:`"is vulnerable"`、`"is exploitable"`、`"is exposed"`。必须:`"may be"`、`"appears to"`、`"consistent with"` —— 除非工具本身使用断言性语言 |
| 严重程度仅来自已确认发现 | 不得仅凭端口号、服务名或版本字符串判定 Critical/High/Medium/Low。默认:若未明确报告漏洞则为 `"Informational"` |
| 三层输出规范 | `[RAW OUTPUT]` / `[PARSED DATA]` / `[INTERPRETATION]` 明确分离 |
| 无证据块 → 不编造 | 声明 `"No tool output available"` 并停止 |
**技能级强化:**
每个技能定义都携带其自己的 `EVIDENCE DISCIPLINE:` 注释,作用域限定于其运维上下文:
- `recon`:仅报告扫描输出;不添加版本或 CVE
- `exploit`:CVE 候选是假设(`"may be vulnerable — requires validation"`),而非已确认匹配
- `analysis`:TTP 归因仅使用条件性语言(`"consistent with"`、`"suggests"`)
- `defense`:仅针对已确认发现进行修复;无假设性补丁
- `reporting`:证据字段使用证据块逐字摘录;严重程度和 CVSS 仅来自工具输出
### 推理块剔除
当具备推理能力的模型(LM Studio / DeepSeek / QwQ)发出 `...` 内容时,会在两个独立点被剔除:
1. **存储层**(`store.js` — `stripReasoning()`):在提交到消息数组之前应用于 `fullContent`。存储的消息和 SQLite 记录从不包含推理块。
2. **导出层**(`reportPdf.js`):HTML 渲染前的三遍清理 —— 剔除推理标签、丢弃 `` 标记前的内容、剔除内部标记。对部署剔除功能之前存储的消息进行纵深防御。
## LLM 集成
所有提供商实现通用的 `BaseAdapter` 接口:
```
async def capabilities() -> dict
async def list_models() -> list[dict]
async def generate(messages, model, **kwargs) -> dict
async def stream(messages, model, **kwargs) -> AsyncGenerator[dict, None]
```
所有适配器发出的流式事件:
| 事件 | 载荷 |
|-------|---------|
| `token` | `{"data": ""}` |
| `tool_call` | `{"data": {"id", "name", "arguments"}}` |
| `usage` | `{"data": {"prompt_tokens", "completion_tokens", "total_tokens"}}` |
| `done` | `{"data": None}` |
### 支持的提供商
**OpenAI**
- 端点:`https://api.openai.com/v1`(可配置 base URL)
- 模型:从 `/v1/models` 动态获取
- 工具调用:支持(OpenAI 格式)
- 推理:支持(o1/o3/o4 系列通过 `reasoning_effort`)
- 流式:支持,带 `stream_options: include_usage`
**Anthropic**
- 端点:`https://api.anthropic.com/v1`
- 模型:从 `/v1/models` 动态获取(需要 API 密钥)
- 工具调用:支持(tool_use 块;输入 schema 经清理移除 oneOf/anyOf/allOf)
- 推理:支持(通过 `thinking.budget_tokens` 进行扩展思考)
- 流式:支持(Anthropic SSE 事件协议)
**OpenRouter**
- 端点:`https://openrouter.ai/api/v1`(可配置)
- 模型:从 OpenRouter API 动态获取
- 工具调用:支持(OpenAI 兼容)
- 推理:不支持
**LM Studio**
- 端点:可配置(默认 `http://localhost:1234/v1`)
- 模型:从本地 LM Studio 实例获取
- 工具调用:支持(跨流块累积)
- 推理:支持(过滤 `...` 块;禁用时追加 `/no_think` 后缀)
- 超时:300 秒
**Ollama**
- 端点:可配置(默认 `http://localhost:11434`)
- 模型:从本地 Ollama 实例获取
- 工具调用:不支持
- 推理:不支持
- Token 计数:来自 `eval_count` / `prompt_eval_count`
### 上下文处理
- 每次请求发送完整对话历史(无摘要或窗口化)
- 来自技能管道的系统提示词作为第一条历史条目注入
- 工具调用后:带有 `tool_calls` 的助手消息和工具结果消息在后续生成前追加
- Token 使用量和延迟按消息存储在 SQLite 中
## MCP 集成
RamiBot 实现 Model Context Protocol 客户端,用于连接外部工具服务器。
### 连接类型
- **stdio**:生成本地子进程,通过 stdin/stdout 进行 JSON-RPC 2.0 通信。使用后台读取线程(兼容 Windows 选择器循环限制)。
- **HTTP**:向远程 MCP 服务器 URL 发送 POST 请求。
### 工具命名空间
所有工具带前缀:`{server_name}__{tool_name}`。这允许多个 MCP 服务器共存而不发生名称冲突。前缀在服务器前被剥离。
### 持久化
MCP 服务器配置存储在 SQLite `mcp_servers` 表中。启动时,所有保存的服务器自动重新连接。
### Schema 规范化
工具 schema 封装为 `{"type": "function", "function": {...}}` 格式,以实现跨所有适配器的 OpenAI 风格工具调用兼容性。
### 禁用工具
单个工具可在设置模态框中按会话禁用。禁用的名称在 `ChatRequest.disabled_tools` 中发送,并在注入 LLM 上下文前过滤。
## Rami-Kali MCP 服务器
RamiBot 内置预集成的红队工具服务器,基于 Kali Linux 构建并以 Docker 容器形式交付(`rami-kali/`)。
### 概述
- **41+ 渗透测试工具**可用作 MCP 工具,可在任何启用 MCP 的会话中由 LLM 调用
- **自动连接**:首次后端启动时,RamiBot 自动种子 `rami-kali` MCP 服务器条目 —— 无需手动配置
- **传输**:通过 `docker exec -i rami-kali python3 /opt/rami-kali/mcp_server.py` 进行 stdio
- **范围执行**:容器内的 `config.yaml` 定义允许的目标范围;服务器拒绝超出范围的调用
- **证据网关**:工具输出仅在范围检查通过后转发给 LLM
- **审计日志**:每次工具调用追加到内部审计跟踪
### 工具类别
| 类别 | 示例工具 |
|----------|---------------|
| Recon | nmap, masscan, whois, theHarvester, amass, subfinder, dnsx |
| Web | nikto, gobuster, ffuf, sqlmap, whatweb, wafw00f |
| Exploit | metasploit-framework, searchsploit, msfvenom |
| Credential | hydra, medusa, hashcat, john, crackmapexec |
| SMB / AD | enum4linux, smbclient, bloodhound, impacket suite |
| Wireless | aircrack-ng, reaver, hcxtools |
| Social eng | gophish, setoolkit |
### 知识库
`rami-kali/knowledge/` 包含 27 个结构化 Markdown 文件,MCP 服务器使用它们将战术上下文前置到工具结果。类别包括:工具使用指南、MITRE ATT&CK 映射、结果解释指南和运维检查清单。
### 快速开始
```
# 构建镜像 (一次性)
make rami-kali-build
# 启动容器
make rami-kali-start
# 查看日志
make rami-kali-logs
# 停止
make rami-kali-stop
```
下次后端启动时,日志中将出现 `[MCP] Auto-configured rami-kali server 'rami-kali'`,服务器将列在 Settings > MCP 中,显示其完整工具集。
## Docker 终端
RamiBot 包含通过 `docker exec` 连接到 Docker 容器的浏览器终端。
### 平台行为
- **Unix**:`pty.openpty()` 用于完整 PTY 分配。支持交互式程序(vim、tmux 等)、调整大小事件和完整 ANSI 渲染。
- **Windows**:基于管道的通信(`docker exec -i`)。若可用,使用 `script` 工具进行 PTY 仿真;否则回退到普通 bash。
### 会话生命周期
| 步骤 | 端点 |
|------|----------|
| 创建会话 | `POST /api/terminal/start` |
| 流式输出(SSE,base64) | `GET /api/terminal/stream?session_id=X` |
| 发送输入(base64) | `POST /api/terminal/input` |
| 调整 PTY 大小 | `POST /api/terminal/resize` |
| 终止会话 | `POST /api/terminal/stop` |
UI 中最多可同时打开 2 个终端面板。
### Tor 透明代理
当 Docker 容器具有 `NET_ADMIN` 能力时:
- `POST /api/docker/tor {"action": "start"}` 安装 iptables 规则,将 TCP 流量通过 Tor TransPort(9040)重定向,DNS 通过端口 5353 重定向
- `POST /api/docker/tor {"action": "stop"}` 移除规则并停止 Tor 进程
- `GET /api/docker/tor` 返回 `{ running, transparent_proxy, kill_switch }`
要求容器内安装 Tor。仅适用于隔离实验室环境。
## 安装
### 要求
- Python 3.10+
- Node.js 18+
- npm
- Docker(可选,用于终端和 Tor 功能;rami-kali MCP 服务器必需)
### 克隆
```
git clone
cd ramibot
```
### 后端
```
cd backend
python -m venv .venv
# Windows
.venv\Scripts\activate
# macOS / Linux
source .venv/bin/activate
pip install -r requirements.txt
```
### 前端
```
cd frontend
npm install
```
### 🔴 Rami-Kali(核心 MCP 工具服务器)
Rami-Kali 是 RamiBot 的官方 MCP 工具服务器,提供真实的渗透测试工具(nmap、metasploit、hydra 等)。
虽然 RamiBot 可以作为纯 AI 界面运行,但其完整的运维能力在 rami-kali 运行时才能解锁。
rami-kali 需要 Docker。
#### 前置条件
Docker 已安装并运行。
- Windows / macOS:Docker Desktop
- Linux:Docker Engine
#### 1. 构建镜像
```
# 通过 Makefile
make rami-kali-build
# 或者直接
docker build -t rami-kali rami-kali/
```
镜像基于 `kalilinux/kali-rolling` 并安装约 60 个渗透测试工具。首次构建根据网络情况需要数分钟。
#### 2. 启动容器
```
# 通过 Makefile
make rami-kali-start
# 或者直接
docker compose -f rami-kali/docker-compose.yml up -d
```
#### 3. 验证
```
docker ps | grep rami-kali
```
#### 4. 范围配置
允许的目标范围从 UI 的 **Settings > Scope** 管理。更改写入 `rami-kali/config.yaml` 并自动重启容器 —— 无需重建。
您也可以在启动容器前直接编辑该文件:
```
security:
require_scope_check: true # set to false to disable enforcement
allowed_scope:
- "192.168.1.0/24"
- "10.0.0.0/8"
- "172.16.0.0/12"
```
MCP 服务器拒绝任何目标 IP 超出这些范围的工具调用。
#### 自动注册
下次后端启动时,RamiBot 检测运行中的容器并自动将其注册为 MCP 服务器:
```
[MCP] Auto-configured rami-kali server 'rami-kali'
```
服务器出现在 **Settings > MCP** 中,显示完整工具列表。无需手动配置。
#### 容器管理
```
make rami-kali-stop # stop the container
make rami-kali-logs # follow logs
make rami-kali-build # rebuild after changes
docker exec -it rami-kali bash # open a shell inside
```
### 运行
**两个终端:**
```
# 终端 1
cd backend
python -m uvicorn main:app --reload --port 8000
# 终端 2
cd frontend
npm run dev
```
**Makefile(macOS/Linux):**
```
make install
make dev
```
打开 `http://localhost:5173`。
## 配置
### 提供商凭据
API 密钥和 base URL 通过 UI 中的设置模态框配置,保存至 `backend/settings.json`。
| 提供商 | 字段 | 默认值 |
|----------|-------|---------|
| OpenAI | `api_key` | — |
| Anthropic | `api_key` | — |
| OpenRouter | `api_key` | — |
| LM Studio | `base_url` | `http://localhost:1234/v1` |
| Ollama | `base_url` | `http://localhost:11434` |
### Docker
在 Settings > Docker 中设置容器名称。当请求终端会话时,如果容器已停止,将自动启动。
### MCP 服务器
从 Settings > MCP 添加 MCP 服务器。每个服务器需要:
- **Name**:用于工具命名空间的标识符
- **Type**:stdio(命令 + 参数)或 remote(HTTP URL)
服务器持久化在 SQLite 中,后端重启时重新连接。
### 范围
`rami-kali` MCP 服务器的允许目标范围从 **Settings > Scope** 管理。
- 添加或移除 CIDR 范围,即时视觉反馈
- 切换 **Enforce Scope Check** 以完全启用或禁用执行
- 点击 **SAVE & RESTART** 一键写入 `rami-kali/config.yaml` 并重启容器
无需 Docker 重建。配置文件是绑定挂载的,因此容器在重启时获取新值。
底层文件(`rami-kali/config.yaml`)也可以直接编辑 —— UI 在加载时从中读取。
### 技能日志
所有技能激活决定以换行分隔的 JSON 写入 `backend/skill_decisions.log`。每个条目包含:时间戳、团队模式、输入片段、匹配触发、激活技能、风险等级、提取目标、提示词长度。
```
GET /api/skills/log?limit=50 # retrieve
DELETE /api/skills/log # clear
```
也可从 UI 的 Settings > Skill Log 访问。
### 环境变量
提供 `.env.example` 作为参考模板:
```
OPENAI_API_KEY=
ANTHROPIC_API_KEY=
OPENROUTER_API_KEY=
LMSTUDIO_BASE_URL=http://localhost:1234/v1
OLLAMA_BASE_URL=http://localhost:11434
DATABASE_URL=sqlite:///./ramibot.db
CORS_ORIGINS=http://localhost:5173
```
注意:运行时凭据从 `backend/settings.json`(由 UI 写入)读取,而非 `.env`。`.env` 文件是参考模板。
## 使用
### 基本聊天
1. 从顶部栏选择提供商和模型
2. 输入消息并按 Enter
3. 响应实时逐 token 流式显示
### 红队会话
1. 在侧边栏将团队模式设为 **Red**
2. 如需工具执行,启用 **MCP**
3. 以侦察提示开始:
```
scan 10.10.10.0/24 for open ports and services
```
管道检测侦察上下文,注入 nmap 方法论指令,并将任何 `nmap__*` 工具调用路由到 MCP 服务器。
4. 继续利用:
```
enumerate SMB shares on 10.10.10.15 and check for anonymous access
```
管道转换到 exploit 技能。每一步的工具结果反馈到历史中以进行链式推理。
### 蓝队会话
1. 将团队模式设为 **Blue**
2. 启用 MCP
3. 分析:
```
analyze these auth.log entries for brute force indicators: [paste logs]
```
管道选择 analysis 技能。LLM 返回结构化时间线、IOC 和缓解措施。
4. 修复:
```
harden SSH configuration on Ubuntu 22.04 to prevent this attack vector
```
管道转换到 defense 技能,返回带严重程度标签的发现及精确命令。
### MCP 工具执行
当启用 MCP 且 LLM 发出工具调用时:
1. 工具调用在聊天中实时显示为可折叠跟踪
2. MCP 客户端针对配置的服务器执行工具
3. 结果显示并注入回 LLM 上下文
4. LLM 生成解释结果的后续响应
### 工具审批网关
当启用**审批模式**(侧边栏开关,仅在 MCP 激活时可见)时,RamiBot 在执行每个 MCP 工具调用前暂停,等待操作员明确确认。
**启用方式:**
1. 在侧边栏启用 MCP
2. 出现 **Approval Mode** 开关 —— 激活它
**工具调用时发生的情况:**
1. 在聊天和消息输入框之间内联显示横幅,展示:
- 工具短名称(剥离前缀)及最多 4 个关键参数(`target`、`host`、`port` 等)
- 按等级着色的**风险徽章**:`low`(绿)、`medium`(琥珀)、`high`(橙)、`critical`(红) —— 来源:`rami-kali/config.yaml → risk_levels`
- 从 120 秒开始的**倒计时器**;≤ 15 秒时变红
2. 点击 **APPROVE** → 工具正常执行;流继续
3. 点击 **DENY** → 后端将 `[TOOL EXECUTION DENIED BY USER]` 注入 LLM 上下文;LLM 报告拒绝并建议替代方案
4. **超时**(120 秒无响应)→ 自动拒绝;横幅显示 "TIMED OUT — AUTO-DENIED"
5. 在审批期间按 **Stop** 立即清除横幅
风险等级从 `rami-kali/config.yaml → risk_levels` 读取。未列出的工具默认为 `medium`。
### 发现数据库
工具执行结果可保存为结构化安全发现,以便后续审查和导出。
**保存发现:**
1. 展开聊天中的任意工具跟踪(点击工具名行)
2. 点击跟踪底部的 **SAVE AS FINDING**
3. 模态框预填标题(`tool → target`)、描述(清理后的证据网关文本 —— 无原始 JSON)和来自工具参数的目标
4. 选择严重程度(Info / Low / Medium / High / Critical)并保存
**审查发现:**
打开 **Settings > Findings** 查看所有保存的发现。在此可以:
- 按严重程度过滤
- 内联展开长描述(▼ SHOW MORE / ▲ SHOW LESS)
- 将过滤后的集合导出为 **JSON** 或 **CSV**(遵循当前严重程度过滤器)
- 使用每卡按钮导出单个发现为 JSON 或 CSV
- 删除单个发现
**描述提取:**
发现描述从工具的证据网关自动填充 —— 即 RamiBot MCP 服务器前置到每个工具结果的结构化摘要块。这提供干净、可读的证据(已验证事实、状态、发现计数),而非原始 JSON 转储或内部指令文本。
### 报告与 PDF 导出
报告技能生成结构化安全报告(执行摘要、单项发现分析、攻击路径、建议、附录)。报告中的所有声明受证据锁定报告规则约束 —— 严重程度、CVE 和 CVSS 评分仅在工具输出中明确出现时才显示。
生成报告后,LLM 提供 PDF 导出:
输入 `pdf`(或 `sí`、`dale`、`yes` 等) —— 前端拦截消息而不进行 LLM 调用,打开一个适合打印的窗口,并自动触发浏览器打印对话框。
PDF 导出在渲染前运行三遍清理:
1. 剥离 `...` / `...` 块(内部模型推理 —— 从不在交付物中)
2. 若存在 `` 标记,丢弃其前所有内容(移除任何前言或杂散推理)
3. 剥离内部 `` 标记和 PDF 提供行
PDF 包括:
- 页眉中的 **RamiBot logo** 及生成时间戳
- 清晰排版的全报告(无衬线字体、正确的标题层级)
- 按等级着色的严重程度徽章(`[CRITICAL]`、`[HIGH]` 等)
- 格式化表格、代码块和列表
- 带分页处理的打印优化 CSS
无需额外 npm 包 —— PDF 生成通过 `window.print()` 使用浏览器原生的打印到 PDF 功能。
### Docker 终端
1. 在 Settings > Docker 中配置容器名称
2. 点击聊天标题中的终端图标打开终端面板
3. 可打开第二个面板(最多 2 个并发)
4. 终端通过 `docker exec` 在配置的容器内运行
## API 参考
### 对话
| 方法 | 路径 | 描述 |
|--------|------|-------------|
| GET | `/api/conversations` | 列出所有对话 |
| POST | `/api/conversations` | 创建对话 |
| GET | `/api/conversations/{id}` | 获取含消息的对话 |
| DELETE | `/api/conversations/{id}` | 删除对话 |
| GET | `/api/conversations/{id}/export?format=json\|markdown` | 导出 |
### 聊天
| 方法 | 路径 | 描述 |
|--------|------|-------------|
| POST | `/api/chat` | 非流式聊天 |
| POST | `/api/chat/stream` | 带 MCP 工具执行的 SSE 流式聊天 |
| POST | `/api/chat/approve` | 解决待处理的工具审批(`approval_id`、`approved: bool`) |
### 提供商
| 方法 | 路径 | 描述 |
|--------|------|-------------|
| GET | `/api/providers` | 列出提供商及能力 |
| GET | `/api/models?provider=X` | 列出某提供商的模型 |
### MCP
| 方法 | 路径 | 描述 |
|--------|------|-------------|
| GET | `/api/mcp/servers` | 列出已配置服务器 |
| POST | `/api/mcp/servers` | 添加服务器 |
| DELETE | `/api/mcp/servers/{name}` | 移除服务器 |
| GET | `/api/mcp/all-tools` | 跨所有服务器的所有工具 |
| GET | `/api/mcp/tools?server=X` | 特定服务器的工具 |
| POST | `/api/mcp/call` | 直接执行工具 |
### 终端
| 方法 | 路径 | 描述 |
|--------|------|-------------|
| POST | `/api/terminal/start` | 创建终端会话 |
| GET | `/api/terminal/stream?session_id=X` | SSE 输出流 |
| POST | `/api/terminal/input` | 发送输入(base64) |
| POST | `/api/terminal/resize` | 调整 PTY 大小 |
| POST | `/api/terminal/stop` | 终止会话 |
### 范围
| 方法 | 路径 | 描述 |
|--------|------|-------------|
| GET | `/api/scope` | 从 `config.yaml` 读取 `allowed_scope` 和 `require_scope_check` |
| PUT | `/api/scope` | 写入范围配置并重启 `rami-kali` 容器 |
`PUT /api/scope` 请求体:
```
{
"allowed_scope": ["192.168.1.0/24", "10.0.0.0/8"],
"require_scope_check": true
}
```
### 发现
| 方法 | 路径 | 描述 |
|--------|------|-------------|
| POST | `/api/findings` | 保存新发现 |
| GET | `/api/findings?severity=X&conversation_id=Y&limit=N` | 列出发现(所有过滤器可选) |
| DELETE | `/api/findings/{id}` | 删除发现 |
| GET | `/api/findings/export?format=json\|csv&severity=X&conversation_id=Y` | 导出发现为文件下载 |
`POST /api/findings` 请求体:
```
{
"conversation_id": "uuid-or-null",
"tool": "rami-kali__nmap",
"severity": "high",
"title": "nmap → 192.168.1.54",
"description": "status: success\nverified_facts:\n - 22/tcp open ssh ...",
"target": "192.168.1.54"
}
```
### 设置
| 方法 | 路径 | 描述 |
|--------|------|-------------|
| GET | `/api/health` | 健康检查 |
| POST | `/api/settings` | 保存配置 |
### SSE 事件格式(`/api/chat/stream`)
```
event: token
data: {"token": ""}
event: tool_call
data: {"id": "call_xxx", "name": "server__tool", "arguments": "{...}"}
event: tool_result
data: {"tool": "server__tool", "arguments": {...}, "result": {...}}
event: tool_approval_required
data: {"approval_id": "uuid", "tool_name": "server__tool", "arguments": {...}, "risk_level": "high"}
event: clear_content
data: {}
event: usage
data: {"prompt_tokens": 100, "completion_tokens": 200, "total_tokens": 300}
event: done
data: {"token_usage": {...}, "latency_ms": 1840.5}
event: error
data: {"error": "..."}
```
## 安全须知
RamiBot 设计用于授权、受控环境。
- 无内置身份验证。请勿暴露于不受信任的网络。
- API 密钥以明文存储于 `backend/settings.json`。请相应保护此文件。
- 终端功能在 Docker 容器内执行命令。确保容器与主机和网络正确隔离。
- Tor 功能修改容器内的 iptables 规则。它需要 NET_ADMIN 或特权模式,仅适用于隔离实验室用途。
- 技能系统生成聚焦安全的 LLM 提示词。仅在授权演练或受控研究环境范围内使用。
- 对超出授权上下文的使用不承担任何责任。用户负责遵守适用法律和组织政策。
## 技术栈
| 层 | 技术 |
|-------|------------|
| 后端框架 | FastAPI + Uvicorn |
| 异步数据库 | aiosqlite (SQLite 3, WAL mode) |
| HTTP 客户端 | httpx |
| Server-Sent Events | sse-starlette |
| 前端框架 | React 19 |
| 打包器 | Vite 7 |
| 状态管理 | Zustand 5 |
| 终端模拟器 | xterm.js (@xterm/xterm 6) |
| Markdown 渲染 | react-markdown + remark-gfm + rehype-highlight |
| 图标 | lucide-react |
## 运行测试
```
cd backend
python -m pytest tests/ -v
```
标签:AI安全平台, Burp Suite, CISA项目, DLL 劫持, Docker容器, IP 地址批量处理, MCP协议, RAG, RamiBot, SQLite, TGT, Tor代理, Windows内核, 人机交互, 多模型支持, 大语言模型, 安全报告, 安全运营, 密码管理, 工具编排, 扫描框架, 攻击面发现, 攻防演练, 本地部署, 白帽子, 网络安全, 自动化攻击, 请求拦截, 运行时操纵, 逆向工具, 隐私保护