サブドメイン列挙とはどういうものなのか調べてみた

この記事は、 NTT Communications Advent Calendar 2023 2日目の記事です。

こんにちは、イノベーションセンターの坪井です。

1日目の記事を担当した平木と同じくNetwork Analytics for Securityというチーム(通称NA4Sec)に所属しています。

1日目の記事はこちらです。

engineers.ntt.com

NA4Secプロジェクトについては、 サイバー脅威インテリジェンス(CTI)配信はじめました を読んでいただくと我々がどんな活動を行なっているかわかると思います。

先日の11/21(火)にInternet Week 2023のC10 DNS DAYというプログラムの中で「ランダムサブドメイン攻撃において事業者として行なった対策と解析について」というタイトルで講演をさせていただきました。

講演の中で、私はDNSハニーポットを運用してランダムサブドメイン攻撃を観測した話をさせていただいたのですが、アドベントカレンダー2日目の本記事では講演の中で出てきたサブドメイン列挙ツールについて、お話しします。

はじめに:免責事項

本記事は、あくまでも調査したサブドメイン列挙ツールの動きについてご紹介するものであり、利用を積極的に推奨するものではありません。また、これらのツールを悪意ある目的で使用することは禁止されています。 これらのツールを使用することによって発生したいかなる損害や問題について、ツール開発者や提供者及び本記事の執筆者・ブログ管理者は責任を負いません。予めご了承ください。

ランダムサブドメイン攻撃とは

まず初めに、ランダムサブドメイン攻撃について簡単に説明します。 ランダムサブドメイン攻撃とはサイバー空間におけるDNSを使ったDDoS攻撃手法の1つです。

悪意のある攻撃者がランダムな文字列やパターンを使用して、特定のドメイン名に対して無差別にサブドメイン名を生成し、生成したサブドメイン名を使ってキャッシュDNSサーバに名前解決の問い合わせ(クエリ)をします。

キャッシュDNSサーバでは受けたクエリのドメイン名に対する情報をすでに保持している場合は保持している情報を返しますが、保持していない場合はそのドメイン名の権威DNSサーバにクエリをします1

今回のようなランダムなサブドメイン名の場合、ほとんどのドメイン名についてはキャッシュDNSサーバには過去のクエリ応答情報が存在していないため、攻撃者からのクエリの都度、権威DNSサーバへクエリをすることになります。

一般的にランダムサブドメイン攻撃は、意図的に大量のDNSクエリを発生させて権威DNSサーバへ負荷をかけることで、各種リソースの逼迫にともなう関連サービスの品質低下またはサーバダウンなどによる関連サービスの停止(いわゆるDoS)を狙いとした攻撃と考えられています。

サブドメイン列挙とは

次に、今回のテーマであるサブドメイン列挙ツールが行う、サブドメイン列挙についてお話しします。 サブドメイン列挙(Subdomain Enumeration)とは、特定のドメインに関して利用されているサブドメイン2を調査し、そのドメイン名をリスト化するプロセスです。

サブドメイン列挙ツールは、セキュリティテストやネットワークスキャニング、ペネトレーションテスト、またはウェブアプリケーションのセキュリティ評価など、さまざまなセキュリティアクティビティで使用されます。

サブドメイン列挙ツールは以下のような手法を使用してサブドメインを収集します。

有名なサブドメイン列挙ツールについて、いくつか取り上げて比較してみました。

サブドメイン列挙ツールはどういう仕組みになっているか、今回はInternet Weekの講演の中でも名前が出たSubBruteについて中身を見ていきたいと思います。

SubBruteについて

SubBruteはPythonで書かれたオープンソースのサブドメイン列挙ツールで主にブルートフォースを実行することに特化しています。DNS におけるブルートフォースは一般的なサブドメインの名前や文字列の組み合わせなどのパターンをさまざま試行する手法です。

指定されたドメインに対して複数の一般的なサブドメイン名を含むワードリストを使用し、DNSクエリを送信して有効なサブドメインを探索します。このプロセスにより、目標のドメインに紐づく未知のサブドメインを見つけることができます。

TheRook/subbrute: A DNS meta-query spider that enumerates DNS records, and subdomains. (github.com)

