CT log でサブドメインを列挙する方法
目次
この記事でわかること
- CT log(Certificate Transparency)が公開している情報の範囲
- crt.sh と CertSpotter の使い分け
- 自社サブドメインを網羅列挙する具体的なクエリ
- 列挙結果から「使われていないサブドメイン」を絞り込む手順
CT log とは
Certificate Transparency(証明書透明性、RFC 9162)は、世界中の認証局が発行した SSL/TLS 証明書を公開ログに記録する仕組みです。Chrome / Edge / Safari などのブラウザは、CT log に登録されていない証明書を信頼しません。
その結果:
- 御社が過去〜現在に発行した全ての証明書が CT log で公開されている
- 証明書には Subject Alternative Name(SAN)として全サブドメインが記録されている
- 第三者からも「御社が過去にどのサブドメイン名を使ったか」が網羅できる
これは攻撃者の偵察にも使われる情報源です。自社が把握していないサブドメインを早めに棚卸しすることが防御の第一歩。
crt.sh での列挙
crt.sh は CT log を検索できる無料サービスです。自社棚卸しは crt.sh で十分。
基本クエリ(ブラウザ)
https://crt.sh/?q=%25.example.co.jp
%25 は URL エンコード済の % ワイルドカード。これで *.example.co.jp 配下の全サブドメインが取れます。
JSON API で取得
curl -s 'https://crt.sh/?q=%25.example.co.jp&output=json' \
| jq -r '.[].name_value' | sort -u | tee subdomains.txt
name_value は改行区切りで複数 SAN が入る場合があるので、後段で展開:
curl -s 'https://crt.sh/?q=%25.example.co.jp&output=json' \
| jq -r '.[].name_value' \
| tr ',\n' '\n\n' \
| sort -u
&exclude=expired で失効済を除外
https://crt.sh/?q=%25.example.co.jp&exclude=expired&output=json
「現役の証明書を持つサブドメイン」のみを優先的に見たい場合に有効。
CertSpotter(SSLMate)での列挙
CertSpotter は SSLMate 社の CT 監視サービス。crt.sh が応答しない時のフォールバックとして優秀。API の使い方や継続監視の設定はCertSpotter の使い方で解説しています。
認証なしで取得
curl -s 'https://api.certspotter.com/v1/issuances?domain=example.co.jp&include_subdomains=true&expand=dns_names' \
| jq -r '.[].dns_names[]' | sort -u
include_subdomains=true がポイント。
crt.sh との使い分け
| 観点 | crt.sh | CertSpotter |
|---|---|---|
| 取得速度 | ◎(速い時は速い) | ○ |
| 安定性 | △(しばしば 503) | ◎ |
| クエリ柔軟性 | ◎(SQL ライク) | ○ |
| 過去履歴 | ◎ | ◎ |
| API 認証 | 不要 | 不要(無料枠) |
運用では crt.sh を一次、CertSpotter をフォールバックにする 2 段構えが安定します。ドメイン番人の サブドメイン棚卸し 単発チェック も同じパターンで実装しています。
列挙後の絞り込み
CT log で得たリストには、現在使っていないサブドメインも含まれます。「dangling な可能性があるもの」を抽出するために以下を実行:
1. DNS 解決を確認
for sub in $(cat subdomains.txt); do
result=$(dig +short $sub)
echo "$sub : ${result:-(no answer)}"
done
応答なしのサブドメインから優先的に調査。
2. CNAME 宛先を確認
for sub in $(cat subdomains.txt); do
cname=$(dig +short CNAME $sub)
if [ -n "$cname" ]; then
echo "$sub → $cname"
fi
done
CNAME が SaaS パターン(*.herokuapp.com *.github.io *.netlify.app 等)に合致するものをマーク。
3. SaaS 解約状況を確認
CNAME 宛先 SaaS にアクセスして、解約エラー("There isn't a GitHub Pages site here" 等)が返ってきたら dangling 確定です。
詳しくは dangling CNAME のリスクと検出方法 を参照してください。
攻撃者にも見えていることに注意
CT log は世界中で公開されています。攻撃者は同じ情報を使って偵察しています。
- 過去のキャンペーン用サブドメイン
- 退職者が立てた検証環境
- 社内ツールの URL
これらが CT log に漏れなく記録されているので、自社が先に棚卸ししないと攻撃者の方が先に dangling を見つけて占有してしまうリスクがあります。
まずは現状を把握しましょう
ドメイン番人の サブドメイン棚卸し 単発チェック では、crt.sh + CertSpotter フォールバック + DoH 解決確認 + 既知 SaaS パターンの検出までを 30 秒で実行します。
棚卸しと是正の支援は サブドメイン棚卸し+テイクオーバーリスク診断(5 万円〜)でご相談ください。
関連記事:
総合点検は 無料のドメイン診断、SSL 単独は SSL 単発チェック をご利用ください。