TP2 : Scapy Rushed Kanawati 13 mars 2017 Ce TP est à réaliser en binôme. Chaque binôme dispose de trois machines Linux. Un seul rapport est à rendre à la fin de la séance 2 P -T Résumé L’objectif de ce TP est de se familiariser avec l’outil scapy : un outil de forge de paquets réseaux fréquemment utilisé pour l’audit de sécurité des réseaux. Les outils à utiliser sont : scapy, python et wireshark Scapy 0 1 2 4 M Description générale scapy est une bibliothèque de manipulation de paquets réseaux écrit en python. Il permet notamment de : — Forger des PDU de principaux protocoles : ethernet, IP, ICMP, ARP, UDP, TCP, . . . ; etc. L’extension pour représenter d’autres PDU est aussi possible. L’outil donne accès à tous les champs de données et de contrôle d’un PDU permettant ainsi de générer des PDU correctes ou erronés. — Capturer et analyser du trafic réseau. — Ecrire des scripts permettant de générer, capturer et analyser des grandes quantités de PDU. Ceci est souvent utils pour mettre en place des attaques réseaux sophistiquées. Ces scripts peuvent servir lors d’études d’audit de la sécurité d’un système. Mini guide d’utilisation — Commencer par installer la bibliothèque scapy sur chacune des machines sudo apt-get install scapy — Dans un interpréteur python (exécuté en mode root) importer le paquetage scapy.all sudo python Python 2.7.6 (v2.7.6 :3a1db0d2747e, Nov 10 2013, 00 :42 :54) Type ”help”, ”copyright”, ”credits” or ”license” for more information. >>> from scapy.all import * 1 — La génération d’un PDU passe par l’invocation d’un constructeur du protocole demandé. Par exemple : ip =IP() génère un paquet IP avec la configuration par défaut. — La comande ls() liste l’ensemble des protocoles supportés par scapy — La commande ls(PDU()) montre les champs disponibles d’un PDU (par exemple ls(IP()) donne les champs d’un paquets IP. — L’accès à un champ d’un PDU passe par la notation objet usuelle ou lors de la construction. Exemple : i p=IP ( ) i p . t t l =70 i p = IP ( t t l =70) — La méthode show permet d’afficher la configuration actuelle d’un PDU. 2 P -T i p=IP ( ) i p . t t l =70 i p . show ( ) ###[ IP ]### version = 4 ihl = None tos = 0 x0 len = None id = 1 flags = frag = 0 ttl = 70 proto = ip chksum = None src = 127.0.0.1 dst = 127.0.0.1 \ options \ 0 1 2 4 M — L’encapsulation se fait par l’opérateur /. Exemple : IP()/ICMP() — send(pkts, inter=0, loop=0, verbose=None) permet d’envoyer un paquet au niveau 3, inter est le temps entre deux paquets, loop permet d’envoyer les paquets en boucle si 6= 0. — sendp est l’équivalent de send mais au niveau 2. — sr, stp, sr1, srp1 sont des primitives d’envoi et de réception de réponses au niveau 3 et 2. Les primitives avec 1 donnent seulement le premier paquet reçu comme réponse. — srloop : pour envoyer et recevoir en boucle. — sniff permet de capturer des paquets en trafic. 2 Scapy : Prise en main 1 Relever la configuration par défaut des PDU générés par scapy pour les protocoles suivants : ARP, IP, ICMP, TCP. 2 Donner une instruction qui permet d’envoyer le paquet ICMP généré par défaut. 3 Donner un script p ython/scapy qui permet d’envoyer un paquet ICMP ECHO-request à partir de P C1 à P C3 mais en usurpant l’adresse de P C2 . Relever et justifier le trafic induit par l’envoi de ce paquet. 4 Donner un script python/scapy qui implement un simple opération de ping. Le script accepte un seul argument : l’adresse destination. Il consiste à envoyer un seul paquet ICMP echo request. Si la machine destination réponds avec un paquet ICMP echo-reply le script affiche le message destination up sinon il affiche destination unreachable. 5 Modifier le script précédent de sort à utiliser l’opération timestamp request pour réaliser le ping (type 13, réponse type 14) 2 P -T 6 Développer et tester un script python/scapy qui permet de tracer la route vers une machine destination (indication : augmenter le TTL d’un paquet ICMP echo request progressivement) Attaques DoS 1 Développer et tester un script python/scapy qui permet de réaliser l’attaque ping de la mort 0 1 2 4 M 2 Développer et tester un script python/scapy qui permet de réaliser une attaque de type land 3 Développer et tester un script python/scapy qui permet de réaliser une attaque de type Teardrops Autres attaques 1 Réaliser et tester un script d’attaque par saturation en envoyant un rafale de segments SYN. 2 Réaliser et tester une attaque de type arp spoofing sur P C3 pour permettre à P C2 d’intercepter le trafic de P C3 vers P C1 . Attaque de balayage Nous nous intéressons ici à développer des scripts python/scapy qui implantent les commandes nmap suivantes : 1 nmap -sS destination 2 nmap -sX destination 3 Python : rappel python est un langage de script largement utilisé des des tâches d’administration systèmes et pour le prototype rapide d’application. Python est un langage à typage dynamique avec une syntaxe très simple. Types de données — i = 3 est un entier — i=3.0 est un réel (float). — i="33" est une chaine de caractères. — t=(5,6) est un tuple non modifiable — l=[1, 3, 5, [6], (6,7) ] est une liste d’éléments (hétérogènes) — d={ "one":1, "two":2} est un dictionnaire. 2 P -T Structures de contrôle i f cond : instruction1 instruction2 e l i f cond : instruction1 instruction2 else : instruction1 instruction2 0 1 2 4 M while cold : instruction1 instruction2 f o r i in range ( 1 0 ) : instruction1 instruction2 d e f f o n c ( param ) : c o r p s de l a f o n c t i o n Quelques modules utils import s y s import random p r i n t s y s . argv [ 0 ] # a f f i c h e r l e nom du s c r i p t p r i n t s y s . argv [ 1 ] # a f f i c g e r l e premierargument 4 r=random . r a n d i n t ( 1 , 1 0 0 ) # g é n é r e r un nombre e n t i e r a l é a t o i r e e n t r e 1 e t 100 2 P -T 0 1 2 4 M 5