关于 open-tor
OpenTor 是供 OpenCode 使用的 Tor 暗网调查技能,面向 OSINT 和事件响应工作。它将搜索、抓取和实体提取交给 Python CLI 工具,并要求先查公开网络,再用证据标签区分观察与推断。
主要功能
- 01通过 Tor 查询暗网搜索引擎
- 02经 Tor 获取 URL 页面内容
- 03轮换 Tor circuit 并检查引擎状态
- 04提取邮件、加密货币和 onion 地址等实体
- 05支持 JSON、CSV、STIX、MISP 和文本输出
- 06按观察、推断与不确定性标注调查发现
适用场景
- 01结合公开情报调查勒索软件组织
- 02核查企业是否出现在泄露信息中
- 03抓取并检查暗网泄露目录
- 04整理带证据状态的事件响应报告
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ vichhka-git/ opentor --skill open-tor安装后在 Claude Code 中输入/open-tor确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
.gitignore.env.exampleLICENSECORE_ENGINE.mdREADME.mdEXAMPLES.mdrequirements.txtassets/report-template.mddatabase/.gitkeepreferences/safety.mdtroubleshooting.mdscripts/engines.pycrawl.py__init__.pyosint.pyopentor.pydb.pysetup.pywatch.pytorcore.py详细介绍
OpenTor — OpenCode 暗网访问
OpenTor 采用编排器-协调器架构。你(编排器)负责智能决策。scripts/ 中的 Python 模块是机械工具——它们通过 Tor 路由流量、查询搜索引擎并抓取网页。所有策略决策都由你做出。
⚠️ 权限处理
运行任何需要 sudo 的命令之前,都要向用户询问 sudo 密码。 切勿假设你已获得密码。如果命令因“Permission denied”而失败,请立即询问用户。常见情况:
sudo systemctl start tor— 启动 Tor 守护进程sudo apt install tor— 安装 Torsudo 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
示例: 调查一家据称遭到入侵的公司:
- 明网:搜索“公司名称 ransomware leak” → 找到团伙名称、追踪页面、洋葱地址
- 优化:定位已识别的泄露博客网址,搜索针对受害者的关键词
- 暗网:爬取泄露目录 → 发现部门文件夹、数据库备份、合同
- 综合:将暗网发现与公开威胁情报交叉核对 → 生成 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 engines | Ping 全部 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”
- 先查明网: 在 Google/DuckDuckGo 上搜索“X”,了解背景
- 优化: 根据明网结果,找出相关的 .onion 地址、团伙名称和关键词
- 检查 Tor:
python3 {baseDir}/scripts/opentor.py check— 如果 Tor 未激活,则中止 - 检查引擎:
python3 {baseDir}/scripts/opentor.py engines— 记录正常运行的引擎 - 搜索暗网:
python3 {baseDir}/scripts/opentor.py search "refined keywords" --mode threat_intel - 获取有价值的网址: 对排名靠前的结果运行
python3 {baseDir}/scripts/opentor.py fetch "URL" - 综合: 结合明网背景和暗网发现,由你完成分析。
“company.com 是否已被泄露?”
- 明网: 搜索“company.com ransomware breach leaked”,查找追踪页面
- 识别: 哪个勒索软件团伙?洋葱地址是什么?事件发生在何时?
- 检查 Tor → 搜索暗网:
opentor.py search "company data" --mode corporate - 如果第 1 步找到了 .onion 地址,则获取具体的泄露网站
- 将结果综合为企业 OSINT 报告(参见下文的分析提示词)
“调查勒索软件组织 X”
- 明网: 研究组织 X——TTP、已知的 .onion 地址、受害者数量、IOC
- 查找泄露站点: 查找该组织的 .onion 博客地址(ransomware.live 会追踪这些地址)
- 检查 Tor → 获取泄露站点:
opentor.py fetch "http://group.onion" - 搜索受害者:
opentor.py search "GROUP victim" --mode ransomware - 提取 IOC 并综合整理成一份勒索软件情报报告
“发现数据泄露目录时”
如果你发现了泄露的数据目录(Apache 索引、nginx 自动索引、JSON API、
HTML 文件列表等),不要依赖固定的解析器。使用 fetch() 获取原始
内容,查看其格式,并针对实际格式编写专用解析器。
- 获取目录列表:
python3 {baseDir}/scripts/opentor.py fetch "URL" --json - 查看格式: 是 Apache 索引、nginx、JSON API 还是 HTML 表格?
- 直接编写解析器,以匹配观察到的格式:
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
"
- 至少深入验证 2 层,再将内容报告为
✓ Observed - 按照规则 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:公开修订,不要悄悄更改
如果新证据与先前的发现相矛盾:
- 陈述带有原始标签的原始发现
- 陈述附有来源的新发现
- 说明发生了什么变化以及原因
- 更新依赖原始发现的下游结论
更正自己的结论有助于建立信任。报告是一份持续更新的文档,而非最终裁决。利益相关方明白,随着发现更多数据,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 | .onion | Tor 上的 DDG |
| Ahmia-clearnet | clearnet | 仅在使用 --include-clearnet 时使用 |
模式 → 引擎路由
| 模式 | 首选引擎 |
|---|---|
| threat_intel | 所有在线引擎 |
| ransomware | Ahmia、Tor66、Excavator、Ahmia-clearnet(+ 种子博客) |
| personal_identity | Ahmia、OnionLand、Tor66、DuckDuckGo-Tor、Ahmia-clearnet |
| corporate | Ahmia、Excavator、Tor66、TheDeepSearches、Ahmia-clearnet |
核心原则
- 优先使用明网,再使用暗网。 在访问 Tor 之前,务必先从公开来源收集背景信息。这是开展有效调查最重要的原则。
- 由你主导调查。 Python 代码负责查询和抓取。由你决定搜索什么、追踪哪些结果,以及如何解读发现。
- 根据观察到的格式调整方法。 遇到数据泄露目录列表时,使用
fetch()获取原始内容,观察其格式,并针对实际内容编写专用解析器。文件夹名称只是猜测,只有爬取到的内容才是事实。 - 报告事实,不要猜测。 每项断言都必须标记为
✓ Observed、⚡ Inferred、❓ Uncertain或🤖 AI Analysis。如果有不清楚的地方,请明确说明。绝不要用假设填补空白。 - 提高效率。 暗网查询速度较慢(每次搜索需 30-60 秒)。请做好规划,并使用简短的关键词查询(≤5 个词)。
- 询问密码。 如果命令因“Permission denied”而失败或需要 sudo,请先询问用户,再重试。绝不要假定自己拥有 root 权限。
- 内容安全。 引擎内置了非法内容黑名单,无法禁用。
- 保持透明。 告知用户流量会通过 Tor 路由。注意标明 .onion 站点离线的情况(状态为 0)。
- 明网噪声过滤由你负责。 暗网搜索引擎返回的结果可能噪声大、相关性低,Tor 搜索结果中经常会出现明网垃圾链接。你(大模型)有责任过滤明网噪声、评估相关性,并决定追踪哪些结果。未经筛选,不要将搜索引擎的原始输出直接提供给用户。
参考文件
README.md— 项目概览、安装和快速入门CORE_ENGINE.md— 所有模块的完整 API 参考EXAMPLES.md— 端到端使用示例references/safety.md— 内容安全与负责任使用references/troubleshooting.md— 常见问题及解决方法