Comment capturer le trafic du protocole X11 ?
J'ai besoin de trouver un moyen de capturer le trafic X11 entre deux machines et également entre un serveur X11 et un client X11 sur une machine locale.
Vous pouvez parler X11 sur TCP, ou sur un socket de domaine Unix ou (sous Linux) sur un socket de domaine Unix dans l' espace de noms abstrait .
Lorsque DISPLAY est réglé sur host:4
, abréviation detcp/host:4
, les clients utilisent TCP pour se connecter au serveur. Le port TCP est alors 6000 plus le numéro d'affichage (dans ce cas 6004).
Dans ce cas, vous pouvez capturer le trafic avec n'importe quel renifleur réseau comme tcpdump
ou wireshark
en capturant le trafic TCP sur ce port.
Lorsque $DISPLAY
est seulement :4
(abréviation de unix/:4
), les clients utilisent une socket de domaine Unix. Soit /tmp/.X11-unix/X4
ou le même chemin dans l' espace de noms ABSTRACT (généralement affiché comme @/tmp/.X11-unix/X4
dans la netstat
sortie).
La capture du trafic est alors plus délicate.
Si votre serveur X écoute sur TCP (mais ils n'ont plus tendance à le faire de nos jours), le plus simple est de passer DISPLAY
à la localhost:4
place de :4
et de capturer le trafic réseau sur le port 6004 sur l'interface de bouclage.
Si ce n'est pas le cas, vous pouvez utiliser en socat
tant qu'homme au milieu qui accepte les connexions en TCP et les transfère en tant qu'unix ou abstrait :
socat tcp-listen:6004,reuseaddr,fork unix:/tmp/.X11-unix/X4
Vous pouvez ensuite définir $DISPLAY
à localhost:4
et capturer le trafic réseau comme ci - dessus ou dire socat
de vider avec -x -v
.
Maintenant, si vous ne pouvez pas changer $DISPLAY
et que vous souhaitez capturer le trafic d'une application X locale déjà en cours d'exécution qui utilise des sockets de domaine Unix, c'est là que cela devient difficile.
Une approche pourrait consister à utiliser strace
(ou la commande équivalente sur votre système si ce n'est Linux) pour tracer les appels système d'envoi / réception que votre application fait pour communiquer avec le serveur X.
Ici xterm
, je le constate writev()
, recvfrom()
et le recvmsg()
système appelle le descripteur de fichier 3 pour cela. Je peux donc faire:
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 -
).
L'idée étant d'extraire l'horodatage et les octets envoyés / reçus de la sortie de strace
et de les utiliser text2pcap
pour les convertir en pcap
(en ajoutant des en-têtes TCP factices sur le port 6000 avec -T6000,1234
) avant de les alimenter wireshark
. Nous avons également divisé les paquets pour éviter la limite de 64 Ko sur la longueur maximale d'un enregistrement PCAP.
Notez que pour text2pcap
fonctionner correctement en ce qui concerne la bonne direction du trafic, vous avez besoin d'une version relativement récente de Wireshark.
Si vous êtes principalement intéressé par le protocole X11 et non par les éléments TCP / IP et Ethernet sous-jacents, et si vous êtes en mesure d'ajuster les paramètres du client ou du serveur, vous pouvez utiliser un outil spécialement conçu pour capturer et décoder le trafic entre un X11 client et un serveur X11. Contrairement au
wireshark
dissecteur X11, il est peu probable que ces outils soient confondus par le trafic, car ils y sont pleinement impliqués.Le principal est xscope qui, bien qu'il ne soit pas disponible en tant que binaire pour certaines distributions Unix ou Linux, peut facilement être construit à partir des sources .
Alternativement, il existe également xtruss et xtrace mais je n'ai aucune expérience avec eux.
Tous ces outils agissent comme des proxys inverses relayant les connexions à un vrai serveur X11. Les clients utilisent simplement une variable DISPLAY différente (ou argument -display) pour se connecter au proxy.
par exemple:
Remarque: Si, pour une raison quelconque, vous ne pouvez pas modifier les paramètres des clients X11 (affichage), vous pourrez peut-être reconfigurer le serveur pour écouter un autre port (généralement 6001 vs 6000), puis configurer
xscope
pour écouter sur le port d'origine (6000).la source
xtrace -D:1 -d:0 -k
. (Ou x11trace, comme l'exécutable est nommé sur certaines distributions)X11 utilise TCP comme protocole de transport. La plage de ports TCP pour X11 est généralement de 6000 à 6063, mais vous verrez très probablement le port TCP 6000 utilisé.
Vous devriez donc pouvoir utiliser n'importe quel moniteur réseau de votre choix pour observer le trafic en filtrant cette plage de ports et les hôtes en question. Je sais également que
wireshark
, par exemple, contient déjà un filtre prédéfinix11
pour surveiller le trafic qui vous intéresse.Par exemple, pour surveiller tout le trafic X11 sur la machine locale (si vous utilisez TCP; reportez-vous à la réponse de @ Stéphane Chazelas) utilisez le filtre suivant:
la source
lsof -U | grep '^X'
.