Analyse fine des communications réseaux

Au long de ce cours, vous avez pu rencontrer des analyses de trames, qui permettent de visualiser concrètement les données qui transitent sur le réseau. Elles ont été réalisées au moyen du logiciel Wireshark. Il serait utile que vous sachiez vous aussi utiliser un tel analyseur : cela vous permettrait de savoir précisément ce qui est émis ou reçu par votre poste.

Dans ce chapitre, nous allons voir deux analyseurs de trames : Wireshark, qui dispose d’une interface graphique très performante, et tcpdump, qui fonctionne en mode texte (en console), ce qui se révèle bien pratique pour des serveurs.

Présentation générale

Le principal intérêt de ces logiciels est de visualiser les trames qui transitent par les interfaces réseaux d’un appareil. Cela est utile pour comprendre et résoudre un dysfonctionnement, mais cela est aussi très instructif pour connaitre finement un protocole. On peut aussi s’en servir pour faire de la rétro-ingénierie, c’est-à-dire déterminer le fonctionnement d’une application en observant son comportement.

Les analyseurs permettent de capturer les flux qui passent en temps réel, de les sauvegarder au format pcap1, de lire des enregistrements, de les filtrer et de les analyser finement. Pour les hôtes ne disposant pas d’une interface graphique, comme souvent les serveurs, nous recommandons tcpdump. L’installation se fait au moyen du gestionnaire de paquets. Nous supposons que si vous savez utiliser un serveur, vous savez installer un logiciel. :)

Pour les systèmes à interface graphique (Windows, Ubuntu, Mac OS X, …), nous conseillons Wireshark. Rendez-vous sur cette page de téléchargement pour l’installer.


  1. pcap est un format de fichier permettant de stocker des trames réseaux.

Utilisation de tcpdump

Que diriez-vous de faire joujou avec notre nouvelle application ? :) Nous allons commencer par présenter tcpdump.

Les exemples présentés ici sont capturés depuis un serveur exposé sur Internet. Pour lancer notre analyse, on lance tout simplement la commande tcpdump. Pour l’arrêter, on utilise la combinaison CTRL + C (ou + C sous Mac).

tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ens3, link-type EN10MB (Ethernet), capture size 262144 bytes
12:58:37.199174 IP netmon-1-bhs.ovh.ca > 105.ip-71-57-81.eu: ICMP echo request, id 57303, seq 1, length 12
12:58:37.199240 IP 105.ip-71-57-81.eu > netmon-1-bhs.ovh.ca: ICMP echo reply, id 57303, seq 1, length 12
12:58:37.199856 IP 105.ip-71-57-81.eu.44326 > cdns.ovh.net.domain: 59980+ PTR? 105.71-57-81.in-addr.arpa. (43)
12:58:37.201701 IP cdns.ovh.net.domain > 105.ip-71-57-81.eu.44326: 59980 1/0/0 PTR 105.ip-71-57-81.eu. (75)
12:58:37.201887 IP 105.ip-71-57-81.eu.53832 > cdns.ovh.net.domain: 6713+ PTR? 1.37.114.167.in-addr.arpa. (43)
12:58:37.203776 IP cdns.ovh.net.domain > 105.ip-71-57-81.eu.53832: 6713 1/0/0 PTR netmon-1-bhs.ovh.ca. (76)
12:58:37.204270 IP 105.ip-71-57-81.eu.42985 > cdns.ovh.net.domain: 46110+ PTR? 99.33.186.213.in-addr.arpa. (44)
12:58:37.206165 IP cdns.ovh.net.domain > 105.ip-71-57-81.eu.42985: 46110 1/0/0 PTR cdns.ovh.net. (70)
12:58:39.857063 IP netmon-1-gra.ovh.net > 105.ip-71-57-81.eu: ICMP echo request, id 49924, seq 1, length 12
12:58:39.857156 IP 105.ip-71-57-81.eu > netmon-1-gra.ovh.net: ICMP echo reply, id 49924, seq 1, length 12
12:58:39.857572 IP 105.ip-71-57-81.eu.52686 > cdns.ovh.net.domain: 61030+ PTR? 1.186.222.92.in-addr.arpa. (43)
12:58:39.859535 IP cdns.ovh.net.domain > 105.ip-71-57-81.eu.52686: 61030 1/0/0 PTR netmon-1-gra.ovh.net. (77)
^C
12 packets captured
12 packets received by filter
0 packets dropped by kernel

