• Aucun résultat trouvé

Scapy: outil de manipulation avancée des paquets réseaux Nesrine Ammar – ProgRes 2018 nesrine.ammar@etu.upmc.fr

N/A
N/A
Protected

Academic year: 2022

Partager "Scapy: outil de manipulation avancée des paquets réseaux Nesrine Ammar – ProgRes 2018 nesrine.ammar@etu.upmc.fr"

Copied!
29
0
0

Texte intégral

(1)

Scapy: outil de manipulation avancée des paquets réseaux

Nesrine Ammar – ProgRes 2018 nesrine.ammar@etu.upmc.fr

(2)

Objectives de manipulation des paquets réseaux

Packet forging tool

Forge des paquets et envoient les dans le réseaux Sniffing tool

Capture des paquets réseaux Testing tool

Essaye de répondre à une question précise (oui/non) ex. ping

(3)

Objectives de manipulation des paquets réseaux

Scanning tool

Faire des tests utilisant différents paramètres Fingerprinting tool

Faire des tests prédéfinis afin de discriminer un pair Attacking tool

Utilise des valeurs inattendus d’un protocole

(4)

Bibliothèque d’analyse de trafic

Pcap

• Interface de programmation (API) permettant de capturer le trafic réseau

• Implémenté sous Unix et Mac OS par la bibliothèque Libpcap et sous windows par la bibliothèque Winpcap

Libpcap et winpcap:

• Assure le filtrage, la capture et l’analyse de paquets,

• Supporte plusieurs protocoles: IP(), UDP(), DNS(), DHCP(), HTTP()…

(5)

Libpcap

Programme utilisant Libpcap:

Tcpdump

Wireshark

Nmap

Bibliothèque d’enveloppe pour Libpcap(wrapper librairies):

Python: pylibpcap, scapy

Java: jpcap, jNetPcap

Ruby: PacketFu

(6)

Python

• This is an int (signed, 32bits) : 42

• This is a long (signed, infinite): 42L

