emirhankaplan/ariadne

GitHub: emirhankaplan/ariadne

一个离线、确定性的渗透测试决策引擎,将 nmap/gobuster/masscan 的扫描输出自动转化为经评分排序的优先级攻击路径与可直接执行的命令建议。

Stars: 0 | Forks: 0

ARIADNE # 🧵 ARIADNE ### 引导你走出迷宫的引路线。 **一个用于渗透测试的离线、确定性决策引擎。** 它会读取你已经运行的扫描器输出——并告诉你*接下来具体该做什么*。 [![Python](https://img.shields.io/badge/python-3.9%2B-3776AB?style=for-the-badge&logo=python&logoColor=white)](https://www.python.org/) [![License](https://img.shields.io/badge/license-MIT-22D3EE?style=for-the-badge)](LICENSE) [![Dependencies](https://img.shields.io/badge/dependencies-0_stdlib-F5B342?style=for-the-badge)](pyproject.toml) [![Offline](https://img.shields.io/badge/network-100%25_offline-6B7488?style=for-the-badge)](#-why-ariadne) ![Rules](https://img.shields.io/badge/rules-208-FF2E4C?style=flat-square) ![Tests](https://img.shields.io/badge/tests-74_passing-4ADE80?style=flat-square) ![Coverage](https://img.shields.io/badge/coverage-88%25-4ADE80?style=flat-square) ![Determinism](https://img.shields.io/badge/output-byte--identical-22D3EE?style=flat-square) ![OSCP](https://img.shields.io/badge/level-OSCP_%2F_HackTricks-FF6B7D?style=flat-square) ![PRs](https://img.shields.io/badge/PRs-welcome-FF2E4C?style=flat-square)
ARIADNE Attack Path Console **攻击路径控制台** —— 一个单一的离线 HTML 文件。Ariadne 之线(红色)描绘了穿过服务迷宫的杀伤链。

## ⚡ 30 秒演示 ``` # 1. scan(仅限您已授权测试的目标!) nmap -sCV -oX scan.xml 10.10.10.5 # 2. 让 ARIADNE 读取它 ariadne analyze --nmap scan.xml --html report.html # 3. 打开交互式控制台 ariadne-open report.html # or just double-click report.html ```
**就是这样。** 你现在拥有了一条经过评分和推理的攻击路径,以及随时可运行的命令。
``` 🧵 ARIADNE v0.3.0 — 208 rules, 2 iteration(s) ╭─ 10.10.10.5 Linux 4.15 6 svc · 11 rec ───────────────────────────────────╮ │ score sev phase recommendation │ │ 90 ⚠ CRITICAL expl vsftpd 2.3.4 backdoor (CVE-2011-2523) [✓] │ │ └ searchsploit vsftpd 2.3.4 │ │ 78 ⚠ HIGH enum Exposed /.git → dump full source & secrets [✓] │ │ └ git-dumper http://10.10.10.5:80/.git ./loot │ │ 67 ⚠ HIGH post Anonymous FTP → harvest credentials 🧵 [✓] │ │ └ wget -m ftp://anonymous:anonymous@10.10.10.5 │ │ 54 ▲ MEDIUM privesc NFS no_root_squash → root file write [·] │ ╰──────────────────────────────────────────────────────────────────────────────╯ ```
## 📑 目录 - [为什么选择 ARIADNE](#-why-ariadne) - [功能](#-features) - [安装](#-install) - [用法](#-usage) - [攻击路径控制台](#-the-attack-path-console) - [工作原理](#-how-it-works) - [评分](#-scoring) - [知识库](#-the-knowledge-base--adding-your-own-rules) - [CLI 参考](#-cli-reference) - [JSON 契约](#-the-json-contract) - [验证:Metasploitable 2](#-proof-metasploitable-2) - [测试与确定性](#-testing--determinism) - [路线图](#-roadmap) - [贡献](#-contributing) - [许可与免责声明](#-license)
## 🎯 为什么选择 ARIADNE 你已经运行了扫描。现在你正盯着 25 个开放端口,其中一半带有版本字符串,还有一个列出了 200 个 URL 的目录列表。**你实际上应该先做什么?** ARIADNE 回答了这个问题。对于它识别的每一个服务,它会告诉你: | | | |---|---| | **做什么** | 具体的下一步行动(枚举 / 利用 / 提权) | | **为什么** | 2-4 句话解释该漏洞以及它能带来什么 | | **怎么做** | 可直接复制粘贴的命令,并已填入 `{ip}`/`{port}` | | **紧急程度** | 0-100 的评分,让你绝不会在低价值的事情上浪费时间 | | **已确认的内容** | 锁定版本的 / NSE 验证的发现与“可能存在”的发现的对比 | 它是为考场或隔离实验室的实际情况而构建的: - 🔌 **100% 离线** —— 绝不进行任何网络调用。没有 `socket`、`urllib` 或 `requests`。 - 🎲 **确定性** —— 没有 AI,没有随机性。相同的扫描始终产生完全相同的输出,逐字节一致。 - 📦 **零依赖** —— 纯 Python 标准库。`rich` 和 `pyyaml` 只是可选的锦上添花;没有它们,程序也会优雅降级且绝不会崩溃。 - 🎓 **具有教学意义** —— 每个建议都解释了*原因*,而不仅仅是给出命令。
## ✨ 功能
### 🧠 智能引擎 - 208 条内置规则 - 多步**链** (fixed-point) - 已确认与潜在发现的评分 - 确定性的优先级排序 ### 🕸️ 可视化控制台 - 交互式攻击路径图 - Ariadne 之线杀伤链 - 一键复制命令 - 按阶段 / 严重程度 / 主机 / 分数过滤 ### 🔌 读取一切 - nmap `-oX` - gobuster / ffuf / dirsearch - masscan / rustscan - 支持 UDP,格式自动检测
### 📤 支持所有输出 - 彩色终端报告 - Markdown (OSCP-ready) - 独立 HTML 控制台 - Mermaid 图表 + 机器可读 JSON ### 📚 可扩展的知识库 - 以 YAML 添加规则 - 锁定版本的 CVE 匹配 - MITRE ATT&CK 标签 - 将发现链接在一起 ### 🛡️ 构建合理 - 逐字节一致的确定性 - 74 个测试,88% 覆盖率 - 优雅降级 - 4 个清晰的退出代码

