X11 프로토콜의 트래픽 캡처


15

X11 프로토콜의 트래픽을 어떻게 캡처 할 수 있습니까?

두 컴퓨터 간 및 로컬 컴퓨터의 X11 서버와 X11 클라이언트 간 X11 트래픽을 캡처하는 방법을 찾아야합니다.

답변:


19

TCP를 통해 또는 Unix 도메인 소켓을 통해 또는 Linux에서 추상 네임 스페이스 의 Unix 도메인 소켓을 통해 X11과 통신 할 수 있습니다 .

DISPLAY가로 host:4짧게 설정되면 tcp/host:4클라이언트는 TCP를 사용하여 서버에 연결합니다. TCP 포트는 6000에 표시 번호 (이 경우 6004)를 더한 값입니다.

이 경우 해당 네트워크 스니퍼를 사용 tcpdump하거나 wireshark해당 포트의 TCP 트래픽을 캡처하여 트래픽을 캡처 할 수 있습니다 .

$DISPLAY아니라 :4(짧은 unix/:4), 다음 클라이언트는 유닉스 도메인 소켓을 사용합니다. 어느 /tmp/.X11-unix/X4또는 동일한 경로 ABSTRACT 공간 (일반적으로 도시 @/tmp/.X11-unix/X4netstat출력).

트래픽 캡처는 더 까다 롭습니다.

X 서버가 TCP에서 수신 대기하지만 (오늘날 더 이상 사용하지 않는 경향이있는 경우) 가장 쉬운 방법은 루프백 인터페이스의 포트 6004 대신 네트워크 트래픽 을 변경 DISPLAY하여 캡처하는 localhost:4것입니다 :4.

그렇지 않은 경우, 당신이 사용할 수있는 socatA와 중간에 사람 TCP 등의 전달을 같은 연결을 받아 유닉스 또는 추상적를 :

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

당신은 다음 설정할 수 있습니다 $DISPLAY위해 localhost:4위와 같이 네트워크 트래픽을 캡처하거나 말과 socat함께 덤프 -x -v.

이제 $DISPLAYunix 도메인 소켓을 사용하는 이미 실행중인 로컬 X 응용 프로그램의 트래픽을 변경 하고 캡처 할 수없는 경우 까다로워집니다.

한 가지 방법은 strace응용 프로그램이 X 서버와 통신하기 위해 수행하는 보내기 / 받기 시스템 호출을 추적하는 데 사용할 수 있습니다 (또는 Linux가 아닌 경우 시스템에서 동등한 명령).

여기 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 -).

아이디어는 출력에서 ​​전송 / 수신 된 타임 스탬프 및 바이트를 추출하여 에 공급하기 전에이를 포트 6000에 더미 TCP 헤더 추가 로 변환하는 데 strace사용 됩니다 . 또한 pcap 레코드의 최대 길이에 대한 64kiB 제한을 피하기 위해 패킷을 분할합니다.text2pcappcap-T6000,1234wireshark

에 대한주의 text2pcap트래픽 방향의 권리를 얻기에 관해서 제대로 작동하려면, 당신은 Wireshark는 비교적 최신 버전이 필요합니다.


유닉스 도메인 소켓을 기본값으로 설정 한 이유를 알고 있습니까? TCP가 성능이나 기타 단점에 중대한 영향을 미칩니 까?
inVader

@inVader, 그렇습니다. 여러 계층을 거치는 전체 TCP / IP 프로토콜입니다. 루프백 연결을 위해 시스템이 일반적인 혼잡 방지 알고리즘을 구현하지 않는 것과 같은 단축키를 취할 수 있다고 가정하지만 여전히 테스트에서는 tcp 소켓 socat 테스트보다 유닉스 도메인 소켓을 사용하여 처리량을 두 배로 늘립니다.
Stéphane Chazelas

14

기본 TCP / IP 및 이더넷이 아닌 X11 프로토콜에 주로 관심이 있고 클라이언트 또는 서버 설정을 조정할 수있는 경우 X11 간의 트래픽을 캡처하고 디코딩하도록 특별히 설계된 도구를 사용할 수 있습니다 클라이언트와 X11 서버. wiresharkX11 dissector 와 달리 이러한 도구는 트래픽으로 인해 혼동되어서 완전히 관여하지는 않습니다.

주요한 것은 xscope 인데, 일부 유닉스 나 리눅스 배포판에서 바이너리로 사용할 수 는 없지만 source 에서 쉽게 빌드 할 수 있습니다 .

또는 xtrussxtrace도 있지만 경험이 없습니다.

이러한 모든 도구는 연결을 실제 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)에서 수신 하도록 구성 할 수 있습니다.


xscope를 컴파일하려고했습니다 ... " 'xproto'패키지가 없습니다." pls 여기에 첫 번째 패킷 (12 바이트)의 덤프를 작성할 수 있습니까?
마시모

@Massimo 누락 된 패키지를 설치 했습니까?
jlliagre

Amazon에서 Linux 인스턴스를 사용하고 있으며 yum은 xproto를 모릅니다. Pls 당신은 첫 번째 패킷의 덤프를 게시 할 수 있습니까? 난 그게 필요해
Massimo

일반적인 첫 번째 패킷은 12 바이트가 아닌 21 바이트이기 때문에 x.org/releases/current/doc/xproto/x11protocol.html의
Massimo

1
방금 시도한 xtrace-잘 작동하는지 확인할 수 있습니다. 메시지 당 한 줄로 출력이 더 작기 때문에 쉽게 잡을 수 있습니다. 예를 들어 실행하십시오. xtrace -D:1 -d:0 -k. (또는 x11trace, 실행 일부 배포판에 이름으로)
ALEKSI Torhamo

4

X11은 TCP를 전송 프로토콜로 사용합니다. X11의 TCP 포트 범위는 일반적으로 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

로컬 클라이언트-서버 메시지는 유닉스 도메인 소켓을 통해 전달됩니다 lsof -U | grep '^X'.
goldilocks
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.