NFLabs. エンジニアブログ

セキュリティやソフトウェア開発に関する情報を発信する技術者向けのブログです。

サブドメイン名列挙の方法についてまとめてみた

この記事は NFLaboratories Advent Calendar 2022 6日目の記事です。

ソリューション事業部セキュリティソリューション担当の岩崎です。

多くのウェブサイトでは登録されたドメイン名を利用して構築されており、サブドメインを作成して構築されるケースも多いです。中には、開発環境や公開前のプロダクト用にサブドメインを作成して運用されているケースも多いです。
昨今、公開を前提としたサーバでは適切なセキュリティ設定や脆弱性診断などセキュリティ侵害を防ぐための対策が取られているケースが多いです。一方、開発環境や公開前のプロダクト用のサーバでは十分な対策が取られていないケースも多く見受けられます。

そこで今回はセキュリティ侵害から防御することを目的として、攻撃者視点でサブドメイン名列挙をする手法についてまとめてみました。

総当たり

サブドメイン名を多数推測・生成し、実際に問い合わせることで該当のサブドメイン名が利用されているか調査する手法です。
多くのツールではよく使われているサブドメイン名がリスト化されており、効果的に探索できるように実装されております。
DNSReconやFierceなどが有名です。

github.com

github.com

ただし、検出できるドメイン名は多くの場合 test.example.com. や www.example.com.といったような簡単な文字列に限られております。
長い文字列やランダムな文字列が含まれるドメイン名については現実的な時間で検出できないケースが多いです。
そのため、多くのケースではただ時間を浪費するだけであり有効なドメイン名を見つけることができません。

ゾーン転送

ゾーン転送とは権威DNSサーバ間でゾーン情報を同期するための技術です。権威DNSサーバを冗長構成にする場合などで利用されます。
実際にゾーン転送を要求することで、標的の権威DNSサーバにおいてゾーン転送が可能になっているか確認することができます。

ゾーン転送が可能な設定となっている場合の例

% dig @10.4.0.63 example.com axfr

; <<>> DiG 9.18.1-1ubuntu1.2-Ubuntu <<>> @10.4.0.63 example.com axfr
; (1 server found)
;; global options: +cmd
example.com.            600     IN      SOA     ns.example.com. root.example.com. 2022121401 3600 900 3600 1800
example.com.            600     IN      A       192.0.2.30
example.com.            600     IN      AAAA    2001:db8::bf8:3
example.com.            600     IN      MX      0 example.com.
example.com.            600     IN      TXT     ""
example.com.            600     IN      CAA     0 issue "letsencrypt.org"
example.com.            600     IN      CAA     0 issuewild "letsencrypt.org"
api.example.com.        600     IN      CNAME   example.com.
blog.example.com.       600     IN      CNAME   example.com.
devapi.example.com.     600     IN      CNAME   example.com.
ns.example.com.         600     IN      A       192.0.2.30
ns.example.com.         600     IN      AAAA    2001:db8::bf8:3
private.example.com.    600     IN      CNAME   example.com.
root.example.com.       600     IN      A       192.0.2.30
root.example.com.       600     IN      AAAA    2001:db8::bf8:3
test.example.com.       600     IN      CNAME   example.com.
www.example.com.        600     IN      CNAME   example.com.
example.com.            600     IN      SOA     ns.example.com. root.example.com. 2022121401 3600 900 3600 1800
;; Query time: 4 msec
;; SERVER: 10.4.0.63#53(10.4.0.63) (TCP)
;; WHEN: Wed Dec 14 16:11:53 JST 2022
;; XFR size: 18 records (messages 1, bytes 470)

ゾーン転送ができない設定になっている場合の例

 dig @10.4.0.63 example.com axfr

; <<>> DiG 9.18.1-1ubuntu1.2-Ubuntu <<>> @10.4.0.63 example.com axfr
; (1 server found)
;; global options: +cmd
; Transfer failed.
対策

第三者によるゾーン転送が可能な状態は「脆弱な設定になっている」と扱われるケースが一般的です。

www.jpcert.or.jp

権威DNSサーバのソフトウェアにより対策は異なります。一般的には第三者によるゾーン転送要求を拒否するために接続元IPアドレスの制限などが有効とされています。

Passive DNS

Passive DNSは様々なロケーションでの名前解決結果を蓄積し、検索可能な形で提供するサービスです。商用・無償含め多くのサービスが存在しております。また、現在登録されているレコードだけでなく過去の履歴も含め検索できることが多いです。
無料で利用できるものだとMicrosoft Defender Threat Intelligenceがおすすめです。

ti.defender.microsoft.com

ドメイン名を入力するだけでサブドメイン名の一覧を取得できます。


検索エンジン

GoogleやYahooなどの検索エンジンを利用してサブドメイン名列挙をすることもできます。
site識別子を指定することで指定されたドメイン名を含むサブドメイン名のウェブサイトを検索できます。
多くの場合、サブドメイン名トップページのWebサイトの表示順位が高いため1〜2ページ目を確認すればサブドメイン名をリスト化できます。

site:google.co.jp


Zone walking

Zone walkingはDNSSECで過去に利用されていた仕様を用いたドメイン名列挙手法です。
DNSSECとは名前解決のレスポンスが改ざんされていないことを受信側で検証するためのプロトコルです。クライアント側で改ざんを検知できるようにために、RRSIGレコード(RRsetに対する署名)を付与してレスポンスを返します。
一方、RRSIGはRRsetに対して署名をするため、不在証明(NXDomain)の際は署名の対象がありません。これを解決するための仕組みがNSECレコードとなります。NSECレコードとは予め権威DNSサーバに登録されたドメイン名の一覧をソートしておき、問い合わせられたドメイン名が存在しない場合に一覧表で前後のドメイン名を返す仕組みです。その際、RRSIGはNSECレコードを含めて署名されたものを返します。

