Consignes

Pour ce TP, vous devrez rendre un petit rapport au format texte comportant vos remarques ainsi que les réponses aux questions posées.

Vous pouvez faire un minimum de mise en page, mais les document Word, OpenOffice ou pdf ne sont pas autorisés !

Liens utiles

Objectifs du TP

L'objectif de ce TP est de se familiariser avec les concepts liés au réseau.

Préliminaires

1. Adresses IP, DNS, routes, etc.

Chaque ordinateur sur Internet doit être identifié par une adresse IP. Par exemple, l'adresse IP (version 4) du serveur qui héberge le site www.lama.univ-smb.fr est 193.48.121.226

Vérifiez que vous pouvez utiliser l'adresse IP 193.48.121.226 pour aller sur le site du LAMA avec votre navigateur Internet.

DNS

Pour simplifier la vie des utilisateurs, les sites Internet utilisent une adresse "textuelle" :

Ces adresses sont traduites en adresses IP en utilisant le protocole DNS (Domain Name System). Ceci est fait automatiquement par le navigateur web, mais il est possible de faire une requête DNS directement avec la commande host.

Quelle est l'adresse IP du site www.linuxfr.org ?

Comparez les addresses IP de

Ping : temps d'accès

La commande ping permet de mesurer le délai de transmission entre la machine locale et une machine distante. Cette commande s'utilise simplement comme suit

$ ping -c 10 ADDRESS

et envoie des paquets spéciaux (une dizaine) vers l'adresse donnée, qui renvoie une réponse. La commande affiche le temps de réponse de chaque paquet, et des statistiques finales (temps de réponse minimum, moyen et maximum).

Attention, sans l'option -c 10, la commande continue d'envoyer des paquets jusqu'à ce qu'on la stoppe à la main. Pour ceci, il faut utiliser la combinaison "Control-c".

Mesurez le délai de réponse pour atteindre les sites suivants :

Qu'en pensez vous ?

En particulier, où pensez vous que sont hébergés les serveurs de www.univ-smb.fr et de www.polytech.univ-smb.fr ?

Routes

Les paquets qui voyagent sur Internet sont routés : le chemin qu'ils empruntent est décidé dynamiquement par des routeurs qui essaient de rapprocher les paquets de leur destination finale.

L'utilitaire traceroute permet de visualiser le chemin emprunté par un paquet pour arriver à une destination. Vous devez l'installer avec

$ sudo apt install traceroute

Pour l'utiliser, il faut ensuite faire

$ traceroute ADDRESS

Regardez la route qu'empruntent les paquets pour aller jusqu'aux adresses IP correspondant aux sites suivants :

Précisez, le nombre de routeurs empruntés par les paquets.

  • si le résultat de traceroute ressemble à ça

    1  _gateway ...
    2  * * *
    3  * * *
    4  * * *
    5  * * *
    6  * * *
    7  * * *

    il est probable que votre box / firewall refuse les paquets UDP utilisé par traceroute. Dans ce cas, vous pouvez essayer de lancer `traceroute` avec l'option `--icmp` qui utilise ... des paquets ICMP à la place. Attention, il faudra probablement utiliser `sudo` pour avoir les droits nécessaires.

  • L'utilitaire mtr (qui n'est pas installé par défaut) combine ping et traceroute. Si vous voulez l'utiliser, il suffit de l'installer avec

    $ sudo apt install mtr-tiny

2. Wireshark

Wireshark est un logiciel qui permet de capturer tout ce qui passe par l'interface réseau (carte Ethernet ou carte WiFi) de votre ordinateur et de l'analyser. Cet outils est intéressant pour les administrateurs d'un réseau, mais aussi pour les pirates qui peuvent ainsi écouter le trafic réseau et chercher des informations utiles.

Vous devez installer Wireshark et donner les droits nécessaires à votre utilisateur :

$ sudo apt install wireshark

en choisissant oui à la question Faut-il autoriser les utilisateurs non privilégiés à capturer des paquets ?.

Vous devez ensuite ajouter votre utilisateur au groupe wireshark

sudo adduser UTILISATEUR wireshark

Attention, vous devez vous déconnecter puis vous reconnecter pour activer l'ajout de l'utilisateur au groupe wireshark.