## 📥 安装 要求 **Python 3.9+**。无需其他依赖。 ``` git clone https://github.com/emirhankaplan/ariadne cd ariadne python3 -m venv .venv && source .venv/bin/activate pip install -e . # stdlib only — no network needed for deps ``` 需要彩色终端和 YAML 规则支持吗?(可选) ``` pip install -e ".[full]" # adds rich + pyyaml ``` 验证: ``` ariadne version # ariadne 0.3.0(208 条内置规则) ```
## 🚀 用法 ``` # 核心要点 ariadne analyze --nmap scan.xml # 融入 web 内容发现(将文件绑定到 host:port) ariadne analyze --nmap scan.xml --gobuster dirs.txt@10.10.10.5:80 # 一次性展示所有 artifact ariadne analyze --nmap scan.xml --md report.md --json out.json \ --html console.html --mermaid graph.mmd # 聚焦 & 筛选 ariadne analyze --nmap scan.xml --host 10.10.10.5 --phase exploitation --min-score 40 # 探索知识库 ariadne rules --list ariadne rules --explain ftp-vsftpd-234-backdoor # 内置帮助,附带示例 ariadne help ``` 遇到困难?`ariadne help`、`ariadne analyze -h` 和 `ariadne rules -h` 都会打印内容丰富、充满示例的指南。
## 🕸️ 攻击路径控制台 `--html console.html` 会写入**一个自包含的离线 HTML 文件**,其中包含了你的分析结果。在任何浏览器中打开它 —— 无需服务器,无需互联网: - 一个动态的**攻击图**:`主机 → 服务 → 建议 → 发现`,*Ariadne 之线*(杀伤链)在迷宫中穿梭。 - 一个包含已评分建议卡片的**优先级栏** —— 一键复制任何命令。 - 一个带有置信度/难易度/分数进度条、NSE 输出、链上下文和参考资料的**检查器**。 - 按**阶段、严重程度、主机、分数**过滤,或进行自由文本搜索;将步骤标记为已完成或已忽略。 - 将任何 `ariadne --json` 输出直接拖放到页面上,或将其粘贴进去。
## 🏗️ 工作原理 七个独立的层,单向数据流。下层永远不会导入上层。 ``` flowchart LR A["📥 nmap · gobuster
masscan · rustscan"] --> B["🔎 Parsers
registry + autodetect"] B --> C["🧱 Model"] C --> D["🧠 Rule Engine
fixed-point chaining"] D --> E["🎯 Scoring
confirmed vs potential"] E --> F["🕸️ Attack-Path Graph
priority topo-sort"] F --> G["📤 Report
terminal · md · html · json"] style A fill:#12141B,stroke:#232733,color:#ECEEF2 style D fill:#2a0d14,stroke:#FF2E4C,color:#fff style F fill:#0e1a1e,stroke:#22D3EE,color:#fff style G fill:#1a1206,stroke:#F5B342,color:#fff ``` | 层级 | 文件 | 职责 | |---|---|---| | Model | `ariadne/models.py` | dataclasses + 确定性的 `to_dict()` (JSON 契约) | | Parsers | `ariadne/parsers/` | nmap · webdir · portscan, 注册机制 + 自动检测 | | Knowledge | `ariadne/knowledge/` | 规则加载器 (内置 + 内置包 + 用户 YAML) + 规则库 | | Engine | `ariadne/engine.py` | 匹配 · 不动点链接 · 评分 | | Graph | `ariadne/graph.py` | 攻击路径 DAG · 优先级拓扑排序 · Mermaid | | Report | `ariadne/report.py` | 终端 · markdown · html-console · json 渲染 | | CLI | `ariadne/cli.py` | argparse 子命令 · 退出代码 · session |
## 🎯 评分 每个建议都会获得一个 **[0, 100]** 之间的分数。该公式是唯一的真理来源 —— 并且它总是如实地告诉你*它的确定程度*: ``` eff_conf = confidence if confirmed # NSE / version-locked / chained-from-confirmed min(confidence, 0.5) if only "potential" # port/name match, no version → capped score = 100 · SEV_W[severity] · (0.40 + 0.60 · eff_conf) · (0.30 + 0.70 · ease) × 1.25 if chained (unlocked by a confirmed finding) → clamped to [0, 100] ``` - **已确认** `[✓]` —— 匹配到了 NSE 脚本,匹配到了锁定版本的正则表达式,或者该步骤是基于已确认的发现链接而来的。 - **潜在的** `[·]` —— 仅匹配到了端口/服务名称。自动将其*下推*,以便“可能存在”永远不会排在已证实的结果之上。 - **平局将以确定性的方式打破**,基于 `(-score, phase, -severity, -ease, rule_id)`。
## 📚 知识库与添加你自己的规则 内置了 208 条规则。**你的**规则放在 `~/.ariadne/rules/*.yaml` 中 —— 随时可以使用 `ariadne rules --validate ~/.ariadne/rules/` 验证它们。 规则是一个小的 YAML 文档(所有的 `match` 键都是 AND 关系): ``` - id: ftp-vsftpd-234-backdoor title: "vsftpd 2.3.4 backdoor (CVE-2011-2523) — instant root RCE" why: > This build shipped a backdoor: a username containing ':)' opens a root shell on 6200/tcp. Version-locked and trivial to trigger. match: port: [21] product_regex: "vsftpd\\s*2\\.3\\.4" # matches "product version extrainfo"; makes it CONFIRMED # script_regex: { ftp-anon: "Anonymous" } # match NSE output # path_regex: "/\\.git" # match a discovered web path # requires_finding: "ftp-anon" # only fire once this finding exists → a CHAIN # negate: { product_regex: "vsftpd\\s*3" } # do NOT fire if this also matches commands: # {ip} {port} {domain} {path} auto-filled - "searchsploit vsftpd 2.3.4" - "nc {ip} 6200" phase: exploitation # enumeration | exploitation | privesc | post severity: critical # info | low | medium | high | critical confidence: 0.95 ease: 0.9 tags: ["ftp", "rce", "cve-2011-2523", "T1210"] # include a MITRE ATT&CK id refs: ["https://nvd.nist.gov/vuln/detail/CVE-2011-2523"] # emits_finding: { id: "ftp-anon", title: "Anonymous FTP" } # feed a chain ``` **链** 是杀手级功能:一条带有 `emits_finding` 的规则会产生一个事实;一旦该事实存在,后续带有 `requires_finding` 的规则就会被触发。ARIADNE 会迭代至不动点,因此链的链条会自动解析。
## 🧰 CLI 参考 | 命令 | 作用 | |---|---| | `ariadne analyze --nmap FILE` | 分析扫描结果,打印优先级报告 | | `--gobuster FILE@ip:port` | 折叠 Web 发现结果 (也支持 `--ffuf`, `--dirsearch`) | | `--masscan` / `--rustscan` | 仅端口扫描 | | `--html FILE` | 写入交互式控制台 | | `--md` / `--json` / `--mermaid` | Markdown · 机器 JSON · Mermaid 图表 | | `--phase` / `--min-score` / `--host` | 过滤输出 | | `--session FILE` | 持久化/恢复已完成和已忽略的状态 | | `ariadne rules --list` | 列出所有已加载的规则 | | `ariadne rules --explain ID` | 详细显示某条规则 | | `ariadne rules --validate DIR` | 验证用户 YAML 规则 | | `ariadne help` · `ariadne version` | 指南 · 版本 | **退出代码:** `0` 正常 · `1` 用法错误 · `2` 解析错误 · `3` 未找到输入。
## 🔗 JSON 契约 `--json` 会输出一个稳定的 schema,任何前端都可以消费:`meta`,`hosts[]`(每个都包含 `services`、`web_paths`、`findings`、`recommendations`),以及 `attack_path`(`nodes`、`edges`、`kill_chain_order`),所有这些都带有经过清理的、稳定的节点 ID。键的顺序和列表的顺序都是固定的 —— diff 保持干净,输出是可复现的。
## 🧪 验证:Metasploitable 2 指向一个完整的 Metasploitable 2 主机(25 个服务)后,ARIADNE 生成了**53 条建议**,并捕获了 **12/12** 个标志性 CVE —— 包括那些锁定版本、已确认的 CVE: ``` flowchart LR H(["🖥️ 172.17.0.3"]) --> S1["21/vsftpd 2.3.4"] --> R1{{"[90] vsftpd backdoor RCE"}} H --> S2["445/Samba 3.0.20"] --> R2{{"[81] usermap_script RCE"}} H --> S3["6667/UnrealIRCd"] --> R3{{"[73] IRC backdoor RCE"}} H --> S4["1099/Java RMI"] --> R4{{"[63] deserialization RCE"}} H --> S5["3632/distccd"] --> R5{{"[63] distcc RCE"}} R1 --> F1[">Anonymous FTP → creds"] style R1 fill:#2a0d14,stroke:#FF2E4C,color:#fff style R2 fill:#2a0d14,stroke:#FF2E4C,color:#fff style R3 fill:#2a1206,stroke:#F5B342,color:#fff ```
## 🔬 测试与确定性 ``` pip install pytest && pytest -q # 74 tests, all green ``` 为了在不同的运行和机器上实现逐字节一致的输出,固定 ARIADNE 发出的唯一一个时间戳: ``` SOURCE_DATE_EPOCH=1751630400 ariadne analyze --nmap scan.xml --json a.json SOURCE_DATE_EPOCH=1751630400 ariadne analyze --nmap scan.xml --json b.json diff a.json b.json # identical ```
## 🗺️ 路线图 - [x] nmap / web / portscan 解析器 · 200+ 条规则 · 评分 · 终端 - [x] 交互式 HTML 控制台 · Mermaid · JSON 导出 - [x] 用户 YAML 规则 · session 状态 · 完整的端口覆盖 - [ ] enum4linux / snmp / nikto 解析器 - [ ] 跨主机关联(密码重用 → 枢轴提示) - [ ] 社区规则包
## 🤝 贡献 欢迎提交 PR —— 尤其是**新规则**。标准很简单:参考已知的、公开的技术(searchsploit / NSE / Metasploit 模块名称),始终解释*原因*,并保持确定性。在推送之前运行 `pytest -q`。
## 📜 许可证 [MIT](LICENSE) —— 随你所欲,不提供任何担保。 ## ⚠️ 免责声明 ARIADNE 指向的是处于 OSCP / HackTricks 级别的**已知的、公开的**技术,且不提供任何**漏洞利用 payload** —— 它只告诉你该运行哪个模块以及为什么。**仅**在你获得明确授权进行测试的系统上使用它。你应对你的行为负责。

**跟随线。逃离迷宫。** 🧵 专为安全操作人员、学生,以及每一个曾经盯着扫描结果心想“……接下来怎么办?”的人而构建。
标签:Python, 决策引擎, 多模态安全, 实时处理, 密码管理, 插件系统, 无后门, 网络调试, 聊天机器人, 自动化, 逆向工具