retr0verride/Anglerfish-AI
GitHub: retr0verride/Anglerfish-AI
Anglerfish AI 是一个利用本地大模型生成逼真交互的 SSH 蜜罐,结合 MITRE ATT&CK 威胁评分与加密凭据采集,用于防御性安全研究与攻击行为分析。
Stars: 1 | Forks: 0
# Anglerfish AI
[](https://github.com/retr0verride/Anglerfish-AI/actions/workflows/ci.yml)
[](pyproject.toml)
[](https://codecov.io/gh/retr0verride/Anglerfish-AI)
Anglerfish AI 最初是我在搭建包含 Proxmox、Splunk 和 Suricata 的 SOC 实验室时的一个衍生实验。它最终成了让我学到最多东西的部分。架构和安全决策由我做出,而实现则交给了 Claude Code。这个项目的目标从来不是发布一个产品,而是为了理解当你必须自己做决定时,蜜罐的各个组件是如何拼凑在一起的:攻击者实际上在寻找什么,以及如何向他们展示这些内容;为什么普通的蜜罐在被扫描的那一刻就会暴露自己;应该信任哪个本地模型,又该拒绝哪个模型;以及真正的信任边界应该设在哪里。彻底理清这些决策才让我真正掌握了它们,光靠阅读是永远学不到的。
它被公开是因为这能保证工作的严谨性,也因为这些文档(设计文档优先的轨迹、威胁模型、审计说明)值得一读,哪怕你从未运行过它。它被设计为在 VM 中隔离运行,绝对不要在不属于你的网络上运行。docs/THREAT_MODEL.md、docs/PRE_DEPLOY_CHECKLIST.md 和 docs/INCIDENT_RESPONSE.md 说明了其边界和故障模式。如果这里有什么错误、疏忽或危险的地方,请告诉我。我宁愿听到我漏掉了什么,也不想只听我抓住了什么。
## ⚠️ 法律和道德使用声明
**Anglerfish AI 是一款防御性安全研究工具。使用本工具即表示
您同意以下条款:**
1. **仅在您拥有或获得明确书面授权
运行蜜罐的网络上部署。**在
第三方网络上运行蜜罐在
您所在的司法管辖区可能构成未授权访问、
窃听或计算机欺诈。
2. **您有责任遵守**当地的法律法规,以及
您的托管服务提供商、网络运营商
和域名注册商的可接受使用政策。
3. **捕获的凭据、payload 和 shell 会话属于敏感
数据。**请谨慎对待。它们可能
包含配置错误的自动化程序无意中
提交的真实凭据。凭据
数据库在静态存储时使用 AES-GCM 加密;切勿
以明文形式导出。
4. **无担保。**Anglerfish AI 按“原样”提供;参见
[LICENSE](LICENSE)。
首次启动向导要求在任何服务启用之前
明确确认这些条款。
## 架构
```
┌──────────────────────────────────────────────────────┐
│ HONEYPOT VM (no GPU) │
│ │
bait NIC ──────┤ Lure (native asyncssh on :2222 by default) │
(hostile) │ │ │
│ │ unknown commands (HTTP, loopback :8421) │
│ v │
│ Bridge HTTP server │
│ │ │
│ v │ ┌─────────────┐
│ AIBridgeService ── sanitize → rate-limit → prompt │ service │ Model VM │
│ │ → Ollama → cap → fallback ───────┼── network ──►│ Ollama LLM │
│ v ▲ │ :11434 │ (GPU) │
│ Threat engine ── MITRE ATT&CK tagger ──┘ │ │ qwen3:14b │
│ │ → webhook │ └─────────────┘
│ v │
│ Session store (SQLite at /var/lib/anglerfish) │
│ │ │
│ v │
│ Dashboard (FastAPI + WebSockets) ─── operator UI ── service NIC
│ │ │
│ v │
│ Credentials DB (SQLite + AES-GCM, dedup via HMAC) │
│ Fingerprinter (SSH banner, JA3, HASSH, Tor exits) │
│ Geo lookup (MaxMind GeoLite2) │
└──────────────────────────────────────────────────────┘
```
蜜罐 VM 没有 GPU,也不运行任何模型。它通过
服务网络调用 Model VM 以获取
每次响应。在本地开发中,您可以在
同一台机器的回环地址(`http://127.0.0.1:11434/`)上运行
Ollama 来替代。
蜜罐 VM 有两个网络接口:
* **Bait**:暴露于恶意流量。在
配置的端口上运行诱饵 SSH 监听器
(原生 asyncssh)。除了
DNS 外,在 nftables 层面丢弃所有出站流量。
* **Service**:私有且受防火墙保护。连接 Model VM 上的 Ollama(在
服务网络上具有单个受信任的 IP)以及操作员
仪表板。除此之外别无其他。在本地开发中,Ollama 可以运行在
回环地址上。
被攻破的 Anglerfish 绝不能能够跳板攻击其他系统。
首次启动时生成的 nftables 规则强制规定,在
Service 接口上的出站流量仅限于配置的 Ollama 和仪表板
endpoint。参见 [`nftables/anglerfish.nft`](nftables/anglerfish.nft)。
## 组件
| 组件 | 状态 | 用途 |
| --------------- | ------------- | ------------------------------------------------------------------ |
| `config/` | **已发布** | Pydantic 配置模型 + 设置加载器 |
| `bridge/` | **已发布** | 清理 / 速率限制 / Ollama 客户端 / 回退 / 编排器 / HTTP 服务器 |
| `threat/` | **已发布** | MITRE ATT&CK 技术标签 + 评分器 + webhook 报警器 |
| `fingerprint/` | **已发布** | SSH banner 解析器 + JA3/HASSH 哈希辅助工具 + Tor 出口节点列表 |
| `geo/` | **已发布** | MaxMind GeoLite2 包装器(通过 `to_thread` 实现异步) |
| `credentials/` | **已发布** | SQLite + AES-GCM 加密的凭据情报数据库 |
| `sessions/` | **已发布** | 基于 SQLite 的持久化会话存储 |
| `dashboard/` | **已发布** | FastAPI + WebSocket UI,采用深海生物发光主题 |
| `wizard/` | **已发布** | 首次启动 Typer 向导,生成密钥,写入 `.env` |
| `cli/` | **已发布** | `anglerfish` 和 `anglerfish-wizard` 入口点 + ASCII banner |
| `models/` | **已发布** | 共享的 session / response / threat / fingerprint / geo / credential 类型 |
| `lure/` | **已发布** | 原生 asyncssh SSH 蜜罐 |
| `iso/` | **已发布** | live-build 配方、钩子、构建脚本 |
| `systemd/` | **已发布** | 为每个长期运行的服务强化的 unit 文件 |
每个发布的 Python 模块都必须通过 `ruff`、`mypy --strict` 和
`pytest --cov-fail-under=90` 的严格检查。
## 文档
| 文档 | 涵盖内容 |
| ------------------------------------------------ | ---------------------------------------------------------------------- |
| [`docs/PRODUCT.md`](docs/PRODUCT.md) | 核心理念、设计原则、七大能力、非目标 |
| [`docs/ROADMAP.md`](docs/ROADMAP.md) | 从基础到完全自适应欺骗的十一阶段构建计划 |
| [`docs/design/TEMPLATE.md`](docs/design/TEMPLATE.md) | 每个阶段在编写代码前需要填写的设计文档模板 |
| [`docs/ARCHITECTURE.md`](docs/ARCHITECTURE.md) | 逐模块解析、IPC 边界、以及相关排查指南 |
| [`docs/API_REFERENCE.md`](docs/API_REFERENCE.md) | Bridge + 仪表板 REST endpoint、WebSocket 协议、集成示例 |
| [`docs/INSTALL.md`](docs/INSTALL.md) | 前置条件、ISO + Proxmox/QEMU 部署、向导演练 |
| [`docs/MODEL_SETUP.md`](docs/MODEL_SETUP.md) | 本地 LLM 安装:硬件规格、Ollama 调优、三层模型栈、完整性哈希 |
| [`docs/proxmox.md`](docs/proxmox.md) | Proxmox 专属网桥准备、VM 配置、GPU 直通、快照 |
| [`docs/proxmox-lab.md`](docs/proxmox-lab.md) | 严格实验室变体:隔离的 Bait 网桥、PCAP 捕获、快照/重置工作流 |
| [`docs/PRE_DEPLOY_CHECKLIST.md`](docs/PRE_DEPLOY_CHECKLIST.md) | 暴露于攻击者流量之前的自上而下全面检查 |
| [`docs/INCIDENT_RESPONSE.md`](docs/INCIDENT_RESPONSE.md) | 针对跳板攻击、违规、审计日志缺失、上游 CVE 的预案 |
| [`docs/RUNBOOK.md`](docs/RUNBOOK.md) | 日常运维:凭据轮换、geo 更新、7 种恢复场景 |
| [`docs/THREAT_MODEL.md`](docs/THREAT_MODEL.md) | STRIDE 表格、信任边界、加密清单、已知局限 |
| [`SECURITY.md`](SECURITY.md) | 漏洞披露政策、支持的版本、范围 |
| [`CONTRIBUTING.md`](CONTRIBUTING.md) | 质量门禁、分支/提交风格、PR 检查清单 |
| [`docs/ONBOARDING.md`](docs/ONBOARDING.md) | 为新贡献者准备的 30 分钟导览 |
| [`docs/AUDIT.md`](docs/AUDIT.md) | 每次切片提交前应用的子阶段审计检查清单 |
## 部署
生产环境部署分布在两台 VM 上。Model VM 配备 GPU
并运行 Ollama。蜜罐 VM 没有 GPU,并通过
服务网络调用 Model VM。蜜罐通过以下配置指向它:
`ANGLERFISH_OLLAMA__BASE_URL=http://
:11434/` 和
`ANGLERFISH_OLLAMA__TRUSTED_REMOTE_HOST=`。
按照 [`docs/proxmox.md`](docs/proxmox.md) 进行逐步构建
(主机网络、GPU 直通、两台 VM、首次启动向导以及
端到端验证)。以下部分涵盖的是本地开发,而非
部署。
## 快速开始(开发环境)
以下命令用于在单台机器上运行 Anglerfish 以供开发使用。
回环 Ollama(`http://127.0.0.1:11434/`)是本地开发的便利设置;
生产环境则在上述独立的 Model VM 上运行模型。
### 前置条件
* Python 3.11+
* `pip` 和 `venv`
* 实时 LLM 测试:可访问的 Ollama 实例(本地开发使用回环地址,
或用于分离拓扑的可信远程 IP)
### 安装
```
git clone https://github.com/retr0verride/Anglerfish-AI.git
cd Anglerfish-AI
python3.11 -m venv .venv
source .venv/bin/activate # PowerShell: .\.venv\Scripts\Activate.ps1
pip install -e ".[dev]"
pre-commit install --install-hooks
```
### 运行质量门禁
流水线是唯一的真理来源。每次提交都必须通过以下检查:
```
ruff check .
ruff format --check .
mypy
pytest # enforces --cov-fail-under=90
```
`pre-commit run --all-files` 会一次性运行上述所有检查。
### 检查配置
```
export ANGLERFISH_DASHBOARD__SESSION_SECRET="$(openssl rand -base64 32)"
export ANGLERFISH_CREDENTIALS__ENCRYPTION_KEY="$(openssl rand -base64 32)"
anglerfish banner
anglerfish config show
anglerfish --version
```
### 针对本地 Ollama 运行 Bridge
```
anglerfish bridge serve --host 127.0.0.1 --port 8421
```
### 在空状态下运行仪表板
```
anglerfish dashboard serve --host 127.0.0.1 --port 8420
```
两个标志均为可选。如果没有它们,仪表板将绑定到
`settings.dashboard.host` 和 `settings.dashboard.port`(默认值为
`127.0.0.1:8420`)。它提供普通的 HTTP 服务。使用
`curl http://127.0.0.1:8420/api/health` 进行检查,这将返回
`{"status":"ok","version":"0.1.0"}`。
### 手动运行首次启动向导
```
anglerfish-wizard run --env /tmp/anglerfish.env
```
## 配置参考
配置从前缀为 `ANGLERFISH_` 的环境变量中读取,
其中 `__` 作为嵌套部分的分隔符。工作
目录下的 `.env` 文件也会被采纳。有关
完整列表,请参见 [`.env.example`](.env.example)。
有两个值是**必需的**,没有默认值,必须由
操作员提供(首次启动向导会生成它们):
| 变量 | 格式 |
| ----------------------------------------- | ---------------------------- |
| `ANGLERFISH_DASHBOARD__SESSION_SECRET` | ≥32 个字符的字符串 |
| `ANGLERFISH_CREDENTIALS__ENCRYPTION_KEY` | base64 编码的 32 字节密钥 |
### Ollama Endpoint 策略
Ollama 的 Endpoint 主机会在配置时进行验证:
* **始终接受:**任何回环 IP(`127.0.0.0/8`、`::1`)以及
字面主机名 `localhost`。
* **有条件接受:**与
`ANGLERFISH_OLLAMA__TRUSTED_REMOTE_HOST` 的值匹配的字面 IP(**并且仅限**
字面 IP)。
* **始终拒绝:**所有其他主机名(包括恰好
解析为受信任 IP 的 DNS 名称)、所有不匹配的 IP,以及
未指定地址 `0.0.0.0`。
这是一个结构性属性。没有任何覆盖标志。
## 威胁模型与安全边界
* **蜜罐是攻击目标。**攻击者输入在到达 prompt 模板之前会被限制长度并
剔除 C0 控制字符;
每个模型响应都会被静默限制在配置的最大值内。
* **LLM 是不受信任的。**来自攻击者命令的 prompt 注入在
结构上得到了缓解:攻击者的文本始终位于其独立的
用户消息中,并且系统 prompt 指示模型将任何
用户消息视为 shell 命令,而不是指令。
* **强制进行速率限制。**Bridge 强制执行全局
并发上限以及基于会话的 token bucket。当其中任何一个触发时,
攻击者仍会收到合理的响应(从
预设的回退集合中提取),因此限制器不能被用作探测工具。
* **静态加密凭据。**使用通过 `ANGLERF_CREDENTIALS__ENCRYPTION_KEY` 提供的密钥进行
AES-GCM 加密。去重使用
在从主密钥派生的单独密钥下的 HMAC-SHA256 指纹,因此唯一计数和相等性查找永远不会接触
明文。
* **服务网络为单向出站。**nftables 规则仅允许
连接到配置的 Ollama 和仪表板 endpoint。
Bait 接口的出站流量被完全丢弃(DNS 除外)。
* **systemd 加固。**每个长期运行的 unit 都使用
`ProtectSystem=strict`、`NoNewPrivileges`、显式的
`SystemCallFilter`、最小化的 `CapabilityBoundingSet` 以及
`PrivateTmp`。
## MITRE ATT&CK 覆盖范围
默认规则集会标记以下技术。通过
构造自定义的 `TechniqueRule` 元组并将其传递给
`score_session`,可以添加更多技术。
| 技术 | 描述 |
| ---------- | ------------------------------------------ |
| T1003 | OS 凭据转储 |
| T1016 | 系统网络配置发现 |
| T1018 | 远程系统发现 |
| T1033 | 系统所有者/用户发现 |
| T1046 | 网络服务扫描 |
| T1049 | 系统网络连接发现 |
| T1053 | 计划任务/作业(持久化) |
| T1057 | 进程发现 |
| T1059.004 | Unix Shell |
| T1070 | 主机上的迹象移除 |
| T1071 | 应用层协议 |
| T1082 | 系统信息发现 |
| T1083 | 文件和目录发现 |
| T1098 | 账户操纵(持久化) |
| T1105 | 入口工具传输 |
| T1136 | 创建账户(持久化) |
| T1496 | 资源劫持(挖矿程序) |
| T1543 | 创建或修改系统进程(持久化) |
涉及持久化技术的会话将获得 +20 分的加分,并
翻转 `persistence_attempted` 标志,这正是报警器
所监视的内容。
## ISO 构建
```
sudo apt install live-build debootstrap squashfs-tools xorriso \
isolinux syslinux-common
sudo cp -r . /tmp/anglerfish-ai
sudo ./iso/build.sh
```
生成 `iso/build/anglerfish-ai-.iso` 以及 `.sha256`
校验和。构建默认使用 `--without-ollama`,这正是
分离拓扑所需要的(蜜罐调用 Model VM 获取模型)。有关
完整详细信息,请参见
[`iso/README.md`](iso/README.md)。
ISO 直接引导进入文本控制台,并在任何网络服务启动之前
在 tty1 上运行首次启动向导。
## 仓库布局
```
Anglerfish-AI/
├── src/anglerfish/
│ ├── bridge/ # Ollama AI middleware + rate limiting + HTTP server
│ ├── dashboard/ # FastAPI + WebSocket UI + templates + static
│ ├── threat/ # Threat scoring + MITRE ATT&CK tagging + alerter
│ ├── fingerprint/ # SSH/JA3/HASSH + Tor exit list
│ ├── geo/ # MaxMind GeoLite2 wrapper
│ ├── credentials/ # AES-GCM encrypted credential intelligence DB
│ ├── sessions/ # SQLite-backed persistent session store
│ ├── config/ # Pydantic config models
│ ├── models/ # Shared runtime data models
│ ├── wizard/ # First-boot configuration wizard
│ ├── lure/ # Native asyncssh SSH lure
│ └── cli/ # Entry points + ASCII banner
├── tests/ # pytest test suite (≥90% coverage gate)
├── nftables/ # nftables ruleset template
├── iso/ # live-build recipe + hooks + build script
├── systemd/ # Hardened systemd unit files
├── assets/ # SVG icon, ASCII art
├── docs/ # Architecture diagrams, docs
├── pyproject.toml
├── .pre-commit-config.yaml
└── README.md
```
## 实现声明
Anglerfish AI 由人类设计架构,并在
Claude Code (Anthropic) 的协助下实现。每个文件在
落地之前都会经过人工审查。决定代码能否发布的标准是质量流水线(`ruff`、`mypy --strict`、
`pytest --cov-fail-under=90`),而
不是助手的信心。Pull request 也需通过同样的门禁。
## License
[MIT](LICENSE) © 2026 Anglerfish AI 贡献者标签:AI风险缓解, DLL 劫持, PE 加载器, SSH, 大语言模型, 威胁情报, 开发者工具, 本地部署, 蜜罐, 证书利用