Cette capture a été prise complètement au hasard. Pour des raisons de confidentialité, des adresses et des indications horaires ont pu être modifiées.

On peut voir une série de lignes toutes structurées de la même manière :

heure (au millionième de seconde !) protocole de niveau 3 source destination détails sur le protocole de niveau supérieur
12:58:37.199174 IP netmon-1-bhs.ovh.ca > 105.ip-71–57–81.eu: ICMP echo request, id 57303, seq 1, length 12
12:58:37.199240 IP 105.ip-71–57–81.eu > netmon-1-bhs.ovh.ca: ICMP echo reply, id 57303, seq 1, length 12
12:58:37.199856 IP 105.ip-71–57–81.eu.44326 > cdns.ovh.net.domain: 59980+ PTR? 105.71–57–81.in-addr.arpa. (43)

Si on veut plus de détails sur ces paquets, on peut ajouter l’option -vv à notre commande :

# tcpdump -vv
tcpdump: listening on ens3, link-type EN10MB (Ethernet), capture size 262144 bytes
13:00:54.067669 IP (tos 0x8, ttl 5, id 1, offset 0, flags [DF], proto ICMP (1), length 32)
    netmon-1-bhs.ovh.ca > 105.ip-71-57-81.eu: ICMP echo request, id 43960, seq 1, length 12
13:00:54.067736 IP (tos 0x8, ttl 64, id 10606, offset 0, flags [none], proto ICMP (1), length 32)
    105.ip-71-57-81.eu > netmon-1-bhs.ovh.ca: ICMP echo reply, id 43960, seq 1, length 12
13:00:54.068731 IP (tos 0x0, ttl 64, id 7857, offset 0, flags [DF], proto UDP (17), length 71)
    105.ip-71-57-81.eu.51013 > cdns.ovh.net.domain: [bad udp cksum 0x3c79 -> 0xb297!] 9513+ PTR? 105.71-57-81.in-addr.arpa. (43)
13:00:54.070665 IP (tos 0x0, ttl 55, id 52876, offset 0, flags [none], proto UDP (17), length 103)
    cdns.ovh.net.domain > 105.ip-71-57-81.eu.51013: [udp sum ok] 9513 q: PTR? 105.71-57-81.in-addr.arpa. 1/0/0 105.71-57-81.in-addr.arpa. PTR 105.ip-71-57-81.eu. (75)
13:00:54.070967 IP (tos 0x0, ttl 64, id 7858, offset 0, flags [DF], proto UDP (17), length 71)
    105.ip-71-57-81.eu.32925 > cdns.ovh.net.domain: [bad udp cksum 0x3c79 -> 0x91b6!] 23524+ PTR? 1.37.114.167.in-addr.arpa. (43)
13:00:54.073168 IP (tos 0x0, ttl 55, id 40370, offset 0, flags [none], proto UDP (17), length 104)
    cdns.ovh.net.domain > 105.ip-71-57-81.eu.32925: [udp sum ok] 23524 q: PTR? 1.37.114.167.in-addr.arpa. 1/0/0 1.37.114.167.in-addr.arpa. PTR netmon-1-bhs.ovh.ca. (76)
13:00:54.074404 IP (tos 0x0, ttl 64, id 7859, offset 0, flags [DF], proto UDP (17), length 72)
    105.ip-71-57-81.eu.60036 > cdns.ovh.net.domain: [bad udp cksum 0x3c7a -> 0x3c95!] 43386+ PTR? 99.33.186.213.in-addr.arpa. (44)
13:00:54.076506 IP (tos 0x0, ttl 55, id 40371, offset 0, flags [none], proto UDP (17), length 98)
    cdns.ovh.net.domain > 105.ip-71-57-81.eu.60036: [udp sum ok] 43386 q: PTR? 99.33.186.213.in-addr.arpa. 1/0/0 99.33.186.213.in-addr.arpa. PTR cdns.ovh.net. (70)
^C
8 packets captured
8 packets received by filter
0 packets dropped by kernel

Ainsi, on obtient davantage de détails sur différents protocoles : on voit notamment les champs IP et des erreurs de checksum au niveau d’UDP.

