
DNSChef - ペネトレーションテスターとマルウェアアナリストのためのDNSプロキシ
| | version 0.4 | | / _|
| | __ ___ | | __| |
/ ` | ' / |/ | ' \ / _ \ |
| (| | | | _ \ (| | | | __/ |
_,|| ||/_|| ||___||
D O C U M E N T A T I O N
DNSChef は、ペネトレーションテスターやマルウェアアナリスト向けの、高度に設定可能な DNS プロキシです。DNS プロキシ(別名「Fake DNS」)は、アプリケーションネットワークトラフィックの分析などに使用されるツールです。例えば、DNS プロキシを使用して "badguy.com" へのリクエストを偽装し、インターネット上の実際のホストではなく、ローカルマシンに終端またはインターセプトのために転送することができます。
既存の DNS プロキシは多数ありますが、そのほとんどはすべての DNS クエリを単一の IP アドレスにポイントするか、ごく基本的なフィルタリングしか実装していません。DNSChef は、より設定可能なシステムが必要とされたペネトレーションテストの一環として開発されました。その結果、DNSChef はクロスプラットフォームアプリケーションであり、包含・除外ドメインリストに基づくレスポンスの偽装、複数の DNS レコードタイプのサポート、ワイルドカードによるドメインマッチング、非マッチングドメインに対する真のレスポンスのプロキシ、外部設定ファイルの定義、IPv6 など、多くの機能を備えています。各機能の詳細な説明と推奨される使用方法は以下にあります。
DNS プロキシの使用は、アプリケーションに他のプロキシサーバーを直接強制できない状況で推奨されます。例えば、一部のモバイルアプリケーションは OS の HTTP プロキシ設定を完全に無視します。このような場合、DNSChef のような DNS プロキシサーバーを使用することで、そのアプリケーションをだまして目的の宛先に接続を転送できます。
DNSChef の使用を開始する前に、ツールが実行されている DNS ネームサーバーを使用するようにマシンを設定する必要があります。使用する OS に応じていくつかのオプションがあります。
Linux - /etc/resolv.conf を編集し、先頭にトラフィック分析ホストを追加します(ローカルで実行している場合は "nameserver 127.0.0.1" を追加)。あるいは、Network Manager などのツールを使用して DNS サーバーアドレスを追加することもできます。Network Manager 内で IPv4 設定を開き、Method ドロップダウンボックスから Automatic (DHCP) addresses only または Manual を選択し、DNS Servers テキストボックスに DNSChef が実行されている IP アドレスを編集します。
Windows - コントロールパネル から ネットワーク接続 を選択します。次に、いずれかの接続(例:"ローカルエリア接続")を選択し、右クリックしてプロパティを選択します。新しいダイアログボックスで、インターネットプロトコル (TCP/IP) を選択し、プロパティをクリックします。最後に 次の DNS サーバーのアドレスを使う ラジオボタンを選択し、DNSChef が実行されている IP アドレスを入力します。例えば、ローカルで実行している場合は 127.0.0.1 を入力します。
OS X - システム環境設定 を開き、ネットワーク アイコンをクリックします。アクティブなインターフェースを選択し、DNS サーバ フィールドに入力します。Airport を使用している場合は、詳細... ボタンをクリックし、そこから DNS サーバーを編集する必要があります。あるいは、/etc/resolv.conf を編集し、先頭に偽のネームサーバー(例:"nameserver 127.0.0.1")を追加することもできます。
iOS - 設定 を開き、一般 を選択します。次に Wi-Fi を選択し、リストからアクティブなアクセスポイントの右側にある青色の矢印をクリックします。DNS エントリを編集して DNSChef が実行されているホストを指定します。セルラーインターフェースが利用可能な場合は無効にしてください。
Android - 設定 を開き、ワイヤレスとネットワーク を選択します。Wi-Fi 設定 をクリックし、電話の オプション ボタンを押した後、詳細設定 を選択します。静的 IP を使用 チェックボックスを有効にし、カスタム DNS サーバーを設定します。
デバイスの DNS 設定を手動で変更できない場合でも、ARP スプーフィング、不正 DHCP などの手法を使用するオプションがいくつかあります。
最後に、DNSChef がすべてのリクエストをポイントする偽のサービスを設定する必要があります。例えば、Web トラフィックをインターセプトする場合、ポート 80 で動作する別の Web サーバーを立ち上げるか、Web プロキシ(例:Burp)を設定してトラフィックをインターセプトします。DNSChef は、適切に設定されたサービスのあるプロキシ/サーバーホストにクエリをポイントします。
DNSChef は Python で開発されたクロスプラットフォームアプリケーションであり、Python インタプリタが動作するほとんどのプラットフォームで動作します。Windows ホストでは、Python インタプリタをインストールせずに実行できる付属の dnschef.exe 実行ファイルを使用できます。このガイドでは Unix 環境に焦点を当てますが、以下の例はすべて Windows でも動作することを確認しています。
DNSChef の最も基本的な監視機能を試してみましょう。以下のコマンドを root で実行します(ポート 53 でサーバーを起動するために必要)。
# ./dnschef.py
_ _ __
| | version 0.2 | | / _|
__| |_ __ ___ ___| |__ ___| |_
/ _` | '_ \/ __|/ __| '_ \ / _ \ _|
| (_| | | | \__ \ (__| | | | __/ |
\__,_|_| |_|___/\___|_| |_|\___|_|
[email protected]
[*] DNSChef started on interface: 127.0.0.1
[*] Using the following nameservers: 8.8.8.8
[*] No parameters were specified. Running in full proxy mode
パラメータを指定しない場合、DNSChef はフルプロキシモードで動作します。つまり、すべてのリクエストは単純にアップストリーム DNS サーバー(デフォルトでは 8.8.8.8)に転送され、クエリ元のホストに返されます。例えば、ドメインに対する "A" レコードをクエリして結果を確認してみましょう。
$ host -t A thesprawl.org
thesprawl.org has address 108.59.3.64
DNSChef は、時刻、送信元 IP アドレス、要求されたレコードのタイプ、そして最も重要なクエリされた名前を示すログ行を出力します。
[23:54:03] 127.0.0.1: proxying the response of type 'A' for thesprawl.org
このモードは、アプリケーションが通信に使用するドメインを特定する必要があるシンプルなアプリケーション監視に便利です。
DNSChef は IPv6 を完全にサポートしており、-6 または --ipv6 フラグを使用して有効にできます。デフォルトのリスニングインターフェースが ::1 に、デフォルトの DNS サーバーが 2001:4860:4860::8888 に切り替わる以外は IPv4 モードとまったく同じように動作します。以下はサンプル出力です。
# ./dnschef.py -6
_ _ __
| | version 0.2 | | / _|
__| |_ __ ___ ___| |__ ___| |_
/ _` | '_ \/ __|/ __| '_ \ / _ \ _|
| (_| | | | \__ \ (__| | | | __/ |
\__,_|_| |_|___/\___|_| |_|\___|_|
[email protected]
[*] Using IPv6 mode.
[*] DNSChef started on interface: ::1
[*] Using the following nameservers: 2001:4860:4860::8888
[*] No parameters were specified. Running in full proxy mode
[00:35:44] ::1: proxying the response of type 'A' for thesprawl.org
[00:35:44] ::1: proxying the response of type 'AAAA' for thesprawl.org
[00:35:44] ::1: proxying the response of type 'MX' for thesprawl.org
注:デフォルトでは、DNSChef は UDP リスナーを作成します。代わりに TCP を使用するには、後述の --tcp 引数を使用します。
DNSChef の起動方法がわかったところで、次に --fakeip パラメータを使用してすべての応答を 127.0.0.1 に向けるように設定しましょう。
# ./dnschef.py --fakeip 127.0.0.1 -q
[*] DNSChef started on interface: 127.0.0.1
[*] Using the following nameservers: 8.8.8.8
[*] Cooking all A replies to point to 127.0.0.1
[23:55:57] 127.0.0.1: cooking the response of type 'A' for google.com to 127.0.0.1
[23:55:57] 127.0.0.1: proxying the response of type 'AAAA' for google.com
[23:55:57] 127.0.0.1: proxying the response of type 'MX' for google.com
上記の出力では、DNSChef がすべてのリクエストを 127.0.0.1 にプロキシするように設定されていることがわかります。08:11:23 の最初のログ行は、"A" レコードの応答を 127.0.0.1 に "cook"(偽装)したことを示しています。しかし、'AAAA' および 'MX' レコードの後続のリクエストは、実際の DNS サーバーから単にプロキシされています。要求プログラムからの出力を見てみましょう。
$ host google.com localhost
google.com has address 127.0.0.1
google.com has IPv6 address 2001:4860:4001:803::1001
google.com mail is handled by 10 aspmx.l.google.com.
google.com mail is handled by 40 alt3.aspmx.l.google.com.
google.com mail is handled by 30 alt2.aspmx.l.google.com.
google.com mail is handled by 20 alt1.aspmx.l.google.com.
google.com mail is handled by 50 alt4.aspmx.l.google.com.
ご覧のとおり、プログラムは IPv4 アドレスに 127.0.0.1 を使用するよう騙されました。ただし、IPv6(AAAA)およびメール(MX)レコードから得られた情報は完全に正当に見えます。DNSChef の目標はプログラムの正しい動作への影響を最小限に抑えることです。そのため、アプリケーションが特定のメールサーバーに依存している場合、このプロキシリクエストを通じて正しく取得されます。
次に、複数のレコードを同時にターゲットにする方法を示すために、もう 1 つリクエストを偽装してみましょう。
# ./dnschef.py --fakeip 127.0.0.1 --fakeipv6 ::1 -q
[*] DNSChef started on interface: 127.0.0.1
[*] Using the following nameservers: 8.8.8.8
[*] Cooking all A replies to point to 127.0.0.1
[*] Cooking all AAAA replies to point to ::1
[00:02:14] 127.0.0.1: cooking the response of type 'A' for google.com to 127.0.0.1
[00:02:14] 127.0.0.1: cooking the response of type 'AAAA' for google.com to ::1
[00:02:14] 127.0.0.1: proxying the response of type 'MX' for google.com
--fakeip フラグに加えて、'AAAA' レコードクエリを偽装するための --fakeipv6 も指定しました。更新されたプログラム出力は以下のとおりです。
$ host google.com localhost
google.com has address 127.0.0.1
google.com has IPv6 address ::1
google.com mail is handled by 10 aspmx.l.google.com.
google.com mail is handled by 40 alt3.aspmx.l.google.com.
google.com mail is handled by 30 alt2.aspmx.l.google.com.
google.com mail is handled by 20 alt1.aspmx.l.google.com.
google.com mail is handled by 50 alt4.aspmx.l.google.com.
アプリケーションによって明示的に上書きされなかったレコードはすべてプロキシされ、実際の DNS サーバーから返されました。ただし、IPv4(A)と IPv6(AAAA)は両方ともローカルマシンを指すように偽装されました。
DNSChef は複数のレコードタイプをサポートしています。