
外部から観測可能なデータのみを使用して、組織が契約しているSaaSサービスを特定します。シャドーITの発見のために構築されています。
▄▄▓▓▓▓▓▓▓▓▓▄▄
▄▓▓▒▒▒▒▒▒▒▒▒▒▒▓▓▄ Yowie · tracking down the SaaS nobody told you about
▓▓▒▒░░░░░░░░░░░▒▒▓▓
▓▒░░ ● ● ░▒▓ Domain acme.com.au
▓▒░░ ▼ ░▒▓ Candidates acme, acmecorp
▓▓▒░░ ╰───╯ ░▒▓▓
▀▓▓▒▒░░░░░░░░░▒▒▓▓▀
▀▀▓▓▓▓▓▓▓▓▓▓▓▀▀
組織が契約しているSaaSサービスを、外部から観測可能なデータのみを用いて特定します。シャドーITの発見のために作られており、見つける価値のあるサービスとは、誰もあなたに教えてくれなかったサービスのことです。
オーストラリアのブッシュクリプティドにちなんで名付けられました。誰もが「そんなものは存在しない」と言い張る何かを、あなたは追い求めているからです。

9つの検出器にわたり593のベンダーをカバーする786のシグネチャ、さらに確認待ちの109件が保留中です。検出結果は格付けされ、そのすべてに、それを導き出したレコードまたはレスポンスが付随します。
go build -o yowie ./cmd/yowie
Go 1.22 以降が必要です。署名パックはバイナリに埋め込まれているため、単一のファイルをデプロイするだけで済みます。
yowie [flags] <domain> [candidate ...]
ドメインは組織のルートドメインです。候補は、ベンダーテナントの名前の由来となり得る短い文字列です — 商号、略称、買収によって引き継がれた旧ブランドなどです。できるだけ多く指定してください。それぞれがテナントを見つける追加の機会となります。何も指定しない場合、ドメインの最初のラベルが使用されます。
yowie acme.com.au acme acmecorp acmegroup
yowie -format html -o report.html acme.com.au acme
yowie -format json acme.com.au | jq '.findings[] | select(.confidence=="high")'
yowie -only dns,spf,dmarc -compact acme.com.au
yowie -signatures ./signatures -validate
| 検出器 | シグナル |
|---|---|
dns | TXT 検証トークン、CNAME、MX、NS レコード |
vanity | 組織名にちなんで命名されたベンダーホスト型テナント(acme.zendesk.com) |
http | DNS 上の痕跡を持たないサービスのアプリケーション層フィンガープリント |
spf | ネストされた include とリダイレクトを追跡した、SPF include グラフ全体 |
dmarc | DMARC 集約レポート/フォレンジックレポートの送信先 |
bimi | BIMI ロゴと Verified Mark Certificate のホスティング |
mta-sts | MTA-STS ポリシーの内容 |
tenant | Microsoft テナント ID、フェデレーション ID プロバイダー、および関連ドメイン |
ct | Certificate Transparency ログから取得したサブドメイン(解決および帰属判定済み) |
-only または -skip で選択できます。例えば -skip ct,http を指定すると、DNS のみの高速パスになります。
最後の 2 つは特筆に値します。シグネチャリストでは見つけられないものを発見できるからです。
tenant は Microsoft の非認証エンドポイントに、そのドメインが誰に属しているかを問い合わせます。Autodiscover のフェデレーション情報は、同じテナントに紐づくすべてのドメインを返すため、事業部門、買収企業、放棄されたブランドが日常的に浮かび上がります。そのそれぞれが、スキャンする価値のある別のドメインです。
ct は発見モデルを逆転させます。他のすべてのチェックは固定リストに対して「この組織はベンダー X を使っているか?」と問うため、誰かがすでにシグネチャを書いたベンダーしか見つけられません。CT は「この組織は実際に自分のサブドメインを何に向けているか?」と問います。ある製品にサインアップして support.acme.com を設定したチームには証明書が発行され、その証明書は公開され、永続的に残ります。どのシグネチャにも一致しないターゲットはリードとして報告され、これによって、探すべきだと知らなかったものを見つけられるのです。
検出結果にはグレードが付けられ、そのグレードこそが要点です:
acme.blogspot.com はあなたの acme ではないかもしれません。2 つの独立した検出器が同じベンダーで一致すると、Probable の検出結果は Confirmed に昇格します。すべての検出結果には、それを引き起こした正確なレコードまたはレスポンスが付随するため、ツールを再実行しなくてもレポートは正当化できます。
この昇格には 1 つの例外があり、それは「このテナントは存在する」と「このテナントはあなたのものだ」の違いです — 精度に関する注記 の名前空間に関する注記を参照してください。
シグナルのみが必要な場合は、-no-unknown で帰属不明のリードを除外できます。
-format cli(デフォルト)、json、jsonl、csv、html。-o でファイルに書き出します。HTML レポートは自己完結型(外部アセットなし)なので、メールで送信したり共有ドライブに置いたりしても問題なく動作します。
進捗は stderr に、結果は stdout に出力されるため、yowie -format json acme.com > out.json でもライブの進捗行が表示されます。
シグネチャは signatures/*.yaml にあります。バイナリにはこれらが埋め込まれていますが、-signatures <dir> または YOWIE_SIGNATURES=<dir> を指定するとディスクから読み込むため、再ビルドせずに反復作業ができます。
version: 1
pack: dns-txt
description: "Domain-ownership verification tokens published as TXT records."
defaults:
confidence: high
signatures:
- id: txt-1password
vendor: "1Password"
category: "Identity & Secrets"
type: txt
query: "{domain}"
match:
contains: "1password-site-verification"
{domain} はルートドメインに、{candidate} は各候補文字列に展開されます。
{candidate} を参照するシグネチャは、候補ごとに1回評価されます。
| 種類 | マッチ対象 | 備考 |
|---|---|---|
txt、cname、mx、ns | query のレコードに対する match.contains | 大文字小文字を区別しない |
vanity_a、vanity_cname | ベースライン比較。match ブロックなし | query には {candidate} を含める必要がある |
http | match.present、match.absent、または match.status のみ | 下記のステータス処理を参照 |
spf_include | 解決済みの SPF include グラフに対する match.contains | |
dmarc_rua | DMARC レポート送信先に対する match.contains | |
cname_target | query はホスティングのサフィックスのみ | ct で発見されたホストに適用。* は1ラベルにマッチ |
disabled: true は、その背後にある調査結果を失うことなくシグネチャを保留状態にします。
notes: はアナリスト向けのガイダンスをレポートまで引き継ぎます。
編集後は yowie -validate を実行してください。検証は厳格です — 未知のキーは
エラーとなり、黙って無視されることはありません — またパックは go test でも
チェックされるため、タイポが今後のすべてのスキャンで気づかれぬままカバレッジを
損なうことはありません。
| パック | 内容 |
|---|---|
dns-txt、dns-cname、dns-mx | 検証トークンと委任されたホスト名。有効。 |
email-spf、email-dmarc | 送信者と DMARC プロセッサ。有効。 |
vanity-tenants、http-endpoints | テナントのホスト名とアプリのフィンガープリント。有効。 |
cname-targets | CT で発見されたサブドメイン向けのホスティングサフィックス。有効。 |
ai-services | AI および LLM プラットフォーム。保留中。 |
file-transfer | マネージドファイル転送 — MOVEit、GoAnywhere、Egnyte。保留中。 |
finance-procurement | 財務、経費、給与、調達。保留中。 |
security-grc | セキュリティツールとコンプライアンス自動化。保留中。 |
graveyard | 未検証のエントリ、および運営者を特定できなかったプラットフォーム。保留中。 |
5つのパックは完全に無効化された状態で出荷されます。構造的には完全で検証も 通過しますが、マッチ条件が実際のテナントに対して確認されたことがないため、 スキャン中には評価されません。
これは意図的なものです。誤った contains 値を持つシグネチャは決して発火せず、
エラーも出しません — ただ、実際にはカバーされていないのにベンダーがカバーされて
いるように見えるだけです。これらを無効のまま出荷することで、数値を水増しする
ことなく調査結果をリポジトリに残しています。
これまでに5つが昇格しており、残りを信頼する前にその記録を知っておく価値が あります。2つは書かれた通りに正しく、1つはドメインが誤っており、2つはドメインは 正しかったもののチャネルが誤っていました — ベンダーはエントリが予測した 顧客ごとのホスト名ではなく、SPF include として現れました。残りの保留中エントリは、 潜在的なカバレッジではなく調査メモとして扱ってください。
-validate はバックログをパック別にグループ化して出力します:
$ ./yowie -validate
786 signatures across 13 packs, covering 593 vendors
...
109 signature(s) parked behind `disabled: true`, awaiting confirmation against a live tenant:
ai-services.yaml (24)
txt-fireflies-ai Fireflies.ai
...
昇格させるには:
dig +short TXT known-customer.com | grep -i <vendor> # token signatures
dig +short A acme.egnyte.com # vanity signatures
dig +short A $(openssl rand -hex 6).egnyte.com # ...and its baseline
バニティテナントは、ランダムなラベルとは異なる応答を返さなければならない。disabled: true を削除し、正直な信頼度を設定する。notes: を書き換えて、確認した内容を記述する。./yowie -signatures ./signatures -validateあるメカニズムが機能しないことが判明した場合は、無効のままにしておき、否定的な結果を notes: に記録する。これは機能するシグネチャと同様に価値がある。次の担当者が半日かけて再発見するのを防ぐことができるからだ。security-grc にはすでにこうした事例がいくつか含まれており、CrowdStrike、Wiz、Tenable にバニティシグネチャが存在しない理由を説明している。これらのベンダーはすべての顧客を共有コンソール上に配置しているため、顧客ごとに検出できるものが存在しないのだ。
このツールは自らバックログを生成する。帰属先が特定されていない送信者やホストは、まさにシグネチャを書く価値のあるベンダーであり、多くのスキャンを通じて頻度順にランク付けされる。
for d in $(cat domains.txt); do ./yowie -format json -quiet "$d"; done \
| jq -r '.findings[] | select(.category|startswith("Unidentified")) | .vendor' \
| sort | uniq -c | sort -rn | head -40
無関係な組織をまたいで繰り返し現れるものは本物である。これはさらに、確認済みのライブサンプルを無償で生み出す — SPF と DMARC の証拠には実際の送信元ホスト名が含まれており、まさにそれが保留中のエントリに必要なものだからだ。
多くのベンダーはテナントゾーンをワイルドカード化しているため、「解決する」ことは何も証明しない。各テンプレートはまず、存在しないテナントに対してベンダーがどう応答するかを知るために、2つのランダムなラベルでプローブされる。候補がカウントされるのは、その応答がベースラインと異なる場合のみである。2つのベースラインが互いに食い違う場合 — ジオDNS、ラウンドロビン — 比較は無意味であり、シグネチャは推測されるのではなく警告付きでスキップされる。
NXDOMAIN のベースラインは Confirmed の検出結果を生む。応答が異なるワイルドカードのベースラインは、シグネチャ自身の信頼度と、なぜそれが弱いのかを説明する注記を生む。