« SE4 manipulation de paquets » : différence entre les versions

De wiki-se.plil.fr
Aller à la navigation Aller à la recherche
 
(25 versions intermédiaires par le même utilisateur non affichées)
Ligne 15 : Ligne 15 :
== Détails techniques ==
== Détails techniques ==


Pour vous permettre d’émettre et de recevoir des paquets Ethernet sur le réseau, vous disposez d’un utilitaire nommé <code>ether</code> (le binaire se trouve dans <code>/usr/local/bin</code> et vous avez les sources complètes dans les annexes).
Pour vous permettre d’émettre et de recevoir des paquets Ethernet sur le réseau, vous disposez d’un utilitaire nommé <code>ether</code> (le binaire se trouve dans <code>/usr/local/bin</code> et les sources sont disponibles [[Media:Sources_Ether.zip]]).


L’utilitaire ether est utilisable dans deux modes différents : un mode d’affichage où il affiche les paquets Ethernet reçus par l’interface réseau et un mode pour envoyer un paquet Ethernet. Vous laisserez donc une instance du programme tourner en mode affichage et vous en utiliserez une autre pour envoyer vos propres paquets. En mode affichage vous pouvez demander à l’utilitaire de n’afficher que les paquets à destination d’une certaine adresse Ethernet, vous pouvez même demander à ne pas afficher les paquets de diffusion (broadcast). Tapez <code>ether --help</code> pour obtenir la syntaxe des différentes options.
L’utilitaire ether est utilisable dans deux modes différents : un mode d’affichage où il affiche les paquets Ethernet reçus par l’interface réseau et un mode pour envoyer un paquet Ethernet. Vous laisserez donc une instance du programme tourner en mode affichage et vous en utiliserez une autre pour envoyer vos propres paquets. En mode affichage vous pouvez demander à l’utilitaire de n’afficher que les paquets à destination d’une certaine adresse Ethernet, vous pouvez même demander à ne pas afficher les paquets de diffusion (broadcast). Tapez <code>ether --help</code> pour obtenir la syntaxe des différentes options.
Ligne 34 : Ligne 34 :
   
   
  # ether -u <Adresse Ethernet du groupe associé>
  # ether -u <Adresse Ethernet du groupe associé>
| style="width: 40%;" |
| style="width: 40%;" |
  Fenêtre 2
  Fenêtre 2
Ligne 63 : Ligne 65 :
  <votre machine> # ssh <autre machine n°1>
  <votre machine> # ssh <autre machine n°1>
  <autre machine n°1> ether -u <seconde adresse fictive>
  <autre machine n°1> ether -u <seconde adresse fictive>
| style="width: 30%;" |
| style="width: 30%;" |
  Fenêtre 3
  Fenêtre 3
Ligne 68 : Ligne 71 :
  <votre machine> # ssh <autre machine n°2>
  <votre machine> # ssh <autre machine n°2>
  <autre machine n°2> ether -u <seconde adresse fictive>
  <autre machine n°2> ether -u <seconde adresse fictive>
|}
|}


Ligne 93 : Ligne 97 :
   
   
  # ether -u <Adresse Ethernet fictive>
  # ether -u <Adresse Ethernet fictive>
| style="width: 40%;" |
| style="width: 40%;" |
  Fenêtre 2
  Fenêtre 2
Ligne 120 : Ligne 126 :
   
   
  <votre machine> # ether -u <adresse autre machine n°2>
  <votre machine> # ether -u <adresse autre machine n°2>
| style="width: 30%;" |
| style="width: 30%;" |
  Fenêtre 3
  Fenêtre 3
Ligne 139 : Ligne 147 :
* on met dans le champ de la somme de contrôle non pas le résultat de l’addition mais l’inverse (au sens de la négation booléenne bit à bit).  
* on met dans le champ de la somme de contrôle non pas le résultat de l’addition mais l’inverse (au sens de la négation booléenne bit à bit).  


Ecrivez un petit programme pour calculer une somme de contrôle IP, vous pouvez vous aider du morceau de code C de la RFC 1071.
Ecrivez un petit programme pour calculer une somme de contrôle IP, vous pouvez vous aider du morceau de code C de la RFC 1071 ou du code C ci-dessous.
 
