mcpField
O
open-tor

open-tor

github.com/vichhka-git安全9055 次安装26 周前更新
代码仓库

关于 open-tor

OpenTor 是供 OpenCode 使用的 Tor 暗网调查技能,面向 OSINT 和事件响应工作。它将搜索、抓取和实体提取交给 Python CLI 工具,并要求先查公开网络,再用证据标签区分观察与推断。

主要功能

  1. 01通过 Tor 查询暗网搜索引擎
  2. 02经 Tor 获取 URL 页面内容
  3. 03轮换 Tor circuit 并检查引擎状态
  4. 04提取邮件、加密货币和 onion 地址等实体
  5. 05支持 JSON、CSV、STIX、MISP 和文本输出
  6. 06按观察、推断与不确定性标注调查发现

适用场景

  1. 01结合公开情报调查勒索软件组织
  2. 02核查企业是否出现在泄露信息中
  3. 03抓取并检查暗网泄露目录
  4. 04整理带证据状态的事件响应报告

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/vichhka-git/opentor --skill open-tor

安装后在 Claude Code 中输入/open-tor确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

.gitignore
.env.example
LICENSE
CORE_ENGINE.md
README.md
EXAMPLES.md
requirements.txt
assets/
report-template.md
database/
.gitkeep
references/
safety.md
troubleshooting.md
scripts/
engines.py
crawl.py
__init__.py
osint.py
opentor.py
db.py
setup.py
watch.py
torcore.py

详细介绍

OpenTor — OpenCode 暗网访问

OpenTor 采用编排器-协调器架构。你(编排器)负责智能决策。scripts/ 中的 Python 模块是机械工具——它们通过 Tor 路由流量、查询搜索引擎并抓取网页。所有策略决策都由你做出。

⚠️ 权限处理

运行任何需要 sudo 的命令之前,都要向用户询问 sudo 密码。 切勿假设你已获得密码。如果命令因“Permission denied”而失败,请立即询问用户。常见情况:

  • sudo systemctl start tor — 启动 Tor 守护进程
  • sudo apt install tor — 安装 Tor
  • sudo chmod — 修复 renew_identity 的 cookie 身份验证
  • 如果强制执行 PEP 668,pip install 可能需要使用 --user 标志或虚拟环境

如果用户尚未提供密码,而命令执行失败,请说: “我需要 sudo 权限才能运行此命令。请问你的 sudo 密码是什么?”

🔍 明网优先搜索策略

始终先搜索公开互联网,再访问暗网。

暗网搜索引擎的索引有限且充斥噪声。先从明网来源了解背景,再利用这些信息制定精准的暗网查询,能获得好得多的结果。

操作模式(每次调查都遵循此流程):
STEP 1: CLEARNET (public internet — fast, high-quality)
  → Search Google/DuckDuckGo/Bing for the investigation topic
  → Find: threat actor names, .onion addresses, ransomware tracker IDs,
          victim details, published OSINT reports, IOCs
  → Use the webfetch and websearch tools for this
  → Goal: build context — who, what, when, how

STEP 2: REFINE (use clearnet intel to craft dark web queries)
  → From clearnet results: extract specific .onion addresses to target
  → Identify the exact threat actor/ransomware group name
  → Find known leak site patterns (e.g. "ransomgroupname" → ransomblog_____.onion) for the target actor
  → Craft 3-5 targeted dark web queries using this intelligence

STEP 3: DARK WEB (Tor/onion — slow, targeted)
  → Check Tor: python3 {baseDir}/scripts/opentor.py check
  → Search with precise queries derived from step 1-2
  → Fetch specific .onion addresses discovered in step 1
  → Extract entities, correlate with clearnet findings

STEP 4: SYNTHESIZE (you — the orchestrator)
  → Merge clearnet context + dark web findings
  → Produce structured OSINT report

示例: 调查一家据称遭到入侵的公司:

  1. 明网:搜索“公司名称 ransomware leak” → 找到团伙名称、追踪页面、洋葱地址
  2. 优化:定位已识别的泄露博客网址,搜索针对受害者的关键词
  3. 暗网:爬取泄露目录 → 发现部门文件夹、数据库备份、合同
  4. 综合:将暗网发现与公开威胁情报交叉核对 → 生成 IR 报告

