Archive

Archive for the ‘Réseau’ Category

Analyse de traces réseau par l’exemple

6 avril 2011 3 commentaires

Le présent article n’a en rien pour objectif de vous dévoiler tous les mystères des analyses réseau, étant donné que cela aborde une quantité de concepts assez large.

J’ai choisi de procéder par un exemple pour montres les étapes principales nécessaires à une bonne analyse réseau.

Pour cet article, pas de VM, j’ai fait au plus simple, un serveur web (lighttpd), un navigateur web (w3m, mais ce n’est pas important) et un outil de capture/analyse de traces. Pour ce dernier, j’utilise Wireshark, qui convient tout à fait à mon besoin.

Le principe de cet exemple est tout simple. Nous allons analyser ce qu’il se passe niveau réseau quand mon navigateur va accéder au serveur web pour afficher une page.

Tout d’abord une présentation rapide de Wireshark. Il s’agit d’un analyseur de paquets réseau, multi plateformes supportant plusieurs centaines de protocoles (nous verrons cela plus loin). Il possède l’avantage de s’interfacer avec un outil de capture réseau (tshark) et de posséder une interface graphique plutôt intuitive, pour peu que l’on sache ce que l’on veut faire.

L'interface de Wireshark

Pour notre exemple, nous allons donc procéder en premier lieu à une capture réseau. Le principe est tout simple, nous lançons la capture avec Wireshark, et ensuite nous affichons notre page web sur le navigateur, suite à quoi nous pourrons stopper la capture et passer à l’étape suivante, c’est à dire l’analyse de notre capture.

Il est nécessaire que Wireshark soit lancé en tant que « root » pour pouvoir effectuer des captures réseau (pour des raisons de sécurité).

Dans notre exemple, le serveur et le client sont installés sur la machine locale, une capture simple sur l’interface de boucle locale (lo) sera utilisée. Il est cependant possible d’effectuer toutes sortes de captures, sur toutes les interfaces de la machine (y compris les interfaces USB), en appliquant divers filtres. Cependant je n’en parlerais pas dans cet article, par soucis de ne pas tout tenter d’expliquer en même temps.

Donc pour lancer ma capture, je me contente de cliquer sur l’interface « lo » dans la liste des interfaces. Apparaît alors une fenêtre me permettant de suivre en temps réel l’avancée de ma capture.

Aucun paquet capturé pour le moment

Pour le moment n’ayant aucune communication sur cette interface, aucun paquet n’a été capturé. Je peux donc lancer l’affichage de ma page web (page d’accueil par défaut du serveur) dans mon navigateur.

La fameuse page web

Et tout de suite le résultat de la capture est affiché dans Wireshark.

Résultat de la capture

Nous allons pouvoir maintenant passer à la partie qui nous intéresse vraiment, à savoir l’analyse de la capture en elle-même.

Chaque ligne affichée correspond à un paquet, chacun identifié par un numéro. Dans la colonne suivante est affiché le temps écoulé depuis le début de la connexion (information très utile par exemple pour savoir quelle partie intervient dans la lenteur d’une connexion). Ensuite la source et la destination, qui indiquent quelles sont les IP émettrices et réceptrices du paquet, informations utiles dès lors que plus de 2 machines sont utilisées, peu pertinentes pour notre exemple, les 2 étant la même machine. Vient ensuite le protocole utilisé, cela permet dans notre cas d’identifier les différentes parties d’une connexion. Viennent ensuite les informations qui nous en apprennent déjà pas mal sur le paquet en question.

Ces informations nous montrent ainsi ce que sont les trois premiers paquets. Il s’agit du three ways handshake permettant l’établissement de la connexion.

Le premier paquet, [SYN] est une demande de connexion envoyée par le client (le navigateur) au serveur, le second [SYN ACK] est un accusé de réception de cette demande (du serveur au client) et le troisième est un « accusé de cet accusé ». Il s’agit de la méthode utilisée pour établir une connexion avec le protocole TCP, qui est un protocole réseau en mode connecté (il y a un suivi des informations envoyées).

A la suite de ces trois paquets, la connexion est établie entre le serveur et le client, le client va pouvoir alors faire sa requête. Il s’agit du paquet suivant, « GET / HTTP/1.0 », qui signifie tout simplement que l’on demande la page d’accueil par défaut du serveur.