#include <stdio.h>
#include <stdint.h>
int main(void){
uint32_t sum=0;
uint8_t h,l;
while(scanf("%hhx",&h)==1){
  if(scanf("%hhx",&l)!=1) l=0;
  sum += ((uint16_t)h<<8)|l;
  }
while(sum>>16) sum=(sum&0xffff)+(sum>>16);
printf("%04x\n",(uint16_t)~sum);
return 0;
}


=== Somme de contrôle ===
=== Somme de contrôle ===
Ligne 145 : Ligne 167 :
Pour cet exercice vous utiliserez une adresse Ethernet fictive <code>00:11:11:11:11:ZZ</code> et une adresse IPv4 fictive <code>172.26.145.100+ZZ</code> où <code>ZZ</code> est le numéro de votre machine.
Pour cet exercice vous utiliserez une adresse Ethernet fictive <code>00:11:11:11:11:ZZ</code> et une adresse IPv4 fictive <code>172.26.145.100+ZZ</code> où <code>ZZ</code> est le numéro de votre machine.


Forgez un paquet IPv4 encapsulant un paquet vide d’un protocole IPv4 fantaisiste à destination d'un machine du réseau local. Commencez par mettre une somme de contrôle non adaptée. Envoyez le paquet.
Forgez un paquet IPv4 encapsulant un paquet vide d’un protocole IPv4 fantaisiste à destination d'une machine distante du réseau local. Commencez par mettre une somme de contrôle non adaptée. Envoyez le paquet.


Il est recommandé d'utiliser deux fenêtres comme indiqué ci-dessous.
Il est recommandé d'utiliser deux fenêtres comme indiqué ci-dessous.
Ligne 154 : Ligne 176 :
  Fenêtre 1
  Fenêtre 1
   
   
  <votre machine> # ether -u <adresse Ethernet de la machine ciblée>
  <votre machine> # ether -u <adresse Ethernet de la machine distante>
| style="width: 40%;" |
| style="width: 40%;" |
  Fenêtre 2
  Fenêtre 2
Ligne 182 : Ligne 206 :
  Fenêtre 1
  Fenêtre 1
   
   
  <votre machine> # ether -u <adresse Ethernet de la machine ciblée>
  <votre machine> # ether -u <adresse Ethernet fictive>
| style="width: 40%;" |
| style="width: 40%;" |
  Fenêtre 2
  Fenêtre 2
Ligne 193 : Ligne 219 :
Ne laissez pas de connexion <code>ssh</code> sur la machine ciblée sous peine de voir votre première fenêtre inondée de paquets <code>ssh</code>.
Ne laissez pas de connexion <code>ssh</code> sur la machine ciblée sous peine de voir votre première fenêtre inondée de paquets <code>ssh</code>.


== Paquets ICMP ==
== Paquets ICMPv4 ==


=== Indications pratiques ===
=== Indications pratiques ===


La somme de contrôle d’un paquet ICMP tient compte des octets de données (i.e. l’entête du paquet ayant donné lieu à l’emission du paquet ICMP).
La somme de contrôle d’un paquet ICMPv4 tient compte des octets de données (i.e. l’entête du paquet ayant donné lieu à l’emission du paquet ICMP).


=== Paquets ICMP echo ===
=== Paquets ICMP echo ===


Reprenez l’exercice sur ARP manipulant la commande <code>ping</code>. Faites en sorte de répondre au paquet ICMP de demande d’écho (forgez le paquet, envoyez le, vérifiez au niveau de la commande ping que votre réponse est bien comprise).
Pour cet exercice vous utiliserez une adresse Ethernet fictive <code>00:11:11:11:11:ZZ</code> et une adresse IPv4 fictive <code>172.26.145.100+ZZ</code> où <code>ZZ</code> est le numéro de votre machine.
 
Reprenez l’exercice sur la réponse ARP manipulant la commande <code>ping</code>. Faites en sorte de répondre au paquet ICMP de demande d’écho (forgez le paquet, envoyez le, vérifiez au niveau de la commande ping que votre réponse est bien comprise).
 
