N1ckw1ck/Dark_OSINT
GitHub: N1ckw1ck/Dark_OSINT
一套暗网 OSINT 工具集,通过 Tor 聚合多个 .onion 搜索引擎结果,并自动化完成 URL 提取、安全预检和情报索引构建。
Stars: 1 | Forks: 0
# 暗网 OSINT

## 目录
- [仓库结构](#repository-structure)
- [安装说明](#setup)
- [Erebus](#erebus-dark-web-search)
- [Hemera](#hemera-url-extractor)
- [Mnemosyne](#mnemosyne-onion-link-recon)
- [Khaeos](#khaeos-control-center)
- [其他工具](#other-possibly-helpful-tools)
#### 免责声明
###### 这些工具仅供授权(如适用)且符合道德(始终)的使用。
###### 您有责任确保您的使用符合所有适用的法律、法规等。
###### 代码只是文字。
###### 运行通过互联网发起请求的可执行代码就不只是文字了。
###### 除非您采取了严格的 OPSEC 措施(这不太可能),否则请假设发出的所有请求都可以追溯到您。
###### 请注意,作者本人**不**对任何滥用行为承担责任。
## 仓库结构
```
DARK_OSINT/
├── d_erebus.py — dark web search aggregator, standalone or pipeline
├── d_hemera.py — extract a clean .onion URL list from Erebus JSON output
├── d_mnemosyne.py — pre-visit .onion safety scanner, standalone or pipeline
├── pgp_verify.py — verify PGP signatures/canaries, fully standalone
│
├── Khaeos/ # the persistent index + web UI, runs on your own machine
│ ├── d_khaeos.py — ingest Mnemosyne output, serve the searchable index UI
│ ├── khaeos_ui.html — the web UI itself, served by d_khaeos.py
│ └── khaeos-mass-batch-ingest.sh — example bulk-ingest helper; edit the paths/date
│ range in it before using, not a polished CLI tool
│
├── Pipeline/ # chain Erebus → Hemera → Mnemosyne (→ Khaeos) automatically
│ ├── VPS_Files/ # meant to be deployed to and run unattended on a VPS
│ │ ├── pipeline.py — chain all three tools for one or more queries
│ │ ├── run-pipeline.sh — cron-friendly wrapper (day-specific queries, outbox move)
│ │ ├── validate_batch.py — validate a Mnemosyne batch before it reaches the outbox
│ │ ├── validate-batch-helper.sh — one-off manual re-validate helper, edit before use, not polished
│ │ ├── vps-setup.sh — harden a fresh Debian VPS, create the SFTP/working users and directories
│ │ ├── config/
│ │ │ ├── queries.txt — fallback query list
│ │ │ └── queries_.txt — optional day-specific override, e.g. queries_monday.txt
│ │ └── output/ # created at runtime, not committed
│ │ ├── discovery_queue.txt — created with --aggressive flag: links found, queued for the *next* run
│ │ ├── erebus/ # Erebus outputs: Erebus__.json
│ │ ├── hemera/ # Hemera outputs: erebus_urls__.txt
│ │ └── mnemosyne/ # Mnemosyne outputs: Mnemosyne_batch_.json
│ │ └── quarantine/ # batches that failed validate_batch.py
│ └── Local_Machine_Files/ # run on your own machine, talk to the VPS over SSH/SFTP
│ ├── push_queries.py — manage the VPS's query files over SSH, no manual login needed
│ ├── pull_batches.py — pull validated batches from the VPS outbox over SFTP, verify + ingest
│ └── pull-khaeos-batches.sh — thin cron/alias wrapper around pull_batches.py
│
├── requirements.txt
└── README.md
```
Erebus、Hemera 和 Mnemosyne 都是各自独立的工具——直接运行它们会将输出写入您运行所在的目录中。`output/erebus/`、`output/hemera/`、`output/mnemosyne/` 的分离只有在通过 `pipeline.py` 驱动它们时才会发生,因为 `pipeline.py` 显式设置了每个阶段的工作目录,这样就不会有文件松散地留在脚本旁边。
**为什么自动化脚本特别放在 `Pipeline/VPS_Files/` 中**:Erebus 和 Mnemosyne 会持续、重复地发送 Tor 请求,这正是一种长时间运行且无人值守的工作负载,您肯定不希望它占用您自己的机器,或者随着时间的推移反复将您的家庭网络连接暴露给 Tor 入口节点。偶尔在您自己的机器上手动运行 pipeline 是可以的;而按计划定期运行正是廉价 VPS 的用途所在。`pipeline.py` 和 `run-pipeline.sh` 正是考虑到这种部署场景而编写的。
## 安装说明
#### 前提假设
- 您的系统上已安装最新版本的 Python
- 您的系统上已安装 Tor 二进制文件
- 您的系统上已安装 GnuPG (gpg)(用于 pgp 签名验证,非绝对必要)
- 对于 Erebus/Mnemosyne:请在虚拟机(为了最佳安全性,请使用 Whonix)或 VPS 中运行,并在搜索/扫描前连接到 VPN
#### Pipeline(如果需要)
##### Erebus → Hemera → Mnemosyne → Khaeos
##### 示例流程:
###### 手动,逐步执行:
```
python d_erebus.py --pages 5 --save-j
python d_hemera.py Erebus__.json
python d_mnemosyne.py --batch erebus_urls__.txt --save
python Khaeos/d_khaeos.py --ingest Mnemosyne_batch_.json --serve
```
1. Erebus 抓取暗网。它当然可以作为独立工具使用。
2. Hemera 接收 Erebus 的 JSON 输出,并输出一个干净的 .txt 格式的 URL 列表。
3. Mnemosyne 对传入的 .onion 地址进行访问前的安全分析。它是一个独立的工具。
4. Mnemosyne 也可以使用 Hemera 的 .txt 输出以批处理模式运行,从而生成群组摘要。
5. Khaeos 接收单次扫描和批处理的 Mnemosyne JSON 文件,构建自定义的情报索引。
###### 自动化,每次查询只需一条命令(`Pipeline/VPS_Files/pipeline.py`):
```
cd Pipeline/VPS_Files
python pipeline.py "ransomware"
python pipeline.py "forums" "leaked credentials" --pages 5
python pipeline.py "malware" --aggressive # optionally queue discovered links for a future run
python pipeline.py "markets" --no-khaeos --dry-run
```
自动将这三个工具串联起来,将每个阶段的输出写入 `output/` 下各自的子文件夹中(参见[仓库结构](#repository-structure)),而不是让文件散落在外。`--aggressive` 参数会使 Mnemosyne 从其扫描的每个页面中提取出站 `.onion` 链接,并将新发现的链接追加到 `output/discovery_queue.txt` 中。在同一次运行中不会扫描额外内容,它们只是被排队留待以后处理,因此单个包含大量链接的页面不会导致运行时间急剧膨胀。`pipeline.py` 会自动在仓库根目录下找到 `d_erebus.py`/`d_hemera.py`/`d_mnemosyne.py`,并在 `Khaeos/` 下找到 `d_khaeos.py`,它不需要在扁平化的目录中运行,直接在克隆的仓库中即可使用。
###### 在 VPS 上无人值守运行(`run-pipeline.sh` + cron):
`run-pipeline.sh` 是一个对 cron 友好的包装脚本:如果存在特定日期的查询文件(如 `config/queries_monday.txt`,并回退到 `config/queries.txt`),它会优先选择该文件,运行 `pipeline.py`,首先消耗*上一次*运行留在发现队列中的内容,然后通过 `validate_batch.py` 验证并将本次运行实际生成的所有批处理结果移动到 SFTP 发件箱中。单个查询失败(如不稳定的 Tor 线路、索引超时)不会中断其余查询,所有成功执行的结果仍然会被验证和移动。

## Erebus 暗网搜索
#### 聚合多个 .onion 搜索引擎中针对特定搜索词的结果。
#### 所有请求均通过 Tor 路由。在任何阶段都不会发起 clearnet 请求。
### 环境要求
```
pip install 'requests[socks]' stem beautifulsoup4 rich
```
#### 系统依赖:
- **Tor binary** — `brew install tor` (macOS) 或 `sudo apt install tor` (Debian/Ubuntu)
### 用法
```
python d_erebus.py
python d_erebus.py --pages # pages to fetch per index (1-10, default 1, more = slower)
python d_erebus.py --save-j # save all results to JSON
python d_erebus.py --save-h # save all results to HTML (rich table)
python d_erebus.py --no-save # skip all save prompts
python d_erebus.py --debug # verbose error output and raw HTML previews
```
### 搜索引擎
| 搜索引擎 | 类型 | 可靠性 (1(最差)-10(最好)) |
|-------|------|-----------|
| Ahmia | 结构化的大型索引 | 10 |
| Torch | 经典的 Tor 搜索引擎 | 1.5 |
| Tor66 | 广泛的暗网索引 | 8 |
| notevil | 补充索引 | 4 |
| Amnesia | 补充索引 | 9 |
每个索引在无法访问时都会优雅地失败并给出明确的错误信息,而不会影响其他索引。
如果它们失效了,请更新 `d_erebus.py` 中的 .onion 链接。
### 工作原理
1. **Tor 管理** — 检测 `127.0.0.1:9050` 上现有的守护进程,或启动一个托管的进程。在任何请求发出之前,会等待完全引导完成。
2. **线路轮换** — 在每次索引查询之间请求一个新的 `NEWNYM` 线路,以确保每个搜索引擎都能看到不同的 Tor 身份。
3. **可达性检查** — 在尝试抓取之前先探测每个索引。不可达的索引会被立即跳过,并显示清晰的错误信息,而不是在抓取过程中卡住等待超时。
4. **所有流量均通过 Tor** — 全程使用 `socks5h://` 代理,DNS 解析在 Tor 内部进行。在任何阶段都不发起 clearnet 请求。
5. **去重** — 结果按规范的 `.onion` 主机进行分组。在多个索引的多个路径中出现的同一个主机会被折叠为一个条目,并将分支路径以易读的列表形式展示。已知的链接农场地址(在 `LINK_FARM_BLOCKLIST` 中可配置的黑名单)会被标记为 `⚑`,但不会被丢弃。
6. **输出** — 格式丰富的 CLI 表格展示前 50 个结果,按跨索引的印证程度排序。完整的结果集可以保存为带时间戳的 JSON 文件。
### 输出结果
- **CLI** — 在格式丰富的表格中展示前 50 个结果,包含标题、规范主机、分支路径、来源索引和摘要
- **JSON** — 完整的结果集将保存为当前目录下的 `Erebus_{query}_{timestamp}.json` 文件
- **HTML** — 完整的结果集将保存为当前目录下的 `Erebus_{query}_{timestamp}.html` 文件,包含带颜色的、显示完整行的富格式表格(需要 `rich`)
### 截图



### 重要提示
- **系统必须安装 Tor。如果找不到二进制文件,该工具将退出并给出清晰的错误信息和安装说明。**
- .onion 搜索引擎经常下线并更改地址。如果某个索引持续失败,请验证其当前地址并更新文件中的 `INDEXES`。
- 分页可能会显著增加运行时间。
- 当您发现已知的链接农场 `.onion` 主机名时,请将它们添加到文件顶部的 `LINK_FARM_BLOCKLIST` 中。
- 请勿输入敏感信息作为搜索词。搜索引擎可能会(极有可能)记录搜索内容。请参阅上面的免责声明。
- Torch 运行在 CGI 架构上。对于 CGI 最贴切的描述可以在现存最接近官方 CGI 文档的地方找到 (https://www.w3.org/CGI/):“留作历史参考”。但他们就是在用这个,而且它经常崩溃。

## Hemera (URL 提取器)
#### 解析 d_erebus.py 的 JSON 输出文件,并提取所有 .onion URL,以便使用 d_mnemosyne.py 进行批量扫描。
#### 默认情况下会排除被标记为链接农场的主机。输出一个干净的文本文件,每行一个 URL。
##### 只有在使用 pipeline 时才真正有用
### 环境要求
除 Python 标准库外,没有其他依赖项。
### 用法
```
python d_hemera.py
python d_hemera.py --output # custom output filename
python d_hemera.py --full-paths # emit every unique path per host, not just canonical roots
python d_hemera.py --include-farms # include link-farm flagged hosts (not recommended, see notes)
python d_hemera.py --no-save # print URLs to stdout only, skip file write
```
### 工作原理
1. **JSON 解析** — 加载并验证由 `d_erebus.py` 生成的 `Erebus_*.json` 文件。如果文件缺失、格式错误或不是 Erebus 输出文件,程序将退出并显示明确的错误信息。
2. **去重** — 在规范根模式(默认)下,无论看到多少路径,每个 `.onion` 主机只输出一个 URL。在 `--full-paths` 模式下,将包含在所有路径中找到的每个唯一的 URL,并根据确切的 URL 进行去重。
3. **链接农场过滤** — 默认情况下,被 Erebus 标记为链接农场的主机会被静默排除。`--include-farms` 参数可以通过打印警告来覆盖此设置,因为这些主机会产生低信噪比的结果,并浪费大量扫描时间。
4. **输出** — 将提取的列表及其索引编号打印到终端,然后写入一个带时间戳的 `.txt` 文件,该文件可以直接传递给 `d_mnemosyne.py --batch` 使用。
### 输出结果
- **CLI** — 带编号的提取 URL 列表,并显示包含总结果数、跳过的农场和提取的 URL 数量的摘要
- **TXT** — URL 列表保存为当前目录下的 `erebus_urls_{query}_{timestamp}.txt` 文件,每行一个 URL
### 截图


### 重要提示
- **输入必须是 `d_erebus.py` 保存的 JSON 文件。** 其他不同结构的 JSON 文件将被拒绝。
- 建议在批处理扫描时使用规范根模式(`http://host/`)——这样可以避免对同一服务的不同路径进行重复扫描。
- 可以使用 `--include-farms` 参数,但它可能会显著增加扫描时间,并且目标价值较低。如果您有特殊原因,请谨慎使用。
- 在传递给 `d_mnemosyne.py` 之前,可以手动编辑输出的 `.txt` 文件——删除任何您想跳过的 URL,或者使用 `#` 添加注释。

## Mnemosyne (.onion 链接侦察)
#### 在访问 .onion 网站或服务之前使用。它会在没有任何直接浏览器交互的情况下分析该地址。
#### 仅通过 Tor 线路获取原始的 HTTP/HTML,不执行 JavaScript,不加载图片,不存储 cookies。
#### 批量检查通过 Erebus 找到的 URL(但务必先使用 Hemera!)或来自自定义列表的 URL。
### 环境要求
```
pip install 'requests[socks]' stem beautifulsoup4 python-gnupg
```
#### 系统依赖:
- **Tor binary** — `brew install tor` (macOS) 或 `sudo apt install tor` (Debian/Ubuntu)
- **gpg binary** — 仅用于 PGP canary 验证(如果您正在使用 Tor,无论如何您都应该有这个)
### 用法
```
python d_mnemosyne.py
python d_mnemosyne.py --save # If not passed you will be prompted to save after scan
python d_mnemosyne.py --debug # Prints more verbose error output
python d_mnemosyne.py --batch # Multiple link batch scan
python d_mnemosyne.py --batch --aggressive # also queue discovered links for a future run
python d_mnemosyne.py --batch --aggressive --discovery-out # custom queue path (default: discovery_queue.txt)
```
**退出代码**(可脚本化)(目前可能无法正常工作):
- `0` — LOW 风险
- `1` — MEDIUM 风险
- `2` — HIGH 风险
- `3` — CRITICAL 风险
### 工作原理
1. **Tor 管理** — 使用 `stem` 检测 `127.0.0.1:9050` 上现有的 Tor 守护进程。如果未找到,则使用系统二进制文件和临时数据目录启动一个托管的 Tor 进程。在进行下一步之前,会等待完全引导完成。每次扫描前会通过 `NEWNYM` 请求一个新的线路。托管的进程在退出时干净地终止(或者会另行通知)。
2. **所有流量均通过 Tor 路由** — `requests` 会话使用 `socks5h://` 代理,这意味着主机名解析发生在 Tor 内部。这意味着 .onion 地址永远不会直接接触您的网络。
3. **信誉检查** — 在启动时通过 Tor 获取 Ahmia 滥用黑名单。目标主机会被哈希处理并与列表进行比对,如果发现是已知的因滥用或非法内容而被标记的地址,将会发出通知。
4. **仅进行静态 HTML 分析** — 根页面只会被获取一次,并使用 BeautifulSoup 进行解析。不执行任何 JavaScript。在静态 HTML 上执行的检查包括:script 标签枚举、外部资源泄露检测、内联事件处理器计数、表单分析以及指纹向量模式匹配(WebRTC、canvas、AudioContext 等)。
5. **已知文件探测** — 通过 Tor 获取 `/canary.txt`、`/pgp.txt`、`/.well-known/pgp-key.txt`、`/security.txt`、`/robots.txt` 和 `/sitemap.xml`。
6. **PGP canary 验证** — 如果同时找到了明文签名的 canary 和 PGP 公钥,则会在隔离的临时密钥环中使用 `gpg` 验证签名。如果发现指纹不匹配,则会将其标记为潜在的密钥替换攻击。
7. **风险评分** — 基于以下因素计算加权被动评分 (0–100):clearnet 重定向、外部资源泄露、clearnet 表单动作、clearnet 脚本源、canary 验证失败、缺失的安全标头、指纹向量以及黑名单状态。
8. **批量扫描** - 从文本文件中读取 .onion URL(每行一个),并在一个 Tor 会话中顺序扫描所有目标。输出为分组摘要报告。JSON (--save) 会生成一个合并的单一文件,而不是针对每个目标的文件。使用以下命令生成输入文件:python d_erebus.py --save-j
9. **发现 (--aggressive)** - 提取每个扫描页面上找到的出站 `.onion` 链接,并将新发现的(已去重)链接追加到发现队列文件中——纯文本格式,每行一个 URL,与任何 `--batch` 文件使用的格式相同。在此次运行中不会扫描额外内容;该队列旨在作为 `--batch` 文件在未来的运行中重新输入,这使得单次运行的持续时间变得可预测,而不是让一个充满链接的页面使其无限膨胀。
### 截图
##### 单个 URL 扫描



##### 如果以批处理模式运行(遵循 pipeline 或使用自定义的 .txt URL 列表)


###### 根据黑名单状态、可达性、去匿名化风险对输出进行分组
### 重要提示
- **系统必须安装 Tor。如果找不到二进制文件,该工具将退出并给出明确的错误信息和安装说明。**
- 自签名证书在 .onion 服务中很常见,并不会被视为风险信号——由于 v3 地址本身即是加密身份,因此针对 .onion 目标禁用了 TLS 验证。
- .onion 服务的响应速度可能明显慢于 clearnet。默认请求超时为 40 秒。在缓慢的隐藏服务上进行扫描可能需要几分钟的时间。
- 在任何阶段都不会打开浏览器,也绝不会执行 JavaScript,因此该工具无法评估动态行为,只能评估静态 HTML 响应中存在的内容(这通常仍然能提供大量信息)。
- 有意将 `Accept-Encoding` 从请求标头中排除,以防止收到压缩的二进制响应。
- well-known/ OMG 指导文件的扫描探测通常只有在扫描根域路径(如 / 而不是 /news)时才有参考价值

## Khaeos 控制中心
#### 针对 .onion 网站的持久化情报索引和时间序列情报追踪器。
#### 接收 Mnemosyne 的 JSON 输出,并构建一个包含每个站点完整扫描历史的可查询本地数据库。
### 环境要求
```
pip install fastapi uvicorn
```
### 用法
```
python d_khaeos.py # start the web UI (localhost:7777)
python d_khaeos.py --ingest # ingest a file, then exit
python d_khaeos.py --ingest --serve # ingest then start the UI
python d_khaeos.py --db # use a custom database path
```
支持单次扫描(`Mnemosyne_.json`)和批处理(`Mnemosyne_batch_.json`)输出文件。在重新导入时,重复的扫描(相同主机 + 相同扫描时间)将被静默跳过。
### 工作原理
1. **数据摄取** — 解析 Mnemosyne JSON(单次或批处理),将所有可达性、风险、标头、canary、脚本和资源数据提取到本地 SQLite 数据库中。每次扫描都会完整存储,关键字段也会作为可查询的列提取出来。批处理文件会作为命名的批次进行追踪,并包含聚合统计数据。
2. **站点画像** — 每个规范的 `.onion` 主机对应一行记录,并在每次导入时更新。跟踪所有扫描中的正常运行时间百分比、延迟滚动平均值、风险评分历史、黑名单状态、canary 有效性记录、clearnet 泄露标志以及安全标头计数。
3. **时间序列追踪** — 每次扫描都会单独存储,允许生成每个站点随时间变化的可达性、延迟、风险评分、安全标头和脚本数量图表;这使得观察不同扫描之间的风险评分偏移成为可能。
4. **类别推断** — 站点标题和摘要会与关键词列表进行匹配,从而自动分配类别(论坛、市场、聊天、电子邮件、新闻、wiki、泄露、加密货币、黑客攻击、托管、社交、搜索、隐私、服务)。类别也可以通过 UI 手动覆盖。
5. **以安全为核心的搜索** — 可以同时根据风险等级、可达性、黑名单状态、是否存在 clearnet 泄露、canary 有效性以及类别对结果进行筛选。排名优先展示信任信号,而不是相关性。
6. **持久化存储** — 所有数据都存储在一个单一的 SQLite 文件中(默认为 `khaeos.db`)。通过 `--db` 指定包含外部驱动器在内的任何路径,即可将数据库存储在您想要的任何位置。数据库会无限增长——扫描结果会永久累积,不会覆盖任何内容。
### Web UI
服务器启动时,UI 会自动在您的浏览器中打开,地址为 `http://127.0.0.1:7777`。它由四个标签页组成:
| 标签页 | 描述 |
|-----|-------------|
| **Index** | 可搜索、可筛选的站点列表,包含每个站点的安全徽章、正常运行时间和延迟。点击任何条目可查看包含时间序列图表的完整详细视图。 |
| **Overview** | 仪表板,展示风险分布、按类别划分的站点、批处理比较图表以及跨数据摄取的批处理趋势线。 |
| **Terminal** | 用于数据库查询和管理的命令行界面。 |
| **Journal** | 用于自由笔记、标签框和方向连接线的持久化画布。每 60 秒自动保存一次。 |
### 数据库
该数据库使用 SQLite 并启用了 WAL 模式。包含三个表:
| 表名 | 描述 |
|-------|-------------|
| `sites` | 每个规范主机对应一行。在每次导入时更新聚合统计数据。 |
| `scans` | 每次扫描运行对应一行。包含完整的 JSON 数据以及用于快速过滤的提取列。 |
| `batches` | 每次批处理导入对应一行。包含用于趋势分析的每个批次的聚合统计数据。 |
数据库文件是可移植的——可以将其复制以进行备份,在机器之间移动,或者使用任何 SQLite 浏览器直接打开。要使用外部驱动器:
```
python d_khaeos.py --db /Path/To/Drive/khaeos_folder/khaeos.db
```
可以添加一个 shell 别名,这样就永远不会忘记路径了:
```
alias khaeos='python /path/to/d_khaeos.py --db /Path/To/Drive/khaeos_folder/khaeos.db'
```
### 重要提示
- **Khaeos 不会进行任何扫描。** 它纯粹是一个存储和可视化层。所有扫描均由 Mnemosyne 执行。它是一个不暴露于互联网的本地 Web 应用。
- 数据库会无限累积扫描历史。没有自动修剪机制。磁盘使用量会随着站点数量和扫描频率的增加而成比例增长。
- 批处理聚合统计数据(平均风险评分、可达性等)是在数据摄取时计算的,如果以后通过 `db --delete-row`(Terminal 命令)删除了单个扫描记录,这些数据将不会重新计算。
- `khaeos_journal.json` 会与 `khaeos.db` 保存在同一位置,用于在不同会话之间保留 Journal 画布。在对数据库目录进行任何备份时,应同时包含这两个文件。
## 其他(可能有用的)工具
1. `pgp_verify.py`
- 验证 PGP 签名(阅读文件中的注释)(或者直接尝试一下,它是非常直观的)
[返回顶部](#dark-web-osint)
标签:ESC4, OSINT, Python, TCP SYN 扫描, Web UI, 多模态安全, 数据泄露, 无后门, 暗网情报, 逆向工具