어떻게 캡처해X11프로토콜 트래픽?
두 컴퓨터 사이, 그리고 로컬 컴퓨터의 X11 서버와 X11 클라이언트 사이에서 X11 트래픽을 캡처하는 방법을 찾아야 합니다.
답변1
TCP, Unix 도메인 소켓 또는 (Linux의 경우) Unix 도메인 소켓을 통해 X11과 통신할 수 있습니다.추상적인네임스페이스.
host:4
DISPLAY가 (약어) 로 설정되면 tcp/host:4
클라이언트는 TCP를 사용하여 서버에 연결합니다. TCP 포트는 6000에 디스플레이 번호(이 예에서는 6004)를 더한 값입니다.
이 경우 네트워크 스니퍼를 사용하여 해당 포트에서 TCP 트래픽을 tcpdump
캡처하는 등 트래픽을 캡처할 수 있습니다 .wireshark
$DISPLAY
is 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를 피하기 위해 패킷을 분할합니다.text2pcap
pcap
-T6000,1234
wireshark
트래픽 방향을 올바르게 결정 하려면 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