X11 프로토콜 트래픽 캡처

X11 프로토콜 트래픽 캡처

어떻게 캡처해X11프로토콜 트래픽?

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

답변1

TCP, Unix 도메인 소켓 또는 (Linux의 경우) Unix 도메인 소켓을 통해 X11과 통신할 수 있습니다.추상적인네임스페이스.

host:4DISPLAY가 (약어) 로 설정되면 tcp/host:4클라이언트는 TCP를 사용하여 서버에 연결합니다. TCP 포트는 6000에 디스플레이 번호(이 예에서는 6004)를 더한 값입니다.

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

$DISPLAYis only :4(의 약어 ) 인 경우 unix/:4클라이언트는 Unix 도메인 소켓을 사용합니다. /tmp/.X11-unix/X4같은 길이 라도추상적인네임스페이스(일반적으로 @/tmp/.X11-unix/X4출력에 표시됨 netstat)

트래픽 캡처가 더욱 까다로워집니다.

X 서버가 TCP를 수신하고 있었지만 더 이상 수신하지 않는 경우 가장 쉬운 방법은 DISPLAY대신 루프백 인터페이스의 포트 6004에서 네트워크 트래픽을 localhost:4캡처 하도록 변경하는 것입니다.:4

그렇지 않은 경우 다음을 socat사용할 수 있습니다.중간 사람TCP 연결을 수락하고 다음과 같이 전달합니다.유닉스또는추상적인:

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

그런 다음 위와 같이 설정 $DISPLAY하고 localhost:4네트워크 트래픽을 캡처하거나 socat사용자에게 이를 덤프하도록 지시할 수 있습니다 -x -v.

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

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

여기에서 xterm나는 그것이 일어나는 것을 관찰 하고 writev()이를 위해 파일 설명자 3에 대해 시스템 호출을 만들었습니다. 그래서 나는 이것을 할 수 있습니다 :recvfrom()recvmsg()

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가 필요합니다.

답변2

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

주요한 것은범위일부 Unix 또는 Linux 배포판에서는 바이너리로 사용할 수 없지만 다음에서 쉽게 얻을 수 있습니다.원천.

게다가지붕틀그리고하지만 나는 그들을 상대한 경험이 없습니다.

이러한 도구는 모두 역방향 프록시처럼 작동하여 실제 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)에서 수신 대기합니다.

답변3

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

관련 정보