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
© Copyright 2025 ExpyDoc