一例として、NSECレコードでは下記表の様なレコードが登録されている場合にb.example.com. というドメイン名を問い合わせると不在を証明するために a.example.com. と d.example.com. が含まれたNSECレコードが返ってきます。
これらを見てクライアント側では「a.example.com. の次は d.example.com. しか無い」と認識することができます。

OWNER TYPE RDATA
a.example.com. A 192.0.2.12
d.example.com. A 192.0.2.30
g.example.com. A 192.0.2.45
z.example.com. A 192.0.2.60

これらの問い合わせを反復的に行い、ドメイン名を列挙する仕組みがZone walkingと呼ばれる手法となります。

Zone walkingを検証するためのツールとして ldns-walk がよく利用されております。

unbound.jp

対策

現在はNSECの問題点を緩和するために、NSECレコードのドメイン名をハッシュ化したNSEC3への移行が推奨されております。
多くのゾーンではNSEC3に移行されており、NSECでZone walkingができる権威DNSサーバは多くありません。*1
ただし、NSEC3でも依然としてドメイン名列挙のリスクは残っております。少しボリュームの多い内容となるため詳細については別途記事にできればと考えております。

また、Route53などマネージド権威DNSサービスによってはZone walkingを検知して落とす機能が入っているらしいです。

docs.aws.amazon.com

Internet Search Engine

Internet Search EngineはグローバルIPに対して定常的にスキャンし、結果を蓄積・検索できるサービスです。呼称は人により異なり、IoT検索エンジンなどと呼ばれる場合もあります。
様々なサービスがありますがShodanが有名です。

www.shodan.io

Shodanを利用してグローバルに公開されているサーバの中からSSL証明書などでフィルタして検索することでサブドメイン名を収集することができます。

www.shodan.io

Shodanでは有料課金をしなければフィルタ検索ができません。しかし、稀に永久会員が$5セールをしている場合があるため、そのタイミングに購入するのがおすすめです。

CT(Certificate Transperency)サーバ

Certificate Transperency(以下、CT)とはSSL/TLS証明書の不正発行や誤発行を早期検知するための仕組みです。

認証局は証明書を発行する際、発行証跡をCTサーバに登録します。不正に証明書が発行された場合もCTサーバにログが載るため、ドメイン名の登録者がCTサーバを確認することで不正発行されたことを気付ける様になります。

Subject Alternative Name(以下、SAN)にサブドメイン名が指定された証明書が発行されていればCTサーバを起点としてサブドメイン名の検索が可能です。多くのウェブサイトではSSL/TLS証明書が発行されているため、CTサーバを利用してサブドメイン名を列挙する手法はよく利用されます。

CTサーバの1つとしてcrt.shが有名です。

crt.sh

以下は ntt.com. を入力して検索した場合の例です。多くのサブドメイン名が存在することが分かります。

https://crt.sh/?q=ntt.com

対策

CTサーバは証明書の透明性を担保するための仕組みであるため「証明書が発行された事実」を秘匿することはできません。
ただし、証明書のサブドメイン名を知られたくないのであればSANにワイルドカードを指定することでサブドメイン名を隠蔽することが可能です。

以下はワイルドカード証明書の一例です。

crt.sh | 8148687799

CZDS (Centralized Zone Data Service)

サブドメイン名ではありませんが、gTLDについてはゾーンファイルごとダウンロードすることができます。
ICANNが提供しているCentralized Zone Data Service(以下、CZDS)を利用することで多くのgTLDについてはゾーンファイルをダウンロードできます。

czds.icann.org

誰でも好き勝手にダウンロードできる訳ではなく、TLDごとに利用目的を記述・申請し承認されなければダウンロードできない形となっております。また、申請承認時に有効期限が設定され、失効した後は再度申請が必要となります。

一例として、.com. のゾーンファイルもダウンロードすることができます。
ただし、委譲先のゾーンファイルは含まれていないためサブドメイン名については取得することができません。


まとめ

サブドメインを作成し公開された権威DNSサーバにレコードを追加する場合、サブドメイン名を秘匿することが非常に難しいことが分かるかと思います。
元も子もない話ですが、「ドメイン名が分からなければアクセスできないから安心」という考えはリスクの高い設定・構成になりがちです。

尚、セキュリティ侵害を防ぐという観点では上記で挙げた対策の他に下記の対応が有効です。

  • 開発用途や公開前のサーバは第三者からアクセス可能な形で公開しない
  • 内部でのみ利用するレコードを外部向けに公開している権威DNSサーバに登録しない*2
  • 権威DNSサーバのレコードを定期的に確認し、不要なものを削除する *3

弊社では上記のようなOSINTに関する検証もしております。採用もしておりますので、もしご興味があればリクルートページをご確認ください。
nflabs.jp

*1:逆引き(IPv4/IPv6アドレスを起点とした名前解決)については負荷軽減の観点からNSECが利用されていることが多いそうです。

*2: dev.example.com. や test.example.com. といったドメイン名を外部公開する必要がありますか?

*3:Subdomain Takeoverやlame delegationなどのリスクもあるので管理できないものを運用するのはやめましょう