Przechwyć ruch protokołu X11

15

Jak mogę przechwycić ruch protokołu X11 ?

Potrzebuję znaleźć sposób na przechwycenie ruchu X11 między dwoma komputerami, a także między serwerem X11 a klientem X11 na komputerze lokalnym.

zh_
źródło

Odpowiedzi:

19

X11 można rozmawiać przez TCP lub przez gniazdo domeny Unix lub (w systemie Linux) na gniazdo domeny Unix w abstrakcyjnej przestrzeni nazw.

Gdy DISPLAY jest ustawiony na host:4skrót tcp/host:4, klienci używają TCP do łączenia się z serwerem. Port TCP ma wtedy 6000 plus numer wyświetlacza (w tym przypadku 6004).

W takim przypadku możesz przechwycić ruch za pomocą dowolnego sniffera sieciowego, takiego jak tcpdumplub wiresharkprzechwytując ruch TCP na tym porcie.

Kiedy $DISPLAYjest tylko :4(skrót unix/:4), klienci używają gniazda domeny unix. Jedna /tmp/.X11-unix/X4lub ta sama ścieżka w przestrzeni nazw ABSTRACT (zwykle pokazana jak @/tmp/.X11-unix/X4na netstatwyjściu).

Przechwytywanie ruchu jest wtedy trudniejsze.

Jeśli twoje Słuchacze X serwer TCP (ale nie wydają się już dzisiaj), najłatwiej jest zmienić DISPLAYaby localhost:4zamiast :4i przechwytywania ruchu sieciowego na porcie 6004 na interfejsie loopback.

Jeśli tak się nie stanie, możesz użyć socatjako mężczyzna w środku, który przyjmuje połączenia jako TCP i przekazuje je jako unix lub streszczenie :

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

Następnie można ustawić $DISPLAYdo localhost:4i przechwytywanie ruchu sieciowego jak wyżej lub powiedzieć socatzrzucić go -x -v.

Teraz, jeśli nie możesz się zmienić $DISPLAYi chcesz przechwycić ruch już działającej lokalnej aplikacji X, która korzysta z gniazd domeny unix, wtedy jest to trudne.

Jednym z podejść może być użycie strace(lub równoważnego polecenia w systemie, jeśli nie Linux) do śledzenia wywołań systemowych wysyłania / odbierania, które aplikacja wykonuje w celu komunikacji z serwerem X.

Tutaj za xterm, obserwuję to robi writev(), recvfrom()i recvmsg()wywołania systemowe na pliku deskryptora 3 do tego. Więc mogę zrobić:

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 -

(lub tshark -Vi -).

Chodzi o to, aby wyodrębnić znacznik czasu i bajty wysłane / odebrane z wyjścia stracei użyć text2pcapdo przekonwertowania go na pcap(dodanie fałszywych nagłówków TCP na porcie 6000 z -T6000,1234) przed podaniem do wireshark. Dzielimy także pakiety, aby uniknąć ograniczenia 64 kB maksymalnej długości rekordu pcap.

Pamiętaj, że text2pcapaby działać poprawnie w odniesieniu do prawidłowego kierunku ruchu, potrzebujesz stosunkowo najnowszej wersji Wireshark.

Stéphane Chazelas
źródło
Czy znasz powód, dla którego domyślnie używaliśmy gniazd domeny unix? Czy TCP ma (znaczący) wpływ na wydajność lub inne wady?
inVader
@inVader, no tak, to cały protokół TCP / IP do wdrożenia, przechodzenie przez kilka warstw ... Przypuszczam, że system może przyjmować skróty (jak nie implementować zwykłego algorytmu unikania zatorów) dla połączeń pętli zwrotnych, ale nadal w moich testach Dostaję dwa razy więcej przepustowości z prostym gniazdem z domeną unix niż z testem socat gniazda tcp.
Stéphane Chazelas
14

Jeśli jesteś zainteresowany głównie protokołem X11, a nie podstawowymi funkcjami TCP / IP i Ethernet, i jeśli możesz dostosować ustawienia klienta lub serwera, możesz użyć narzędzia zaprojektowanego specjalnie do przechwytywania i dekodowania ruchu między X11 klient i serwer X11. Inaczej niż w przypadku wiresharkX11, narzędzia te raczej nie będą mylone przez ruch, ponieważ są w pełni zaangażowane.

Głównym z nich jest xscope, który pomimo tego, że nie jest dostępny jako plik binarny dla niektórych dystrybucji Uniksa lub Linuksa, można go łatwo zbudować ze źródła .

Alternatywnie są też xtruss i xtrace, ale nie mam z nimi doświadczenia.

Wszystkie te narzędzia działają jak odwrotne proxy przekazujące połączenia z prawdziwym serwerem X11. Klienci używają po prostu innej zmiennej DISPLAY (lub argumentu -display), aby połączyć się z serwerem proxy.

na przykład:

$ 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

Uwaga: Jeśli z jakiegoś powodu nie możesz zmienić ustawień klientów X11 (wyświetlanie), być może będziesz mógł ponownie skonfigurować serwer, aby nasłuchiwał na innym porcie (zazwyczaj 6001 vs. 6000), a następnie skonfigurować xscopenasłuchiwanie na oryginalnym porcie (6000).

jlliagre
źródło
Próbowałem skompilować xscope ... „Nie znaleziono pakietu„ xproto ”. proszę napisać tutaj zrzut pierwszego pakietu (12 bajtów)?
Massimo
@Massimo Czy zainstalowałeś brakujący pakiet?
jlliagre
Korzystam z Linuksa na Amazon, a yum nie zna xproto. Czy możesz wysłać zrzut pierwszego pakietu? Potrzebuję tylko tego, dzięki.
Massimo
ponieważ zwykle pierwszy pakiet ma 21 bajtów, a nie 12, patrz „Inicjacja połączenia” w x.org/releases/current/doc/xproto/x11protocol.html
Massimo
1
Właśnie wypróbowałem xtrace - może potwierdzić, że działa również dobrze; jego dane wyjściowe są bardziej kompaktowe, z jedną linią na wiadomość - dzięki czemu są również łatwe do odczytania. Uruchom z np. xtrace -D:1 -d:0 -k. (Lub x11trace, ponieważ plik wykonywalny jest nazwany w niektórych dystrybucjach)
Aleksi Torhamo
4

X11 używa TCP jako protokołu transportowego. Zakres portów TCP dla X11 to zwykle 6000-6063, ale najprawdopodobniej zobaczysz używany port TCP 6000.

Tak więc powinieneś być w stanie użyć dowolnego monitora sieci, aby obserwować ruch, filtrując dla tego zakresu portów i hostów, o których mowa. Wiem też, że wiresharkna przykład zawiera już gotowe ustawienia filtra x11do monitorowania ruchu, który Cię interesuje.

Na przykład, aby monitorować cały ruch X11 na komputerze lokalnym (jeśli używasz TCP; zapoznaj się z odpowiedzią @ Stéphane Chazelas) użyj następującego filtra:

x11 and ip.src=127.0.0.1 and ip.dst=127.0.0.1
najeźdźca
źródło
Lokalne wiadomości klient-serwer są przekazywane za pośrednictwem gniazda domeny UNIX lsof -U | grep '^X'.
złotowłosa