Erfassen Sie den Datenverkehr des X11-Protokolls

15

Wie kann ich den Datenverkehr des X11- Protokolls erfassen ?

Ich muss eine Möglichkeit finden, den X11-Datenverkehr zwischen zwei Computern sowie zwischen einem X11-Server und einem X11-Client auf dem lokalen Computer zu erfassen.

zh_
quelle

Antworten:

19

Sie können X11 über TCP oder über einen Unix-Domain-Socket oder (unter Linux) über einen Unix-Domain-Socket im abstrakten Namespace kommunizieren.

Wenn DISPLAY auf host:4(kurz für) eingestellt ist tcp/host:4, verwenden Clients TCP, um eine Verbindung zum Server herzustellen . Der TCP-Port ist dann 6000 plus der Anzeigenummer (in diesem Fall 6004).

In diesem Fall können Sie den Datenverkehr mit einem beliebigen Netzwerk-Sniffer tcpdumpoder wiresharkdurch Erfassen des TCP-Datenverkehrs an diesem Port erfassen.

Wenn $DISPLAYnur :4(kurz für unix/:4), dann verwenden Clients einen Unix-Domain-Socket. Entweder /tmp/.X11-unix/X4oder derselbe Pfad im ABSTRACT- Namespace (normalerweise wie @/tmp/.X11-unix/X4in der netstatAusgabe dargestellt).

Die Erfassung des Datenverkehrs ist dann schwieriger.

Wenn Ihr X - Server lauscht auf TCP (aber sie sind in der Regel nicht mehr heutzutage), ist am einfachsten zu ändern , DISPLAYum localhost:4statt :4den Netzwerkverkehr auf Port 6004 auf der Loopback - Schnittstelle und zu erfassen.

Wenn dies nicht der Fall ist, können Sie socatals Mann in der Mitte arbeiten , der Verbindungen als TCP akzeptiert und diese als Unix oder Abstract weiterleitet :

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

Sie können dann festlegen , $DISPLAYum localhost:4den Netzwerkverkehr wie oben oder sagen und erfassen socatsie Dump mit -x -v.

Wenn Sie $DISPLAYden Datenverkehr einer bereits laufenden lokalen X-Anwendung, die Unix-Domain-Sockets verwendet, nicht ändern und erfassen können, wird dies schwierig.

Ein Ansatz könnte darin bestehen, stracedie Sende- / Empfangs-Systemaufrufe, die Ihre Anwendung für die Kommunikation mit dem X-Server durchführt, zu verfolgen (oder den entsprechenden Befehl auf Ihrem System, wenn nicht Linux).

Hier für xtermbeobachte ich es tut writev(), recvfrom()und recvmsg()Systemaufrufe auf Dateideskriptor 3 dafür. Also kann ich tun:

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 -

(oder tshark -Vi -).

Die Idee ist , den Zeitstempel zu extrahieren und Bytes von der Ausgabe der gesendet / empfangen straceund die Verwendung text2pcapzu konvertieren , die in eine pcap(Hinzufügen von Dummy - TCP - Header an Port 6000 mit -T6000,1234) vor der Fütterung an wireshark. Wir teilen auch Pakete auf, um die 64-KB-Grenze für die maximale Länge eines pcap-Datensatzes zu vermeiden.

Beachten Sie, dass text2pcapSie eine relativ aktuelle Version von wireshark benötigen, um die richtige Verkehrsrichtung zu erreichen.

Stéphane Chazelas
quelle
Kennen Sie den Grund für die Standardeinstellung von Unix-Domain-Sockets? Hat TCP (erhebliche) Auswirkungen auf die Leistung oder andere Nachteile?
inVader
@inVader, na ja, das ist ein ganzes TCP / IP-Protokoll, das implementiert werden muss und mehrere Ebenen durchläuft ... Ich nehme an, das System kann Verknüpfungen (wie nicht den üblichen Algorithmus zur Vermeidung von Überlastungen implementieren) für Loopback-Verbindungen verwenden, aber immer noch in meinen Tests Ich bekomme mit einem simplewith Unix-Domain-Socket doppelt so viel Durchsatz wie mit einem tcp-Socket-Socat-Test.
Stéphane Chazelas
14

