サイバーセキュリティの世界、特に偵察(Reconnaissance)フェーズにおいて、ターゲットとなるドメインのサブドメインを網羅的に把握することは非常に重要です。ペネトレーションテストやバグバウンティ(脆弱性報奨金プログラム)などでは、忘れ去られたサブドメインや開発中のサブドメインに脆弱性が潜んでいることが少なくありません。
この重要なプロセスを効率化し、強力にサポートしてくれるのが、Subfinder というツールです。本記事では、Subfinder の概要からインストール方法、基本的な使い方、そしてより高度なオプションまで、網羅的に解説していきます。初心者から経験者まで、Subfinder を使いこなすための実践的なガイドとなることを目指します。
Subfinder とは? 🤔
Subfinder は、ProjectDiscovery チームによって開発された、オープンソースのサブドメイン列挙ツールです。Go 言語で書かれており、その特徴はパッシブな手法に特化している点にあります。
パッシブな手法とは、ターゲットのサーバーに直接リクエストを送る(アクティブなスキャン)のではなく、公開されている様々なオンラインソース(パッシブDNSデータセット、証明書透明性ログ、検索エンジン、セキュリティ関連APIなど)を照会してサブドメイン情報を収集する方法です。これにより、ターゲットに検出されるリスクを低減しつつ、高速かつ網羅的にサブドメインを発見することが可能になります。
Subfinder は、以下のような多くのパッシブソースを利用します(2023年時点の情報では26以上、2025年時点ではさらに多くのソースが追加されている可能性があります):
- SecurityTrails
- Chaos
- Censys
- Shodan
- VirusTotal
- BinaryEdge
- CertSpotter
- GitHub
- Wayback Machine (via AlienVault OTX)
- Netlas
- その他多数…
これらの多様な情報源を活用することで、他のツールでは見逃してしまうようなサブドメインも発見できる可能性が高まります。
Subfinder の主な特徴 ✨
- 高速性: Go 言語の並行処理能力を活かし、複数のソースへ同時に問い合わせを行うため、非常に高速に動作します。
- パッシブ特化: ターゲットに直接的なアクセスを行わないため、ステルス性が高く、検出リスクが低いです。
- 豊富なデータソース: 多数のパッシブDNSソースやAPIと連携し、網羅的な情報収集が可能です。
- 設定の容易さ: APIキーなどの設定が容易に行えるインターフェースを提供します。
- 柔軟な出力形式: 標準出力、ファイル(テキスト、JSON)など、様々な形式で結果を出力できます。
- 軽量性: リソース消費量が少なく、様々な環境で動作させやすいです。
- ワークフロー統合: 標準入力(stdin)と標準出力(stdout)に対応しており、他のツールと連携させたワークフローを構築しやすいです。
- 活発な開発とコミュニティ: ProjectDiscovery によって積極的に開発が続けられており、コミュニティからのフィードバックも活発です。
- 多様なインストール方法: Go言語からのビルド、バイナリ、Dockerイメージなど、様々なインストール方法が提供されています。
インストール方法 💻
Subfinder を利用するには、まず Go 言語(バージョン 1.17 以上、最新版の利用を推奨)がインストールされている必要があります。Go のインストールについては、公式ドキュメントを参照してください。
Go が準備できたら、いくつかの方法で Subfinder をインストールできます。
1. Go を使用したインストール (推奨)
最も簡単で推奨される方法です。以下のコマンドを実行します。
go install -v github.com/projectdiscovery/subfinder/v2/cmd/subfinder@latest
これにより、最新版の Subfinder がダウンロード・コンパイルされ、$GOPATH/bin
ディレクトリ(通常は $HOME/go/bin
)に実行ファイルが配置されます。このディレクトリにパスが通っていれば、ターミナルから subfinder
コマンドを実行できるようになります。
2. バイナリを使用したインストール
GitHub の Releases ページから、お使いの OS とアーキテクチャに対応したコンパイル済みのバイナリファイルをダウンロードします。
例えば、Linux (amd64) の場合:
# 最新バージョンの URL を確認してダウンロード
wget https://github.com/projectdiscovery/subfinder/releases/download/v2.6.6/subfinder_2.6.6_linux_amd64.zip
unzip subfinder_2.6.6_linux_amd64.zip
sudo mv subfinder /usr/local/bin/
subfinder -h # ヘルプが表示されれば成功
ダウンロードするファイル名やバージョンは、最新のリリースに合わせて変更してください。
3. Docker を使用したインストール
Docker がインストールされていれば、以下のコマンドで公式イメージを取得・実行できます。
docker pull projectdiscovery/subfinder:latest
docker run projectdiscovery/subfinder:latest -d example.com
Docker を使うと、ホスト環境に Go やその他の依存関係をインストールする必要がないため、手軽に試すことができます。
4. GitHub からソースコードをビルド
開発に参加したり、特定のバージョンをビルドしたい場合は、ソースコードから直接ビルドすることも可能です。
git clone https://github.com/projectdiscovery/subfinder.git
cd subfinder/v2/cmd/subfinder
go build .
sudo mv subfinder /usr/local/bin/
subfinder -h
5. Homebrew (macOS)
macOS ユーザーは Homebrew を使ってインストールすることもできます。
brew install subfinder
基本的な使い方 🚀
インストールが完了したら、基本的な使い方を見ていきましょう。最も基本的なコマンドは、-d
フラグを使ってターゲットドメインを指定するものです。
subfinder -d example.com
これにより、Subfinder は設定されているデフォルトのパッシブソースを利用して example.com
のサブドメインを検索し、結果を標準出力に表示します。
複数のドメインを対象にする
複数のドメインを一度にスキャンしたい場合は、-d
フラグを複数回指定するか、ドメインリストが書かれたファイルを -dL
フラグで指定します。
# -d を複数指定
subfinder -d example.com -d example.org
# ファイルから読み込む (domains.txt に1行ずつドメイン名を記述)
# --- domains.txt ---
# example.com
# example.org
# example.net
# -------------------
subfinder -dL domains.txt
結果をファイルに保存する
見つかったサブドメインをファイルに保存するには、-o
フラグを使用します。
subfinder -d example.com -o example_subdomains.txt
JSON 形式で保存したい場合は、-oJ
フラグも併せて指定します。
subfinder -d example.com -o example_subdomains.json -oJ
詳細な情報を表示する
どのソースからサブドメインが見つかったかなど、より詳細な情報を表示するには -v
(verbose) フラグを使用します。
subfinder -d example.com -v
また、-cs
フラグを使用すると、出力結果に各サブドメインを発見したソース名が付与されます。
subfinder -d example.com -cs
出力例:
blog.example.com,Github
api.example.com,Censys,Virustotal
shop.example.com,SecurityTrails
API キーの設定 🔑
Subfinder は多くのパッシブソースを利用しますが、一部のソース(例: SecurityTrails, Censys, Shodan, VirusTotal, GitHub など)は、より多くの情報を取得したり、レート制限を緩和したりするために API キーの設定が必要です。API キーを設定しなくても Subfinder は動作しますが、設定することでより多くのサブドメインを発見できる可能性が高まります。
API キーは設定ファイルに記述します。初めて Subfinder を実行すると、設定ファイルが自動的に作成されます。デフォルトのパスは $HOME/.config/subfinder/provider-config.yaml
です。
このファイルをテキストエディタで開き、各サービスの API キーを対応する行に追加します。
# $HOME/.config/subfinder/provider-config.yaml の例
# 1つのキーを設定する場合
# securitytrails: ["YOUR_SECURITYTRAILS_API_KEY"]
# shodan: ["YOUR_SHODAN_API_KEY"]
# virustotal: ["YOUR_VIRUSTOTAL_API_KEY"]
# github: ["YOUR_GITHUB_API_TOKEN_1", "YOUR_GITHUB_API_TOKEN_2"] # 複数のキーも可能
# 複合キー (例: IDとSecret) を設定する場合 (コロンで区切る)
# censys: ["YOUR_CENSYS_API_ID:YOUR_CENSYS_API_SECRET"]
# fofa: ["YOUR_FOFA_EMAIL:YOUR_FOFA_KEY"]
# intelx: ["HOST:API_KEY"] # 例: 2.intelx.io:YOUR_INTELX_API_KEY
# デフォルトでは多くのサービスがコメントアウトされているので、
# 利用したいサービスのコメントを解除し、キーを[]内に入力します。
bevigil: []
binaryedge: []
bufferover: []
builtwith: []
c99: []
censys: []
certspotter: []
# ... (他のソースが続く)
各サービスの API キーは、それぞれの公式サイトでアカウントを作成し、取得する必要があります。多くのサービスでは無料枠が提供されていますが、より多くの情報を得るためには有料プランが必要になる場合もあります。
利用可能な全ソースを確認するには、-ls
フラグを使用します。
subfinder -ls
このコマンドは、Subfinder がサポートしているデータソースの一覧と、それぞれが API キーを必要とするかどうかを表示します。
主要なオプションとフラグ ⚙️
Subfinder には、サブドメイン列挙のプロセスをカスタマイズするための多くのオプションが用意されています。ここでは主要なものをいくつか紹介します。完全なリストは subfinder -h
で確認できます。
フラグ (短縮形, 長形式) | 説明 | 使用例 |
---|---|---|
-d, -domain |
単一または複数のターゲットドメインを指定します。 | subfinder -d example.com |
-dL, -list |
ドメインリストが記述されたファイルを指定します。 | subfinder -dL domains.txt |
-o, -output |
結果を出力するファイル名を指定します。 | subfinder -d example.com -o results.txt |
-oJ, -json |
結果をJSON形式で出力します (-o と併用)。 |
subfinder -d example.com -o results.json -oJ |
-oD, -output-dir |
-dL で複数のドメインを処理する際に、結果を保存するディレクトリを指定します。各ドメインの結果が個別のファイルに保存されます。 |
subfinder -dL domains.txt -oD output_results/ |
-s, -sources |
使用するデータソースをカンマ区切りで指定します。-ls で利用可能なソースを確認できます。 |
subfinder -d example.com -s github,virustotal,censys |
-es, -exclude-sources |
除外するデータソースをカンマ区切りで指定します。 | subfinder -d example.com -es bufferover,binaryedge |
-all |
設定されている全てのデータソースを使用します(APIキー未設定のソースも含まれますが、結果は限定的になる可能性があります)。処理時間が長くなる場合があります。 | subfinder -d example.com -all |
-r, -recursive |
再帰的なサブドメイン探索をサポートするソースのみを使用します。これにより、sub.sub.example.com のような、より深い階層のサブドメインを発見できる可能性があります。 |
subfinder -d example.com -recursive |
-nW, -nowildcard |
発見されたサブドメインに対してDNS解決を試み、解決できない(”dead”)サブドメインや、ワイルドカードとして設定されている可能性のあるサブドメインを除外します。これにより、実際にアクセス可能なサブドメインのみに絞り込むことができます。 | subfinder -d example.com -nW |
-v, -verbose |
詳細なログ(どのソースから何が見つかったかなど)を表示します。 | subfinder -d example.com -v |
-silent |
バナー情報などを表示せず、結果のみを出力します。スクリプトでの利用に便利です。 | subfinder -d example.com -silent |
-t, -threads |
DNS解決に使用する同時実行スレッド数を指定します(-nW などアクティブなチェックを行う場合)。デフォルトは10です。 |
subfinder -d example.com -nW -t 50 |
-timeout |
各ソースへのHTTPリクエストのタイムアウト時間(秒)を指定します。デフォルトは30秒です。 | subfinder -d example.com -timeout 60 |
-rl, -rate-limit |
1秒あたりの最大HTTPリクエスト数を指定します。APIのレート制限を回避するのに役立ちます。 | subfinder -d example.com -rl 10 |
-rls, -rate-limit-source |
特定のソースに対する1秒あたりの最大HTTPリクエスト数をキー=値の形式で指定します。 | subfinder -d example.com -rls "shodan=1/s,censys=5/s" |
-config |
デフォルト以外の設定ファイル (config.yaml, provider-config.yaml) を指定します。 | subfinder -d example.com -config /path/to/custom/config.yaml |
-ls |
利用可能なデータソースの一覧を表示します。 | subfinder -ls |
-h, -help |
ヘルプメッセージを表示します。 | subfinder -h |
-version |
Subfinderのバージョンを表示します。 | subfinder -version |
実践的なユースケースと組み合わせ例 🛠️
Subfinder は単体でも強力ですが、他のツールと組み合わせることで、さらに効果的な偵察ワークフローを構築できます。
1. 生存確認とポートスキャン
Subfinder で発見したサブドメインが実際に動作しているか(生存しているか)を確認し、開いているポートをスキャンする例です。ここでは、同じく ProjectDiscovery 製の httpx
ツールと naabu
ツールを組み合わせます。
# 1. Subfinderでサブドメインを列挙し、アクティブなものだけを絞り込む (-nW)
subfinder -d example.com -silent -nW > live_subdomains.txt
# 2. httpx で Webサーバーが稼働しているサブドメインを特定
cat live_subdomains.txt | httpx -silent -title -status-code -tech-detect > web_servers.txt
# 3. naabu でライブサブドメインのポートスキャンを実行 (Top 100 ポート)
naabu -list live_subdomains.txt -top-ports 100 -silent > open_ports.txt
まず Subfinder で生存しているサブドメインをリストアップし、次に httpx
で HTTP/HTTPS サービスが応答するものを抽出、最後に naabu
でそれらのポートスキャンを行います。
2. 特定の技術を使用しているサブドメインの探索
特定の技術(例: WordPress, Jenkins)を使用している可能性のあるサブドメインを探す場合にも、httpx
の技術検出機能と組み合わせると便利です。
# Subfinder でサブドメインを発見し、httpx で技術情報を付与してファイル保存
subfinder -d example.com -silent | httpx -silent -tech-detect -json -o tech_info.json
# jq コマンドを使って WordPress を含む行を抽出 (jq のインストールが必要)
cat tech_info.json | jq -c 'select(.technologies[]? | contains("WordPress"))'
3. 再帰的探索と組み合わせた深い探索
-recursive
フラグは、より深い階層のサブドメイン(例: dev.internal.example.com
)を発見するのに役立ちます。ただし、対応しているソースが限られるため、通常の探索と組み合わせることが考えられます。
# 通常の探索
subfinder -d example.com -o subs_normal.txt
# 再帰的探索
subfinder -d example.com -recursive -o subs_recursive.txt
# 結果を結合して重複を除去
cat subs_normal.txt subs_recursive.txt | sort -u > all_subdomains.txt
4. バグバウンティでの活用例
バグバウンティハンターは、発見したサブドメインに対して脆弱性スキャナー(例: Nuclei)を実行することがよくあります。
# 1. Subfinderでライブサブドメインを発見
subfinder -d target.com -silent -nW > live_subs.txt
# 2. Nuclei で既知の脆弱性テンプレートを実行
nuclei -list live_subs.txt -t ~/nuclei-templates/ -o nuclei_results.txt
これにより、新しく発見されたサブドメインに存在する可能性のある既知の脆弱性を迅速にチェックできます。
まとめ 🏁
Subfinder は、その高速性、パッシブなアプローチ、そして豊富なデータソース連携により、現代のサブドメイン列挙において非常に強力で不可欠なツールとなっています。基本的な使い方から、API キーの設定、各種オプションの活用、他のツールとの連携まで、その機能を理解し使いこなすことで、偵察活動の効率と精度を大幅に向上させることができます。
特に、ペネトレーションテストやバグバウンティの初期段階において、攻撃対象領域(Attack Surface)を正確に把握するために、Subfinder は大きな助けとなるでしょう。忘れられていたサブドメインや、想定外のサービスが動作しているサブドメインを発見することは、重大な脆弱性を見つける第一歩となることが少なくありません。
本記事が、Subfinder を活用し、より効果的なセキュリティ調査や評価を行うための一助となれば幸いです。ぜひ実際にツールを試してみて、そのパワーを体感してください!🚀
コメント