open-tor について
OpenTor は、OSINT やインシデント対応向けの OpenCode 用 Tor 調査スキルです。検索、ページ取得、エンティティ抽出を Python の CLI ツールで行い、公開ウェブを先に調べ、観察事実と推論を分けて記録します。
主な機能
- 01Tor 経由でダークウェブ検索エンジンを検索
- 02Tor 経由で URL のページ内容を取得
- 03エンジン状態の確認と Tor 回線の切り替え
- 04メール、暗号資産、.onion アドレスなどの抽出
- 05JSON、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— 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
例: 侵害されたと考えられる企業を調査する場合:
- クリアネット:「企業名 ランサムウェア 流出」を検索 → グループ名、トラッカーのエントリー、onion アドレスを見つける
- 絞り込み:特定した流出ブログの URL を対象にし、被害者固有のキーワードを検索する
- ダークウェブ:流出ディレクトリをクロール → 部門フォルダー、データベースのバックアップ、契約書を発見する
- 統合:ダークウェブでの調査結果を公開されている脅威インテリジェンスと照合し、IR レポートを作成する
手順 1 を省略しないでください。 ダークウェブの検索エンジンでは、特定の被害者名は見つかりません。しかし、Google などの公開検索エンジンなら、ランサムウェアのトラッカー、グループ名、onion アドレスが見つかります。
アーキテクチャ
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
セットアップ(1 回のみ実行)
依存関係をインストールします:
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 | 12 個すべての検索エンジンに ping を実行し、ステータスを表示します |
python3 {baseDir}/scripts/opentor.py search "query" | ダークウェブを検索します(すべてのエンジン) |
python3 {baseDir}/scripts/opentor.py fetch "url" | Tor 経由で任意の URL を取得します |
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— 有効でなければ中止します - エンジンを確認:
python3 {baseDir}/scripts/opentor.py engines— 稼働中のものを記録します - ダークウェブを検索:
python3 {baseDir}/scripts/opentor.py search "refined keywords" --mode threat_intel - 有望な URL を取得: 上位の検索結果に対して
python3 {baseDir}/scripts/opentor.py fetch "URL"を実行します - 統合: クリアネットの状況とダークウェブの調査結果を組み合わせます。分析はあなたが行います。
「company.com は情報を流出させられていますか?」
- クリアネット: 「company.com ransomware breach leaked」を検索し、トラッカーを見つけます
- 特定: どのランサムウェアグループか? どの .onion アドレスか? 発生したのはいつか?
- 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 の autoindex、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
"
- 内容を
✓ Observedとして報告する前に、少なくとも 2 階層下まで検証してください - ルール 1 に従って、すべてに検証ステータスのラベルを付けてください
🧾 プロフェッショナルな報告基準
OpenTor の調査結果は、インシデント対応チーム、CISO、規制当局に使用されます。 レポートは信頼できるものでなければなりません。これらは任意のガイドラインではなく、証拠の考え方と提示方法を定めるものです。
ルール 1:すべてにラベルを付ける
レポート内のすべての記述を、次の 4 つのカテゴリのいずれかに分類してください。
| ラベル | 定義 | 使用する場面 |
|---|---|---|
✓ Observed | 直接確認したもの — 一覧、ページ、ファイルから取得した生データ | 次の場合に使用:ディレクトリエントリ、サーバーから取得したファイルサイズ、ページタイトル、HTTP ステータスコード、取得した正確な名前と URL |
⚡ Inferred | 命名パターン、コンテキスト、ドメイン知識から推測したもの | 次の場合に使用:名前、サイズ、周辺のコンテキストに基づき、フォルダーやファイルに含まれている可能性が高い内容の解釈 |
❓ Uncertain | 実際に判断できないもの — 曖昧な名前、アクセス不能、途中で切り捨てられたもの | 次の場合に使用:より深くクロールして検証していない項目、max_depth を超えるディレクトリ、取得に失敗したもの |
🤖 AI Analysis | 複数の情報源を結び付けた統合分析 | 次の場合に使用:クリアネットの情報 + ダークウェブの調査結果 + 命名分析 + 脅威アクターのプロファイルを組み合わせて導いた結論 |
確認方法:調査に立ち会っていないレビュー担当者が、直接確認した内容と推論した内容を 見分けられるでしょうか?
ルール 2:不完全な観察はすべて仮説です
ダークウェブ調査では、複数の層にわたる推論が行われます。生の真実を直接目にすることはほとんどありません。目にするのは、ディレクトリの一覧、ファイルのメタデータ、攻撃者の主張、検索エンジンのスニペットなどです。どれも事実ではなく、仮説です。
すべてに適用できる確認方法: 主張している事柄を直接観察しましたか。それとも別のものを観察し、そこから推論しましたか。観察と主張の間に論理的な段階が一つでもあるなら、それはラベルを付ける必要がある推論です。
ここで遭遇するさまざまなデータ型について、「検証済み」の意味を説明します。
| 目にしたもの | 推測しうること | 検証方法 |
|---|---|---|
Finance/という名前のフォルダー | 「財務記録が含まれている」 | 中をクロールして、実際のファイル名を確認します |
passwords.xlsxという名前のファイル | 「認証情報が含まれている」 | ダウンロードして検査しない限り、確認できません。それまでは → ❓ Uncertain |
40 GB の.bakファイル | 「SQL Serverの完全なデータベースバックアップ」 | 拡張子とサイズは手掛かりであり、証拠ではありません。名前を変更した.zip、VMスナップショット、暗号化されたデータの可能性があります。フォレンジック分析までは → ⚡ 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 | 「Human Resources Management System」 | 一般的な略語ですが、必ずしもそうとは限りません。組織が標準外の命名をしている可能性があります。→ ⚡ Inferred |
どのデータ型にも適用されるルール: 目にしたもの(観察)を報告し、それが何を意味すると思うか(推論)を述べ、正しいラベル(観察には✓、推論には⚡または🤖)を付けて区別してください。両者を一つの記述にまとめてはいけません。
ディレクトリについては、内容に✓ Observedのラベルを付ける前に、最低2階層をクロールする必要があります。それまでは → ❓ Uncertain。
ルール 3:まず生データ、その後に要約
データに関する各調査結果は、生データ → 整形 → 解釈の順に構成してください。
- 生データ:受け取った正確な値(
36557728256) - 整形:人が読みやすい形式への変換(
34.0 GiB) - 解釈:それが意味すること(「このサイズと.bak拡張子から、完全なデータベースバックアップの可能性が考えられます」)
必ず生の値を含めてください。整形した値は便宜上のものです。解釈には、⚡ Inferredまたは🤖 AI Analysisのラベルを明確に付ける必要があります。この3つを一つの要約文にまとめてはいけません。
ルール 4:不確実性も情報です — 報告してください
何かを判断できないとき、その事実自体が貴重な情報です。明示的に報告してください。
- 「サブディレクトリを8個発見しました。3個をクロールしました。残り5個は
❓ Uncertainです — max_depthに達しました。」 - 「ファイル一覧から40 GBの.bakファイルがあると考えられます。取得はタイムアウトしました。
❓ Unconfirmed— 再試行を推奨します。」 - 「ディレクトリ名は解釈できない言語です。
❓ Uncertain— 人間のアナリストによる確認が必要です。」
報告をより完全に見せるために、不確実な項目を省略してはいけません。自信に満ちた推測よりも、正直に示された情報の欠落のほうが価値があります。
ルール 5:すべての調査結果を追跡可能にする
読者がすべての主張を独自に検証できるようにします。各調査結果には、以下の追跡情報を含めてください。
- ソース URL:取得した正確な URL
- 方法:使用したツール(fetch、search_darkweb、extract_entities、専用パーサー)
- タイムスタンプ:データが確認された時刻(サーバーの応答またはクロール時刻に基づく)
- 信頼度:
✓/⚡/❓/🤖のラベル
ルール 6:黙って修正せず、公開して修正する
新たな証拠が以前の調査結果と矛盾する場合:
- 元のラベルを付けて、当初の調査結果を示します
- 新たな調査結果とその情報源を示します
- 何が、なぜ変わったのかを説明します
- 当初の調査結果に依存していた後続の結論を更新します
自分の誤りを正すことで信頼が築かれます。レポートは最終的な判断ではなく、更新され続ける文書です。データがさらに明らかになるにつれ、OSINT の内容も変化することを関係者は理解しています。
OSINT 分析 — オーケストレーターの役割
あなた自身が LLM です。ダークウェブのコンテンツをスクレイピングしたら、以下のプロンプトをガイドとして自ら分析してください。応答内で構造化されたレポートを直接作成します。
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. 露出した個人を特定できる情報(PII) → 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 の検索結果に含まれることもよくあります。クリアネットのノイズを除外し、関連性を評価して、どの結果を追うかを決めるのは、あなた(LLM)の役割です。精査せずにエンジンの生の出力をユーザーに渡してはいけません。
参考ファイル
README.md— プロジェクトの概要、インストール、クイックスタートCORE_ENGINE.md— すべてのモジュールの完全な API リファレンスEXAMPLES.md— エンドツーエンドの使用例references/safety.md— コンテンツの安全性と責任ある使用references/troubleshooting.md— よくある問題と解決方法