Wenn Sie sich hauptsächlich für das X11-Protokoll und nicht für die zugrunde liegenden TCP / IP- und Ethernet-Komponenten interessieren und die Client- oder Servereinstellungen anpassen können, können Sie ein spezielles Tool zum Erfassen und Dekodieren des Datenverkehrs zwischen einem X11 verwenden Client und ein X11-Server. Im Gegensatz zum wiresharkX11-Dissektor ist es unwahrscheinlich, dass diese Tools durch den Datenverkehr verwechselt werden, da sie vollständig in den Datenverkehr eingebunden sind.

Das wichtigste ist xscope, das, obwohl es für einige Unix- oder Linux-Distributionen nicht als Binärdatei verfügbar ist, problemlos aus dem Quellcode erstellt werden kann .

Alternativ gibt es auch xtruss und xtrace aber ich habe keine erfahrung damit.

Alle diese Tools fungieren als Reverse-Proxies, die Verbindungen zu einem echten X11-Server weiterleiten. Die Clients verwenden einfach eine andere DISPLAY-Variable (oder ein anderes -display-Argument), um eine Verbindung zum Proxy herzustellen.

z.B:

$ 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

Hinweis: Wenn Sie aus irgendeinem Grund die Einstellungen der X11-Clients (Anzeige) nicht ändern können, können Sie den Server möglicherweise neu konfigurieren, um einen anderen Port (normalerweise 6001 vs 6000) abzuhören, und dann konfigurieren xscope den ursprünglichen Port (6000) überwacht.

jlliagre
quelle
Ich habe versucht, xscope zu kompilieren ... "Kein Paket 'xproto' gefunden". Kannst du hier den Dump des ersten Pakets (12 Bytes) schreiben?
Massimo
@Massimo Hast du das fehlende Paket installiert?
Juli
Ich benutze eine Linux-Version auf Amazon und yum kennt xproto nicht. Kannst du den Dump des ersten Pakets posten? Das brauche ich nur, Leute.
Massimo
Da das übliche erste Paket 21 Byte und nicht 12 Byte umfasst, siehe "Verbindungsaufbau" unter x.org/releases/current/doc/xproto/x11protocol.html
Massimo,
1
Gerade versucht, xtrace - kann bestätigen, dass es auch gut funktioniert; Die Ausgabe ist kompakter, mit einer Zeile pro Nachricht - also auch leicht greppable. Laufen Sie mit zB. xtrace -D:1 -d:0 -k. (Oder x11trace, da die ausführbare Datei in einigen Distributionen benannt ist)
Aleksi Torhamo
4

X11 verwendet TCP als Transportprotokoll. Der TCP-Portbereich für X11 liegt normalerweise zwischen 6000 und 6063, höchstwahrscheinlich wird jedoch der TCP-Port 6000 verwendet.

Sie sollten daher in der Lage sein, mithilfe eines beliebigen Netzwerkmonitors den Datenverkehr zu überwachen, indem Sie nach diesem Portbereich und den betreffenden Hosts filtern. Ich weiß auch, dass wiresharkzum Beispiel bereits ein Filter-Preset x11zur Überwachung des von Ihnen gewünschten Verkehrs enthalten ist.

Verwenden Sie zum Überwachen des gesamten X11-Datenverkehrs auf dem lokalen Computer (wenn Sie TCP verwenden, lesen Sie die Antwort von @ Stéphane Chazelas) den folgenden Filter:

x11 and ip.src=127.0.0.1 and ip.dst=127.0.0.1
Eindringling
quelle
Die lokalen Client-Server-Nachrichten werden über einen Unix-Domain-Socket weitergeleitet lsof -U | grep '^X'.
Goldlöckchen