
DNSリクエストを解決し、CNAMEチェーンを追跡し、偵察中に潜在的なサブドメイン乗っ取りをフラグ付けすることで、露出したクラウドストレージバケット(AWS S3、GCP、Azure)を検出するパッシブDNSサーバー。
# S3DNS **s3dns** は、DNS リクエストを解決し、CNAME を追跡し、既知のバケット URL パターンと照合することで、クラウドストレージバケット(AWS S3、Google Cloud Storage、Azure Blob)を特定する軽量 DNS サーバーです。 これは、DNS トラフィック解析中に露出したクラウドバケットを検出したい **ペネトレーションテスター**、**バグバウンティハンター**、**クラウドセキュリティアナリスト** にとって便利なツールです。 S3DNS が偵察セッションの時間を節約してくれたなら、ぜひ ⭐️ を付けてください。プロジェクトの発見に役立ちます。 --- --- ### 🆕 更新 2026/03/06 * **TCP/53 サポート** — S3DNS は UDP と TCP の両方のポート 53 で待機するようになりました。切り捨てられた UDP 応答後に TCP で再試行するクライアントは正しく処理され、クエリは TCP 経由で上流に転送されて完全な応答が取得されます。 * **より大きな DNS バッファ** — UDP 受信バッファを 512 バイトから 4096 バイトに増やしました。クライアントからの EDNS0 オプションはそのまま上流リゾルバに渡されます。 * **応答キャッシュ** — UDP および TCP パスで共有される TTL ベースの LRU キャッシュ。アクティブな偵察セッション中に上流の負荷とレイテンシを削減します。`CACHE_SIZE` で設定可能(デフォルト: `1000` エントリ、`0` に設定すると無効)。 * **レート制限** — クライアント IP ごとのリクエストレート制限による不正使用の防止。`RATE_LIMIT` で設定可能(デフォルト: `100` req/s、`0` に設定すると無効)。 * **サブドメインテイクオーバー検出** — ドメインがクラウドストレージパターンに一致するが `NXDOMAIN` を返す場合、S3DNS はそれを **可能性のあるドメインテイクオーバー** としてフラグ付けします。これは、攻撃者が登録可能な未請求のバケットを指す、ぶら下がった DNS レコードを示しています。 * **IPv6 IP 範囲チェック** — AAAA レコードも解決され、既知のクラウドストレージ IP 範囲に対してチェックされるようになりました。AWS IPv6 S3 プレフィックスが IPv4 範囲と共に読み込まれます。 * **CNAME 深度制限** — 再帰的な CNAME チェーンの追跡を制限(デフォルト: 10 ホップ)し、細工された循環レコードによる無限ループを防止します。`max_cname_depth` パラメータで設定可能。 ### 更新 2025/08/19 * JSON ファイルとしてオフラインの AWS IP 範囲を追加。 * JSON ファイルとしてオフラインの Azure Storage IP 範囲を追加。 * 以下の設定を使用して、いずれかのサービスの IP 範囲チェックを無効にするオプションを追加: * `AZURE_IP_RANGES=false` または `AWS_IP_RANGES=false`(デフォルトは true)。 * `regex_patterns` とハードコードされたパターンを `patterns` フォルダに YAML ファイルとして移動。独自のパターンを追加可能。 * **正規表現パターンは `regex_` で始まる必要があります。** * さらに多くのクラウドプロバイダを追加: * IBM Cloud Object Storage * Oracle Object Storage * Alibaba OSS * Backblaze B2 * Linode Object Storage * Scaleway Object Storage * Vultr Object Storage * Cloudflare R2 ### 更新 2025/06/21 * AWS GovCloud サポートを追加。 ### 更新 2025/04/16 * 正規表現パターンを更新。 * 出力を見やすく更新(CNAME の元のドメイン、クライアント IP、IP 範囲インジケータを表示)。 * AWS からの IP 範囲の自動ダウンロード — それらもチェックするようになりました! * 独自の IP 範囲を追加するオプション(手動でクラス内のパターンまたは IP 範囲を調整)。 ### 更新 2025/04/14 * **Google Cloud Storage** および **Azure Blob Storage** バケットの正規表現サポートを追加。 --- ## 🚀 特徴 * DNS サーバとしてポート 53(UDP **および** TCP)で動作 * DNS リクエスト内の潜在的なクラウドストレージバケットを検出: * **AWS S3**(仮想ホスト形式とパス形式、GovCloud を含む) * **GCP バケット** * **Azure Blob コンテナ** * **DigitalOcean Spaces**、**Wasabi**、**IBM COS**、**Oracle Object Storage**、**Alibaba OSS**、**Backblaze B2**、**Linode**、**Scaleway**、**Vultr**、**Cloudflare R2** * **CNAME チェーン** を再帰的に追跡(設定可能な深度制限)して、隠れたクラウドバケットリンクを捕捉 * **潜在的なサブドメインテイクオーバー** をフラグ付け — NXDOMAIN を返すクラウドストレージパターン * 解決された IP(A および AAAA の両方)を既知の **AWS S3 および Azure Storage の IP 範囲** と照合 * **TTL 対応応答キャッシュ** により、偵察中のレイテンシと上流の負荷を削減 * **IP ごとのレート制限** で不正使用を防止 * すべての結果をコンソールとファイルに記録 * コンテナ対応 --- ## ⚙️ 動作の仕組み S3DNS は DNS クエリのために **ポート 53 (UDP および TCP)** で待機します。各リクエストに対して: 1. **要求されたドメインを抽出** 2. **応答キャッシュを確認** — 有効なキャッシュ応答があれば即座に返却 3. **実際の DNS リゾルバ(例: `1.1.1.1`)にリクエストを転送** — UDP クライアントには UDP 経由、TCP クライアントには TCP 経由 4. **有効な DNS 応答をクライアントに返却** 並行して: * **クラウドストレージバケットパターン**(正規表現およびハードコードされたホスト名マッチング)をチェック * **解決された IP を既知の AWS S3 および Azure Storage の範囲**(IPv4 および IPv6)と照合 * **CNAME チェーン** を設定された深度まで再帰的に追跡 * マッチしたパターンで **NXDOMAIN ヒット** を可能なサブドメインテイクオーバー候補としてフラグ付け * **すべての結果をコンソールと `s3dns.log` に記録** ⚡ 偵察中にこれを DNS として使用すると、ツールやブラウザが解決するすべてのドメインについて、クラウドバケットとテイクオーバー候補を受動的に表面化します。 --- ## 🧱 前提条件 次のいずれかのみ必要です: * Python **3.11+** * Docker(任意だが推奨) --- ## 🔧 インストール *Python でローカル実行する場合のみ必要* ### リポジトリのクローン ```bash git clone https://github.com/olizimmermann/s3dns.git cd s3dns ``` ### 依存関係のインストール (仮想環境の使用を推奨) ```bash python3 -m venv venv source venv/bin/activate pip install -r requirements.txt ``` --- ## 🧪 使用方法 ### Python で実行 ポート 53 には昇格した権限が必要です: ```bash sudo python s3dns.py ``` *`sudo` がモジュールが見つからないと訴える場合は、`sudo venv/bin/python s3dns.py` を試してください* * 自分でイメージをビルドする場合は、一貫性のために Docker Hub のバージョンと同じタグを付けてください: `docker build -t ozimmermann/s3dns:latest .` ### Docker を使用 *S3DNS を始める最も簡単な方法です。* ```bash 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 でビルドして実行 ```bash docker build -t ozimmermann/s3dns:latest . ``` ```bash 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` フラグを設定すると役立つ場合があります: ```bash 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` が必要になる場合があります: ```bash sudo docker run --rm -p 53:53/udp -p 53:53/tcp \ -v "./bucket_findings/:/app/buckets/" \ --name "s3dns" \ ozimmermann/s3dns:latest ``` --- ## 🌐 偵察での S3DNS の使用 システムまたはツールの **DNS リゾルバ** を S3DNS インスタンスに設定します。 > ブラウジングやターゲットのファジング中に、S3DNS はすべてのドメインを分析し、次のいずれかに解決されるかどうかを通知します: > > * **AWS S3 バケット** > * **GCP バケット** > * **Azure Blob コンテナ** > * その他 13 のサポートされているクラウドストレージプロバイダ > > **CNAME を追跡** するため、ドメインが `cdn.example.com` を指し、その先がクラウドバケットを指している場合も検出します。 > > また、**潜在的なサブドメインテイクオーバー** もフラグ付けします。ドメインがクラウドストレージパターンに一致するが、ターゲットが存在しない(NXDOMAIN)場合、ぶら下がったレコードがテイクオーバー候補として強調表示されます。 サイトを解析中に受動的に使用して、**アクティブなプロービングなしで露出したバケットやテイクオーバーの機会を発見** します。 --- ## ⚙️ 設定 コマンドラインフラグ、環境変数、または `s3dns.py` の変更により動作を調整できます。 すべてのオプションの優先順位は **コマンドラインフラグ > 環境変数 > インタラクティブプロンプト/デフォルト** です。フラグなしで実行すると、以前とまったく同じように動作します。 ### コマンドラインフラグ `python s3dns.py -h` を実行して全リストを表示: | フラグ | 対応する環境変数 | 説明 | |---|---|---| | `-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) | 例: ```bash sudo python s3dns.py -l 0.0.0.0 -u 1.1.1.1 --rate-limit 200 --no-azure-ip-ranges ``` ### 環境変数 | 変数 | デフォルト | 説明 | |---|---|---| | `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` = 無効) | #### ⚠️ Azure IP 範囲に関する注意 Microsoft は Azure Blob Storage の IP 範囲を明示的に命名していないため、S3DNS は **公開されているすべての Azure Storage IP アドレス** を使用します。これにより誤検出が発生する可能性があります。問題が発生した場合は、このチェックを無効にすることを検討してください: ```bash AZURE_IP_RANGES=false ``` ### カスタムパターンの追加 `patterns/` ディレクトリに YAML ファイルを追加します。`regex_` で始まるファイルは正規表現パターンとして扱われ、それ以外は部分文字列マッチとして扱われます。 --- ### デバッグモード **Python:** ```bash sudo su export DEBUG=true python s3dns.py ``` **Docker:** ```bash 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 で複数の環境変数を設定する: ```bash 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](https://github.com/olizimmermann/s3dns/blob/main/CONTRIBUTING.md) を参照してください。 パターンファイルは `patterns/` にあります。新しいプロバイダのサポートを追加するには、YAML エントリを追加するだけで — Python の知識は不要です。 --- ## 📄 ライセンス MIT ライセンス — 自由に使用、改善、共有できます。 --- ## ⚠️ 免責事項 責任を持って使用してください。**所有している** か、**明示的な許可** を得たドメインのみをスキャンしてください。 無許可のアクセスやプロービングは違法となる可能性があります。