====== Visualiser avec Wireshark les échanges chiffrés avec les serveurs IMAP et SMTP ======
===== Présentation =====
Un **analyseur de trame** est un outil **de base** de l'informaticien car il permet de comprendre ce qu'il se passe à un niveau très bas. Il permet aussi aussi de mettre en évidence de nombreux concepts théoriques du cours.
**Wireshark** (anciennement Ethereal) est un est un logiciel libre d'**analyse de protocole**, ou **packet sniffer**, utilisé dans le **dépannage** et l'**analyse du fonctionnement** des réseaux informatiques. Il est utilise pour **diagnostiquer** des dysfonctionnement dans un réseau informatique.
Un analyseur de protocoles (ou analyseur de réseaux ou de paquets) est un logiciel permettant **d’intercepter** et de consigner le trafic des données transférées sur un réseau de données. L’analyseur **capture** chaque **PDU** (protocol data unit - unité de données de protocole) des flux de données circulant sur le réseau.
Il permet de décoder et d’analyser leur contenu conformément aux spécifications **RFC** ou autres appropriées.
Wireshark est programmé pour reconnaître la structure de différents protocoles réseau.
===== Installation de Wireshark dans la VM Ubuntu =====
Avant d'installer un nouveau logiciel, mettrez à jour votre environnement Ubuntu.
* lancez un Terminal
* Mettez à jour votre environnement Ubuntu
$ sudo apt update
$ sudo apt upgrade
* installez Wireshark
$ sudo apt install wireshark
Durant l'installation il vous est demandé **d'autoriser** l'installation de **Dumcap**. Utilisez la touche **TAB** pour sélectionner le bouton **OK** et validez avec la touche entrée :
{{ :bloc3s1:wireshark_01.png?500 |}}
* **Autorisez** les utilisateurs non privilégiés à **utiliser Wireshark** :
{{ :bloc3s1:wireshark_02.png?500 |}}
* **Ajoutez** le compte utilisateur voulu au groupe **wireshark** pour lui permettre d'utiliser toutes les fonctionnalités de Wireshark :
$ sudo usermod -aG wireshark comptevoulu
ou le compte qui a ouvert la session (la commande whoami permet de connaitre l'utilisateur qui a ouvert la session :
$ sudo usermod -aG wireshark $(whoami)
* Fermez puis réouvrez votre session pour actualiser vos droits.
* Lancez un Terminal et vérifiez que vous êtes bien dans le groupe wireshark avec la commande suivante :
$ groups
En cas d'**erreur de configuration de Wireshark,** relancez l'assistant de configuration avec la commande suivante :
$ sudo dpkg-reconfigure wireshark-common
===== Prise de contact =====
Lancez le logiciel qui se présente ainsi (la carte réseau **enp0s3** connectée au réseau est encadrée en rouge):
{{ :bloc3s1:wireshark_03.png?500 |}}
Vous pouvez démarrer une capture en cliquant tout simplement sur l'interface réseau qui vous intéresse. Vous ne verrez donc que le trafic réseau vu par cette carte réseau.
* **Démarrez une capture** avec l'icône en forme d'aileron de requin en haut à gauche.
* Au bout de quelques instants vous verrez des paquets réseau apparaître dans la fenêtre, ce qui montre que même si vous ne faites rien, il y a des informations qui circulent sur le réseau !
* **Arrêtez** la capture des trames :
* {{ :bloc3s1:wireshark_04.png?500 |}}
Wireshark permet de donner des informations très détaillées. Examinez l'écran principal du logiciel :
{{ :bloc3s1:wireshark_05.png?500 |}}
On observe en trois parties :
* 1. La **liste des trames Ethernet capturées**. Elles sont chacune numérotées et horodatées par Wireshark (ces données ne figurent donc pas dans la trame d'origine).
* 2. Pour chaque trame, sa **structure** est présentée sous une forme **hiérarchique** (ainsi ce que vous voyez dans le volet 2 est le détail de la trame numéro 2)
* 3. Le volet 3 est la même chose que le volet 2 mais sous une forme **brute** non structurée avec une présentation ASCII et hexadécimale. Vous pouvez la présenter en binaire (clic droit dans le volet 3).
===== Examen détaillé =====
Examinez en détail le volet 2. Vous pouvez cliquer sur les croix pour développer les contenus. Ce volet met en évidence le phénomène **d'encapsulation** :
Le premier élément concerne la **trame** proprement dite (taille, temps, etc.) :
{{ :bloc3s1:wireshark_06.png?500 |}}
Ensuite, en montant d'un cran est présentée la partie liée à **Ethernet**. On retrouve les adresses physiques de **destination** et de **source**, également le type trame de niveau supérieur (ici IP **0x0800**) :
{{ :bloc3s1:wireshark_07.png?500 |}}
A la couche supérieure, c'est la partie IP :
{{ :bloc3s1:wireshark_08.png?500 |}}
On retrouve les **adresses IP source** et **destination du paquet**. De plus, certaines données correspondent à des bits d'un octet particulier (**differentiated services field**). Des données techniques comme la longueur du paquet, le numéro de séquence, le temps à vivre (**TTL** ou Time To Live), l'identité du protocole supérieur (**UDP**) sont nécessaires au fonctionnement de cette couche.
En montant encore d'un niveau on observe la partie **transport**. Ici il s'agit de **UDP** qui est un protocole simple sans gestion des erreurs, son contenu est beaucoup plus simple que **TCP** :
{{ :bloc3s1:wireshark_09.png?500 |}}
Comme à chaque fois, une information concernant le protocole de niveau supérieur (ici **ssdp** pour Simple Service Discovery Protocol) est intégré. Nous retrouvons également la notion de **port source** et de **destination** mais aussi de **checksum** qui permet le contrôle d'erreur.
Et enfin, on aborde la partie **application**. vous remarquerez que **Wireshark** sait mettre en relation les **données structurées** et les **données brutes**. Ainsi, sur n'importe quelle couche du paquet, si vous sélectionnez un élément, celui-ci est mis en évidence dans le dernier volet :
{{ :bloc3s1:wireshark_10.png?500 |}}
Pour information, le paquet présenté ici correspond au **protocole HTTP** et à la demande **GET** de téléchargement de la feuille de style **shadowbox.css** de la page d'accueil du site l'Académie de Limoges.
===== Filtres =====
Lorsque vous capturez des trames sur un réseau, vous pouvez avoir beaucoup de **trame** car tous les ordinateurs du réseau **communiquent en permanence** et les données sont découpées, segmentées, pour être transportées dans des trames Ethernet dont la longueur maximale est de 1500 octets. Il est donc important de pouvoir **filtrer** une capture sur différents critères. Parmi les plus fréquents, nous avons les **adresses source** ou **destination** de niveau 2 ou 3 et le protocole.
Dans copie d'écran ci-dessous, vous voyez qu'il existe une zone **filter** qui permet justement de saisir des requêtes avec une **syntaxe** propre à Wireshark (mais qui s'inspire du langage C).
Par exemple, pour filtrer sur l'adresse MAC source : 08:00:27:ca:9a:e0 (**à adapter à ce que vous avez réellement dans votre capture**)
Dans le champ Filter saisissez : **eth.src==08:00:27:ca:9a:e0** et cliquez sur le bouton **Apply**; Seules 60% des trames capturées sont affichées.
{{ :bloc3s1:wireshark_11.png?500 |}}
Lorsque vous avez commencé à taper **eth.** Vous avez vu que de nombreux autres champs sont disponibles.
Vous pouvez faire de même avec les **adresses IP**, par exemple l'adresses source **192.168.1.47**. Seules 30% des trames capturées sont affichées.
Dans le champ Filter saisissez : **ip.src==192.168.1.47**
{{ :bloc3s1:wireshark_12.png?500 |}}
Pour un filtre basé sur les protocoles, saisissez tout simplement :
* Filter : **http** ou **ssh** ou **dns** ou **smtp**
{{ :bloc3s1:wireshark_13.png?500 |}}
Bien sûr, les filtres peuvent être **cumulés**, par exemple **protocole** et **adresse source** :
* Filter : **http&&ip.src==192.168.1.47** (3% des trames capturées)
{{ :bloc3s1:wireshark_14.png?500 |}}
===== Visualisation de l'envoi et de la réception des courriels avec utilisation du protocole TLS =====
Rédigez un court document contenant des copies d'écran de capture de trame avec Wireshark montrant que les échanges avec les serveurs **IMAP et SMTP sont chiffrés** avec le** protocole TLS**.
Pour cela :
* **recherchez les ports réseaux** TCP utilisés par les **protocoles IMAP et SMTP** ;
* utilisez un **filtre** avec ces valeurs et celle de l'**adresse IP** de votre VM.
====== Retour Accueil Bloc3 ======
* [[bloc3S1:accueil|Bloc3]]