どのようにキャプチャするX11プロトコルトラフィック?
2つのコンピュータ間、およびローカルコンピュータのX11サーバーとX11クライアント間でX11トラフィックをキャプチャする方法を見つける必要があります。
答え1
TCP、Unixドメインソケット、または(Linuxの場合)Unixドメインソケットを介してX11と通信できます。抽象的な名前空間。
host:4
DISPLAYが(省略形)に設定されている場合、tcp/host:4
クライアントはTCPを使用してサーバーに接続します。 TCPポートは、6000にディスプレイ番号(この例では6004)を加えた値です。
この場合、ネットワークスニファを使用してそのポートからTCPトラフィックをtcpdump
キャプチャするなど、トラフィックをキャプチャできます。wireshark
$DISPLAY
is 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アプリケーションからのトラフィックを変更することができず、キャプチャしたい場合はこれが難しくなります。
strace
1つのアプローチは、アプリケーションが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を避けるためにパケットを分割します。text2pcap
pcap
-T6000,1234
wireshark
トラフィックの方向を正しく決定するには、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