Como posso capturar o tráfego do protocolo X11 ?
Preciso encontrar uma maneira de capturar o tráfego X11 entre duas máquinas e também entre um servidor X11 e um cliente X11 na máquina local.
Você pode falar com o X11 sobre TCP ou sobre um soquete de domínio Unix ou (no Linux) em um soquete de domínio Unix no espaço para nome abstrato .
Quando DISPLAY estiver definido como host:4
, abreviação de tcp/host:4
, os clientes usam o TCP para se conectar ao servidor. A porta TCP é então 6000 mais o número de exibição (nesse caso, 6004).
Nesse caso, você pode capturar o tráfego com qualquer sniffer de rede como tcpdump
ou wireshark
capturando o tráfego TCP nessa porta.
Quando $DISPLAY
é apenas :4
(abreviação de unix/:4
), os clientes usam um soquete de domínio unix. Um /tmp/.X11-unix/X4
ou o mesmo caminho no espaço de nome ABSTRACT (geralmente mostrado como @/tmp/.X11-unix/X4
emnetstat
saída).
Capturar o tráfego é mais complicado.
Se o seu servidor X ouvir no TCP (mas atualmente não o ouvem mais), o mais fácil é mudar DISPLAY
para em localhost:4
vez de:4
capturar o tráfego de rede na porta 6004 na interface de loopback.
Caso contrário, você pode usar socat
como um homem no meio que aceita conexões como TCP e as encaminha como unix ou abstrato :
socat tcp-listen:6004,reuseaddr,fork unix:/tmp/.X11-unix/X4
Você pode então definir $DISPLAY
a localhost:4
e capturar o tráfego de rede como acima ou dizer socat
para despejá-lo com -x -v
.
Agora, se você não pode mudar $DISPLAY
e deseja capturar o tráfego de um aplicativo X local já em execução que usa soquetes de domínio unix, é aí que fica complicado.
Uma abordagem poderia ser usar strace
(ou o comando equivalente em seu sistema, se não o Linux) para rastrear as chamadas de sistema de envio / recebimento que seu aplicativo faz para se comunicar com o servidor X.
Aqui xterm
, observo que sim writev()
, recvfrom()
e o recvmsg()
sistema chama o descritor de arquivo 3 para isso. Então eu posso fazer:
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 -
(ou tshark -Vi -
)
A idéia é extrair o carimbo de data e hora enviado / recebido da saída strace
e usá-lo text2pcap
para convertê-lo em um pcap
(adicionando cabeçalhos TCP fictícios na porta 6000 com -T6000,1234
) antes de alimentar wireshark
. Também dividimos pacotes para evitar o limite de 64 kB no comprimento máximo de um registro pcap.
Observe que, para text2pcap
funcionar corretamente com relação à orientação correta do tráfego, você precisa de uma versão relativamente recente do wireshark.
Se você estiver interessado principalmente no protocolo X11 e não no material TCP / IP e Ethernet subjacente, e se conseguir ajustar as configurações do cliente ou do servidor, poderá usar uma ferramenta projetada especificamente para capturar e decodificar o tráfego entre um X11 cliente e um servidor X11. Ao contrário do
wireshark
dissector X11, é improvável que essas ferramentas sejam confundidas pelo tráfego, estando totalmente envolvidas com ele.O principal é o xscope que, apesar de não estar disponível como um binário para algumas distribuições Unix ou Linux, pode ser facilmente construído a partir do código - fonte .
Como alternativa, também existem xtruss e xtrace, mas não tenho experiência com eles.
Todas essas ferramentas agem como proxies reversos retransmitindo conexões com um servidor X11 real. Os clientes simplesmente usam uma variável DISPLAY diferente (ou argumento -display) para se conectar ao proxy.
por exemplo:
Nota: Se, por algum motivo, você não puder alterar as configurações dos clientes X11 (vídeo), poderá reconfigurar o servidor para escutar uma porta diferente (normalmente 6001 vs 6000) e, em seguida, configurar
xscope
para escutar na porta original (6000).fonte
xtrace -D:1 -d:0 -k
. (Ou x11trace, como o executável é chamado em algumas distros)O X11 usa o TCP como seu protocolo de transporte. O intervalo de portas TCP para o X11 geralmente é de 6000 a 6063, mas provavelmente você verá a porta TCP 6000 sendo usada.
Portanto, você poderá usar qualquer monitor de rede de sua escolha para observar o tráfego filtrando esse intervalo de portas e os hosts em questão. Eu também sei que
wireshark
, por exemplo, já contém uma predefinição de filtrox11
para monitorar o tráfego no qual você está interessado.Por exemplo, para monitorar todo o tráfego X11 na máquina local (se estiver usando TCP; consulte a resposta de @ Stéphane Chazelas), use o seguinte filtro:
fonte
lsof -U | grep '^X'
,.