Utilisez la même disposition de fenêtres que pour la section sur la réponse ARP.


== Paquets ICMPv6 ==
== Paquets ICMPv6 ==
Ligne 208 : Ligne 238 :


Une différence majeure entre IPv4 et IPv6 réside dans la somme de contrôle qui a disparu du niveau IP. Il faut cependant s’assurer que les paquets transmis ne comportent pas d’erreurs, notamment sur les adresses source et destination. La somme de contrôle de ICMPv6 est calculée à partir d’un pseudo-en-tête (visible sur schéma ci-dessous) concaténé avec le paquet ICMP complet. L’algorithme de calcul est le même que pour IPv4.
Une différence majeure entre IPv4 et IPv6 réside dans la somme de contrôle qui a disparu du niveau IP. Il faut cependant s’assurer que les paquets transmis ne comportent pas d’erreurs, notamment sur les adresses source et destination. La somme de contrôle de ICMPv6 est calculée à partir d’un pseudo-en-tête (visible sur schéma ci-dessous) concaténé avec le paquet ICMP complet. L’algorithme de calcul est le même que pour IPv4.
{| class="wikitable" style="text-align: center;"
|-
! style="width: 10em;" | Bits 0-7 !! style="width: 10em;" | Bits 8-15 !! style="width: 10em;" | bits 16-23 !! style="width: 10em;" | bits 24-31
|-
| colspan="4" style="height: 5em;" | Adresse IPv6 source
|-
| colspan="4" style="height: 5em;" | Adresse IPv6 destination
|-
| colspan="4" | Taille des données IPv6 en octets
|-
| colspan="3" | 0x000000 || Code entête
|}


===  Paquets ICMP echo  ===
===  Paquets ICMP echo  ===
Ligne 227 : Ligne 270 :
| colspan="4" | Adresse IPv4 destination
| colspan="4" | Adresse IPv4 destination
|-
|-
| 0x00 || 0x11 (protocole) || colspan="2" | taille paquet UDP en octets
| 0x00 || 0x11 (protocole) || colspan="2" | Taille paquet UDP en octets
|}
|}


Ligne 241 : Ligne 284 :


La somme de contrôle d’un paquet TCP tient compte d’une pseudo-entête IPv4 (voir schéma ci-dessous), de l’entête TCP (avec le champ somme de contrôle initialisé à zéro) et des données TCP.
La somme de contrôle d’un paquet TCP tient compte d’une pseudo-entête IPv4 (voir schéma ci-dessous), de l’entête TCP (avec le champ somme de contrôle initialisé à zéro) et des données TCP.
{| class="wikitable" style="text-align: center;"
|-
! style="width: 10em;" | Bits 0-7 !! style="width: 10em;" | Bits 8-15 !! style="width: 10em;" | bits 16-23 !! style="width: 10em;" | bits 24-31
|-
| colspan="4" | Adresse IPv4 source
|-
| colspan="4" | Adresse IPv4 destination
|-
| 0x00 || 0x06 (protocole) || colspan="2" | Taille paquet TCP en octets
|}


Le champ taille du paquet TCP dans la pseudo entête IP doit être calculée à partir de la taille du paquet IPv4 et de la taille des entêtes IPv4.
Le champ taille du paquet TCP dans la pseudo entête IP doit être calculée à partir de la taille du paquet IPv4 et de la taille des entêtes IPv4.

Version actuelle datée du 23 octobre 2024 à 12:46

Manipulation de paquets

Introduction

Le but de ces travaux dirigés est de forger et de décrypter des paquets de la suite de protocoles réseau TCP/IP.

Déroulement du TD

Chaque exercice doit être abordé suivant les étapes ci-dessous :

  • construction théorique (dans un éditeur de texte) du paquet à émettre ;
  • émission réelle du paquet sur le réseau de la plateforme informatique ;
  • capture du ou des paquet(s) en réponse ;
  • décryptage (avec annotation dans un éditeur de texte) de la réponse.

Détails techniques

