
DNSリクエストを解決し、CNAMEチェーンを追跡し、偵察中に潜在的なサブドメイン乗っ取りをフラグ付けすることで、露出したクラウドストレージバケット(AWS S3、GCP、Azure)を検出するパッシブDNSサーバー。
s3dns は、DNS リクエストを解決し、CNAME を追跡し、既知のバケット URL パターンと照合することで、クラウドストレージバケット(AWS S3、Google Cloud Storage、Azure Blob)を特定する軽量 DNS サーバーです。
これは、DNS トラフィック解析中に露出したクラウドバケットを検出したい ペネトレーションテスター、バグバウンティハンター、クラウドセキュリティアナリスト にとって便利なツールです。
S3DNS が偵察セッションの時間を節約してくれたなら、ぜひ ⭐️ を付けてください。プロジェクトの発見に役立ちます。
CACHE_SIZE で設定可能(デフォルト: 1000 エントリ、0 に設定すると無効)。RATE_LIMIT で設定可能(デフォルト: 100 req/s、0 に設定すると無効)。NXDOMAIN を返す場合、S3DNS はそれを 可能性のあるドメインテイクオーバー としてフラグ付けします。これは、攻撃者が登録可能な未請求のバケットを指す、ぶら下がった DNS レコードを示しています。max_cname_depth パラメータで設定可能。AZURE_IP_RANGES=false または AWS_IP_RANGES=false(デフォルトは true)。regex_patterns とハードコードされたパターンを patterns フォルダに YAML ファイルとして移動。独自のパターンを追加可能。
regex_ で始まる必要があります。S3DNS は DNS クエリのために ポート 53 (UDP および TCP) で待機します。各リクエストに対して:
1.1.1.1)にリクエストを転送 — UDP クライアントには UDP 経由、TCP クライアントには TCP 経由並行して:
s3dns.log に記録⚡ 偵察中にこれを DNS として使用すると、ツールやブラウザが解決するすべてのドメインについて、クラウドバケットとテイクオーバー候補を受動的に表面化します。
次のいずれかのみ必要です:
Python でローカル実行する場合のみ必要
git clone https://github.com/olizimmermann/s3dns.git
cd s3dns
(仮想環境の使用を推奨)
python3 -m venv venv
source venv/bin/activate
pip install -r requirements.txt
ポート 53 には昇格した権限が必要です:
sudo python s3dns.py
sudo がモジュールが見つからないと訴える場合は、sudo venv/bin/python s3dns.py を試してください
docker build -t ozimmermann/s3dns:latest .S3DNS を始める最も簡単な方法です。
docker pull ozimmermann/s3dns:latest
docker run --rm -p 53:53/udp -p 53:53/tcp \
-v "./bucket_findings/:/app/buckets/" \
--name "s3dns" \
ozimmermann/s3dns:latest
docker build -t ozimmermann/s3dns:latest .
docker run --rm -p 53:53/udp -p 53:53/tcp \
-v "./bucket_findings/:/app/buckets/" \
--name "s3dns" \
ozimmermann/s3dns:latest
結果は次の場所に保存されます:
./bucket_findings/分析を行うマシンと同じマシンで S3DNS を使用する場合、--network host フラグを設定すると役立つ場合があります:
docker run --rm -p 53:53/udp -p 53:53/tcp \
-v "./bucket_findings/:/app/buckets/" \
--network host \
--name "s3dns" \
ozimmermann/s3dns:latest
ポート 53 には昇格した権限が必要なため、一部のユーザー(Mac ユーザーなど)は sudo が必要になる場合があります:
sudo docker run --rm -p 53:53/udp -p 53:53/tcp \
-v "./bucket_findings/:/app/buckets/" \
--name "s3dns" \
ozimmermann/s3dns:latest
システムまたはツールの DNS リゾルバ を S3DNS インスタンスに設定します。
ブラウジングやターゲットのファジング中に、S3DNS はすべてのドメインを分析し、次のいずれかに解決されるかどうかを通知します:
- AWS S3 バケット
- GCP バケット
- Azure Blob コンテナ
- その他 13 のサポートされているクラウドストレージプロバイダ
CNAME を追跡 するため、ドメインが
cdn.example.comを指し、その先がクラウドバケットを指している場合も検出します。また、潜在的なサブドメインテイクオーバー もフラグ付けします。ドメインがクラウドストレージパターンに一致するが、ターゲットが存在しない(NXDOMAIN)場合、ぶら下がったレコードがテイクオーバー候補として強調表示されます。
サイトを解析中に受動的に使用して、アクティブなプロービングなしで露出したバケットやテイクオーバーの機会を発見 します。
コマンドラインフラグ、環境変数、または s3dns.py の変更により動作を調整できます。
すべてのオプションの優先順位は コマンドラインフラグ > 環境変数 > インタラクティブプロンプト/デフォルト です。フラグなしで実行すると、以前とまったく同じように動作します。
python s3dns.py -h を実行して全リストを表示:
例:
sudo python s3dns.py -l 0.0.0.0 -u 1.1.1.1 --rate-limit 200 --no-azure-ip-ranges
Microsoft は Azure Blob Storage の IP 範囲を明示的に命名していないため、S3DNS は 公開されているすべての Azure Storage IP アドレス を使用します。これにより誤検出が発生する可能性があります。問題が発生した場合は、このチェックを無効にすることを検討してください:
AZURE_IP_RANGES=false
patterns/ ディレクトリに YAML ファイルを追加します。regex_ で始まるファイルは正規表現パターンとして扱われ、それ以外は部分文字列マッチとして扱われます。
Python:
sudo su
export DEBUG=true
python s3dns.py
Docker:
docker run --rm -p 53:53/udp -p 53:53/tcp \
-v "./bucket_findings/:/app/buckets/" \
-e "DEBUG=true" \
--name "s3dns" \
ozimmermann/s3dns:latest
Docker で複数の環境変数を設定する:
docker run --rm -p 53:53/udp -p 53:53/tcp \
-v "./bucket_findings/:/app/buckets/" \
-e "LOCAL_DNS_SERVER_IP=0.0.0.0" \
-e "REAL_DNS_SERVER_IP=1.1.1.1" \
-e "RATE_LIMIT=200" \
-e "CACHE_SIZE=2000" \
--name "s3dns" \
ozimmermann/s3dns:latest