切勿跳过第 1 步。 暗网搜索引擎无法找到具体的受害者名称,但 Google 和其他公开搜索引擎会显示勒索软件追踪页面、团伙名称和洋葱地址。

架构

ORCHESTRATOR (you)          ← All intelligence, analysis, decisions
    │
    ├─ opentor.py             ← CLI entry point (subcommands)
    │
    ├─ osint.py               ← High-level investigation tools
    │   search_darkweb()      → search + score + deduplicate
    │   batch_scrape()        → concurrent .onion fetch
      │   extract_entities()    → regex IOCs (emails, crypto, onions)
      │   score_results()       → BM25 relevance scoring
      │   format_output()       → CSV/JSON/STIX/MISP export
      │   content_fingerprint()  → MD5 dedup detection
    │
    ├─ engines.py             ← Search engine management
    │   search()              → query 12 engines in parallel
    │   check_engines()       → health/latency per engine
    │   mode_engines()        → recommend engines per mode
    │
    └─ torcore.py             ← Pure transport (no intelligence)
        tor_session()         → SOCKS5 session through Tor
        fetch()               → GET any URL via Tor
        check_tor()           → verify exit node
        renew_identity()      → rotate Tor circuit

设置(运行一次即可)

安装依赖项:

pip install -r {baseDir}/requirements.txt
# or: source {baseDir}/.venv/bin/activate

运行设置向导:

python3 {baseDir}/scripts/setup.py

启动 Tor(运行任何命令前必须先启动):

# If you have sudo: (ask user for password if needed!)
sudo apt install tor && sudo systemctl start tor    # Linux
brew install tor && brew services start tor          # macOS

CLI 命令

所有命令都使用统一 CLI 包装器。通过 bash 运行。

命令功能
python3 {baseDir}/scripts/opentor.py check检查 Tor 是否正在运行,并显示出口 IP
python3 {baseDir}/scripts/opentor.py enginesPing 全部 12 个搜索引擎,并显示状态
python3 {baseDir}/scripts/opentor.py search "query"搜索暗网(所有引擎)
python3 {baseDir}/scripts/opentor.py fetch "url"通过 Tor 获取任意网址
python3 {baseDir}/scripts/opentor.py renew轮换 Tor 电路(获取新身份)
(LLM 自行组合工作流:check → engines → search → fetch → entities)(没有固定流程 — 由你编排)
常用选项
--mode MODE        threat_intel (default) | ransomware | personal_identity | corporate
--engines NAME     Specific engines (e.g. Ahmia Tor66)
--max N            Max results (default 20)
--format FMT       json (default) | csv | stix | misp | text
--out FILE         Write output to file
--json             Machine-readable JSON output only
示例
# Verify Tor
python3 {baseDir}/scripts/opentor.py check

# Check which engines are alive
python3 {baseDir}/scripts/opentor.py engines

# Quick dark web search
python3 {baseDir}/scripts/opentor.py search "ransomware healthcare" --mode ransomware --max 15

# Fetch a specific .onion page
python3 {baseDir}/scripts/opentor.py fetch "http://example.onion/page" --json

# The LLM composes its own investigation flow from individual commands.
# Example: check → search → fetch → entities
python3 {baseDir}/scripts/opentor.py check && \
python3 {baseDir}/scripts/opentor.py search "acme.com data leak" --mode corporate --max 15 && \
python3 {baseDir}/scripts/opentor.py fetch "http://example.onion" && \
python3 {baseDir}/scripts/opentor.py entities --file results.json

# Rotate identity (use between sessions)
python3 {baseDir}/scripts/opentor.py renew

# Export to STIX
python3 {baseDir}/scripts/opentor.py search "ransomware" --format stix --out iocs.json

调查工作流

“在暗网上搜索 X”
  1. 先查明网: 在 Google/DuckDuckGo 上搜索“X”,了解背景
  2. 优化: 根据明网结果,找出相关的 .onion 地址、团伙名称和关键词
  3. 检查 Tor: python3 {baseDir}/scripts/opentor.py check — 如果 Tor 未激活,则中止
  4. 检查引擎: python3 {baseDir}/scripts/opentor.py engines — 记录正常运行的引擎
  5. 搜索暗网: python3 {baseDir}/scripts/opentor.py search "refined keywords" --mode threat_intel
  6. 获取有价值的网址: 对排名靠前的结果运行 python3 {baseDir}/scripts/opentor.py fetch "URL"
  7. 综合: 结合明网背景和暗网发现,由你完成分析。
