Analyse réseau
Niveau :
Résumé : wireshark ; tcpdump
Face à un problème de communication, on en est souvent réduit aux outils de base : un sniffer.
tcpdump
Le sniffer le plus connu est tcpdump. Si vous ne l’avez pas encore utilisé, man est votre ami. Mais il est très simple. Petit exemple en root :
$ tcpdump host 1.2.3.4 and port 80
Le langage de filtrage de tcpdump est assez simple, pour l’apprendre, chercher la section “expression” dans le manuel de tcpdump. Mais finalement, la sortie de cet outil n’est pas très passionnante, et à moins de savoir décoder le tcp/ip à la vitesse de la lumière ou d’avoir besoin juste d’une petite information (les paquets passent ? combien ? …), il est un peu ardu à utiliser.
Tout de même, les quelques options à connaître :
- -e : pour des problèmes au niveau ethernet
- -i : pour écouter sur une interface (attention le any par défaut n’inclue pas le loopback)
- -s 0 : pour stocker l’intégralité des paquets capturés (à utiliser de préférence avec -w)
- -w fichier : stocke les données dans un fichier pour analyse ultérieure
wireshark
De son ancien nom ethereal, wireshask est l’équivalent graphique de tcpdump. On ne se rend pas compte sans l’avoir testé de tout ce qu’apporte la version graphique. L’analyse de paquet est plus détaillée qu’avec tcpdump, on peut demander des infos a posteriori à coup de clic ou filtrer une unique communication.
Utilisez par exemple sudo (ou xauth) pour lancer facilement wireshark en tant que root. Wireshark utilise les mêmes filtres que tcpdump. Pratique, votre apprentissage n’est pas perdu.
Voici ce que donne une capture.
Remarquez que vous pouvez aisément analyser le contenu des paquets en bas, couche par couche.
Et parlons de l’une des fonctionnalités les plus importantes de wireshark : “follow TCP stream” dans le menu “analyse”. Cette fonction vous permet de lire tout le dialogue TCP comme si vous y étiez. Qui vous donne l’écran suivant. Au passage, ne soyez pas surpris d’avoir “perdu” des paquets, cette fonctionnalité en profite pour ajouter un filtre sur la connexion considérée.
tcpdump + wireshark
Et maintenant si la machine que vous voulez analyser est un serveur ? Ce qui est souvent le cas. Hé bien on combine les deux.
# sur le serveur $ tcpdump -i eth0 -s0 -w /tmp/dump0.cap # sur un client quelconque avec wireshark $ scp serveur:/tmp/dump0.cap . # puis cliquer sur open dans wireshark pour lire la capture ainsi obtenue
Et la lecture se passe de la même façon que si la capture s’était faite sur la machine locale.
Edit : on me fait remarquer une meilleure méthode pour faire tout cela en une ligne (note, toujours faire tenir les commandes sur une seule ligne, ça facilite les essais successifs).
# Le user et le sudo sont à moduler selon votre situation # Attention au cas du port 22 qu'on utilise en direct $ ssh server "sudo tcpdump -i eth0 -s0 -w - port not 22" | wireshark -i - -k
Pour ceux qui voudraient savoir comment ça marche avec un mot de passe : ça marche bien, puisque ssh comme sudo utilisent le tty pour demander le mot de passe et non pas stdin (vous savez le truc qui fait qu’on ne peut pas mettre le mot de passe dans un script et lui passer en pipe).