Immédiatement le serveur accuse réception de cette demande ([ACK]), et la traite. Cela résulte alors en l’envoi de la page demandée dans le paquet suivant, « HTTP/1.0 200 OK ». Le serveur informe ensuite que le dernier paquet de réponse a été transmis, dans notre cas un seul paquet aura suffit à transmettre toute l’information, mais dans le cas de gros fichiers plus de paquets sont nécessaires.

Le client accuse alors réception des paquets, et informe le serveur qu’il souhaite mettre un terme à la connexion. Le serveur accuse alors réception de cette demande et la connexion est alors terminée.

Cet exemple résume bien le déroulement d’une communication classique entre un serveur et un navigateur. Nous allons maintenant étudier cela d’un peu plus prêt en nous attaquant à l’analyse proprement dite d’un paquet. Pour cette étape j’ai choisi d’étudier le paquet contenant la page Web, étant le paquet le plus intéressant selon moi car il regroupe le plus de protocoles.

Sans vouloir entrer dans les détails, un paquet du protocole http est encapsulé dans du tcp, lui-même encapsulé dans du protocole IP (pour informations complémentaires, se référer au modèle OSI et notamment son architecture en 7 couche). Pour simplifier, chaque protocole cité précédemment fait partie d’une couche plus ou moins élevée de ce modèle.

Nous allons donc nous servir de Wireshark pour analyser ce paquet. Un double clic sur ce paquet nous permet d’afficher de plus amples informations (informations également données dans le panel inférieur).

Zoom sur un paquet

Dans la partie du haut, 5 lignes, toutes étendables.

La première donne des informations basiques sur le paquet : taille, date d’émission et de réception…

Ensuite sont séparées les informations des différents protocoles mis en jeu, dans l’ordre proposé par le modèle OSI.

Tout d’abord la couche de liaison de donnée, avec le protocole Ethernet. L’information à en tirer est l’adresse MAC des deux protagonistes.

Ensuite vient la couche de réseau avec le protocole IPv4. Attardons nous un peu sur cette ligne. En la dépliant, on peut voir tout un tas d’informations, résumées sur cette image (source Wikipedia).

Elements de l'entête IP

Les éléments les plus importants sont la version du protocole (IPv4 ou IPv6) ainsi que l’adresse IP source et destination. La partie « Protocol » correspond au protocole encapsulé, dans notre cas, TCP. Toutes ces informations sont principalement à destination des routeurs traversés par le paquet.

Vient ensuite le protocole TCP. Il permet entre autres de définir quels sont les ports source et destination d’un paquet.

Enfin vient le protocole HTTP en lui-même, contenant les données envoyées par le serveur, c’est à dire la page web.

Notre page web... ou pas

Parmi les informations concernant le succès de la requête, ainsi que l’identification du serveur (lighttpd 1.4.26), se trouve l’entête du fichier envoyé par le serveur. Nous constatons que la page Web a été envoyée compressée au format bzip2. De ce fait, dans la partie Data nous ne retrouvons pas directement la page Web telle qu’affichée dans notre navigateur.

Pour retrouver cette page, il va falloir faire autrement. Retournons à l’affichage principal de Wireshark. Sélectionnons ensuite le paquet, et naviguons jusqu’à afficher la partie Data (comme dans l’image ce-dessus). Ensuite, un clic droit puis « Export selected Packet Bytes » permettra d’extraire ces données sous forme de fichier. Sachant qu’il s’agit d’un fichier au format bzip2, enregistrons cela dans un fichier a.bzip2 par exemple. Une fois décompressé, voici ce que l’on obtient :

Notre page Web, vraiment

Notre page Web, arborant son plus beau code HTML.

A travers ce petit exemple nous avons donc vu quelques bases de l’analyse réseau, bien évidemment uniquement survolées pour la plupart. Cependant nous avons déja vu comment retrouver des informations dans une trace basique, et quelles étaient les informations à tirer de chaque protocole. La méthode utilisée pour analyser un paquet est généralisable à quasiment tout type de paquet, Wireshark les présentant de manière très claire.

Publicités
Catégories :Réseau, Sécurité, Tutoriel Étiquettes :