Le sniffer wireshark ?>

Le sniffer wireshark

1 Introduction

Pour pouvoir analyser finement le trafic réseau lorsqu’il y a, par exemple, un problème que l’on n’arrive pas à déterminer, il peut être utile de voir ce qu’il se passe réellement sur le réseau. Pour cela il existe des sniffeurs qui sont des outils qui permettent de récupérer les paquets qui passent physiquement sur un réseau (quelque soit la destination de ces paquets). Il existe un outil sous licence GNU qui permet de faire cela et qui permet d’interpréter la structure des paquets, cela de façon graphique.

2 Le programme

Cet outil s’appelle wireshark et il est disponible sur le site de wireshark.

Il est aussi nécessaire de connecter cette machine avec une carte réseau sur le réseau à sniffer, a priori en la connectant sur un hub. On ne peut voir que les paquets qui passent physiquement sur le réseau auquel est connecté la carte réseau. Ce qui veux dire que si l’on veux analyser des paquets qui ne sont pas à destination de notre machine, il faut que l’on soit sur un réseau à collisions (tout le monde utilise le même câble réseau à tour de rôle) ce qui est le cas des réseaux 10 base 2 (coax) ou 10/100 base T avec l’utilisation d’un concentrateur Ethernet ou HUB.

L’installation de ce logiciel dépendra du format dans lequel vous vous l’êtes procuré. Dans tous les cas, il n’y a pas vraiment de problèmes si vous disposez d’une installation standard de Linux. Il faut être sous une session graphique (X Window) pour utiliser ce logiciel et le lancer sous le compte root. Pour lancer ce logiciel, il suffit d’utiliser un terminal et d’y taper la commande /usr/local/bin/wireshark ou /usr/bin/wireshark (wireshark devrait d’ailleurs suffire). Si vous n’étiez pas sous le compte root, utilisez la commande su – puis le mot de passe du root avant de lancer wireshark. Voilà vous utilisez wireshark. Pour plus d’informations sur l’utilisation même du produit, tapez man wireshark à l’invite de commande d’un shell.

Le principe est simple, vous lancez une session de capture à l’aide du menu Capture. Cette session peut être interactive ou pas. En d’autres termes, les paquets capturés peuvent être affichés au fur et à mesure ou à la fin de la capture.

wireshark-cap1.png

Pour lancer une session de capture, il faut accéder au menu Capture puis cliquer sur l’Option….

 

wireshark-cap2.pngApparaît la boîte de dialogue qui permet de spécifier ce qui doit être analysé.

Le champ Interface permet de choisir l’interface sur laquelle on va écouter. Sur le portable, l’interface doit être eth0 car c’est la seule. Si cette interface n’est pas disponible vérifiez que vous êtes bien sur le compte root. Il n’y a que le root qui peut sniffer les paquets.

La section Stop Capture de spécifier le nombre des paquets sniffés. Si non spécifié fera que wireshark captera des paquets jusqu’à ce qu’on lui demande d’arrêter. Vient ensuite un champ intéressant.

Le champ Capture Filter permet de limiter les paquets qui seront conservés. Seuls les paquets pour lesquels cette expression est vraie seront conservés. Dans l’exemple donné, on ne conservera que les paquets dont le protocole est udp avec le port source ou destination 53 qui correspond au protocole DNS. Pour des détails sur les filtres, se référer au chapitre sur Les filtres.

Le Capture File permet de spécifier un fichier dans lequel on vas stoker la capture (ce n’est pas obligatoire).

Update liste of packets in realtime permet (s’il est coché) de voir les paquets s’afficher en temps réel (pendant la capture) dans la fenêtre des paquets disponibles. Cette option ne doit être utilisée que si il n’y a pas trop de paquets conservés.

Automatic scrolling in live capture permet (s’il est coché) de voir les derniers paquets s’afficher en temps réel (pendant la capture) dans la fenêtre des paquets disponibles en faisant défiler la liste des paquets disponibles. Cette option ne doit être utilisée que s’il y a peu de paquets (surtout sur un portable avec un affichage plus que lent).

Enable network name resolution permet (s’il est coché) de demander une traduction des adresses IP en noms. Cette option doit aussi être manipulée avec “précaution” car elle génère des requêtes DNS qui peuvent “encombrer” le réseau et prendre du temps. Surtout s’il y a beaucoup de machines différentes dans les paquets et qu’elles ne sont pas connues dans les DNS.

Durant la capture, une barre récapitule les paquets qui sont conservés.Wirecap1.png En même temps les paquets apparaissent dans la fenêtre principale si l’option Update liste of packets in realtime a été cochée. L’appui du bouton Stop Wirestop.png permet d’arrêter la capture. Les paquets deviennent disponibles dans la fenêtre principale s’ils n’étaient pas déjà disponibles.

Wirecap2.png
L’affichage des résultats se décompose en trois parties :

  • La liste des paquets capturés disponibles en dessous de la barre de menu avec un affichage synthétique du contenu de chaque paquet.
  • La décomposition exacte du paquet actuellement sélectionné dans la liste. Cette décomposition permet de visualiser les champs des entêtes des protocoles ainsi que l’imbrication des différentes couches de protocoles connus.
  • La troisième zone contient le paquet (le début s’il est trop gros) affiché en hexadécimal et en ASCII.