Préliminaire

  1. Vérifiez que vous accèdez bien à la version HTTP de cette page. Si l'url commence par https://..., remplacez la par http://...

    Si cela ne fonctionne pas, je vous conseille de passer en mode "privé" ("incognito" sous Chrome) et de :

    • désactiver les extensions qui pourraient forcer le passage en https:// (HTTPSeverywhere par exemple)

    • vider le cache et l'historique de navigation (quelque part dans le menu "préferrences").

    Attention, si vous accèdez une fois à la version https://, il faudra fermer tous les onglets de la fenêtre privée et en relancer une nouvelle.

  2. Fermez tous les onglets de votre navigateur Internet pour ne gardez que le sujet du TP. Les autres onglets peuvent générer du trafic qui rendra les informations importantes plus difficiles à trouver...

Lancez le logiciel wireshark. (Si vous le lancez depuis le terminal, n'oubliez pas de mettre un & à la fin de la ligne pour récupérer votre shell.)

Vous devriez obtenir quelque chose comme

TP5/wireshark1.jpg

Dans le menu "Vue" / "View",

Vous pouvez maintenant sélectionner l'interface connectée au réseau (probablement eth0, eth1 ou eth2 si vous êtes connecté par un câble ethernet, ou un nom bizarre si vous êtes sur une machine virtuelle, enp1s0 lors de mes tests) et lancer la capture en cliquant sur le petit "triangle" en haut à gauche. Vous obtenez quelque chose comme

TP5/wireshark2.jpg

La fenêtre Wireshark est divisée en 3 :

  1. la liste des paquets capturés, avec quelques informations (un numéro de paquet, la date de capture, la source et destination, etc.)

  2. le contenu "lisible" du paquet, c'est à dire analysé par Wireshark. C'est là qu'on peut lire les métadonnées de chaque paquet, ainsi que ses données (lorsqu'elle sont au format texte).

  3. le contenu "brut" du paquet, affiché en hexadécimal.

Vous pouvez supprimer l'affichage du contenu "brut" en désactivant l'option "Paquet Bytes" du menu "View".

Pour limiter l'affichage aux paquets HTTP concernant votre machine, il faut ajouter un filtre : pour ne garder que les paquets en provenance (ou à destination) de votre adresse qui utilisent le protocole HTTP et qui ne sont pas en UDP, on peut ajouter le filtre ip.addr == ADDRESS and http and not udp dans la boite correspondante ("Filter"). "ADDRESS" doit être remplacé par votre adresse IP.

Vous pouvez obtenir votre adresse IP avec la commande

$ ip address

