Abadikan lalu lintas protokol X11

15

Bagaimana saya bisa menangkap traffic protokol X11 ?

Saya perlu menemukan cara untuk menangkap lalu lintas X11 antara dua mesin dan juga antara server X11 dan klien X11 pada mesin lokal.

zh_
sumber

Jawaban:

19

Anda dapat berbicara X11 melalui TCP, atau melalui soket domain Unix atau (di Linux) pada soket domain Unix di namespace abstrak .

Ketika DISPLAY diatur ke host:4, singkatan dari tcp/host:4, klien menggunakan TCP untuk terhubung ke server. Port TCP kemudian 6000 ditambah nomor layar (dalam hal ini 6004).

Dalam hal itu, Anda dapat menangkap lalu lintas dengan sniffer jaringan seperti tcpdumpatau wiresharkdengan menangkap lalu lintas TCP pada port itu.

Ketika $DISPLAYhanya :4(kependekan dari unix/:4), maka klien menggunakan soket domain unix. Entah /tmp/.X11-unix/X4atau jalur yang sama di namespace ABSTRAK (biasanya ditampilkan sebagai @/tmp/.X11-unix/X4dalam netstatoutput).

Menangkap lalu lintas lebih rumit.

Jika server X Anda mendengarkan pada TCP (tapi mereka tidak cenderung lagi saat ini), yang paling mudah adalah dengan mengubah DISPLAYke localhost:4bukannya :4dan menangkap lalu lintas jaringan pada port 6004 pada interface loopback.

Jika tidak, Anda dapat menggunakan socatsebagai pria di tengah yang menerima koneksi sebagai TCP dan meneruskannya sebagai unix atau abstrak :

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

Anda kemudian dapat mengatur $DISPLAYke localhost:4dan menangkap lalu lintas jaringan seperti di atas atau meminta socatuntuk membuangnya -x -v.

Sekarang, jika Anda tidak dapat mengubah $DISPLAYdan ingin menangkap lalu lintas aplikasi X lokal yang sudah berjalan yang menggunakan soket domain unix, di situlah ia menjadi rumit.

Salah satu pendekatan bisa dengan menggunakan strace(atau perintah setara pada sistem Anda jika bukan Linux) untuk melacak panggilan sistem kirim / terima yang aplikasi Anda lakukan untuk berkomunikasi dengan server X.

Di sini untuk xterm, saya amati itu writev(), recvfrom()dan recvmsg()panggilan sistem pada file deskriptor 3 untuk itu. Jadi saya bisa melakukan:

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 -

(atau tshark -Vi -).

Idenya adalah untuk mengekstrak timestamp dan byte yang dikirim / diterima dari output stracedan digunakan text2pcapuntuk mengubahnya menjadi pcap(menambahkan header TCP dummy pada port 6000 dengan -T6000,1234) sebelum diumpankan wireshark. Kami juga membagi paket untuk menghindari batas 64kiB pada panjang maksimum catatan pcap.

Perhatikan bahwa untuk text2pcapdapat bekerja dengan benar sehubungan dengan mendapatkan arah lalu lintas yang benar, Anda memerlukan versi wireshark yang relatif baru.

Stéphane Chazelas
sumber
Apakah Anda tahu alasan di balik pengaturan default untuk unix soket domain? Apakah TCP berdampak (signifikan) pada kinerja atau kelemahan lainnya?
inVader
@inVader, ya, itu protokol TCP / IP keseluruhan untuk diimplementasikan, melalui beberapa lapisan ... Saya kira sistem dapat mengambil jalan pintas (seperti tidak menerapkan algoritma penghindaran kemacetan yang biasa) untuk koneksi loopback, tetapi masih, dalam pengujian saya Saya mendapatkan throughput dua kali lebih banyak dengan socket unix-domain sederhana dengan tes socket tcp socat.
Stéphane Chazelas
14

Jika Anda terutama tertarik pada protokol X11 dan bukan TCP / IP dan hal-hal ethernet yang mendasarinya, dan jika Anda dapat menyesuaikan pengaturan klien atau server, Anda mungkin menggunakan alat yang dirancang khusus untuk menangkap dan mendekode lalu lintas antara X11 klien dan server X11. Tidak seperti wiresharkpembangkang X11, alat-alat ini tidak mungkin dibingungkan oleh lalu lintas, karena terlibat sepenuhnya dengannya.

Yang utama adalah xscope yang, meskipun tidak tersedia sebagai biner untuk beberapa distribusi Unix atau Linux, dapat dengan mudah dibangun dari sumber .

Atau, ada juga xtruss dan xtrace tapi saya tidak punya pengalaman dengan mereka.

Semua alat ini bertindak seperti reverse-proxy yang menyampaikan koneksi ke server X11 nyata. Klien cukup menggunakan variabel DISPLAY yang berbeda (atau argumen tampilan) untuk terhubung ke proxy.

misalnya:

$ 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

Catatan: Jika karena alasan tertentu Anda tidak dapat mengubah pengaturan klien X11 (tampilan), Anda mungkin dapat mengkonfigurasi ulang server untuk mendengarkan port yang berbeda (biasanya 6001 vs 6000) dan kemudian mengkonfigurasi xscopeuntuk mendengarkan pada port asli (6000).

Jlliagre
sumber
Saya mencoba mengkompilasi xscope ... "Tidak ditemukan paket 'xproto'". tolong bisakah Anda menulis di sini dump paket pertama (12 byte)?
Massimo
@ Massimo Apakah Anda menginstal paket yang hilang?
jlliagre
Saya menggunakan istance linux di Amazon, dan yum tidak tahu xproto. Bisakah Anda memposting dump paket pertama? Aku hanya butuh itu, thks.
Massimo
karena paket pertama yang biasa adalah 21 byte, bukan 12, lihat "Inisiasi Koneksi" di x.org/releases/current/doc/xproto/x11protocol.html
Massimo
1
Baru saja mencoba xtrace - dapat mengonfirmasi bahwa itu juga berfungsi dengan baik; outputnya lebih kompak, dengan satu baris per pesan - jadi juga mudah diterima. Jalankan dengan misalnya. xtrace -D:1 -d:0 -k. (Atau x11trace, karena executable dinamai pada beberapa distro)
Aleksi Torhamo
4

X11 menggunakan TCP sebagai protokol transportnya. Rentang port TCP untuk X11 biasanya 6000-6063 tetapi kemungkinan besar Anda akan melihat port TCP 6000 digunakan.

Jadi, Anda harus dapat menggunakan monitor jaringan apa pun yang Anda pilih untuk mengamati lalu lintas dengan memfilter rentang port ini dan host yang dimaksud. Saya juga tahu, bahwa wireshark, misalnya, sudah berisi preset filter x11untuk memantau lalu lintas yang Anda minati.

Misalnya, untuk memantau semua lalu lintas X11 pada mesin lokal (jika menggunakan TCP; lihat jawaban @ Stéphane Chazelas) gunakan filter berikut:

x11 and ip.src=127.0.0.1 and ip.dst=127.0.0.1
penyerbu
sumber
Pesan server klien lokal dilewatkan melalui soket domain unix lsof -U | grep '^X',.
goldilocks