
リモート デスクトップ サービス用ユニバーサル動的仮想チャネルコネクタ
Terminal Services(または Remote Desktop Services)には、もっと深く掘り下げたい人向けの隠れた機能が数多く用意されています。その1つがダイナミック仮想チャネルで、ファイアウォールで新しいソケットや接続、ポートを開く必要なく、開いている RDP 接続を介して通信できます。これらのチャネルは、アクティブなネットワークデバイスからデータを隠したり、ファイアウォールをバイパスしたり、ネットワーク経由でデバイスドライバを実装したり、ペネトレーションテスターがデータを転送するのを助けたりするために使用できます。可能性は 無限にあります。
このプロジェクトが作られた本当の理由は XFLTReaT です。これは、分離されたネットワーク上に「VPN」を構築するために使用でき、最終的にはファイアウォールの変更を要求せずにジャンプボックスを経由したテストを可能にします。一言で言えば、ペネトレーションテスターの作業を楽にします。
RDP サーバーへの接続に使用するクライアントコンピューターにプラグイン(.dll)をインストールする必要があります。RDP サーバー側では、プロジェクトのもう半分である .exe を使用する必要があります。これにより、プラグインとサーバー実行ファイルの間にチャネルが作成されます。 詳細を知りたい場合は、下にスクロールしてください。
Windows のみ対応です。 ダイナミック仮想チャネルは Windows Server 2008 と Windows Vista SP1 で導入されました。これらおよびそれよりも新しいバージョンであれば問題なく動作します。
プロジェクト全体を取得して自分でコンパイルするか、リリースセクション からコンパイル済みバイナリを使用することができます。すべての場合において正しいバイナリを使用することが重要です。対応するアーキテクチャに合ったものを選択してください(クライアントが32ビットでサーバーが64ビットの場合は、32ビットの dll と64ビットの exe を取得してください)。
.dll はクライアントコンピューターの任意のディレクトリに配置する必要があります(長期的に使用する場合は、%SYSROOT%\system32\ または %SYSROOT%\SysWoW64\ に配置できます)。そして、昇格したユーザー(別名 Administrator)として次のコマンドでインストールします:
regsvr32.exe UDVC-Plugin.dll
ユーザーが管理者でない場合は、自分のユーザーでもレジストリ設定をインポートする必要があります。その場合は UDVC-Plugin.reg ファイルを使用してください。
削除したい場合:
regsvr32.exe /u UDVC-Plugin.dll
今後 RDP サーバーに接続するたびに、このプラグインが読み込まれ、レジストリで指定されたとおりに自動設定されます(下記参照)。
.exe は RDP サーバーに配置し、任意のユーザーとして実行する必要があります。
現時点では、両側で3つのモードをサポートしています:
このモードを有効にすると、指定されたポートとインターフェース(IPアドレス)でリスナーがセットアップされます。
このモードでは、指定された IP アドレスとポートのリスナーに対して接続が行われます。
このモードは、指定された名前で名前付きパイプをセットアップします。例として、他のツールが RDP 経由で IPC 通信を行うために使用できます。残念ながら、名前付きパイプはディスクに書き込まれるため、ソケットモードと比較して低速と見なされます。帯域幅を気にする場合は、ソケットモードを使用してください。
クライアントとサーバーバイナリはどちらも同じように動作し、同じオプションで設定できます。
サーバーバイナリはコマンドラインからオプションを読み取ります。
PS C:\Users\UDVC\> .\UDVC-Server.exe -h
Universal Dynamic Virtual Channel server application
Usage: C:\Users\UDVC\UDVC-Server.exe [-s | -c [-p port [-h ip]] | -m [-n name]] [-0 | -1 | -2 | -3]
Socket server mode -s (default) OR
Socket client mode -c:
-p port port to bind the listener (default: 31337)
-i ip ip to bind the listener (default: 127.0.0.1)
Named pipe mode -m:
-n name name of the named pipe (by default: "\\.\pipe\UDVC_{RDP SESSION NUMBER}")
Data transfer priority parameters:
-0 real time (WTS_CHANNEL_OPTION_DYNAMIC_PRI_REAL)
-1 high priority (WTS_CHANNEL_OPTION_DYNAMIC_PRI_HIGH) - default
-2 medium priority (WTS_CHANNEL_OPTION_DYNAMIC_PRI_MED)
-3 low priority (WTS_CHANNEL_OPTION_DYNAMIC_PRI_LOW)
クライアントの .dll はレジストリからすべてのオプションを読み取ります。値は次のキーの下にあります:
HKEY_CURRENT_USER\SOFTWARE\Microsoft\Terminal Server Client\Default\AddIns\UDVC-Plugin
モジュールが有効になるたびに、接続が行われる前に注意喚起の警告が表示されます。次のように表示されます:

この警告により、ユーザーはプラグインが読み込まれていることと、その設定内容を認識できます。
リスナー、接続、名前付きパイプは、サーバー実行ファイルがプラグイン dll に接続できた場合にのみ作成されます。設定によって異なりますが、デフォルトでは仮想チャネル接続が確立されると(プラグインが正しく読み込まれ、サーバーバイナリが実行されると)、両方のエンドポイントで localhost:31337 をリッスンします。これらのポートに接続してソケット経由でデータを送信すると、相手側に表示されます。
このツールが使用できるいくつかのユースケースを示します。
非常に基本的なポートフォワーディング。Segregated 1 マシンには tcp/80 で HTTP サービスがあります。そのネットワークは 192.168.0.0/24 ネットワークからルーティングされていないため、アクセスするにはデュアルホームのジャンプボックスを使用する必要があります。クライアント側ではリッスンモードが 0.0.0.0:31337 で設定され、サーバーバイナリは Web サーバーへの接続を作成するためにコネクトモード設定で実行されました。RDP クライアントのユーザーは、ブラウザで http://127.0.0.1:31337 を開いて、http://10.13.37.2:80 のコンテンツにアクセスできます。

もう少し高度なファイル転送シナリオ。両方のエンドポイントが 0.0.0.0:31337 でリッスンするように設定されています。最初に Hacking box が RDP クライアントに接続し、入力を待ちます。次に Segregated 2 マシンが Jump box に接続し、ファイル全体をソケットに読み込みます。

さらに、名前付きパイプも使用できます。この場合、RDP クライアントと Jump box の両方が両側に名前付きパイプ(hIPC-client と hIPC-server)を作成し、他のマシンはこれらのパイプに接続できます。パイプに書き込まれたものは、もう一方の端に表示されます。これは、TCP ソケットの代わりに名前付きパイプを使用している点を除けば、上記のリッスンモードの例とそれほど変わりません。

プラグインが読み込まれない、または実行ファイルが実行されない場合(たとえば VCRUNTIME140.DLL などの一部の DLL が不足しているため)、Visual C++ Redistributable for Visual Studio 2015 パッケージをインストールするとよいでしょう。