
PolarDNSは、ペネトレーションテストや脆弱性調査に適した特殊な権威DNSサーバーです。
PolarDNS は Python 3.x で書かれた特殊な権威 DNS サーバーで、もともとはサーバー側から DNS 再帰リゾルバーのセキュリティテストを行うためのツールとして開発されました。
_
PolarDNS は以下のテストに使用できます:
UDP と TCP の両方のプロトコルをサポートし、オペレーターは DNS プロトコル層を完全に制御できます。
PolarDNS サーバーは、非標準および非準拠の DNS 応答、RFC 仕様に違反する DNS 応答、極めて異常で不正な形式の DNS 応答などを生成できます。
これは以下の用途に役立ちます:
PolarDNS をインストールするには、3 つの方法があります。
PolarDNS には Python 3.11 以降が必要であり、追加の依存関係はありません。
これが PolarDNS をインストールして実行する最も簡単な方法です:
pip install polardns
polardns
リポジトリをクローンして PolarDNS を直接実行することもできます:
git clone https://github.com/oryxlabs/PolarDNS.git
cd PolarDNS
python polardns.py
この方法は、コードのデバッグや修正、新機能の追加を計画している場合に推奨されます。
PolarDNS を Docker コンテナ内で実行することもできます:
docker run -p 53:53/tcp -p 53:53/udp oryxlabs/polardns
PolarDNS サーバーは polardns/polardns.toml 設定ファイルで構成できます。
PolarDNS を起動すると、次のような出力が表示されるはずです:
python polardns.py
1741599804.9039893 | PolarDNS v1.6.1 サーバー起動中
1741599804.9039893 | '/path/to/your/polardns/polardns.toml' 設定ファイルを使用中
1741599804.9039893 | tcp://0.0.0.0:53 でリスナーを起動中
1741599804.9039893 | udp://0.0.0.0:53 でリスナーを起動中
これはサーバーが起動して実行中であることを示します。
デフォルトでは、サーバーはすべてのインターフェース上で UDP および TCP ポート 53 (0.0.0.0:53) で待機し、DNS クエリに応答する準備ができています。
次のサンプルクエリをローカルでテストできます。これは常に何かに解決されるはずです。
UDP モードで問い合わせ:
dig always.yourdomain.com @127.0.0.1
TCP モードで問い合わせ:
dig always.yourdomain.com @127.0.0.1 +tcp
2.3.4.5 IP アドレスを持つ A レコードが返されるはずです。次のスクリーンショットと同様です:
これはサーバーが正しく動作していることを示します。
PolarDNS サーバーに何かを解決するよう依頼することは、実質的にサーバーに対してどのように応答すべきかの指示を与えることになります。つまり、クライアントであるあなたが PolarDNS サーバーにどのような応答を生成させるかを決定します。
例えば、次のクエリを考えてみてください:
dig always.ttl2000000000.slp1500.yourdomain.com @127.0.0.1
再び 2.3.4.5 IP アドレスを持つ A レコードが返されるはずですが、今度は TTL 値が 2,000,000,000(63.4 年)で、1.5 秒の遅延後に応答が返されます:
上記の例では、always 基本機能(常に何かに解決)を使用し、ttl モディファイアで TTL 値を調整し、slp モディファイアで応答送信前に待機するように組み合わせました。
PolarDNS には以下の主要な機能があります:
現在、70 を超える機能と 19 の応答モディファイアが実装されています。異なる機能と応答モディファイアを組み合わせることで、無数の応答バリエーションを生成できます。
実装されているすべての 機能 と 応答モディファイア の カタログ をご覧ください。
これにより、PolarDNS は非常に異常で、異常かつ不正な形式の DNS 応答を生成でき、受信側がそのような状況をどのように処理するか、また受信側が技術的に堅牢で成熟しているかを確認できます。
PolarDNS が生成できる DNS 応答の例には以下が含まれます:
これらは、次のようなさまざまな脆弱性の発見につながる可能性があります:
詳細、さらに多くの例とユースケースについては、BlackHat MEA 2023 のプレゼンテーション(BONUS スライドを含む)をご覧ください。
再帰 DNS サーバーのテストを開始するために必要なものの概要を以下に示します。
example123.com)を購入します。polardns/polardns.toml 設定ファイルを編集し、ドメイン名とネームサーバーの IP アドレスを適宜変更します(両方で同じ設定)。これで、任意の再帰 DNS リゾルバーをテストするためのインフラストラクチャが整いました。
ターゲット DNS リゾルバーのテストを開始するには、クエリをターゲット DNS リゾルバーに向ける必要があります。例:
dig always.example123.com @<TARGET-RESOLVER-IP>
例えば、CloudFlare のパブリック DNS をテストする場合:
dig always.example123.com @1.1.1.1
解決中、ターゲット DNS リゾルバーは、クエリを解決するためにあなたの権威ある PolarDNS ネームサーバー(example123.com テストドメインを管理)に接続します。
PolarDNS サーバーの 1 つがターゲット DNS リゾルバーに応答します。リゾルバーは PolarDNS からの応答を受信、解析、処理し、最終的な回答をクライアント(あなた)に返します。
テストプロセスの視覚的な概要:

DNS リゾルバーに example123.com ドメインのさまざまなサブドメインを解決するように指示することで、DNS リゾルバーの動作を効果的にテストし、さまざまな予期しない状況(応答)をどのように処理するかを確認できます。
例えば、不正な形式の DNS 応答、注入されたレコードを含む応答、不正な文字を含むレコードを取得した場合、リゾルバーはどのように処理し、最終的にクライアントにどのような回答を送信するのでしょうか?
PolarDNS はさまざまな DNS リゾルバーと統合して、包括的なエンドツーエンド(E2E)DNS サーバーテストスイートを実行できます。
この統合は GitHub Actions によって実現され、現在以下の 6 つの DNS リゾルバー用のリファレンステンプレート(ワークフロー)が利用可能です:
GitHub Action がトリガーされると(例:コミット時または手動)、ワークフローは次の手順を実行します:
独自の E2E テストを追加するには、test-e2e/ ディレクトリに配置するだけです。
フル機能の DNS サーバー E2E テストスイートをお探しですか? [email protected] までお問い合わせください。
PolarDNS に新機能を追加することは、真に新しい DNS 問題を発見するために不可欠です。そして PolarDNS を使用すれば、比較的簡単にそれができます。
PolarDNS を使用すると、新しい機能を迅速に追加したり、アイデアを試したり、独自の DNS サーバーを構築せずに PoC を開発したりできます。必要なのは Python コードを理解する能力と、DNS プロトコルを実験する好奇心だけです。
詳細なステップバイステップのコントリビューションガイドが用意されており、新しい機能の追加方法だけでなく、PolarDNS のデバッグ方法、問題の報告、アイデアの共有なども記載されています。
PolarDNS を試す際に役立つ優れたリソースをいくつか紹介します。
DNS プロトコル関連リンク:
DNS サーバー:
PolarDNS に貢献してくださったすべての皆様に感謝します! ❤️