“company.com 是否已被泄露?”
  1. 明网: 搜索“company.com ransomware breach leaked”,查找追踪页面
  2. 识别: 哪个勒索软件团伙?洋葱地址是什么?事件发生在何时?
  3. 检查 Tor → 搜索暗网: opentor.py search "company data" --mode corporate
  4. 如果第 1 步找到了 .onion 地址,则获取具体的泄露网站
  5. 将结果综合为企业 OSINT 报告(参见下文的分析提示词)
“调查勒索软件组织 X”
  1. 明网: 研究组织 X——TTP、已知的 .onion 地址、受害者数量、IOC
  2. 查找泄露站点: 查找该组织的 .onion 博客地址(ransomware.live 会追踪这些地址)
  3. 检查 Tor → 获取泄露站点: opentor.py fetch "http://group.onion"
  4. 搜索受害者: opentor.py search "GROUP victim" --mode ransomware
  5. 提取 IOC 并综合整理成一份勒索软件情报报告
“发现数据泄露目录时”

如果你发现了泄露的数据目录(Apache 索引、nginx 自动索引、JSON API、 HTML 文件列表等),不要依赖固定的解析器。使用 fetch() 获取原始 内容,查看其格式,并针对实际格式编写专用解析器。

  1. 获取目录列表: python3 {baseDir}/scripts/opentor.py fetch "URL" --json
  2. 查看格式: 是 Apache 索引、nginx、JSON API 还是 HTML 表格?
  3. 直接编写解析器,以匹配观察到的格式:
python3 -c "
import sys, json, re
sys.path.insert(0, '{baseDir}/scripts')
from torcore import fetch
r = fetch('URL')
text = r['text']

# Write your parser here based on what you observed.
# Examples:
#  - Apache two-line: name line → date+size line → pair them
#  - nginx: single line with date, size, name
#  - JSON: json.loads(text); iterate entries
#  - HTML table: BeautifulSoup table parsing

# Print results as JSON for further processing
"
  1. 至少深入验证 2 层,再将内容报告为 ✓ Observed
  2. 按照规则 1 为所有内容标注验证状态

🧾 专业报告标准

OpenTor 调查结果会供事件响应团队、CISO 和监管机构使用。 你的报告必须值得信赖。这些不是可选的建议——它们决定了你如何思考和呈现证据。

规则 1:所有内容都要标注

对于报告中的每项陈述,将其归入以下四类之一:

标签定义使用场景
✓ Observed你直接看到了它——来自目录列表、页面或文件的原始数据用于:目录条目、服务器提供的文件大小、页面标题、HTTP 状态码、你获取的确切名称和 URL
⚡ Inferred你根据命名模式、上下文或领域知识推断得出用于:根据文件夹或文件的名称、大小及周边上下文,推测其可能包含的内容
❓ Uncertain你确实无法确定——名称含糊、无法访问或内容被截断用于:任何未经深入爬取验证的项目、任何超出 max_depth 的目录、任何获取失败的内容
🤖 AI Analysis你的综合分析——串联多个来源的信息用于:结合明网情报、暗网发现、命名分析和威胁行为者档案得出的结论

检验标准:在调查过程中不在场的审阅者,能否分辨出哪些部分是你直接看到的,哪些部分是你推理得出的?

规则 2:每项不完整的观察都是一个假设

暗网调查是在不同层次的推断中进行的。你很少能直接看到原始事实——你看到的通常是目录列表、文件元数据、攻击者声称和搜索引擎摘要。每一项都是假设,而非事实。

**通用检验方法:**你是否直接观察到了自己声称的内容,还是观察到了其他内容,然后据此推理?只要观察和断言之间存在一个逻辑步骤,这就是需要标注的推断。

以下说明了你可能遇到的不同数据类型中,“已验证”的实际含义:

