Захоплення трафіку протоколу X11


15

Як я можу захопити трафік протоколу X11 ?

Мені потрібно знайти спосіб захоплення трафіку X11 між двома машинами, а також між сервером X11 та клієнтом X11 на локальній машині.

Відповіді:


19

Ви можете розмовляти з X11 через TCP або над гніздом домену Unix або (в Linux) в розетці домену Unix в абстрактному просторі імен.

Якщо для параметра DISPLAY встановлено host:4короткий термін tcp/host:4, клієнти використовують TCP для підключення до сервера. Порт TCP тоді становить 6000 плюс номер дисплея (у цьому випадку 6004).

У цьому випадку ви можете зафіксувати трафік будь-яким мережевим sniffer, схожим tcpdumpабо wiresharkзахопивши трафік TCP на цьому порту.

Коли $DISPLAYце лише :4(скорочено для unix/:4), клієнти використовують розетку домену unix. Будь-який /tmp/.X11-unix/X4або той самий шлях у просторі імен РЕФЕРАТ (зазвичай показано як @/tmp/.X11-unix/X4у netstatвихідному).

Захоплення трафіку тоді складніше.

Якщо ваш X-сервер слухає TCP (але в даний час вони, як правило, більше не працюють), найпростіше - перейти DISPLAYна localhost:4замість :4і захопити мережевий трафік на порту 6004 в інтерфейсі петлі.

Якщо це не так, ви можете використовувати socatяк людину посередині, яка приймає з'єднання як TCP та пересилає їх як unix або абстракт :

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

Після цього ви можете встановити , $DISPLAYщоб localhost:4і захопити мережевий трафік , як зазначено вище , або сказати , socatщоб скинути його з -x -v.

Тепер, якщо ви не можете змінити $DISPLAYі хочете зафіксувати трафік вже запущеного локального додатка X, який використовує сокети домену Unix, тут це стає складним.

Одним із підходів може бути використання strace(або еквівалентна команда у вашій системі, якщо не Linux) для відстеження системних викликів надсилання / отримання, які ваша програма робить для зв'язку з сервером X.

Ось xterm, я спостерігаю, що це робить writev(), recvfrom()і recvmsg()системні виклики для дескриптора файлів 3 для цього. Тож я можу зробити:

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 -

(або tshark -Vi -).

Ідея полягає у витягуванні часової позначки та байтів, надісланих / отриманих з виводу straceта використання text2pcapдля їх перетворення в pcap(додавання фіктивних заголовків TCP на порт 6000 з -T6000,1234) перед подачею в wireshark. Ми також розділяємо пакети, щоб уникнути обмеження в 64кіБ на максимальну довжину запису в pcap.

Зауважте, що для text2pcapправильної роботи щодо правильного напрямку руху вам потрібна відносно недавня версія проводки.


Чи знаєте ви причину дефолту сокетів домену Unix? Чи має TCP якийсь (значний) вплив на продуктивність чи інші недоліки?
inVader

@inVader, так, так, це цілий протокол TCP / IP для впровадження, проходячи через кілька шарів ... Я вважаю, що система може приймати ярлики (як, наприклад, не застосовувати звичайний алгоритм уникнення перевантажень) для з'єднань із зворотним зв'язком, але все-таки в моїх тестах Я отримую вдвічі більше пропускної спроможності за допомогою гніздо simplexith unix-домену, ніж тест socat tcp socket.
Стефан Шазелас

14

Якщо вас цікавлять в основному протокол X11, а не базові речі TCP / IP та Ethernet, і якщо ви в змозі відрегулювати налаштування клієнта чи сервера, ви можете скористатися інструментом, спеціально розробленим для збору та декодування трафіку між X11 клієнт та сервер X11. На відміну від wiresharkдисектора X11, ці інструменти навряд чи можуть заплутати трафік, будучи повністю задіяними в ньому.

Основним з них є xscope, який, незважаючи на те, що він не доступний як двійковий файл для деяких дистрибутивів Unix або Linux, може бути легко побудований з джерела .

Крім того, є також xtruss і xtrace, але я не маю досвіду з ними.

Усі ці інструменти діють як зворотні проксі-сервери, що передають з'єднання з реальним сервером X11. Клієнти просто використовують іншу змінну DISPLAY (або -дисплей-аргумент) для підключення до проксі.

наприклад:

$ 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

Примітка. Якщо ви з якихось причин не можете змінити налаштування клієнтів X11 (дисплей), можливо, ви зможете налаштувати сервер для прослуховування іншого порту (як правило, 6001 проти 6000), а потім налаштувати xscopeпрослуховування на вихідному порту (6000).


Я спробував скласти xscope ... "Не знайдено жодного пакета" xproto ". pls Ви можете написати тут дамп першого пакету (12 байт)?
Массімо

@Massimo Ви встановили відсутні пакет?
jlliagre

Я використовую інстанс Linux на Amazon, і yum не знає xproto. Ви можете опублікувати дамп першого пакету? Мені потрібно лише це, тикс.
Массімо

Оскільки звичайний перший пакет - 21 байт, а не 12, див. "Ініціація підключення" в x.org/releases/current/doc/xproto/x11protocol.html
Массімо

1
Щойно спробував xtrace - може підтвердити, що він також добре працює; його вихід є більш компактним, з одним рядком на повідомлення - таким чином, це також легко можна отримати. Бігайте з напр. xtrace -D:1 -d:0 -k. (Або x11trace, як в деяких дистрибутивах названо виконуваний файл)
Aleksi Torhamo

4

X11 використовує TCP як свій транспортний протокол. Діапазон портів TCP для X11 зазвичай становить 6000-6063, але, швидше за все, ви побачите, що TCP-порт 6000 використовується.

Таким чином, ви повинні мати можливість використовувати будь-який мережевий монітор на ваш вибір для спостереження за трафіком, фільтруючи для цього діапазону портів та відповідних хостів. Я також знаю, що wireshark, наприклад, вже є попередньо встановлений фільтр x11для моніторингу трафіку, який вас цікавить.

Наприклад, для моніторингу всього трафіку X11 на локальній машині (якщо використовується TCP; див. Відповідь @ Stéphane Chazelas) використовуйте наступний фільтр:

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

Повідомлення місцевих клієнт-сервер передаються через сокет домену Unix, lsof -U | grep '^X'.
золотинок
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.