捕获X11协议的流量


15

如何捕获X11协议的流量?

我需要找到一种方法来捕获两台计算机之间以及本地计算机上的X11服务器和X11客户端之间的X11通信。

Answers:


19

您可以通过TCP或Unix域套接字或在抽象名称空间中的Unix域套接字上(在Linux上)谈论X11 。

当DISPLAY设置为时,客户端的host:4简称tcp/host:4,使用TCP连接到服务器。然后,TCP端口为6000加上显示号(在这种情况下为6004)。

在这种情况下,你可以捕捉交通与任何网络嗅探器像tcpdumpwireshark通过捕捉端口的TCP流量。

$DISPLAY仅当为时:4(是的缩写unix/:4),然后客户端使用unix域套接字。或者/tmp/.X11-unix/X4,或在相同的路径摘要命名空间(通常示为@/tmp/.X11-unix/X4netstat输出)。

这样,捕获流量变得更加棘手。

如果您的X服务器侦听TCP(但如今它们不再支持),最简单的方法是更改DISPLAYlocalhost:4而不是:4并捕获回送接口上端口6004上的网络流量。

如果没有,您可以在中间socat作为一个男人使用,接受连接作为TCP并将其转发为unixabstract

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

然后,您可以如上所述设置$DISPLAYlocalhost:4并捕获网络流量,或者使用告诉socat它进行转储-x -v

现在,如果您无法更改$DISPLAY并且想要捕获使用Unix域套接字的已经运行的本地X应用程序的流量,那就麻烦了。

一种方法是使用strace(如果不是Linux ,则使用系统上的等效命令;如果不是Linux ,则使用等效命令)跟踪应用程序与X服务器进行通信的发送/接收系统调用。

在这里xterm,我观察到了writev()recvfrom()并且recvmsg()系统为此调用了文件描述符3。所以我可以做:

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 -)。

这个想法是从时间戳的输出中提取时间戳和发送/接收的字节,strace并用于text2pcap将其转换为pcap(在端口6000上添加虚拟TCP头添加-T6000,1234),然后馈入wireshark。我们还拆分数据包,以避免对pcap记录的最大长度限制为64kiB。

请注意,要使text2pcap正确的通信方向正确运行,您需要相对较新的Wireshark版本。


您知道默认为Unix域套接字的原因吗?TCP是否对性能或其他缺点有任何(重大)影响?
inVader 2015年

@inVader,是的,这是要实现的整个TCP / IP协议,它要经历多个层次...我想系统可以采用快捷方式(例如不实现通常的拥塞避免算法)来建立环回连接,但是仍然在我的测试中使用unix域套接字,与使用TCP套接字socat测试相比,我获得了两倍的吞吐量。
斯特凡Chazelas

14

如果您主要对X11协议感兴趣,而不对基础的TCP / IP和以太网内容感兴趣,并且能够调整客户端或服务器设置,则可以使用专门设计用于捕获和解码X11之间流量的工具。客户端和X11服务器。与wiresharkX11解剖器不同,这些工具不太可能被流量所迷惑,因为它们会完全参与其中。

最主要的是xscope,尽管它不能作为某些Unix或Linux发行版的二进制文件提供,但可以很容易地从源代码构建。

另外,也有xtrussxtrace,但我没有经验。

所有这些工具的作用就像反向代理,将连接中继到真实的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)。


我试图编译xscope ...“未找到包'xproto'”。请您在这里写第一个数据包(12个字节)的转储吗?
马西莫

@Massimo是否安装了缺少的软件包?
jlliagre

我在Amazon上使用的是Linux,而yum不知道xproto。请问您可以发布第一个数据包的转储吗?我只需要那个,th。
马西莫

因为通常的第一个数据包是21个字节,而不是12个字节,请参见x.org/releases/current/doc/xproto/x11protocol.html中的
Massimo,

1
刚刚尝试过的xtrace-可以确认它也可以正常工作;它的输出更紧凑,每条消息只有一行-因此也很容易抓握。运行例如。xtrace -D:1 -d:0 -k。(或x11trace,因为可执行文件在某些​​发行版中被命名)
Aleksi Torhamo

4

X11使用TCP作为其传输协议。X11的TCP端口范围通常为6000-6063,但很可能会看到正在使用的TCP端口6000。

因此,您应该能够使用您选择的任何网络监视器通过对该端口范围和相关主机进行过滤来观察流量。我也知道,wireshark例如,已经包含一个过滤器预设,x11用于监视您感兴趣的流量。

例如,要监视本地计算机上的所有X11流量(如果使用TCP,请参阅@StéphaneChazelas的回答),请使用以下过滤器:

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

本地客户端服务器消息是通过Unix域套接字传递的lsof -U | grep '^X'
goldilocks 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.