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が必要です。

おすすめ記事