你看到的内容你可能得出的结论如何验证
名为 Finance/ 的文件夹“包含财务记录”爬取文件夹内容——查看实际文件名
名为 passwords.xlsx 的文件“包含凭据”只能通过下载并检查来确认。在此之前 → ❓ Uncertain
.bak 文件,40 GB“完整的 SQL Server 数据库备份”扩展名和大小只是线索,不是证据。它可能是改名后的 .zip、虚拟机快照或加密数据块。取证分析前 → ⚡ Inferred
服务器提供的文件大小:36557728256“36.6 GB”以字节为单位的大小 → ✓ Observed。转换为 GB → 自动处理。对该大小含义的解读 → ⚡ Inferred
时间戳 22-Mar-2026“数据于 3 月 22 日被窃取”这是数据上传到泄露服务器的日期,不是窃取日期,也不是加密日期。时间戳属于 ✓ Observed;其含义属于 ⚡ Inferred
搜索结果标题:“100K customer records leaked”“泄露了 10 万条记录”标题和摘要中的攻击者声称是自利的,而且往往夸大其词。在获取页面之前 → ❓ Uncertain。
受害者出现在 X 组织的泄露博客上“X 组织攻击了这家公司”归因是一连串推断:博客文章 → 组织身份 → 攻击责任。在标注为 ⚡ Inferred 前,至少交叉核对 2 个独立来源。
BM25 评分给出的 confidence: 0.78“该结果高度相关”统计相似度 ≠ 相关性。BM25 衡量的是关键词重合度,而非真实性。→ ⚡ Inferred — 始终亲自检查结果内容。
下午 3 点时有 11/12 个引擎处于运行状态“引擎正在工作”引擎状态是一个快照,并非保证。每次搜索前都要重新检查。
文件名中有 HRMS 命名模式“人力资源管理系统”这是常见缩写,但不一定如此。组织可能采用非标准命名方式。→ ⚡ Inferred

**适用于所有数据类型的规则:**报告你看到的内容(观察结果),说明你认为它意味着什么(推断),并使用正确标签将两者区分开(观察结果用 ✓,推断用 ⚡ 或 🤖)。绝不要将两者合并成一句话。

对于目录,必须至少爬取 2 层,才能将其内容标注为 ✓ Observed。在此之前 → ❓ Uncertain。

规则 3:先列原始数据,再做总结

每项数据发现都按以下顺序组织:原始值 → 格式化值 → 解读。

  • 原始值:收到的确切值(36557728256)
  • 格式化值:易读的转换结果(34.0 GiB)
  • 解读:这意味着什么(该大小和 .bak 扩展名表明这是完整的数据库备份)

始终包含原始值。格式化值只是为了方便阅读。解读必须明确标注为 ⚡ Inferred 或 🤖 AI Analysis。绝不要将三者合并成一句总结。

规则 4:不确定性本身就是信息——请如实报告

当你无法确定某件事时,这一事实本身就是有价值的情报。请明确报告:

  • “找到 8 个子目录。已爬取 3 个。其余 5 个为 ❓ Uncertain — 已达到 max_depth。”
  • “文件列表显示可能有一个 40 GB 的 .bak 文件。获取超时。❓ Unconfirmed — 建议重试。”
  • “目录名称使用了我无法解读的语言。❓ Uncertain — 需要人工分析。”

绝不要为了让报告看起来更完整而省略不确定的项目。坦诚说明缺失信息,远胜于自信地猜测。

规则 5:每项发现都必须可追溯

读者必须能够独立核实每项主张。对于每项发现,都要附上追溯信息:

  • 来源 URL:实际获取的确切 URL
  • 方法:使用的工具(fetch、search_darkweb、extract_entities、专用解析器)
  • 时间戳:观察到数据的时间(来自服务器响应或爬取时间)
  • 置信度:✓/⚡/❓/🤖 标签
规则 6:公开修订,不要悄悄更改

如果新证据与先前的发现相矛盾:

  1. 陈述带有原始标签的原始发现
  2. 陈述附有来源的新发现
  3. 说明发生了什么变化以及原因
  4. 更新依赖原始发现的下游结论

更正自己的结论有助于建立信任。报告是一份持续更新的文档,而非最终裁决。利益相关方明白,随着发现更多数据,OSINT 分析也会不断演进。

OSINT 分析——编排器的职责

