subfinder はドメインのサブドメイン探索(列挙)を行うためのセキュリティツールです。主にセキュリティ研究者やペネトレーションテスター(侵入テスト実施者)が使用します。
subfinder の主な特徴
- パッシブ偵察ツール – ターゲットドメインに直接クエリを送信せずに、様々なパブリックソースからサブドメイン情報を収集します
- 複数のソースを使用 – DNSデータベース、検索エンジン、証明書の透明性ログなど様々な情報源から情報を収集します
- 高速処理 – 並列処理を行い、短時間で多くのサブドメインを発見できます
- 柔軟な出力オプション – 結果をテキスト、JSON、CSVなど様々な形式で出力できます
使用目的
subfinder は主に以下のような目的で使用されます:
- セキュリティ評価の初期段階での偵察
- ウェブアプリケーションの攻撃対象領域の把握
- バグバウンティプログラムでの脆弱性調査
- 組織の外部から見えるデジタル資産の把握
インストール
sudo apt update
sudo apt install subfinder
利用方法
基本
subfinder -d example.com
発見したサブドメインをファイルに出力する
subfinder -d example.com -o output.txt -silent -active
利用可能な情報源
subfinderで利用している情報源は下記コマンドでわかります。
subfinder -ls
[INF] Detected old /home/kali/.config/subfinder/config.yaml config file, trying to migrate providers to /home/kali/.config/subfinder/provider-config.yaml
[INF] Migration successful from /home/kali/.config/subfinder/config.yaml to /home/kali/.config/subfinder/provider-config.yaml.
__ _____ __
_______ __/ /_ / __(_)___ ____/ /__ _____
/ ___/ / / / __ \/ /_/ / __ \/ __ / _ \/ ___/
(__ ) /_/ / /_/ / __/ / / / / /_/ / __/ /
/____/\__,_/_.___/_/ /_/_/ /_/\__,_/\___/_/
projectdiscovery.io
[INF] Current subfinder version v2.6.0 (outdated)
[INF] Current list of available sources. [38]
[INF] Sources marked with an * need key(s) or token(s) to work.
[INF] You can modify /home/kali/.config/subfinder/provider-config.yaml to configure your keys/tokens.
alienvault
anubis
bevigil *
binaryedge *
bufferover *
c99 *
censys *
certspotter *
chaos *
chinaz *
commoncrawl
crtsh
digitorus
dnsdb *
dnsdumpster
dnsrepo *
fofa *
fullhunt *
github *
hackertarget
hunter *
intelx *
netlas *
leakix *
passivetotal *
quake *
rapiddns
riddler
robtex *
securitytrails *
shodan *
sitedossier
threatbook *
virustotal *
waybackarchive
whoisxmlapi *
zoomeye *
zoomeyeapi *
アスタリスク(*
)が付いているものと付いていないものがあります。
この違いは、APIキーの設定状況を示しています。
- アスタリスク (
*
) が付いている情報源: これらの情報源は、Subfinderが利用するためにAPIキーを必要とするサービスです。しかし、現状ではAPIキーが設定されていないため、このままではSubfinderはこれらの情報源を利用してサブドメインを検索することができません。これらの情報源を利用したい場合は、対応するAPIキーを取得し、Subfinderの設定ファイルに登録する必要があります。 - アスタリスク (
*
) が付いていない情報源: これらの情報源は、Subfinderが利用するためにAPIキーを必要としないサービスです。したがって、特別な設定をしなくても、Subfinderはこれらの情報源を利用してサブドメインを検索することができます。
実行結果
このサイトにはサブドメインはwwwしかありませんが実際に動かした結果を見てみたいと思います。
subfinder
subfinder -d watashi-no-meishi.net
__ _____ __
_______ __/ /_ / __(_)___ ____/ /__ _____
/ ___/ / / / __ \/ /_/ / __ \/ __ / _ \/ ___/
(__ ) /_/ / /_/ / __/ / / / / /_/ / __/ /
/____/\__,_/_.___/_/ /_/_/ /_/\__,_/\___/_/
projectdiscovery.io
[INF] Current subfinder version v2.6.0 (outdated)
[INF] Loading provider config from /home/kali/.config/subfinder/provider-config.yaml
[INF] Enumerating subdomains for watashi-no-meishi.net
www.watashi-no-meishi.net
[INF] Found 1 subdomains for watashi-no-meishi.net in 10 seconds 106 milliseconds
alienvault
AlienVault OTXは、公開されているDNS情報を継続的に収集・記録しています。あなたのドメインに関連するDNSレコードの変更(IPアドレスの変更、ネームサーバーの変更など)を過去に観測し、記録していることがわかります。
subfinderのソースでは下記のようになっているので、これをcurlで実行してみます。
resp, err := session.SimpleGet(ctx, fmt.Sprintf("https://otx.alienvault.com/api/v1/indicators/domain/%s/passive_dns", domain))
curl -v https://otx.alienvault.com/api/v1/indicators/domain/watashi-no-meishi.net/passive_dns
{
"passive_dns": [
{
"address": "160.251.148.92",
"first": "2024-07-24T07:20:22",
"last": "2024-08-29T03:46:14",
"hostname": "watashi-no-meishi.net",
"record_type": "A",
"indicator_link": "/indicator/domain/watashi-no-meishi.net",
"flag_url": "assets/images/flags/jp.png",
"flag_title": "Japan",
"asset_type": "domain",
"asn": "5A98DB gmo internet"
},
{
省略
}
],
"count": 2
}
address | 関連付けられていたIPアドレスまたはネームサーバーのホスト名です |
first | そのDNSレコードが最初に観測された日時(UTC) |
last | そのDNSレコードが最後に観測された日時(UTC) |
hostname | 問い合わせられたドメイン名 |
record_type | DNSレコードのタイプA : ドメイン名とIPv4アドレスの対応を示すレコードSOA (Start of Authority): DNSゾーンに関する権威情報を持つレコード。通常、ゾーンのプライマリネームサーバー、管理者のメールアドレス、ゾーンのシリアル番号などが含まれますNS (Name Server): そのドメインのネームサーバーを指定するレコード |
indicator_link | AlienVault OTX内の該当ドメインの詳細ページへのリンク |
flag_url | 関連するIPアドレスやネームサーバーの運用組織の国旗アイコンのURL。必ずしもドメインの登録国を示すとは限りません |
flag_title | 国旗に対応する国名 |
asset_type | アセットのタイプ |
asn (Autonomous System Number): | 関連するIPアドレスまたはネームサーバーを運用している組織の自律システム番号と組織名 |
anubis
subfinderのソースでは下記のようになっているので、これをcurlで実行してみます。
resp, err := session.SimpleGet(ctx, fmt.Sprintf("https://jonlu.ca/anubis/subdomains/%s", domain))
< HTTP/2 301
< date: Mon, 28 Apr 2025 14:09:00 GMT
< content-type: text/html
< content-length: 167
< location: https://anubisdb.com/anubis/subdomains/watashi-no-meishi.net/
endpointが変わったようなのでURLを変更して再実行してみます。
curl -v https://anubisdb.com/anubis/subdomains/watashi-no-meishi.net/
< HTTP/2 429
< ratelimit-policy: 2000;w=900
< ratelimit-limit: 2000
< ratelimit-remaining: 0
< ratelimit-reset: 514
< retry-after: 514
Too many requests, please try again later.
15分間に2000回以上実行したからレート制限に引っかかってしまったようです。
そんなに実行していないのですがまた今度試してみたいと思います。
commoncrawl
Common Crawlは、インターネット上のウェブページを大規模にクロール(収集)して、そのデータを公開している非営利プロジェクトです。 このプロジェクトは、ウェブコンテンツのアーカイブを作成し、研究者、データサイエンティスト、開発者などが自由にアクセスして利用できるようにすることを目的としています。
subfinderのソースでは下記のようになっているので、これをcurlで実行してみます。
const (
indexURL = "https://index.commoncrawl.org/collinfo.json"
maxYearsBack = 5
)
省略
resp, err := session.SimpleGet(ctx, indexURL)
curl -v https://index.commoncrawl.org/collinfo.json
[
{
"id": "CC-MAIN-2025-13",
"name": "March 2025 Index",
"timegate": "https://index.commoncrawl.org/CC-MAIN-2025-13/",
"cdx-api": "https://index.commoncrawl.org/CC-MAIN-2025-13-index",
"from": "2025-03-15T03:16:26",
"to": "2025-03-28T17:32:37"
},
{
"id": "CC-MAIN-2025-08",
"name": "February 2025 Index",
"timegate": "https://index.commoncrawl.org/CC-MAIN-2025-08/",
"cdx-api": "https://index.commoncrawl.org/CC-MAIN-2025-08-index",
"from": "2025-02-06T11:42:25",
"to": "2025-02-19T23:14:40"
},
省略
]
過去に実行したクロールの一覧を取得できました。
Subfinderのソースより上記のcdx-apiに記載されているendpointに対して5年分のクロール結果まで遡りサブドメインの有無を検索しているようです。
type indexResponse struct {
ID string `json:"id"`
APIURL string `json:"cdx-api"`
}
省略
for _, year := range years {
for _, index := range indexes {
if strings.Contains(index.ID, year) {
if _, ok := searchIndexes[year]; !ok {
searchIndexes[year] = index.APIURL
break
}
}
}
}
省略
resp, err := session.Get(ctx, fmt.Sprintf("%s?url=*.%s", searchURL, domain), "", headers)
1個目に取得できたクロール結果に対して実行してみます。
curl -v https://index.commoncrawl.org/CC-MAIN-2025-13-index?url=*.watashi-no-meisho.net
{"message": "No Captures found for: watashi-no-meisho.net"}
crtsh
crt.sh(Certificate Search)は、証明書の透明性(Certificate Transparency、CT)のデータベースとしてインターネット上のSSL/TLS証明書のパブリック記録を検索できるウェブサービスです。
subfinderのソースでは下記のようになっているので、これをcurlで実行してみます。
resp, err := session.SimpleGet(ctx, fmt.Sprintf("https://crt.sh/?q=%%25.%s&output=json", domain))
curl -v https://crt.sh/?q=%25.watashi-no-meishi.net&output=json
省略
<TR>
<TD style="text-align:center"><A href="?id=18043262970">18043262970</A></TD>
<TD style="text-align:center;white-space:nowrap">2025-04-24</TD>
<TD style="text-align:center;white-space:nowrap">2025-04-24</TD>
<TD style="text-align:center;white-space:nowrap">2025-07-23</TD>
<TD>www.watashi-no-meishi.net</TD>
<TD>watashi-no-meishi.net<BR>www.watashi-no-meishi.net</TD>
<TD><A style="white-space:normal" href="?caid=295815">C=US, O=Let's Encrypt, CN=R11</A></TD>
</TR>
省略
「www.watashi-no-meishi.net」を検知できました。
他にも情報源はありますが本日はここまでにします。