hunt-a-handle について
複数のプラットフォームで候補アカウントを探し、関連性を検証する OSINT スキルです。自動検出はアカウントの存在候補にすぎず、確認や棄却には独立した証拠が必要だと説明します。
主な機能
- 01sherlock と maigret でハンドルを列挙
- 02検索用のハンドル変種を生成
- 03アバター、プロフィール、相互リンクで検証
- 04ソフト 404 と誤検出を識別
- 05候補を評価し棄却理由を記録
活用シーン
- 01既知のハンドルから他プラットフォームの候補を探す
- 02複数アカウントが同一人物かを検証
- 03列挙結果を確認し同名ユーザーを除外
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ useosint/ skills --skill hunt-a-handleインストール後、Claude Code で/hunt-a-handleを入力して読み込まれたか確認します。
同梱ファイルreference/platform-leakage.mdreference/variant-patterns.md
詳細
ハンドル名を探す
ハンドル名の使い回しは、OSINT で強いリンクを見つける最も手軽な方法です。ひとつの文字列を数分で調べれば、複数のプラットフォームを同一人物に結び付けられる可能性があります。同時に、最も過信されやすい方法でもあります。列挙ツールが本人確認をするわけではありません。HTTP で存在確認を行うだけで、ヒット一覧はあくまで候補の一覧にすぎません。こうした調査を台無しにするのは、ツールの出力をそのままレポートに貼り付けることです。列挙は手軽な部分であり、確認こそが本番です。
ステップ 1 — 許可された範囲
../../ETHICS.md を読み、クエリを実行する前に、対象、目的、許可された検索条件、範囲外の行為(ログイン、連絡、フォロー申請)、適用される管轄区域を書き出してください。ハンドル名の調査は範囲が広がりやすく、1 回の実行で新たに 30 のプラットフォームが見つかることもあります。その文字列を使っているだけの無関係な人物のプロファイリングに、気づかないうちに踏み込むのも簡単です。
完了の基準 範囲を書き出し、何をすれば範囲外になるか説明できること。
ステップ 2 — 列挙ツールを選ぶ
| 条件 | 選ぶもの | 理由 |
|---|---|---|
| ひとつのハンドル名をすばやく幅広く調べたい | sherlock | 手早く広範囲を調べられますが、存在確認のみです |
| ひとつのハンドル名についてプロフィールの内容も必要 | maigret | ページを解析し、表示名、プロフィール文、ID、リンク、ときには国や作成日も取得します |
| ヒットした理由を確認したい | WhatsMyName のデータ | 各チェックの URI と照合ルールが明示されており、内容を確認できます |
| 既知のプラットフォームひとつでハンドル名を調べたい | 手動でアクセス | 実際のプロフィールを読むのに勝る方法はありません |
sherlock jdoe_92 --timeout 10 --csv
maigret jdoe_92 --html
相関調査では、真偽値ではなくフィールドを返す maigret のほうが価値の高いツールです。表示名、アバター URL、本人が申告した所在地、数値のユーザー ID、「別名」リストがあれば、それを次のプラットフォームと照合する材料にできます。Sherlock が返すのは URL と判定結果です。
WhatsMyName は検出リストであり、スキャナーではありません。サイトごとのエントリーをまとめた JSON ファイルで、各エントリーには URI テンプレートと明示的な照合条件(想定される HTTP ステータスと本文内の想定文字列、および「見つからない」場合に相当する条件)が記載されています。疑わしいサイトがあれば、そのエントリーを読んでください。ツールが何を根拠として扱ったのかが正確に分かります。同じリストを使うラッパーや Web フロントエンドは多いため、異なる 3 つのツールでヒットしても、独立した 3 つの確認ではなく、同じルールが 3 回発動しただけということがよくあります。
完了の基準 候補ごとにプラットフォーム、URL、検出したツール、現在の有効/無効の状態を記録していること。
ステップ 3 — バリエーションを生成する
与えられたハンドル名は、その人物の命名習慣の一例です。その習慣を特定すれば、最初の調査で見落としたアカウントを見つけられます。
- 区切り文字の置き換え:
john.doe、john_doe、john-doe、johndoe - 省略形とイニシャル:
jdoe、johnd、j_doe、doej - 数字の接尾辞:生年、2 桁の生年、
1、99、007 - リートスピークと文字の置き換え:
j0hnd0e、johnd0e - メールアドレスのローカルパートをハンドル名にする、またはハンドル名をメールアドレスのローカルパートにする
- ゲーマータグの形式:接頭辞、
xX…Xx、クランタグ、文字の重複
パターンの一覧:reference/variant-patterns.md。
推論の方向は 2 つあります。ハンドル名 → 名前:jdoe_92 は、名のイニシャルと姓を組み合わせ、1992 年を生年とするパターンを示唆しますが、これは検証すべき仮説であり、確定した事実ではありません。名前 → ハンドル名:すでに本名が分かっている場合、その名前から考えられるハンドル名を生成し、それらも列挙してください。誰かから教えられたハンドル名を起点にするより、うまくいくことがよくあります。
完了の基準 バリエーションを列挙し、ヒットしたものをステップ 2 に反映していること。
ステップ 4 — 確認するか、却下する
候補ごとに、懐疑的な読者にも通用する証拠を探します。
強い証拠:
- 同じアバター。
find-the-original-imageで確認してください。ストック写真や第三者の画像と一致した場合は、確認ではなく却下の根拠になります。 - 自己紹介文が完全一致、またはほぼ一致している。特に、誤字や珍しい言い回しまで引き継がれている場合は有力です。
- 自己申告による相互リンク:一方のプロフィールからもう一方のプロフィールにリンクしています。本人の認める発言を除けば、最も有力な証拠です。
- 両方に同じ連絡先の選択項目がある(同じメールアドレス、同じ個人ドメイン)。
中程度の証拠:
- 複数のプラットフォームでアカウント作成日が狭い期間に集中していること。人はサービスへの登録をまとめて行うことがあります。
- 特徴的な小規模アカウントを同じようにフォローしている、またはフォローされていること。
- 文体:慣用表現、句読点の使い方、投稿するタイムゾーン。
単独では弱い証拠:ハンドルが一致していること。検証対象そのものであり、その裏付けにはなりません。
数値のユーザー ID を公開しているプラットフォームは、特に有用です。ID が登録順に割り当てられる場合、プロフィールに表示されていなくても、ID からアカウントの作成日を絞り込めます。GitHub の
https://api.github.com/users/<login> は数値の id と created_at を返します。Discord のスノーフレーク ID には、作成時刻が直接エンコードされています。プラットフォームごとの詳細は、reference/platform-leakage.md を参照してください。
完了の条件:各候補を「確認済み」「可能性が高い」「却下」のいずれかに分類し、それぞれの証拠を候補の横に記録していること。
うまくいかないケース
存在確認は、HTTP に基づくヒューリスティックです。次のどれも誤検出を引き起こします。
- ソフト 404。 サイトが「ユーザーが見つかりません」というページを 200 で返します。一致判定がステータスコードに基づく場合、すべてが存在することになります。
- どの文字列でも表示されるプロフィールページ。 文字列を問わず汎用のページを表示し、API でのみ 404 を返すプラットフォームもあります。
- レート制限や CAPTCHA の中間ページ。 チャレンジページは本文を含む 200 なので、「見つかった」ルールと「見つからない」ルールのどちらにも該当する可能性があります。また、レート制限に達すると、その実行で以降に得られる結果はすべて当てになりません。1 回の一括確認を信頼せず、失敗したものは個別に再実行してください。
- 予約済み、占有されたアカウント、なりすましアカウント。 登録済みで実在しますが、調査対象ではありません。
- 古いエントリー。 サイトは 404 の動作を変更することがあり、検出リストの更新が追いつかない場合があります。該当が見つからないことは、アカウントが存在しないことを意味しません。
より根本的な問題は、名前の衝突です。よくあるハンドルは、互いに無関係な多数の人が使っています。短いハンドルや辞書に載っている単語のハンドルが 10 個のプラットフォームで使われている場合、同一人物によるものではなく、10 人の別人によるものであることのほうがはるかに多くあります。確信度はハンドルの特徴性に応じて判断してください。珍しい造語でも、それだけでは弱い証拠から中程度の証拠にとどまります。mike は証拠になりません。
あいまいさを解消するために、ログイン、メッセージの送信、フォローのリクエストをしてはいけません。これはデフォルトでは対象外の行為であり、対象者にこちらの存在を知らせることになります。investigate-without-getting-made を参照してください。
確信度の分類
- 確認済み —
find-the-original-imageで確認したアバターの一致に、もう 1 つの強い証拠が加わっている場合、2 つのプロフィール間に自己申告による相互リンクがある場合、または共通の連絡先の選択項目がある場合。 - 可能性が高い — 特徴的なハンドルに、中程度の証拠(作成日の集中、フォロワーの重複、一貫した文体)のいずれかが加わり、矛盾する証拠がない場合。
- 未確認 — ハンドルは一致するものの、それ以外に一致する点がない場合。対象者のアカウントではなく、列挙によるヒットとして報告してください。
- 却下 — 内容、言語、時系列、またはアバターの出所が対象者と矛盾する場合。却下したものも記録してください。次の分析担当者が同じ作業をやり直さずに済みます。
実例
sunfish_ada を指定すると、Sherlock は14件のヒットを返します。maigret は内容を含む9件を返し、その中には表示名が「A. Okonkwo」のコードホスティングプロフィール、同じアバターを使っている写真サイト、プロフィール欄が空のフォーラムが含まれます。
最初にフォーラムのヒットを除外します。同じフォーラムで意図的にあり得ないほど不自然なハンドルを取得しようとしても、同じ空のページとともに200が返されるからです。アカウントではなく、どのハンドルでも一致してしまう仕組みです。
写真サイトのアバターを find-the-original-image で逆画像検索すると、コードホスティングプロフィールの同じ画像が見つかり、ほかには見つかりません。これは有力です。コードホスティングの API から得られる数値 ID と作成日は、写真アカウントに記載された登録月と一致しています。中程度の証拠が2つにアバターの一致が加わるため、どちらのアカウントも本人のものと確認できます。
同じハンドルを使うマイクロブログのヒットでは、ほかのアカウントより6年も前から存在するアカウントで、無関係な話題を別の言語で投稿しています。同じ文字列を使う別人と判断し、却下したことを明記します。レビュー担当者が最初に見つけるのは、このアカウントだからです。
次の調査先
| 新しい検索キー | スキル |
|---|---|
| 表示名/本名 | find-anyone |
| 公開されている、または推定されるメールアドレス | what-an-email-reveals |
| プロフィールに記載された電話番号 | whose-number-is-this |
| アバターまたは投稿された写真 | find-the-original-image, secrets-in-file-metadata |
| 場所に関する情報を含む写真 | where-was-this-taken |
| コードホスティングのハンドル | secrets-in-git-history |
| プロフィールに記載された個人ドメイン | who-owns-this-domain |
| 認証情報の漏えいデータに含まれるハンドル | what-leaked-about-you |
| 本人と確認済みのアカウントでの全投稿履歴 | pattern-of-life-from-socials |
| アカウントの関連図そのもの | graph-the-network |
法律および利用規約に関する注意
スクリプトによるリクエストを使った自動列挙は、データが公開されている場合でも、多くのプラットフォームで利用規約により禁止されています。同時実行数を抑え、CAPTCHA を回避せず、プラットフォームが拒否を示したら停止してください。EU および英国では、公開情報として散在するアカウントをまとめて存命の人物のプロフィールを作成する行為は、個人データの処理にあたり、適法な根拠とデータ最小化が必要です。
ステップ 5 — レポートを作成する
write-the-intel-brief を実行します。プラットフォーム/URL/信頼度/証拠の表を提示し、却下したアカウントとその理由を列挙します。また、ハンドルから判明した本名および連絡先の検索キーを冒頭に記載します。
完了条件:表のすべての候補に評価と情報源が記載され、情報源のない列挙結果が含まれていないこと。