retr0verride/Anglerfish-AI

GitHub: retr0verride/Anglerfish-AI

Anglerfish AI 是一个利用本地大模型生成逼真交互的 SSH 蜜罐,结合 MITRE ATT&CK 威胁评分与加密凭据采集,用于防御性安全研究与攻击行为分析。

Stars: 1 | Forks: 0

Anglerfish AI

# Anglerfish AI [![CI](https://static.pigsec.cn/wp-content/uploads/repos/cas/ad/ad5834178f7599af9fdda11629d49cae07f2997beec49821b2920eff5bfd50e7.svg)](https://github.com/retr0verride/Anglerfish-AI/actions/workflows/ci.yml) [![Python 3.11+](https://img.shields.io/badge/python-3.11+-blue.svg)](pyproject.toml) [![codecov](https://codecov.io/gh/retr0verride/Anglerfish-AI/branch/main/graph/badge.svg)](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, 大语言模型, 威胁情报, 开发者工具, 本地部署, 蜜罐, 证书利用