Pour vous permettre d’émettre et de recevoir des paquets Ethernet sur le réseau, vous disposez d’un utilitaire nommé ether (le binaire se trouve dans /usr/local/bin et les sources sont disponibles Media:Sources_Ether.zip).

L’utilitaire ether est utilisable dans deux modes différents : un mode d’affichage où il affiche les paquets Ethernet reçus par l’interface réseau et un mode pour envoyer un paquet Ethernet. Vous laisserez donc une instance du programme tourner en mode affichage et vous en utiliserez une autre pour envoyer vos propres paquets. En mode affichage vous pouvez demander à l’utilitaire de n’afficher que les paquets à destination d’une certaine adresse Ethernet, vous pouvez même demander à ne pas afficher les paquets de diffusion (broadcast). Tapez ether --help pour obtenir la syntaxe des différentes options.

Vous devez être administrateur pour utiliser ether.

Envoi de paquets Ethernet

Pour cet exercice vous utiliserez l'adresse Ethernet de l'interface principale de votre machine (interface bridge pour les machines zabeth) et l'adresse Ethernet de la machine d'un groupe associé.

Forgez et envoyez ensuite un paquet Ethernet à destination de la machine de l'autre groupe en utilisant le type Ethernet 0x1111. Assurez vous que votre paquet a bien été reçu.

Il est recommandé d'utiliser deux fenêtres comme indiqué ci-dessous.

Fenêtre 1

# ether -u <Adresse Ethernet du groupe associé>


Fenêtre 2

# ether -s
XX YY ZZ ...
CTRL-D

Vérification du fonctionnement des commutateurs

Pour cet exercice vous utiliserez deux adresses Ethernet fictives 00:11:11:11:11:ZZ et 00:22:22:22:22:ZZZZ est le numéro de votre machine.

Envoyez un paquet Ethernet de type 0x1111 à destination de la seconde adresse Ethernet fictive et en provenance de la première adresse Ethernet fictive.

Il est recommandé d'utiliser au moins trois fenêtres comme indiqué ci-dessous.

Fenêtre 1

<votre machine> # ether -s
XX YY ZZ ...
CTRL-D
Fenêtre 2

<votre machine> # ssh <autre machine n°1>
<autre machine n°1> ether -u <seconde adresse fictive>

Fenêtre 3

<votre machine> # ssh <autre machine n°2>
<autre machine n°2> ether -u <seconde adresse fictive>

Que constatez-vous ?

Sur l'une des machines distantes arrêtez l'utilitaire ether en écoute, répondez au paquet Ethernet reçu en inversant les adresses destination et source, relancez l'écoute avec ether -u <seconde adresse fictive> et, enfin, envoyez à nouveau le paquet original de la première fenêtre.

Que constatez-vous ?

Paquets ARP

Cet exercice est une manipulation du protocole ARP de résolution d’adresses MAC de la suite TCP/IP.

Envoi d’une question ARP

Pour cet exercice vous utiliserez une adresse Ethernet fictive 00:11:11:11:11:ZZ et une adresse IPv4 fictive 172.26.145.100+ZZZZ est le numéro de votre machine.

Forgez un paquet de demande de résolution d’adresse MAC pour une adresse IPv4 utilisée sur le réseau local. Faites en sorte que la réponse puisse être aperçue sur l’interface Ethernet de votre machine. Envoyez le paquet, capturez la réponse et décodez la.

Il est recommandé d'utiliser deux fenêtres comme indiqué ci-dessous.

Fenêtre 1

# ether -u <Adresse Ethernet fictive>


Fenêtre 2

# ether -s
XX YY ZZ ...
CTRL-D

Réponse à un paquet ARP

Pour cet exercice vous utiliserez une adresse Ethernet fictive 00:11:11:11:11:ZZ et une adresse IPv4 fictive 172.26.145.100+ZZZZ est le numéro de votre machine.

Utilisez la commande ping pour tester la présence d’une machine sur le réseau local. Comme adresse IPv4 cible utilisez votre adresse IPv4 fictive. Vérifiez qu’une question ARP est envoyée sur le réseau pour trouver l’adresse MAC correspondant à cette adresse IPv4. Capturez cette demande et forgez le paquet de réponse en utilisant votre adresse Ethernet fictive. Envoyez la réponse sur le réseau. Quel type de paquet est ensuite envoyé à l’adresse MAC que vous avez prétendu correspondre à l’adresse IPv4 ?

