Master 1 année

Master 1 ère année
Réseaux Avancés II
Corrections TP n°1
Introduction à Scapy
Traitement de fichier au format « Packet Capture »
2 – Écrivez un programme permettant de recomposer les données fragmentées
1
2
3
#!/usr/bin/python
import sys
from scapy.all import *
13
# configuration
nom_fichier_pcap = "fragment1.pcap"
# programme
saisie = raw_input(’Nom du fichier pcap a traiter [%s]:’%nom_fichier_pcap)
nom_fichier = saisie or nom_fichier_pcap
try:
liste_paquets = rdpcap(nom_fichier)
except Exception, message:
sys.exit(message)
15
liste_paquets.nsummary()
5
6
7
8
9
10
11
12
17
18
19
20
21
22
23
24
25
27
28
29
saisie = raw_input(’Donner le numero du paquet contenant le premier fragment ou vide pour
chercher automatiquement’)
try:
numero_paquet = int(saisie)
paquet_choisi = liste_paquets[numero_paquet]
except ValueError:
liste_tous_fragments = liste_paquets.filter(lambda p : p.haslayer(IP) and p[IP].flags
== 1 and p[IP].frag == 0)
if (not liste_tous_fragments):
sys.exit(’Pas de fragments !’)
paquet_choisi = liste_tous_fragments[0]
paquet_choisi.show()
paquet_identifiant = paquet_choisi[IP].id
liste_fragments = liste_paquets.filter(lambda p: p.haslayer(IP) and p[IP].id==paquet_identifiant)
33
taille_recomposition = 0
for p in liste_fragments:
taille_recomposition += p[IP].len - p[IP].ihl*4
35
recomposition = [’0x00’] * taille_recomposition
37
42
for p in liste_fragments:
taille_fragment = p[IP].len - p[IP].ihl*4
contenu_fragment = str(p[IP].payload)
deplacement = p[IP].frag * 8
for i in range(0, taille_fragment):
recomposition[deplacement+i] = contenu_fragment[i]
44
contenu_recompose = ’’.join(recomposition)
46
if paquet_choisi[IP].proto == 6:
paquet_recompose = TCP(contenu_recompose)
if paquet_choisi[IP].proto == 17:
paquet_recompose = UDP(contenu_recompose)
paquet_recompose.show()
31
32
38
39
40
41
47
48
49
50
3 – Avec le programme que vous avez écrit dans l’exercice précédent, analysez les fragments de cette
capture. Que pouvez vous dire par rapport à l’analyse précédente ?
Il y a un recouvrement de fragment pouvant mener à une attaque. . .
◦
Resp. UE : P-F. Bonnefoi, http://libpfb.so/, « Corrections TP n 1 » version du 1 er avril 2014, rédigé avec ConTEXt – Don’t Panic !
1/2
Contrôle d’erreur
1 – Différence « checksum » et « CRC » :
a. Créez à l’aide des fonctions et objets disponibles dans Scapy deux trames Ethernet contenant :
1. un paquet UDP contenant les données : ’\x00\x00’ ;
2. un paquet UDP contenant les données : ’\xFF\xFF’ ;
b. Comparez les valeurs calculées des checksums présents dans la couche UDP : sont ils identiques ?
Pourquoi ?
Les valeurs sont identiques, car avec le checksum, l’addition de 65535 est équivalent à ajouter 0 !
c. Calculez le CRC-32 de chacune de ces trames : sont-ils différents ? Pourquoi ?
Les valeurs sont différentes car le CRC est capable de détecter une modification de la trame d’une
longueur de 16 bits.
4 – Réalisation d’un serveur de « Port Knocking ».
Vous écrirez le programme Python utilisant Scapy et réalisant :
? la détection de cette séquence de tentative de connexion correspondant à du « port knocking » ;
? l’autorisation à l’aide de NetFilter de la connexion vers l’application (le travail du « PK daemon ») :
◦ la séquence de tentative de connexion TCP est la suivante : [2027, 3230, 2001, 17377] ;
◦ l’application attend en TCP sur le port 16400 ;
◦ le serveur hébergeant l’application et votre programme possède l’@IP 192.168.1.137.
1
#!/usr/bin/python
3
from scapy.all import *
import commands
4
6
7
8
9
10
12
13
14
15
16
17
18
19
20
21
22
23
sequence = [2027, 3230, 2001, 17377]
adresse_serveur = ’192.168.1.137’
adresse_client = ’’
port_application = 16400
rang_sequence = 0
def traiter_paquet(p):
global rang_sequence
if (p.sprintf(’%TCP.flags%’) == ’S’):
if ((rang_sequence == 0) and (p[TCP].dport == sequence[0])):
adresse_client = p[IP].src
if ((p[TCP].dport == sequence[rang_sequence]) and (p[IP].src == adresse_client)):
rang_sequence += 1
print "Knock...",rang_sequence
if (rang_sequence == len(sequence)):
rang_sequence = 0
commands.getoutput(’sudo iptables -A INPUT -s %s -p tcp --dport %d -m state -state NEW, ESTABLISHED -j ACCEPT’%(adresse_client,port_application))
sniff(filter="(dst host %s) and tcp"%adresse_serveur, prn=traiter_paquet)
◦
Resp. UE : P-F. Bonnefoi, http://libpfb.so/, « Corrections TP n 1 » version du 1 er avril 2014, rédigé avec ConTEXt – Don’t Panic !
2/2