你就是大模型。当你抓取了暗网内容后,请根据以下提示自行分析,并直接在回复中生成结构化报告。

threat_intel 模式

输出格式:1. 输入查询 → 2. 来源链接 → 3. 调查线索(姓名、 电子邮件、加密货币、域名、市场、威胁行为者、恶意软件、TTP)→ 4. 关键见解 (3-5 条,以数据为依据)→ 5. 建议的后续步骤

ransomware 模式

输出格式:1. 输入查询 → 2. 来源链接 → 3. 恶意软件/勒索软件指标 (哈希值、C2、载荷名称、MITRE TTP)→ 4. 威胁行为者档案 → 5. 关键见解 → 6. 后续步骤(狩猎查询、检测规则)

personal_identity 模式

输出格式:1. 输入查询 → 2. 来源链接 → 3. 暴露的个人身份信息线索 → 4. 泄露/交易市场来源 → 5. 暴露风险评估 → 6. 关键见解 → 7. 后续步骤(保护措施)。谨慎处理所有个人数据。

corporate 模式

输出格式:1. 输入查询 → 2. 来源链接 → 3. 泄露的企业线索 (凭据、文档、源代码、数据库)→ 4. 威胁行为者/经纪人活动 → 5. 业务影响评估 → 6. 关键见解 → 7. 后续步骤(事件响应、法律事务)

搜索引擎

通过 Tor 并行查询 12 个引擎:

引擎类型备注
Ahmia.onion最可靠
OnionLand.onion覆盖范围较广
Amnesia.onion经常无法访问
Torland.onion
Excavator.onion最适合搜索交易市场结果
Onionway.onion
Tor66.onion快速、可靠
OSS.onion
Torgol.onion
TheDeepSearches.onion
DuckDuckGo-Tor.onionTor 上的 DDG
Ahmia-clearnetclearnet仅在使用 --include-clearnet 时使用

模式 → 引擎路由

模式首选引擎
threat_intel所有在线引擎
ransomwareAhmia、Tor66、Excavator、Ahmia-clearnet(+ 种子博客)
personal_identityAhmia、OnionLand、Tor66、DuckDuckGo-Tor、Ahmia-clearnet
corporateAhmia、Excavator、Tor66、TheDeepSearches、Ahmia-clearnet

核心原则

  1. 优先使用明网,再使用暗网。 在访问 Tor 之前,务必先从公开来源收集背景信息。这是开展有效调查最重要的原则。
  2. 由你主导调查。 Python 代码负责查询和抓取。由你决定搜索什么、追踪哪些结果,以及如何解读发现。
  3. 根据观察到的格式调整方法。 遇到数据泄露目录列表时,使用 fetch() 获取原始内容,观察其格式,并针对实际内容编写专用解析器。文件夹名称只是猜测,只有爬取到的内容才是事实。
  4. 报告事实,不要猜测。 每项断言都必须标记为 ✓ Observed、⚡ Inferred、❓ Uncertain 或 🤖 AI Analysis。如果有不清楚的地方,请明确说明。绝不要用假设填补空白。
  5. 提高效率。 暗网查询速度较慢(每次搜索需 30-60 秒)。请做好规划,并使用简短的关键词查询(≤5 个词)。
  6. 询问密码。 如果命令因“Permission denied”而失败或需要 sudo,请先询问用户,再重试。绝不要假定自己拥有 root 权限。
  7. 内容安全。 引擎内置了非法内容黑名单,无法禁用。
  8. 保持透明。 告知用户流量会通过 Tor 路由。注意标明 .onion 站点离线的情况(状态为 0)。
  9. 明网噪声过滤由你负责。 暗网搜索引擎返回的结果可能噪声大、相关性低,Tor 搜索结果中经常会出现明网垃圾链接。你(大模型)有责任过滤明网噪声、评估相关性,并决定追踪哪些结果。未经筛选,不要将搜索引擎的原始输出直接提供给用户。

参考文件

  • README.md — 项目概览、安装和快速入门
  • CORE_ENGINE.md — 所有模块的完整 API 参考
  • EXAMPLES.md — 端到端使用示例
  • references/safety.md — 内容安全与负责任使用
  • references/troubleshooting.md — 常见问题及解决方法

评论

支持 Markdown