Capture o tráfego do protocolo X11

13

Como posso capturar o tráfego do X11 ?

Eu preciso encontrar uma maneira de capturar o tráfego X11 entre duas máquinas e também entre um servidor X11 e um cliente X11 na máquina local.

    
por zh_ 23.03.2015 / 16:23

3 respostas

14

Você pode falar sobre o TCP X11, ou sobre um soquete de domínio Unix ou (no Linux) em um soquete de domínio Unix no namespace abstract .

Quando DISPLAY é definido como host:4 , abreviação de tcp/host:4 , os clientes usam o TCP para se conectar ao servidor. A porta TCP é então 6000 mais o número de exibição (nesse caso 6004).

Nesse caso, você pode capturar o tráfego com qualquer sniffer de rede como tcpdump ou wireshark , capturando o tráfego TCP nessa porta.

Quando $DISPLAY é apenas :4 (abreviação de unix/:4 ), os clientes usam um soquete de domínio unix. /tmp/.X11-unix/X4 ou o mesmo caminho no namespace ABSTRACT (normalmente mostrado como @/tmp/.X11-unix/X4 in netstat output).

Capturar o tráfego é mais complicado.

Se o seu servidor X escuta no TCP (mas eles tendem a não mais mais atualmente), o mais fácil é alterar DISPLAY para localhost:4 em vez de :4 e capturar o tráfego de rede na porta 6004 na interface de loopback.

Se não, você pode usar socat como um homem no meio que aceita conexões como TCP e as encaminha como unix ou :

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

Você pode então definir $DISPLAY para localhost:4 e capturar o tráfego de rede como acima ou informar socat para despejá-lo com -x -v .

Agora, se você não puder alterar $DISPLAY e quiser capturar o tráfego de um aplicativo X local em execução que use soquetes de domínio unix, é aí que fica complicado.

Uma abordagem poderia ser usar strace (ou o comando equivalente em seu sistema, se não Linux) para rastrear as chamadas do sistema de envio / recebimento que seu aplicativo faz para se comunicar com o servidor X.

Aqui para xterm , observo que writev() , recvfrom() e recvmsg() chama o sistema no descritor de arquivo 3 para isso. Então eu posso fazer:

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 -

(ou tshark -Vi - ).

A ideia é extrair o registro de data e hora e bytes enviados / recebidos da saída de strace e usar text2pcap para converter isso em pcap (adicionando cabeçalhos TCP simulados na porta 6000 com -T6000,1234 ) antes de alimentar codificar%. Também dividimos pacotes para evitar o limite de 64 kB no comprimento máximo de um registro pcap.

Observe que, para que wireshark funcione corretamente no que diz respeito a acertar a direção do tráfego, você precisa de uma versão relativamente recente do wireshark.

    
por 23.03.2015 / 16:45
13

Se você estiver interessado principalmente no protocolo X11 e não no material TCP / IP e Ethernet subjacente, e se conseguir ajustar as configurações do cliente ou do servidor, poderá usar uma ferramenta especificamente projetada para capturar e decodificar o tráfego entre um cliente X11 e um servidor X11. Ao contrário do dissertador wireshark X11, é improvável que essas ferramentas sejam confundidas pelo tráfego, estando totalmente envolvidas com ele.

O principal deles é o xscope que, apesar de não estar disponível como binário para alguns Unix ou Linux distribuições, podem ser facilmente construídas a partir da fonte .

Como alternativa, há também xtruss e xtrace mas não tenho experiência com eles.

Todas essas ferramentas funcionam como proxies reversos que transmitem conexões para um servidor X11 real. Os clientes simplesmente usam uma variável DISPLAY diferente (ou argumento -display) para se conectar ao proxy.

por exemplo:

$ 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 (7)
                                  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

Nota: Se por algum motivo você não puder alterar as configurações dos clientes X11 (exibição), poderá reconfigurar o servidor para ouvir uma porta diferente (normalmente 6001 vs 6000) e, em seguida, configurar xscope para escutar na porta original (6000).

    
por 23.03.2015 / 22:58
3

O X11 usa o TCP como seu protocolo de transporte. O intervalo de portas TCP para o X11 geralmente é de 6000 a 6063, mas provavelmente você verá a porta TCP 6000 sendo usada.

Portanto, você deve poder usar qualquer monitor de rede de sua escolha para observar o tráfego, filtrando esse intervalo de portas e os hosts em questão. Eu também sei, que wireshark , por exemplo, já contém uma predefinição de filtro x11 para monitorar o tráfego em que você está interessado.

Por exemplo, para monitorar todo o tráfego X11 na máquina local (se estiver usando TCP; consulte a resposta de @ Stéphane Chazelas) use o seguinte filtro:

x11 and ip.src=127.0.0.1 and ip.dst=127.0.0.1
    
por 23.03.2015 / 16:42

Tags