On peut enregistrer une capture dans un fichier avec l’option -w : tcpdump -w frames.cap enregistrera les trames capturées dans le fichier frames.cap. Il pourra ensuite être lu avec l’option -r : tcpdump -r frames.cap.

Si on souhaite ne conserver que certains flux, on peut appliquer un filtre à la capture. Voici quelques exemples :

  • Pour ne conserver que les paquets qui concernent l’hôte 192.168.1.1 : tcpdump host 192.168.1.1
  • Pour n’avoir que les flux TCP vers ou depuis le port 443 : tcpdump tcp port 443
  • Pour exclure les flux SSH (très pratique quand on est justement connecté en SSH :-° ) : tcpdump not tcp port 22

La référence pour connaitre toutes les possibilités et toutes les options reste le manuel (man tcpdump). Pour plus d’exemples et plus de précisions sur l’utilisation de tcpdump, nous vous recommandons cet article de Lea Linux.

Utilisation de Wireshark

On en parle tout au long du cours, Wireshark est l’outil le plus simple à utiliser pour faire de l’analyse réseau. Ouvrons-le tout de suite et réalisons une écoute sur une interface. Pour cela, double-cliquez sur l’interface à écouter dans la liste proposée.

Liste d'interfaces proposées par Wireshark
Liste d’interfaces proposées par Wireshark

S’il manque des interfaces, c’est peut-être que vous n’avez pas les droits suffisants pour exécuter le logiciel. Dans ce cas, essayez de le lancer en mode administrateur (Windows) ou en root (Linux).

Pour arrêter la capture, cliquez sur le carré rouge dans la barre d’outils principale. Juste en dessous, vous pouvez filtrer les paquets à l’aide de mots clés comme dhcp, ip, tcp, … Pour connaitre toutes les possibilités, vous pouvez vous référer à la documentation officielle. Vous y apprendrez à faire des filtres sur des sous-réseaux (exemple : ip.addr == 192.168.1.0/24) ou encore à n’afficher que des segments TCP avec le flag SYN levé.

Dans la partie centrale, on visualise le détail des trames couche par couche. La capture suivante est tirée d’un autre chapitre de ce cours.

Représentation d'une trame dans Wireshark
Représentation d’une trame dans Wireshark

Si vous réalisez une analyse sur une interface sans-fil, vous allez vite vous rendre compte qu’il y a anguille sous roche avec la couche 2 : Wireshark montre un autre protocole ! Il s’agit généralement d’Ethernet ou SLL (Linux cooked). Cela est dû au fait que Wireshark n’est pas en mesure de lire réellement les trames au niveau 2, alors il fait semblant en proposant une alternative qui permet quand même de visualiser les adresses source et destination de la couche liaison de données. Cela est détaillé dans la documentation sur le pseudo-protocole SLL.

Il est techniquement possible de visualiser des trames Wi-Fi avec Wireshark si l’on écoute une interface en mode monitor. Cela est trop complexe pour être expliqué ici, mais vous pouvez vous référer à cette page (en anglais).

Vous pouvez afficher le détail d’une couche en double-cliquant dessus, et faire de même pour chaque section qui débute par un symbole >.

Détail du protocole de niveau 3
Détail du protocole de niveau 3

Tout en bas, vous trouvez une représentation en hexadécimal de la section sélectionnée. Dans l’image suivante, c’est la section IP qui est surlignée en bleu. On y visualise le numéro de version dans le premier quartet (4), l’IHL (5, soit 20 octets), etc. Ne cherchez pas de lien avec la capture précédente, il s’agit d’une trame différente.

Représentation en hexadécimal d'une trame
Représentation en hexadécimal d’une trame

Nous ne saurions trop vous conseiller de jouer avec les analyseurs pour comprendre de manière précise ce qui se trame sur votre réseau. N’hésitez pas à explorer par vous-mêmes toutes les possibilités de Wireshark : il propose des fonctionnalités incroyablement pointues de traçage de flux, de statistiques, de reconstitution d’appels téléphoniques, etc. Quand vous découvrez une notion dans ce cours, visualiser sa place au sein d’une communication que vous déclenchez est un excellent moyen de la comprendre et de s’en souvenir.