mercredi 10 mars 2010

basics 2 - tutoriel observation des couches 2,3,4

Dans cet article, nous illustrons en pratique les échanges sur les couches 2,3,4 d'un réseau: ethernet, IP, TCP, UDP.




visualisation du trafic avec TCPDUMP

Dans notre labo, sur le client Windows, dans un terminal:
C:\clientXP > ping -n 1 192.168.0.2
(envoi d'une seule requête echo au serveur)



intrus $ sudo tcpdump
Nous observons bien le trafic de paquets IP du client WXP au serveur: echo request.



intrus $ tcpdump icmp and src 192.168.0.10
( écoute des requêtes icmp provenant du client XP)



Le trafic est filtré:
- source = client XP
- protocole ICMP
Intrus $ sudo tcpdump icmp[0]=8
(uniquement les requêtes echo)



analyse de l'en-tête Ethernet

C:\clientxp > arp -d
C:\clientxp > ping -n 1 192.168.0.2



intrus $ sudo tcpdump -x icmp or arp
( affiche les requêtes ICMP ou ARP en format hexadécimal.)



Dans la première requête ARP, nous remarquons que le champ MAC destination est égal à 00:00:00:00:00:00. C'est normal puisque le but de cette requête est de demander l'adresse MAC associée à l'IP 192.168.0.10.

rappel trame Ethernet

En octets
01234567891011121314 … 15131514151515161517
Adresse MAC destinationAdresse MAC sourceType de protocoleDonnéesFCS/CRC

Attention il existe d'autres types de trames Ethernet qui possèdent d'autres particularités. Le champ Type de protocole peut prendre par exemple les valeurs suivantes :
0x0800 : IPv4
0x86DD : IPv6
0x0806 : ARP
C:\clientXP > ipconfig /all


serveur $ ifconfig


analyse de l'en-tête TCP/IP

C:\clientXP > telnet -l utilisteur 192.168.0.2
intrus $ sudo tcpdump -x src 192.168.0.10


le protocole encapuslé est TCP ( = 6)

Les adresses source et destination sont:
c0.a8.00.0a (192.168.0.10)
c0.a8.00.02 (192.168.0.2)

les ports source et destination sont:
413 (1043d)
17 (23d = telnet)
C:\clientXP > telnet -l utilisteur 192.168.0.2
intrus $ sudo tcpdump -x src 192.168.0.10 or src 192.168.0.2


Le flag TCP de la requete du client est 02 (SYN):
0 = 0000
ECN = 00
URG = 0
ACK = 0

2 = 0010:
PSH = 0
RST = 0
SYN = 1
FIN = 0

Le flag TCP de la réponse est 14 (ACK - RST)

1 = 0001
ECN = 00
URG = 0
ACK = 1

4 = 0100:
PSH = 0
RST = 1
SYN = 0
FIN = 0



rappel paquet IP

(référence [5]

En octets

1234
Version d'IPLongueur en-tête (en mots de 32 bits)Type de serviceLongueur totale en octets
Identification (pour les fragments)Flags (pour les fragments)Fragment offset
Durée de vie (TTL Time To Live)ProtocoleSomme de contrôle de l'en-tête
Adresse source
Adresse destination
Option(s) + bourrage

rappel paquet ARP:

(référence: [3])
Le tableau suivant montre les différents champs d'un message ARP classique (protocole TCP/IPv4).

Type matérielleType protocoleTaille adresse matérielleTaille adresse protocole OpérationAdresse matérielle sourceAdresse protocole sourceAdresse matérielle destinataireAdresse protocole destinataire
2 octets2 octets1 octet1 octet2 octets6 octets4 octets6 octets4 octets

Type matérielle : pour ethernet, 0x0001
Type protocole : par exemple IPv4
Taille adresse matérielle : Pour ethernet, c'est 6 (car les adresses ethernet sont définies sur 6 octets)
Taille adresse protocole (logique) :
Pour IPv4, l'adresse logique des machines est sûr 4 octets
Pour IPv6, l'adresse logique des machines est sûr 6 octets
Opération :
requête (0000.....0001)
réponse (0000.....0010)

rappel segment TCP

(référence [4]
En bits
012345678910111213141516171819202122232425262728293031
Port Source 2 octetsPort destination 2 octets
Numéro de séquence
Numéro d'acquittement
Taille de l'en-têteréservéECNURGACKPSHRSTSYNFINFenêtre
Somme de contrôlePointeur de données urgentes
OptionsRemplissage
Données

Signification des champs :
Port source : Numéro du port source
Port destination : Numéro du port destination
Numéro de séquence : Numéro de séquence du premier octet de ce segment
Numéro d'acquittement : Numéro de séquence du prochain octet attendu
Taille de l'en-tête : Longueur de l'en-tête en mots de 32 bits (les options font partie de l'en-tête)
Réservé : Réservé pour un usage futur
ECN : signale la présence de congestion, voir RFC 3168
Drapeaux
URG : Signale la présence de données URGentes
ACK : Signale que le paquet est un accusé de réception (ACKnowledgement)
PSH : Données à envoyer tout de suite (PuSH)
RST : Rupture anormale de la connexion (ReSeT)
SYN : Demande de SYNchronisation ou établissement de connexion
FIN : Demande la FIN de la connexion
Fenêtre : Taille de fenêtre demandée, c'est-à-dire le nombre d'octets que le récepteur souhaite recevoir sans accusé de réception
Checksum : Somme de contrôle calculée sur l'ensemble de l'en-tête TCP et des données, mais aussi sur un pseudo en-tête (extrait de l'en-tête IP)
Pointeur de données urgentes : Position relative des dernières données urgentes
Options : Facultatives
Remplissage : Zéros ajoutés pour aligner les champs suivants du paquet sur 32 bits, si nécessaire
Données : Séquences d'octets transmis par l'application (par exemple: +OK POP3 server ready...)

analyse de l'en-tête UDP

Traceroute utilise le protocole UDP. Nous allons l'utiliser sur l'interface localhost (pour rester furtif vis à vis du serveur)

prérequis: installer traceroute:
intrus $ sudo apt-get install traceroute
1er terminal:
intrus $ tcpdump -x -i lo
2eme terminal:
intrus $ sudo traceroute -i lo localhost


le port source est: 61168 (0xc7e0)
le port destination est: 33434 (0x829a)
L'émetteur a inscrit son numéro de port dans l'en-tête UDP. Cela permet au serveur de connaître le port auquel renvoyer la réponse.

rappel datagramme UDP

(référence [6])
L'en-tête (header en anglais) d'un segment UDP est bien plus simple que celui de TCP :

Port Source (16 bits)Port Destination (16 bits)
Longueur (16 bits)Somme de contrôle (16 bits)
Données (longueur variable)

Il contient les 4 champs suivants :

Port Source
il indique depuis quel port le paquet a été envoyé.

Port de Destination
il indique à quel port le paquet doit être envoyé.

Longueur
il indique la longueur totale du segment UDP (en-tête et données). La longueur minimale est donc de 8 octets (taille de l'en-tête).

Somme de contrôle
celle-ci (de type checksum) permet de s'assurer de l'intégrité du paquet reçu. Elle est calculée sur l'ensemble de l'en-tête UDP et des données, mais aussi sur un pseudo en-tête (extrait de l'en-tête IP)

analyse du protocole FTP

(Référence [7])

Pré-requis: installer le serveur FTP sur le serveur
serveur $ sudo apt-get install proftpd
si vous voulez afficher le fichier de configuration:
serveur $ cat /etc/proftp/proftp.conf | less
la configuration par défaut suffit pour notre travail.



Autre prérequis: installation du client FTP FileZilla sur le client XP
http://filezilla-project.org/download.php?type=client
Autre prérequis: installation de Wireshark sur l'intrus:
intrus $ sudo apt-get install wireshark
lancement de Wireshark (il faut être sudo):
intrus $ sudo wireshark




description d'une trame:

les données FTP sont encapsulées dans un segment TCP, lui même encapsulé dans un paquet IP.



En suivant le flux TCP (follow TCP stream):






Nous remarquons que le mot de passe et le pseudo sont transmis en clair. Il est nécessaire d'utiliser un autre protocole, comme ftps.

références

3) la norme IEE802.3 et les protocoles ARP et ETHERNET - http://yannklein.free.fr/cours/reseau/protocole_ethernet_arp.html
4) Wikipedia – Transmision Control Protocol - http://fr.wikipedia.org/wiki/Transmission_Control_Protocol
5) Wikipedia – Ipv4 - http://fr.wikipedia.org/wiki/IPv4
6) Wikipedia – UDP - http://fr.wikipedia.org/wiki/User_Datagram_Protocol
7) Ubuntu proftpd - http://doc.ubuntu-fr.org/proftpd

Aucun commentaire:

Enregistrer un commentaire