X11プロトコルトラフィックキャプチャ

X11プロトコルトラフィックキャプチャ

どのようにキャプチャするX11プロトコルトラフィック?

2つのコンピュータ間、およびローカルコンピュータのX11サーバーとX11クライアント間でX11トラフィックをキャプチャする方法を見つける必要があります。

答え1

TCP、Unixドメインソケット、または(Linuxの場合)Unixドメインソケットを介してX11と通信できます。抽象的な名前空間。

host:4DISPLAYが(省略形)に設定されている場合、tcp/host:4クライアントはTCPを使用してサーバーに接続します。 TCPポートは、6000にディスプレイ番号(この例では6004)を加えた値です。

この場合、ネットワークスニファを使用してそのポートからTCPトラフィックをtcpdumpキャプチャするなど、トラフィックをキャプチャできます。wireshark

$DISPLAYis only :4(の省略形)の場合、unix/:4クライアントはUnixドメインソケットを使用します。/tmp/.X11-unix/X4同じ長さでも抽象的な名前空間(通常は出力@/tmp/.X11-unix/X4に表示されますnetstat

トラフィックのキャプチャがさらにトリッキーになります。

XサーバーがTCPをリッスンしていたがもはやリッスンしない場合、最も簡単な方法はDISPLAY代わりにループバックインターフェイスのポート6004でネットワークトラフィックをlocalhost:4キャプチャするように変更することです。:4

それ以外の場合は、次のものをsocat使用できます。中間者TCP接続を受け入れ、次のように渡します。Unixまたは抽象的な:

socat tcp-listen:6004,reuseaddr,fork unix:/tmp/.X11-unix/X4

その後、上記のように設定$DISPLAYしてlocalhost:4ネットワークトラフィックをキャプチャするか、socatユーザーにダンプするように指示できます-x -v

$DISPLAYこれで、Unixドメインソケットを使用している実行中のローカルXアプリケーションからのトラフィックを変更することができず、キャプチャしたい場合はこれが難しくなります。

strace1つのアプローチは、アプリケーションがXサーバーと通信するために実行する送受信システムコールを追跡すること(またはLinux以外の場合はシステムの同等のコマンド)を使用することです。

ここでxterm私はそれが起こっていることを観察し、writev()そのためにファイル記述子3に対してシステムコールを作成しました。だから私はこれを行うことができます:recvfrom()recvmsg()

strace -qqxxttts9999999 -e writev,recvmsg,recvfrom -p "$xterm_pid" 2>&1 |
  perl -lne '
    if (($t,$f,$p) = /^([\d.]+) (writev|recvmsg|recvfrom)\(3, (.*)/) {
      @p = ($p =~ /\\x(..)/g);
      $dir = $f eq "writev" ? "O" : "I";
      while (@p) {print "$dir $t 0000 " . join(" ", splice @p,0,64000)}
    }' | text2pcap -T6000,1234 -Dqt %s. - - | wireshark -ki -

(またはtshark -Vi -)。

アイデアは、出力からタイムスタンプと送信/受信バイトを抽出し、それを変換(ポート6000にダミーTCPヘッダーを追加)straceした後。また、pcapレコードの最大長制限である64kiBを避けるためにパケットを分割します。text2pcappcap-T6000,1234wireshark

トラフィックの方向を正しく決定するには、text2pcap比較的新しいバージョンのWiresharkが必要です。

答え2

デフォルトのTCP / IPおよびイーサネットではなく、X11プロトコルに主に興味があり、クライアントまたはサーバー設定を調整できる場合は、X11クライアントとX11サーバー間のトラフィックをキャプチャしてデコードするように特別に設計されたツールを使用できます。 。 X11パーサーとは異なり、wiresharkこれらのツールはトラフィックが混乱する可能性が低く、トラフィックに完全に参加する可能性が高くなります。

主なもの範囲一部のUnixまたはLinuxディストリビューションではバイナリとしては使用できませんが、以下から簡単に入手できます.源泉

しかも屋根フレームそしてしかし、私はそれらに相対的な経験がありません。

これらのツールはすべてリバースプロキシのように動作し、実際のX11サーバーへの接続を中継します。クライアントは単に別のDISPLAY変数(または-displayパラメーター)を使用してブローカーに接続します。

たとえば、

$ wget http://xorg.freedesktop.org/archive/individual/app/xscope-1.4.1.tar.gz
..
$ tar xzf xscope-1.4.1.tar.gz
..
$ cd xscope-1.4.1
$ ./configure && ./make
..
$ ./xscope & sleep 5; xclock -display :1
...
 0.00: Client -->   12 bytes
              byte-order: LSB first
           major-version: 000b
           minor-version: 0000
 0.00:                   692 bytes <-- X11 Server
                    protocol-major-version: 000b
                    protocol-minor-version: 0000
                          release-number: 00adfef8
                        resource-id-base: 04c00000
                        resource-id-mask: 001fffff
                      motion-buffer-size: 00000100
                        image-byte-order: LSB first
                    bitmap-format-bit-order: LSB first
                    bitmap-format-scanline-unit: 20
                    bitmap-format-scanline-pad: 20
                             min-keycode: 8 (^H)
                             max-keycode: 255 (\377)
                                  vendor: "The X.Org Foundation"
                          pixmap-formats: (7)
                                   roots: (1)
 0.00: Client -->   20 bytes
     ............REQUEST: QueryExtension
                    name: "BIG-REQUESTS"
 0.00:                    32 bytes <-- X11 Server
                     ..............REPLY: QueryExtension
                                 present: True
                            major-opcode: 85

注:何らかの理由でX11クライアント設定(表示されている)を変更できない場合は、別のポート(通常6001から6000)でリッスンするようにサーバーを再構成してから構成できます。xscope元のポート(6000)でリッスンします。

答え3

X11はトランスポートプロトコルとしてTCPを使用します。 X11のTCPポート範囲は通常6000-6063ですが、TCPポート6000が使用されていることがわかります。

したがって、選択したネットワークモニタを使用してこのポート範囲と関連ホストをフィルタリングしてトラフィックを監視できるようにする必要があります。たとえば、関心のあるトラフィックを監視するためにwiresharkフィルタプリセットがすでに含まれていることがわかります。x11

たとえば、ローカルシステム上のすべてのX11トラフィックを監視するには(TCPを使用している場合は@Stéphane Chazelasの回答を参照)、次のフィルタを使用します。

x11 and ip.src=127.0.0.1 and ip.dst=127.0.0.1

関連情報