TP2 : Scapy

publicité
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
Téléchargement