Захват трафика протокола X11

15

Как я могу захватить трафик протокола X11 ?

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

zh_
источник

Ответы:

19

Вы можете общаться с X11 через TCP, или через сокет домена Unix, или (в Linux) через сокет домена Unix в абстрактном пространстве имен.

Если для параметра DISPLAY установлено значение host:4short tcp/host:4, клиенты используют TCP для подключения к серверу. Порт TCP равен 6000 плюс номер дисплея (в данном случае 6004).

В этом случае вы можете захватывать трафик с помощью любого сетевого анализатора, например, tcpdumpили wiresharkпутем захвата трафика TCP на этом порту.

Когда $DISPLAYиспользуется только :4(сокращение unix/:4), клиенты используют сокет домена unix. Либо /tmp/.X11-unix/X4или тот же путь в пространстве имен ABSTRACT (обычно отображается как @/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правильной работы в отношении определения направления движения вам нужна относительно недавняя версия wireshark.

Стефан Шазелас
источник
Знаете ли вы причину по умолчанию для доменных сокетов Unix? Оказывает ли TCP какое-либо (существенное) влияние на производительность или другие недостатки?
inVader
@inVader, ну да, это целый протокол TCP / IP для реализации, проходящий через несколько уровней ... Я предполагаю, что система может использовать ярлыки (например, не реализовывать обычный алгоритм предотвращения перегрузки) для петлевых соединений, но все же, в моих тестах Я получаю вдвое большую пропускную способность с простым сокетом unix-домена, чем с тестом соката tcp socket.
Стефан Шазелас
14

Если вы в основном заинтересованы в протоколе X11, а не в базовых компонентах TCP / IP и Ethernet, и если вы можете настроить параметры клиента или сервера, вы можете использовать инструмент, специально разработанный для захвата и декодирования трафика между X11. клиент и сервер X11. В отличие от wiresharkдиссектора X11, эти инструменты вряд ли будут смущать трафик, будучи полностью вовлеченным в него.

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

Кроме того, есть также xtruss и xtrace, но у меня нет опыта работы с ними.

Все эти инструменты действуют как обратные прокси-серверы, ретранслирующие соединения с настоящим сервером X11. Клиенты просто используют другую переменную DISPLAY (или аргумент -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).

jlliagre
источник
Я пытался скомпилировать xscope ... "Пакет" xproto "не найден". Пожалуйста, вы можете написать здесь дамп первого пакета (12 байт)?
Массимо
@Massimo Вы установили недостающий пакет?
Jlliagre
Я использую Linux-версию на Amazon, а yum не знает xproto. Пожалуйста, вы можете опубликовать дамп первого пакета? Мне нужно только это, спасибо.
Массимо
Так как обычный первый пакет составляет 21 байт, а не 12, см. «Инициирование соединения» в x.org/releases/current/doc/xproto/x11protocol.html
Massimo
1
Только что попробовал xtrace - могу подтвердить, что он тоже работает нормально; его вывод является более компактным, с одной строкой на сообщение - так что также легко перехватываемый. Беги с напр. xtrace -D:1 -d:0 -k, (Или x11trace, так как исполняемый файл назван в некоторых дистрибутивах)
Алекси Торхамо,
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'.
Златовласка