Il est recommandé d'utiliser trois fenêtres comme indiqué ci-dessous.

Fenêtre 1

<votre machine> # ssh -J <autre machine n°1> <autre machine n°2>
<autre machine n°2> ping <adresse IPv4 fictive>
Fenêtre 2

<votre machine> # ether -u <adresse autre machine n°2>


Fenêtre 3

<votre machine> # ether -s
XX YY ZZ ...
CTRL-D

Paquets IP

Indications pratiques

Dans les entêtes d’un paquet IPv4 on trouve une somme de contrôle. Le calcul de la somme de contrôle est décrit dans la RFC 1071. En résumé, le calcul se fait comme suit :

  • la somme de contrôle ne concerne que les entêtes du paquet IP (pas les données du protocole encapsulé) ;
  • pour le calcul, on considère que le champ de la somme de contrôle est initialisé à zéro ;
  • on regroupe les octets deux par deux et en cas de nombre impair d’octets on ajoute un octet nul ;
  • le calcul consiste à faire une addition en complément à 1 des mots de 16 bits ainsi formés (vous pouvez procéder comme une addition normale, en complément à 2, avec une étape finale de repliement des retenues par addition) ;
  • on met dans le champ de la somme de contrôle non pas le résultat de l’addition mais l’inverse (au sens de la négation booléenne bit à bit).

Ecrivez un petit programme pour calculer une somme de contrôle IP, vous pouvez vous aider du morceau de code C de la RFC 1071 ou du code C ci-dessous.

#include <stdio.h>
#include <stdint.h>
int main(void){
uint32_t sum=0; 
uint8_t h,l;
while(scanf("%hhx",&h)==1){ 
  if(scanf("%hhx",&l)!=1) l=0;
  sum += ((uint16_t)h<<8)|l;
  }
while(sum>>16) sum=(sum&0xffff)+(sum>>16);
printf("%04x\n",(uint16_t)~sum);
return 0;
}

Somme de contrôle

Pour cet exercice vous utiliserez une adresse Ethernet fictive 00:11:11:11:11:ZZ et une adresse IPv4 fictive 172.26.145.100+ZZZZ est le numéro de votre machine.

Forgez un paquet IPv4 encapsulant un paquet vide d’un protocole IPv4 fantaisiste à destination d'une machine distante du réseau local. Commencez par mettre une somme de contrôle non adaptée. Envoyez le paquet.

Il est recommandé d'utiliser deux fenêtres comme indiqué ci-dessous.

Fenêtre 1

<votre machine> # ether -u <adresse Ethernet de la machine distante>


Fenêtre 2

<votre machine> # ether -s
XX YY ZZ ...
CTRL-D

Ne laissez pas de connexion ssh sur la machine ciblée sous peine de voir votre première fenêtre inondée de paquets ssh.

Voyez-vous passer une réponse ? Pourquoi ?

Modifiez le paquet en insérant une somme de contrôle correcte, envoyez-le. Repérez un paquet en réception en relation avec le paquet envoyé. Forgez la réponse à ce dernier paquet. Envoyez ce paquet réponse, décodez la suite de l’échange.

Durée de vie

Pour cet exercice vous utiliserez une adresse Ethernet fictive 00:11:11:11:11:ZZ et une adresse IPv4 fictive 172.26.145.100+ZZZZ est le numéro de votre machine.

Forgez un paquet IPv4 encapsulant un paquet vide d’un protocole IPv4 fantaisiste. Ce paquet doit être à destination d’une machine en dehors du réseau local. Positionnez le champ TTL à 1. Envoyez le paquet, faites ce qu’il faut pour qu’un paquet ICMP vous parvienne. Que signifie ce paquet ICMP ?

Il est recommandé d'utiliser deux fenêtres comme indiqué ci-dessous.

Fenêtre 1

<votre machine> # ether -u <adresse Ethernet fictive>


Fenêtre 2