SubBruteのプログラムを紐解いてみたところ、下記の機能を備えていることがわかりました。
なお、下記の機能名は処理内容から類推して付けた呼び名なので、実際の機能名とは関係ありません。

  1. ターゲットドメイン情報取得機能
    サブドメイン作成対象のターゲットドメインの権威DNSサーバを列挙し、応答性のテストを行い、正常応答の場合はDNSクエリ対象の権威DNSサーバ一覧に追加する。

  2. サブドメインリスト生成機能
    一般的に使用されるサブドメイン(wwwなど)や予め用意されたワードリストを使用して存在する可能性のあるサブドメインリストを生成し、DNSクエリをランダムな順序で行えるようにリストの順序をシャッフルさせる。権威DNSサーバがDNSクエリを異常とみなすことを防いだり、1つの権威DNSサーバに対するDNSクエリが集中することを避けることが目的と思われる。

  3. DNSクエリ実行機能
    サブドメインリスト生成機能で生成されたリストを元にDNSクエリを行う。この機能はマルチプロセスで実行され、大量のDNSクエリを並列で実行する。

  4. DNSクエリ結果解析機能
    DNSクエリ実行機能の結果から必要な情報を取り出し解析・整形する。 Aレコードの場合はドメイン名に対応するIPv4アドレスを、AAAAレコードの場合はIPv6アドレスを取り出す。CNAMEレコードからは別名となるドメイン名を取り出す。 取り出した結果をドメイン名と対応するIPアドレスで組み合わせた形に整形する。

例としてexample.jpをターゲットドメインとしてSubBruteを実行すると以下のような動きになります。

$ python subbrute.py example.jp
  1. メイン機能でexample.jpをターゲットのドメインとして設定する。
  2. ターゲットドメイン情報取得機能で指定されたターゲットドメイン example.jp のDNSクエリに応答する権威DNSサーバーのリストを生成する。
  3. サブドメインリスト生成機能で、ターゲットドメイン example.jp のすべての可能性のあるサブドメインのリストを作成しリスト内をシャッフル。
  4. DNSクエリ実行機能で、example.jp の各サブドメインに対するDNSクエリを並列で実行する。
  5. DNSクエリ結果解析機能で、DNSクエリ実行機能の結果を解析・整形する。例えば mail.example.jp www.example.jp などの example.jp のサブドメイン名と、サブドメイン名に対応するIPアドレスを出力する。

以上の流れにより、example.jp のサブドメインと、それらのドメイン名に紐づくIPアドレスなどの情報を取得できます。

このようにワンライナーのコマンドでサブドメイン列挙ツールを実行するだけでサブドメイン列挙行為自体はとても簡単に行うことができます。

サブドメイン列挙とランダムサブドメイン攻撃

さて、今回はSubBruteの動作を紐解いてみました。SubBruteの動作の中では大量のサブドメイン候補からなるリストを生成し、DNSクエリを行っています。

「SubBruteについて」内では説明を省略していますが、SubBruteがDNSクエリを実行する際は、予め設定されているキャッシュDNSサーバを使用します。

キャッシュDNSサーバへクエリした時に、キャッシュDNSサーバがクエリ応答情報を保持していないサブドメインだった場合、権威DNSサーバにクエリを行うことになります。

あれ、これ何かに似てませんか? そう、冒頭で説明したランダムサブドメイン攻撃の構造に似ているんです。

サブドメイン列挙ツールはセキュリティテストやネットワークスキャニング、ペネトレーションテスト、またはウェブアプリケーションのセキュリティ評価といったシチュエーションでの利用を想定して開発されたツールですが、その動作過程上でDNSクエリを大量発生させ、ランダムサブドメイン攻撃に似た状況を作り出してしまうことがあるため、ツールの取り扱いには十分注意するようにしましょう。

まとめ

今回はInternet Weekで登壇させていただいた講演内容からサブドメイン列挙ツールについて深掘りして書いてみました。改めて、サブドメイン列挙とランダムサブドメイン攻撃は紙一重と感じました。最後まで、ご覧頂きありがとうございました。

明日も同じくNetwork Analytics for Securityチームに所属する益本の記事です!それでは、明日の記事もお楽しみに!


  1. 厳密にはいきなり目的の権威DNSサーバにクエリをする挙動をとるとは限りませんが、最終的には何らかの形で権威DNSサーバへのクエリにつながるので、ここでは簡単のためにこのように表現しています。
  2. あるドメインの中の部分的な名前空間のことで、そのドメインに関連する特定のサービス(ウェブサイトやメールなど)を提供するサーバを識別するためなどに使われる。例えば「www」はウェブサーバを指す名前としてよく使われる。
© NTT Communications Corporation All Rights Reserved.