• This is a str : "bell\x07\n" or ’bell\x07\n’ (" ⇐⇒ ’)

• This is a tuple : (1,4,"42")

• This is a list : [4,2,"1"]

• This is a dict : { "one":1 , "two":2 }

(7)

Python

If cond1:

instr instr Elif cond2:

instr Elseinstr

Try:

instr

Except exception:

instr Else

instr

For var in set:

instr

Def func(x):

if x==0:

return 1 else

return x*2 While cond:

instr instr

(8)

Scapy

Un outil de manipulation avancée des paquets réseaux, écrit en python

Objectives:

Intercepter le trafic sur un segment réseau Générer des paquets

Réaliser une prise d’empreinte (fingerprinting) Faire une traceroute

Analyser le trafic réseau

(9)

Scapy

Points forts :

Langage interactif de haut niveau

Forge et analyse de paquets très simples Passe le firewall local

Points faibles :

Fournit les résultats bruts, ne les interprète pas

Support partiel de certains protocoles complexes

(10)

Scapy

Liste de couches

>>> ls() ARP : ARP

DHCP : DHCP options DNS : DNS Dot11 : 802.11

[...]

Liste de commandes

>>> lsc()

sr : Send and receive packets at layer 3

sr1 : Send packets at layer 3 and return only the fi srp : Send and receive packets at layer 2

[...]

Valeurs par défaut pour le packet IP

>>> ls(IP)

version : BitField = (4) ihl : BitField = (None) tos : XByteField = (0) len : ShortField = (None) id : ShortField = (1) flags : FlagsField = (0) frag : BitField = (0) ttl : ByteField = (64)

proto : ByteEnumField = (0) chksum : XShortField = (None) src : Emph = (None)

dst : Emph = (’127.0.0.1’) options : IPoptionsField = (’’)

(11)

Scapy

• Chaque paquet est crée couche par couche

• Chaque couche peut être empiler sur une autre

• Chaque couche et chaque paquet peuvent être manipulés indépendamment

• Chaque champ dans l’entête des protocoles possède une valeur par défaut

• Chaque champ peut contenir une valeur ou plusieurs à la fois

>>> a=IP(dst="www.target.com", id=0x42)

>>> a.ttl=12

>>> b=TCP(dport=[22,23,25,80,443])

>>> c=a/b

(12)

Scapy: valeurs par défaut

• IP source est choisie selon l’adresse destination et la table de routage

• La valeur de checksum est calculée

• MAC source est choisie selon l’interface de sortie

• Le type du paquet Ethernet et le protocole IP est choisie selon les couches supérieures

• …

D’autres champs les plus utilisés:

• Port TCP source est 20, TCP destination est 80

• Port UDP source et destination est 53

• Le type de ICMP est echo request

• …

(13)

Création d’une trame

>>> ma_trame = Ether()

>>> ma_trame.show()

###[ Ethernet ]###

WARNING: Mac address to reach destination not found. Using broadcast.

dst= ff:ff:ff:ff:ff:ff

src= 00:00:00:00:00:00 type= 0x0

>>>

>>> ma_trame = Ether(dst='00:19:4b:10:38:79')

>>>

(14)

Sniffer

>>> rep = sniff(filter="host 192.168.1.10")

>>>

$ ping 192.168.1.10 -c 1

>>> rep.show()

0000 Ether / IP / ICMP 192.168.1.14 > 192.168.1.10 echo-request 0 / Raw 0001 Ether / IP / ICMP 192.168.1.10 > 192.168.1.14 echo-reply 0 / Raw

>>>

(15)

Ecrire et lire un fichier pcap

>>> wrpcap(‘file_name.pcap’, packet)

>>>

>>>packet

<Ether dst=00:19:4b:10:38:79 src=00:26:5e:17:00:6e type=0x800 |<IP version=4Lihl=5Ltos=0x0len=64 id=37095 flags=DFfrag=0Lttl=64proto=udpchksum=0x2666src=192.168.1.14dst=192.168.1.1

options=[] |<UDP sport=38897dport=domainlen=44chksum=0x65a|<DNS id=28184 qr=0L

opcode=QUERYaa=0Ltc=0Lrd=1Lra=0Lz=0Lrcode=okqdcount=1ancount=0nscount=0arcount=0 qd=<DNSQR qname='www.siteduzero.com.' qtype=A qclass=IN|> an=None ns=None ar=None |>>>>

>>> packet = rdpcap(‘file_name.pcap’)

>>> packet[Ether].dst àadresse mac dst Packet[IP].dst àadresse ip dst

(16)

Navigation entre les couches réseaux

àPermet de vérifier la présence de la couche UDP àPermet de retourner la couche demandée (UDP) àLe code est indépendant des couches inférieures

If UDP in pkt:

print pkt[UDP].chksum If pkt.haslayer(UDP):

print pkt[UDP].chksum

(17)

Calculer le nombre de paquets UDP

#! /usr/bin/python Fromscapy.allimport* Def compter(filename):

nb_paquets = 0

file = rdpcap(filename) for pkt in file:

if pkt.haslayer(UDP):

nb_paquets+=1 print nb_paquets

compter(‘captures.pcap’)

(18)

Pour une vue développée du paquet

#! /usr/bin/python Fromscapy.allimport* defafficher_tcp(filename):

file = rdpcap(filename) forpktin file:

if pkt.haslayer(TCP):

pkt.show() break:

afficher_tcp(‘captures.pcap’)

(19)

Pour une vue développée du paquet

(20)

Pour une vue développée du paquet

Flag = SYN

Adresse destination Adresse

source Version IP

Port source

Port destination

(21)

Afficher sport du premier paquet TCP

#! /usr/bin/python Fromscapy.allimport*

File = rdpcap(‘captures.pcap’) for pkt in file:

try:

if pkt.haslayer(TCP):

print pkt[TCP].sport break:

(22)

Scapy: commandes

(23)

Sprintf()

Grâce à la methode sprintf():

• Créer notre propre résumé du paquet

• Extraire les différentes couches et focaliser sur les champs nécessaires

• “%”, “{” and “}” sont des caractères spéciaux

• Ils sont remplacés par “%%”, “%(” and “%)”

>>> pkt = IP(dst="192.168.8.1",ttl=12)/UDP(dport=123)

>>> pkt.sprintf("The source is %IP.src%")

’The source is 192.168.8.14’

(24)

pdfdump()

>>> pkt.pdfdump()

(25)

Summary()

>>> file = rdpcap("test.pcap")

>>> pkt = file[0]

>>> pkt.summary()

Ether / IP / TCP 42.2.5.3:3021 > 192.168.8.14:22 PA / Raw

>>> bytes(pkt[IP])

b'E\x00\x00\x14\x00\x01\x00\x00@\x00|\xe7\x7f\x00\x00\x01\x7f\x00\x00\x01'

Bytes()

(26)

Hexdump()

La fonction hexdump() donne une représentation hexadécimale du paquet (ainsi qu'une représentation ASCII) et s'utilise ainsi :

>>> hexdump(packet)

0000 00 19 4B 10 38 79 00 26 5E 17 00 6E 08 00 45 00 ..K.8y.&^..n..E.

0010 00 40 90 E7 40 00 40 11 26 66 C0 A8 01 0E C0 A8 .@..@.@.&f...

0020 01 01 97 F1 00 35 00 2C 06 5A 6E 18 01 00 00 01 ...5.,.Zn...

0030 00 00 00 00 00 00 03 77 77 77 0A 73 69 74 65 64 ...www.sited 0040 75 7A 65 72 6F 03 63 6F 6D 00 00 01 00 01 uzero.com...

(27)

Python: CSV

import csv

with open('example.csv', newline='') as File:

reader = csv.reader(File) for row in reader:

print(row)

(28)

Python: CSV

import csv

myData = [["first_name", "second_name", "Grade"], ['Alex', 'Brian', 'A'],

['Tom', 'Smith', 'B']]

myFile = open('example2.csv', 'w') with myFile:

writer = csv.writer(myFile) writer.writerows(myData) print("Writing complete")

(29)

Python: CSV

Références

Documents relatifs

- pour le n°1, réagir vite pour ne pas se faire attraper lorsqu’une souris vient se reposer, - prendre des informations efficaces sur la position du chat/de la

La courbe 4.20(a) montre le temps de service moyen pour un paquet 2CP-ARQ lors du transport des images compress ´ees au taux C 3 pour une connexion DSL 1Mbits/s en fonction de

Pour éviter un échec de la vérification d’authentification IPsec, le prétraitement spécifique du relais de trame d’un message de sollicitation de découverte de voisin qui

Le présent document spécifie le format de trame pour la transmission de paquets IPv6 et la méthode de formation des adresses IPv6 de liaison locale et des adresses autoconfigurées

Grâce à l’analyse des états transitoires, le modèle proposé dans ce travail permet de prendre en compte plus de paramètres (paramétres dépendants du temps et de la po- sition

Je les répartis en 100 sous-ensembles disjoints, en sorte de minimiser le nombre total de triangles que je peux former avec trois points du même sous-ensemble (ces triangles

Les routeurs les plus simples que l’on puisse rencontrer permettent de relier ensemble deux réseaux (il possède alors 2 interfaces réseau), mais il existe des

1- Créer une fonction permettant de lire un fichier « pcap » 2- Calculer le nombre de paquets UDP dans la capture. 3- Identifier le protocole utilisé au-dessus de UDP en se