en regardant le champs inet. (Attention, pas pour l'interface lo...)

Appliquez ce filtre, et relancez la capture (carré rouge pour arrêter la capture en cours, et "triangle" vert pour en relancer une nouvelle).

Une fois que la capture est lancée, rechargez la page web du sujet.

  1. Combien de requêtes HTTP GET sont effectuées pour recharger la page complète du sujet, et à quoi correspondent ces requêtes ?

  2. Quelles sont les réponses de la part du serveur ?

Pendant que la capture précédente fonctionne encore, supprimez le caches des données de votre navigateur (pour Firefox et Chrome, le raccourci clavier est "Control+Shift+Suppr").

Une fois le cache de données vidé, rechargez la page web du sujet.

  1. Combien de requêtes HTTP GET sont effectuées pour recharger la page complète du sujet ?

  2. Quelles sont les réponses de la part du serveur ?

  3. Les paquets correspondant au code HTML contiennent ils des données ?

Cherchez, dans la liste des paquets HTTP, la requête GET pour l'image wireshark2.jpg. Vous pouvez accéder à la réponse du serveur en cliquant sur le lien bleu dans le menu "Hypertext Transfer Protocol" du paquet.

  1. Quelle est la taille des données de l'image ?

  2. Cette image est trop grosse pour être transférée en un seul paquet TCP. Regardez la réponse du serveur affiché par Wireshark, et donnez le nombre de paquets TCP utilisés pour transférer l'image.

  3. Quels sont les ports de destination et de départ des paquets TCP de l'image ? Quelles sont les adresses IP de destination et de départ de l'image ?

Formulaires : méthode POST

Ce petit formulaire est très simple : il permet simplement de choisir une couleur pour le fond de la page.

  1. Regardez le contenu HTML du paquet HTTP dans Wireshark et vérifiez que la couleur choisie est bien envoyée par le formulaire.

  2. Faites un "diagramme" de communication en précisant la taille des paquets échangés.

    Par exemple, le diagramme pourra contenir

                                          taille           description
             .....
       local  ------>    serveur           571              GET (favicon)
       local  <------    serveur          1907              OK (favicon)

Le formulaire ajoute une vérification de mot de passe... (Vous pouvez utiliser n'importe quel login, et le mot de passe doit simplement commencer par la même lettre que le login...)

Refaites la question précédente avec ce nouveau formulaire.

Qu'en pensez vous ?

Authentification

La page suivante est protégée par un mot de passe.

Relancez la capture de paquets et connectez vous avec l'utilisateur baleine et le mot de passe poum.

Inspectez les paquets capturés par Wireshark et vérifiez que le mot de passe est envoyé en clair avec la requête GET.

Qu'en pensez vous ?

3. Cryptographie : TLS / SSL

  1. Vérifiez que vous accèdez bien à la version HTTPS de cette page. Si l'url commence par http://..., remplacez la par https://...

Le protocol HTTPS ajoute une couche de cryptographie (TLS) au dessus de HTTP. Pour inspecter les paquets correspondants, il faut remplacer le filtre par ip.addr == ADDRESS and ssl.

  1. Relancez la capture de paquets, avec le filtre ssl et rechargez le formulaire simple. Faites un diagramme de communication en précisant la taille des paquets échangés.

  2. En comparant les tailles des paquets échangés, ainsi que la direction des communications, essayez d'ajouter une description des échanges de paquets SSL de type "application". (Les autres paquets correspondent à des messages permettant de mettre en place la communication...)

4. Serveurs web

Requêtes GET "à la main"

Lorsque vous naviguez sur le web, votre navigateur (qui s'exécute sur votre machine) envoie des requêtes à un serveur web. Les deux requêtes principales sont

Ces deux requêtes prennent en argument un chemin vers une ressource : le document demandé dans le cas d'un GET, ou la ressource qui doit gérer les données envoyées dans le cas d'un POST.

Le serveur web est un processus qui est associé à un port de la machine sur laquelle il s'exécute. Chaque port est associé à un service. Habituellement, les serveurs web utilisent le port 80.

La commande netcat permet de faire des connections TCP/IP "à la main". Il suffit de spécifier une adresse et un port :

$ netcat ADDRESS PORT

et :

Autrement dit, on peut écrire des requêtes sur l'entrée standard, et recevoir les réponses sur la sortie standard.

Connectez vous sur le port 80 de l'adresse www.perdu.com avec netcat et envoyez la requête GET pour récupérer le document /index.html.

Une requête GET tient sur 2 lignes:

  GET <document> HTTP/1.1
  Host: <adresse>

Notes :

La réponse du serveur contient 2 parties :

Quelle est le code de la réponse du serveur ?

Vérifiez que vous obtenez bien le bon contenu en visitant directement le site http://www.perdu.com/index.html.

Attention,

  • il faut taper la requête suffisamment vite. Pour cela, le plus simple est de mettre la commande dans un fichier et utiliser une redirection CMD < FICHIER...

  • il faut que les fins de lignes de votre fichier "requête" utilisent la convention "Windows" : avec nano, il faut appuyer sur les touches "Alt" et "D" en même temps lors du choix du nom de fichier au moment de sauvegarder. (nano affiche que le fichier sera sauvegardé au [Format DOS].) Ce choix sera conservé lorsque vous ouvrirez à nouveau le fichier...

    La différence entre les conventions "DOS" et "Unix" est que Unix utilise le seul caractère ASCII "LF" ("line feed", octet 0x0A) alors que DOS utilise les 2 caractères ASCII "CR" et "LF" ("carriage return" et "line feed", octets 0x0F et 0x0A). Vous pouvez consulter https://en.wikipedia.org/wiki/Newline#Issues_with_different_newline_formats pour plus de détails...

Connectez vous sur le port 80 de l'adresse www.perdu.com avec netcat et envoyez la requête pour récupérer le document /index.php.

Quelle est le code de la réponse du serveur ?