<votre machine> # ether -s
XX YY ZZ ...
CTRL-D

Ne laissez pas de connexion ssh sur la machine ciblée sous peine de voir votre première fenêtre inondée de paquets ssh.

Paquets ICMPv4

Indications pratiques

La somme de contrôle d’un paquet ICMPv4 tient compte des octets de données (i.e. l’entête du paquet ayant donné lieu à l’emission du paquet ICMP).

Paquets ICMP echo

Pour cet exercice vous utiliserez une adresse Ethernet fictive 00:11:11:11:11:ZZ et une adresse IPv4 fictive 172.26.145.100+ZZZZ est le numéro de votre machine.

Reprenez l’exercice sur la réponse ARP manipulant la commande ping. Faites en sorte de répondre au paquet ICMP de demande d’écho (forgez le paquet, envoyez le, vérifiez au niveau de la commande ping que votre réponse est bien comprise).

Utilisez la même disposition de fenêtres que pour la section sur la réponse ARP.

Paquets ICMPv6

Indications pratiques

Une différence majeure entre IPv4 et IPv6 réside dans la somme de contrôle qui a disparu du niveau IP. Il faut cependant s’assurer que les paquets transmis ne comportent pas d’erreurs, notamment sur les adresses source et destination. La somme de contrôle de ICMPv6 est calculée à partir d’un pseudo-en-tête (visible sur schéma ci-dessous) concaténé avec le paquet ICMP complet. L’algorithme de calcul est le même que pour IPv4.

Bits 0-7 Bits 8-15 bits 16-23 bits 24-31
Adresse IPv6 source
Adresse IPv6 destination
Taille des données IPv6 en octets
0x000000 Code entête

Paquets ICMP echo

Utilisez l’utilitaire ping6 (équivalent en IPv6 de l’utilitaire ping) pour tester la présence d’une machine sur le réseau étudiant. Prenez une adresse IPv6 2001:660:4401:6004:xxxx:xxxx:xxxx:xxxx, construite à l’aide de l’EUI-64 correspondant à votre adresse MAC virtuelle. Forgez le paquet de réponse à la demande de résolution d’adresse (rappel : le protocole ARP est intégré dans le protocole ICMP en IPv6). Puis envoyez un paquet de réponse d’écho.

Paquets UDP

Indications pratiques

La somme de contrôle d’un paquet UDP tient compte d’une pseudo-entête IPv4 (voir schéma ci-dessous), de l’entête UDP (avec le champ somme de contrôle initialisé à zéro) et des données UDP.

Bits 0-7 Bits 8-15 bits 16-23 bits 24-31
Adresse IPv4 source
Adresse IPv4 destination
0x00 0x11 (protocole) Taille paquet UDP en octets

Si la somme calculée vaut 0x0000 il faut envoyer 0xffff (la valeur zéro représente un paquet UDP sans somme de contrôle).

Emulation de la commande traceroute

Envoyez des paquets UDP vous permettant de connaitre la liste des routeurs sur le chemin entre votre machine de TP et la machine guillotin.prism.uvsq.fr.

Paquets TCP

Indications pratiques

La somme de contrôle d’un paquet TCP tient compte d’une pseudo-entête IPv4 (voir schéma ci-dessous), de l’entête TCP (avec le champ somme de contrôle initialisé à zéro) et des données TCP.

Bits 0-7 Bits 8-15 bits 16-23 bits 24-31
Adresse IPv4 source
Adresse IPv4 destination
0x00 0x06 (protocole) Taille paquet TCP en octets

Le champ taille du paquet TCP dans la pseudo entête IP doit être calculée à partir de la taille du paquet IPv4 et de la taille des entêtes IPv4.

Refus de connexion par RESET

Logez-vous sur une autre machine de TP, utilisez la commande nc pour vous connecter sur un port de la machine que vous émulez. Répondez à la requête ARP générée par nc. Étudiez le paquet TCP de demande de connexion, répondez par un paquet TCP RESET.

Émulation de la phase de connexion

Reprenez la question précédente mais cette fois envoyez un paquet de réponse SYN. Vérifiez par la commande netstat que la connexion TCP est bien établie.