Tout en haut du programme se trouve un champ filtrer. Il permet de n’afficher que les paquets qui correspondent aux critères spécifiés dans ce champ filtrer. C’est un filtre qui permet de temporairement cacher une partie des paquets.

Wirecap3.png


Voici un exemple du détail que l’on peut obtenir pour un paquet. La vision synthétique du paquet est disponible en haut, la zone du milieu nous donne l’éclaté des protocoles en jeux dans ce paquet (les différentes couches avec les champs associés). Dans la partie du bas, on retrouve le paquet en format “brut” affiché en hexadécimal et en ASCII. Un clic sur un des champs du paquet (dans la zone centrale) sur-ligne les octets correspondant dans la vision brut du paquet.

3 Les filtres

Il y a deux sortes de filtres. Les filtres à la capture et les filtres à l’affichage. Ces filtres n’ont pas la même syntaxe. La syntaxe des filtres à la capture est la même que les filtres utilisés pour la commande tcpdump. Pour en connaître le format, il faut donc utiliser man tcpdump. Quand aux filtres à l’affichage, la syntaxe est une syntaxe propriétaire à wireshark. Pour en connaître la syntaxe, il faut utiliser la commande man wireshark. La section présente donne des exemples pour ces deux types de filtres.

3.1 Filtres de capture

Ne seront gardés que les paquets pour lesquels le filtre est vrai. Les filtres se décomposent en 3 parties :

  • le protocole qui peut être ether, fddi, ip, arp, rarp, decnet, lat, sca, moprc, mopdl, tcp ou udp,
  • la direction qui peut être src ou dst,
  • un champ qui peut être host, net ou port suivi d’une valeur.

Les opérateurs and, or et not peuvent être utilisés pour combiner des filtres.

Filtre Fonction
host 172.16.0.1 and tcp ne conserve que les paquets TCP à destination ou en provenance de la machine 172.16.0.1
udp port 53 ne conserve que les paquets UDP en provenance ou en destination du port 53
udp port 53 and dst host 172.16.0.1 ne conserve que les paquets UDP en provenance ou en destination du port 53 à destination de la machine 172.16.0.1
tcp dst port 80 and dst host 172.16.0.1 and src net 172.16.0.0 mask 255.255.255.0 ne conserve que les paquets TCP en destination de la machine 172.16.0.1 sur le port 80 et en provenance des machines du réseau 172.16.0/24

 

3.2 Filtres d’affichage

Les filtres d’affichage sont un peu plus fin que ceux de la capture. Seuls les paquets pour lesquels l’expression du filtre est vraie seront gardés. Les expressions sont basées sur les champs disponibles dans un paquet. Le simple ajout d’un champ veut dire que l’on garde le paquet si ce champ est disponible. Maintenant, on peut aussi utiliser les opérateurs ==, !=, >, <, >= et <= pour comparer les champs avec des valeurs. Les expressions ainsi fabriquées peuvent être combinées avec les opérateurs && (pour un et logique), || (pour un ou logique), ^^ (pour le ou exclusif) et ! pour la négation. L’usage des parenthèses est possible. Voici quelques exemples de champs disponibles (taper man wireshark pour une liste exhaustive) :

Champ Type Signification
ip.addr adresse IPv4 adresse IP source ou destination
ip.dst adresse IPv4 adresse IP destination
ip.flags.df booléen Drapeau IP, ne pas fragmenter
ip.flags.mf booléen Drapeau IP, fragments à venir
ip.ttl entier non signé sur 8 bits Time to live
nbdgm.src.ip adresse IPv4 adresse IP source d’un paquet Netbios Datagram
nbdgm.src.port entier non signé sur 16 bits port IP source d’un paquet Netbios Datagram
http.request booléen requête HTTP
http.response booléen réponse HTTP
icmp.code entier non signé sur 8 bits numéro du code d’une commande ICMP
icmp.type entier non signé sur 8 bits numéro du type d’une commande ICMP
ftp.request booléen requête FTP
ftp.request.command chaîne de caractères commande FTP
ftp.reponse.data chaîne de caractères donnée de transfer FTP
dns.query booléen requête DNS
dns.response booléen réponse d’une requête DNS

Voici quelques exemples de filtres :

Filtre Signification
ip.addr == 172.16.0.100 tous les paquets IP en provenance ou à destination de la machine 172.16.0.100
(ip.addr == 172.16.0.100) && (dns.response) tous les paquets IP en provenance ou à destination de la machine 172.16.0.100 qui sont des réponses à des requêtes DNS
(ip.addr >= 172.16.0.100) && (ip.addr <= 172.16.0.123) tous les paquets IP en provenance ou à destination des machines comprises entre l’adresse IP 172.16.0.100 et l’adresse IP 172.16.0.123 (comprises)
Les commentaires sont clos.