Cattura il traffico del protocollo X11


15

Come posso acquisire il traffico del protocollo X11 ?

Ho bisogno di trovare un modo per catturare il traffico X11 tra due macchine e anche tra un server X11 e un client X11 su una macchina locale.

Risposte:


19

Puoi parlare X11 su TCP, o su un socket di dominio Unix o (su Linux) su un socket di dominio Unix nello spazio dei nomi astratto .

Quando DISPLAY è impostato su host:4, abbreviazione di tcp/host:4, i client usano TCP per connettersi al server. La porta TCP è quindi 6000 più il numero visualizzato (in tal caso 6004).

In tal caso, è possibile acquisire il traffico con qualsiasi sniffer di rete simile tcpdumpo wiresharkacquisendo il traffico TCP su quella porta.

Quando $DISPLAYè solo :4(abbreviazione di unix/:4), i client usano un socket di dominio unix. Sia /tmp/.X11-unix/X4o lo stesso percorso nel ESTRATTO namespace (generalmente indicato come @/tmp/.X11-unix/X4in netstatuscita).

Catturare il traffico è quindi più complicato.

Se i vostri ascolti server X su TCP (ma non tendono a più al giorno d'oggi), il modo più semplice è quello di cambiare DISPLAYal localhost:4posto di :4e catturare il traffico di rete sulla porta 6004 sull'interfaccia di loopback.

In caso contrario, puoi utilizzare socatcome man nel mezzo che accetta connessioni come TCP e le inoltra come unix o abstract :

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

È quindi possibile impostare $DISPLAYper localhost:4e catturare il traffico di rete di cui sopra o dire socata discarica con -x -v.

Ora, se non puoi cambiare $DISPLAYe vuoi catturare il traffico di un'applicazione X locale già in esecuzione che utilizza socket di dominio unix, è qui che diventa complicato.

Un approccio potrebbe essere quello di usare strace(o il comando equivalente sul tuo sistema se non Linux) per tracciare le chiamate di sistema di invio / ricezione che l'applicazione fa per comunicare con il server X.

Qui per xterm, lo osservo writev(), recvfrom()e il recvmsg()sistema chiama il descrittore di file 3 per questo. Quindi posso fare:

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 -

(o tshark -Vi -).

L'idea è quella di estrarre il timestamp e i byte inviati / ricevuti dall'output di stracee utilizzarli text2pcapper convertirlo in un pcap(aggiungendo intestazioni TCP fittizie sulla porta 6000 con -T6000,1234) prima di alimentare wireshark. Abbiamo anche diviso i pacchetti per evitare il limite di 64 kB sulla lunghezza massima di un record pcap.

Si noti che per text2pcapfunzionare correttamente per ottenere la giusta direzione del traffico, è necessaria una versione relativamente recente di WireShark.


Conosci il motivo dietro l'impostazione predefinita di unix socket socket? TCP ha un impatto (significativo) sulle prestazioni o altri inconvenienti?
inVader,

@inVader, beh sì, questo è un intero protocollo TCP / IP da implementare, passando attraverso diversi livelli ... Suppongo che il sistema possa prendere scorciatoie (come non implementare il solito algoritmo di prevenzione della congestione) per le connessioni di loopback, ma comunque nei miei test Ottengo il doppio della produttività con un socket con dominio unix semplice rispetto a un test socat socket tcp.
Stéphane Chazelas,

14

Se sei principalmente interessato al protocollo X11 e non alle cose TCP / IP e Ethernet sottostanti e se sei in grado di regolare le impostazioni del client o del server, potresti utilizzare uno strumento appositamente progettato per acquisire e decodificare il traffico tra un X11 client e un server X11. A differenza del wiresharkdissettore X11, è improbabile che questi strumenti vengano confusi dal traffico, essendo pienamente coinvolti con esso.

Il principale è xscope che, nonostante non sia disponibile come binario per alcune distribuzioni Unix o Linux, può essere facilmente compilato dal sorgente .

In alternativa, ci sono anche xtruss e xtrace ma non ho esperienza con loro.

Tutti questi strumenti agiscono come proxy inversi che inoltrano connessioni a un vero server X11. I client usano semplicemente una variabile DISPLAY diversa (o argomento -display) per connettersi al proxy.

per esempio:

$ 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

Nota: se per qualche motivo non è possibile modificare le impostazioni dei client X11 (display), potrebbe essere possibile riconfigurare il server per l'ascolto di una porta diversa (in genere 6001 vs 6000) e quindi configurare xscopeper l'ascolto sulla porta originale (6000).


Ho provato a compilare xscope ... "Nessun pacchetto 'xproto' trovato". pls puoi scrivere qui il dump del primo pacchetto (12 byte)?
Massimo

@Massimo Hai installato il pacchetto mancante?
jlliagre,

Sto usando un'istanza di Linux su Amazon e yum non conosce xproto. Puoi pubblicare il dump del primo pacchetto? Ne ho solo bisogno, thks.
Massimo

perché il solito primo pacchetto è di 21 byte, non 12, vedere "Connessione avviata
Massimo

1
Ho appena provato xtrace - può confermare che funziona anche bene; il suo output è più compatto, con una riga per messaggio, quindi facilmente intercettabile. Corri con es. xtrace -D:1 -d:0 -k. (O x11trace, dato che l'eseguibile è chiamato in alcune distro)
Aleksi Torhamo,

4

X11 utilizza TCP come protocollo di trasporto. L'intervallo di porte TCP per X11 è in genere 6000-6063, ma molto probabilmente vedrai la porta TCP 6000 in uso.

Quindi, dovresti essere in grado di utilizzare qualsiasi monitor di rete di tua scelta per osservare il traffico filtrando per questo intervallo di porte e gli host in questione. So anche che wireshark, ad esempio, contiene già un filtro predefinito x11per monitorare il traffico che ti interessa.

Ad esempio, per monitorare tutto il traffico X11 sul computer locale (se si utilizza TCP; fare riferimento alla risposta di @ Stéphane Chazelas) utilizzare il seguente filtro:

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

I messaggi client-server locali sono passati attraverso un socket di dominio unix, lsof -U | grep '^X'.
Riccioli d'oro
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.