我如何捕捉X11协议的流量?
我需要找到一种方法来捕获两台计算机之间以及本地计算机上的 X11 服务器和 X11 客户端之间的 X11 流量。
答案1
您可以通过 TCP、Unix 域套接字或(在 Linux 上)在 Unix 域套接字上与 X11 进行通信。抽象的命名空间。
当 DISPLAY 设置为host:4
(缩写)时tcp/host:4
,客户端使用 TCP 连接到服务器。 TCP 端口为 6000 加上显示编号(在本例中为 6004)。
在这种情况下,您可以使用任何网络嗅探器来捕获流量,例如tcpdump
捕获wireshark
该端口上的 TCP 流量。
当$DISPLAY
is only :4
( 的缩写unix/:4
)时,客户端使用 unix 域套接字。要么/tmp/.X11-unix/X4
是相同的路径抽象的命名空间(通常显示@/tmp/.X11-unix/X4
在输出中netstat
)。
捕获流量就变得更加棘手。
如果您的 X 服务器侦听 TCP(但现在不再这样做),最简单的方法是更改DISPLAY
为而localhost:4
不是:4
捕获环回接口上端口 6004 上的网络流量。
如果没有,您可以socat
用作中间的人接受 TCP 连接并将其转发为UNIX或者抽象的:
socat tcp-listen:6004,reuseaddr,fork unix:/tmp/.X11-unix/X4
然后,您可以按照上面的方式设置$DISPLAY
并localhost:4
捕获网络流量,或者告诉socat
使用 转储它-x -v
。
现在,如果您无法更改$DISPLAY
并且想要捕获已运行的使用 unix 域套接字的本地 X 应用程序的流量,那么这就是棘手的地方。
一种方法可能是使用strace
(如果不是 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 标头) 。我们还分割数据包以避免 pcap 记录最大长度 64kiB 的限制。-T6000,1234
wireshark
请注意,为了text2pcap
正确确定流量方向,您需要一个相对较新版本的wireshark。
答案2
如果您主要对 X11 协议而不是底层 TCP/IP 和以太网内容感兴趣,并且如果您能够调整客户端或服务器设置,则可以使用专门设计用于捕获和解码 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