
DNSChef (NG) - ペネトレーションテスターとマルウェアアナリスト向けDNSプロキシ
[!NOTE] これは、@iphelix によって元々書かれた DNSChef の更新版です。``` _ _ __
| | v0.7 | | / |
| | __ ___ | | | | ______ _ __ __ _ /| '_ \/ __|/ __| '_ \ / _ \ _|______| '_ \ / _| | (| | | | _ \ (__| | | | __/ | | | | | (| | _,|| ||/_|| ||___|| || ||_, | / | |_/ 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 プロキシサーバーを使用すると、そのアプリケーションをだまして、目的の宛先に接続を転送させることができます。
## 新機能
- Python 3.11+ が必要
- DNS 経由でのファイルステージングをサポート(現時点では `A`、`AAAA`、`TXT` のみ)
- 設定ファイルが TOML になりました
- オプションの HTTP API(ログの照会と設定のリモート更新が可能)
- パフォーマンス向上のための完全非同期(AsyncIO を使用)
- 構造化ロギングと多数の QOL 改善
- Python パッケージになりました
- Docker 化
- 元のリポジトリからの多数の PR と修正が含まれています
## インストール
最新リリースをインストールするには、[pipx](https://pypa.github.io/pipx/) を使用してください(いい加減なステーキが好きなクズでない限り):
pipx install dnschef-ng
HTTP API を使用したい場合(追加の依存関係が必要):
pipx install dnschef-ng[api]
pipx を使用して Git から最新バージョンをインストール:
pipx install git+https://github.com/byt3bl33d3r/dnschef-ng.git
pipx を使用して、HTTP API の依存関係を含む Git から最新バージョンをインストール:
pipx install "git+https://github.com/byt3bl33d3r/dnschef-ng.git#egg=dnschef-ng[api]"
## DNS プロキシのセットアップ
DNSChef を使い始める前に、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** - *コントロールパネル* から *ネットワーク接続* を選択します。次に、いずれかの接続(例: "Local Area Connection")を選択し、右クリックしてプロパティを選択します。表示されたダイアログボックス内で、*Internet Protocol (TCP/IP)* を選択し、プロパティをクリックします。最後に、*Use the following DNS server addresses* ラジオボタンを選択し、DNSChef が実行されている IP アドレスを入力します。たとえば、ローカルで実行している場合は 127.0.0.1 を入力します。
- **OS X** - *システム環境設定* を開き、*ネットワーク* アイコンをクリックします。アクティブなインターフェースを選択し、*DNS サーバー* フィールドに入力します。Airport を使用している場合は、*Advanced...* ボタンをクリックして、そこから DNS サーバーを編集する必要があります。あるいは、*/etc/resolv.conf* を編集して、一番上に偽のネームサーバーを追加することもできます(例: "nameserver 127.0.0.1")。
- **iOS** - *設定* を開き、*一般* を選択します。次に *Wi-Fi* を選択し、リスト内のアクティブなアクセスポイントの右側にある青い矢印をクリックします。DNS エントリを編集して、DNSChef が実行されているホストを指すようにします。Cellular インターフェース(利用可能な場合)が無効になっていることを確認してください。
- **Android** - *設定* を開き、*ワイヤレスとネットワーク* を選択します。*Wi-Fi設定* をクリックし、電話の *オプション* ボタンを押した後、*詳細* を選択します。*Use static IP* チェックボックスを有効にして、カスタム DNS サーバーを設定します。
デバイスの DNS 設定を手動で変更できない場合でも、[ARP Spoofing](http://en.wikipedia.org/wiki/ARP_spoofing)、[Rogue DHCP](http://www.yersinia.net/doc.htm)、その他の創造的な方法などのテクニックを含むいくつかの選択肢があります。
最後に、DNSChef がすべてのリクエストを向ける偽のサービスを設定する必要があります。たとえば、Web トラフィックを傍受しようとしている場合、ポート 80 で実行されている別の Web サーバーを立ち上げるか、トラフィックを傍受するための Web プロキシ(例: Burp)をセットアップする必要があります。DNSChef は、適切に設定されたサービスが稼働しているプロキシ/サーバーホストにクエリを向けます。
## DNSChef の実行
DNSChef は Python で開発されたクロスプラットフォームアプリケーションであり、Python インタープリターを備えたほとんどのプラットフォームで実行できるはずです。このガイドでは 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 HTTP API の実行
> [!WARNING]
> API には認証がありません。セキュリティグループ、iptables、ファイアウォールなどを使用して、ネットワークレベルでアクセスを許可/拒否してください。
`uvicorn dnschef.api:app`
その後、`http://127.0.0.1:8000/docs` で OpenAPI ドキュメントを表示できます。```
$ uvicorn dnschef.api:app
INFO: Started server process [28327]
INFO: Waiting for application startup.
_ _ __
| | version 0.6.0 | | / _|
__| |_ __ ___ ___| |__ ___| |_
/ _` | '_ \/ __|/ __| '_ \ / _ \ _|
| (_| | | | \__ \ (__| | | | __/ |
\__,_|_| |_|___/\___|_| |_|\___|_|
@iphelix // @byt3bl33d3r
2023-09-28 11:24:59 cooking replies domain=*.thesprawl.org record=192.0.2.1 section=A
2023-09-28 11:24:59 cooking replies domain=*.thesprawl.org record=2001:db8::1 section=AAAA
-- SNIP --
2023-09-28 11:24:59 cooking replies domain=*.thesprawl.org record=1 . alpn=h2 ipv4hint=127.0.0.1 ipv6hint=::1 section=HTTPS
INFO: Application startup complete.
2023-09-28 11:24:59 DNSChef is active interface=127.0.0.1 ipv6=False nameservers=['8.8.8.8'] port=53 tcp=False
INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
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 を指すように「偽装(cooked)」されたことを示しています。ただし、'AAAA' および 'MX' レコードへの以降のリクエストは、実際の DNS サーバーから単にプロキシされます。要求元プログラムの出力を見てみましょう。