コントリビューションを歓迎します — 新しいクラウドプロバイダパターン、バグ修正、改良など。ガイドラインについては CONTRIBUTING.md を参照してください。
パターンファイルは patterns/ にあります。新しいプロバイダのサポートを追加するには、YAML エントリを追加するだけで — Python の知識は不要です。
MIT ライセンス — 自由に使用、改善、共有できます。
責任を持って使用してください。所有している か、明示的な許可 を得たドメインのみをスキャンしてください。
無許可のアクセスやプロービングは違法となる可能性があります。
| フラグ | 対応する環境変数 | 説明 |
|---|
-h, --help | – | ヘルプを表示して終了 |
--version | – | バージョンを表示して終了 |
-d, --debug | DEBUG | 詳細なデバッグ出力を有効化 |
-l, --listen IP | LOCAL_DNS_SERVER_IP | 待機するローカルインターフェース |
-u, --upstream IP | REAL_DNS_SERVER_IP | 転送先の上流 DNS リゾルバ |
-b, --bucket-file PATH | BUCKET_FILE | 発見されたバケットドメインを書き込むパス |
--aws-ip-ranges / --no-aws-ip-ranges | AWS_IP_RANGES | AWS S3 IP 範囲チェックの切り替え |
--azure-ip-ranges / --no-azure-ip-ranges | AZURE_IP_RANGES | Azure Storage IP 範囲チェックの切り替え |
--rate-limit N | RATE_LIMIT | クライアント IP あたりの最大 DNS リクエスト/秒(0 = 無効) |
--cache-size N | CACHE_SIZE | 最大キャッシュ DNS 応答数(0 = 無効) |
--max-cname-depth N | – | 追跡する最大 CNAME チェーン深度(デフォルト: 10) |
| 変数 | デフォルト | 説明 |
|---|
DEBUG | false | 詳細なデバッグ出力を有効化 |
AWS_IP_RANGES | true | AWS S3 IP 範囲チェックを有効化 |
AZURE_IP_RANGES | true | Azure Storage IP 範囲チェックを有効化 |
REAL_DNS_SERVER_IP | 1.1.1.1 | クエリを転送する上流 DNS リゾルバ |
LOCAL_DNS_SERVER_IP | 0.0.0.0 | 待機するローカルインターフェース |
BUCKET_FILE | buckets.txt | 発見されたバケットドメインを書き込むパス |
RATE_LIMIT | 100 | クライアント IP あたりの最大 DNS リクエスト/秒(0 = 無効) |
CACHE_SIZE | 1000 | 最大キャッシュ DNS 応答数(0 = 無効) |