Browsertunnel は、DNS プロトコルを使用してブラウザからデータを流出させるためのツールです。これは、指定されたドメインの DNS ルックアップをバックグラウンドで実行することで Web サイトの体感レイテンシを低減することを目的とした dns-prefetch を悪用することで実現しています。DNS トラフィックはブラウザのデバッグツールに表示されず、ページの Content Security Policy (CSP) によってブロックされず、企業のファイアウォールやプロキシによって検査されることも少ないため、制約のあるシナリオでデータを密かに送り出す理想的な媒体となります。
これは古い手法です。DNS トンネリング自体は 1990 年代にさかのぼり、Patrick Vananti は 2016 年にこれに dns-prefetch を使用する方法について書いていますが、私の知る限り、browsertunnel はその使用法を示す初めてのオープンソースで実用的なクライアント/サーバーです。dns-prefetch はクライアント側の JavaScript にデータを返さないため、browsertunnel を介した通信は単方向のみです。また、一部のブラウザではデフォルトで dns-prefetch が無効になっており、その場合 browsertunnel は静かに失敗します。
このプロジェクトは2つの部分から構成されています:
html/ フォルダにある小さな JavaScript ライブラリは、クライアント側でメッセージをエンコードして送信します。Browsertunnel は、文字列をサブドメインにエンコードし、ブラウザがそのドメインを再帰的に解決しようとしたときに browsertunnel サーバーに転送されることで、任意の文字列を DNS 経由で送信できます。
1つのドメイン(253バイト)に収まらない長いメッセージは自動的に複数のクエリに分割され、サーバーによって再構成・デコードされます。
まず、サーバーにサブドメインを委任するための DNS レコードを設定します。例えば、サーバーの IP が 192.0.2.123 で、サブドメイン t1.example.com をトンネルに使用する場合、DNS 設定は次のようになります:
t1 IN NS t1ns.example.com.
t1ns IN A 192.0.2.123
サーバー上で、go get を使用して browsertunnel をインストールします。あるいは、自分のマシンで browsertunnel をコンパイルし、バイナリをサーバーにコピーしても構いません。
go get github.com/veggiedefender/browsertunnel
次に、トンネルに使用するサブドメインを指定して browsertunnel を実行します。
browsertunnel t1.example.com
完全な使用方法については、browsertunnel -help を実行してください:
$ browsertunnel -help
Usage of browsertunnel:
-deletionInterval int
seconds in between checks for expired messages (default 5)
-expiration int
seconds an incomplete message is retained before it is deleted (default 60)
-maxMessageSize int
maximum encoded size (in bytes) of a message (default 5000)
-port int
port to run on (default 53)
これらのパラメータの詳細な説明と根拠については、godoc も参照してください。
最後に、トンネルをテストしましょう!私のデモページ こちら を使用するか、このリポジトリをクローンして html/index.html をローカルで読み込んでください。すべてが正常に動作すれば、標準出力にメッセージが表示されるはずです。
このプロジェクトを実際の用途に使用する場合は、必要に応じてコードをフォークして調整するとよいでしょう。いくつかのアイデアを示します: