X11 protokolünün trafiğini yakalayın


15

X11 protokolünün trafiğini nasıl yakalayabilirim ?

İki makine arasındaki ve ayrıca bir X11 sunucusu ile yerel makinedeki bir X11 istemcisi arasındaki X11 trafiğini yakalamanın bir yolunu bulmam gerekiyor.

Yanıtlar:


19

X11'i TCP üzerinden veya soyut ad alanındaki Unix etki alanı soketindeki bir Unix etki alanı soketinden veya (Linux'ta) konuşabilirsiniz .

DISPLAY olarak host:4kısaltılmışsa tcp/host:4, istemciler sunucuya bağlanmak için TCP kullanır. TCP portu 6000 artı ekran numarasıdır (bu durumda 6004).

Bu durumda, herhangi bir ağ dinleyicisi ile tcpdumpveya wiresharko bağlantı noktasındaki TCP trafiğini yakalayarak trafiği yakalayabilirsiniz.

Ne zaman $DISPLAYsadece :4(kısaca unix/:4), sonra istemcileri Unix alan soketi kullanın. Her iki /tmp/.X11-unix/X4ya da aynı yol ÖZET ad (genellikle olarak gösterilen @/tmp/.X11-unix/X4de netstatçıkış).

Trafiği yakalamak daha karmaşıktır.

X sunucunuz TCP'yi dinliyorsa (ancak günümüzde artık böyle bir eğilim göstermiyorsa), en kolayı geri döngü arabirimindeki bağlantı noktası 6004 yerine ağ trafiğine DISPLAYgeçmek ve bu trafiği yakalamaktır.localhost:4:4

Aksi halde, bağlantıları TCP olarak kabul eden ve onları unix veya soyut olarak ileten socatbir adam olarak kullanabilirsiniz :

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

Daha sonra ayarlayabilirsiniz $DISPLAYiçin localhost:4yukarıdaki gibi ağ trafiği yakalamak veya anlatmak ve socatonu dökümü -x -v.

Şimdi, değiştiremiyor $DISPLAYve zaten çalışan bir yerel X uygulamasının unix etki alanı soketlerini kullanan trafiğini yakalamak istiyorsanız, işte burada zorlaşıyor.

Bir yaklaşım strace, uygulamanızın X sunucusuyla iletişim kurmak için yaptığı gönderme / alma sistem çağrılarını izlemek için (veya Linux değilse sisteminizdeki eşdeğer komutu) kullanmak olabilir .

İşte için xterm, ben öyle gözlemlemek writev(), recvfrom()ve recvmsg()sistem çağrıları bunun için dosya tanımlayıcı 3. Böylece yapabilirim:

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 -

(veya tshark -Vi -).

Fikir, çıkışından gönderilen / alınan zaman damgasını ve baytları ayıklamak ve bunu beslemeden önce ( bağlantı noktası 6000'e kukla TCP başlıkları ekleyerek) dönüştürmek için stracekullanmaktır . Ayrıca, bir pcap kaydının maksimum uzunluğunda 64kiB sınırını önlemek için paketleri böldük.text2pcappcap-T6000,1234wireshark

text2pcapTrafik yönünün doğru şekilde yapılması için düzgün çalışmak için , nispeten yeni bir wireshark sürümüne ihtiyacınız olduğunu unutmayın.


Etki alanı yuvalarını varsayılan olarak unix etmenin arkasındaki nedeni biliyor musunuz? TCP'nin performans veya diğer sakıncaları üzerinde önemli bir etkisi var mı?
inVader

@inVader, evet, birkaç katmandan geçerek uygulamak için bütün bir TCP / IP protokolü ... Sistemin geri döngü bağlantıları için kısayollar (her zamanki tıkanıklık önleme algoritmasını uygulama gibi) alabilir, ancak yine de testlerimde Bir tcp soketi socat testinde olduğu gibi basit bir unix-domain soketi ile iki kat daha fazla verim elde ediyorum.
Stéphane Chazelas

14

Temelde temel TCP / IP ve ethernet öğeleriyle değil X11 protokolüyle ilgileniyorsanız ve istemciyi veya sunucu ayarlarını ayarlayabiliyorsanız, X11 arasındaki trafiği yakalamak ve kodunu çözmek için özel olarak tasarlanmış bir araç kullanabilirsiniz. istemcisi ve bir X11 sunucusu. wiresharkX11 disektörden farklı olarak , bu araçların trafikle karıştırılması ve bununla tamamen karışması olası değildir.

Ana biridir xScope bazı Unix veya Linux dağıtımları için bir ikili olarak mevcut olmama rağmen kolaylıkla inşa edilebilir, kaynağı .

Alternatif olarak, xtruss ve xtrace de var ama onlarla hiçbir deneyimim yok.

Tüm bu araçlar, bağlantıları gerçek bir X11 sunucusuna aktaran ters proxy'ler gibi davranır. İstemciler, proxy'ye bağlanmak için yalnızca farklı bir DISPLAY değişkeni (veya -display argümanı) kullanır.

Örneğin:

$ 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

Not: Herhangi bir nedenden dolayı X11 istemci ayarlarını (ekran) değiştiremiyorsanız, sunucuyu farklı bir bağlantı noktasını (genellikle 6001'e karşı 6000) xscopedinleyecek şekilde yapılandırabilir ve ardından orijinal bağlantı noktasını (6000) dinleyecek şekilde yapılandırabilirsiniz .


Ben xscope derlemeye çalıştım ... "'xproto' paket bulunamadı". pls burada ilk paketin dökümü (12 bayt) yazabilir misiniz?
Massimo

@Massimo Eksik paketi yüklediniz mi?
jlliagre

Amazon'da linux istance kullanıyorum ve yum xproto bilmiyor. Pls ilk paketin dökümünü gönderebilir misiniz? Sadece buna ihtiyacım var, teşekkürler.
Massimo

Her zamanki ilk paket 21 bayt değil 12, Beacuse "Bağlantı inisiyasyonu" bkz x.org/releases/current/doc/xproto/x11protocol.html
Massimo

1
Sadece xtrace denedim - aynı zamanda iyi çalıştığını onaylayabilirsiniz; çıktısı mesaj başına bir satır ile daha kompakttır - bu yüzden kolayca açılabilir. Örneğin ile çalıştırın. xtrace -D:1 -d:0 -k. (Veya yürütülebilir dosya bazı dağıtımlarda adlandırıldığı için
x11trace

4

X11, aktarım protokolü olarak TCP kullanır. X11 için TCP bağlantı noktası aralığı genellikle 6000-6063'tür, ancak büyük olasılıkla 6000 numaralı TCP bağlantı noktasının kullanıldığını göreceksiniz.

Bu nedenle, bu bağlantı noktası aralığı ve söz konusu ana bilgisayarlar için filtreleme yaparak trafiği gözlemlemek için istediğiniz herhangi bir ağ izleyicisini kullanabilmeniz gerekir. Ayrıca, wiresharkörneğin, zaten x11ilgilendiğiniz trafiği izlemek için bir filtre hazır ayarı içerdiğini de biliyorum .

Örneğin, yerel makinedeki tüm X11 trafiğini izlemek için (TCP kullanıyorsanız; @ Stéphane Chazelas'ın cevabına bakın) aşağıdaki filtreyi kullanın:

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

Yerel istemci-sunucu iletileri, bir unix etki alanı soketi aracılığıyla iletilir lsof -U | grep '^X'.
goldilocks
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.