568537 Manipulez Les Paquets Reseau Avec Scapy

  • Upload
    arsene

  • View
    283

  • Download
    10

Embed Size (px)

Citation preview

  • 8/12/2019 568537 Manipulez Les Paquets Reseau Avec Scapy

    1/23

    Manipulez les paquets

    rseau avec ScapyPar FireZro

    www.openclassrooms.com

    Licence Creative Commons 6 2.0Dernire mise jour le 14/11/2011

    http://www.openclassrooms.com/http://www.openclassrooms.com/
  • 8/12/2019 568537 Manipulez Les Paquets Reseau Avec Scapy

    2/23

    Sommaire

    2Sommaire ...........................................................................................................................................1Lire aussi ............................................................................................................................................3Manipulez les paquets rseau avec Scapy ........................................................................................

    3Installation et utilisation .....................................................................................................................................................3Installation ...................................................................................................................................................................................................................4Utilisation .....................................................................................................................................................................................................................

    5Manipulation de paquets ...................................................................................................................................................5Forgeons ! ...................................................................................................................................................................................................................7Encapsulons ! ..............................................................................................................................................................................................................

    12Exercice : scan d'une plage d'adresse ......................................................................................................................................................................

    13Les listes de paquets ......................................................................................................................................................13Liste simple ...............................................................................................................................................................................................................14Rang ..........................................................................................................................................................................................................................

    15La fonction sniff() .............................................................................................................................................................15Prsentation ..............................................................................................................................................................................................................16Utilisation ...................................................................................................................................................................................................................

    19Import et export des rsultats ..........................................................................................................................................19Dans des fichiers .pcap .............................................................................................................................................................................................20hexdump et pdfdump ................................................................................................................................................................................................

    22Q.C.M. .............................................................................................................................................................................23Partager .....................................................................................................................................................................................................................

    2/24

    www.openclassrooms.com

    http://fr.openclassrooms.com/http://-/?-
  • 8/12/2019 568537 Manipulez Les Paquets Reseau Avec Scapy

    3/23

    Manipulez les paquets rseau avec Scapy

    Par FireZro

    Mise jour : 14/11/2011Difficult : Intermdiaire Dure d'tude : 1 jour

    Scapy est un module pour Python permettant de forger, envoyer, rceptionner et manipuler des paquets rseau.Si le rseau vous intresse et que vous aimeriez mieux comprendre le fonctionnement des outils traditionnels (wireshark, dig,

    ping, traceroute, nmap...), alors ce tutoriel est fait pour vous !

    La comprhens ion de ce tutoriel ncess ite quelques prrequis :

    Des connaissances en Python (grosso modo les parties 1 et 2 du tutoriel officiel)Des connaiss ances de base en rseau (je vous conseille la lecture du tutorielde elalitte)

    A l'issue de ce tutoriel, vous devriez tre en mesure de programmer par vous mme des utilitaires simples, et surtout decomprendreleur fonctionnement.

    Allez, l'assaut !

    Sommaire du tutoriel :

    Installation et utilisationManipulation de paquetsLes listes de paquetsLa fonction sniff()Import et export des rsultatsQ.C.M.

    Installation et utilisation

    Profitant de la portabilit du langage Python, Scapy est multi-plateforme. Cela dit, je ne dtaillerai ici son installation et sonutilisation que sous Linux, ne possdant que cet OS lors de l'criture de ce tutoriel. La procdure d'installation est dcrite icipourMac OS X et icipour Windows. Par facilit, vous pouvez galement prfrer installer GNU/Linux en machine virtuelle.

    Installation

    Depuis les dpts de votre distribution

    Pour les presss, l'installation minimale se fait avec la commande suivante :

    Code : Console

    $ sudo apt-get install python-scapy

    Scapy ne fonctionne qu'avec la branche 2.x de Python (>= 2.5), la dernire version de cette branche tant Python 2.7. De plus,vous pouvez tendre les poss ibilits de Scapy (rapports pdf, traceroute 3D...) grce d'autres paquets .Pour une distribution bas e de Debian, l'installation complte s e fait donc par cette ligne de commande :

    Code : Console

    Sommaire 3/24

    www.openclassrooms.com

    http://www.secdev.org/projects/scapy/doc/installation.html#windowshttp://www.v3.siteduzero.com/tutoriel-3-568537-manipulez-les-paquets-reseau-avec-scapy.html?pdf=1#ss_part_3http://www.v3.siteduzero.com/tutoriel-3-568537-manipulez-les-paquets-reseau-avec-scapy.html?pdf=1#ss_part_2http://www.v3.siteduzero.com/tutoriel-3-568537-manipulez-les-paquets-reseau-avec-scapy.html?pdf=1#ss_part_2http://www.v3.siteduzero.com/tutoriel-21-568537-manipulez-les-paquets-reseau-avec-scapy.htmlhttp://fr.openclassrooms.com/http://www.siteduzero.com/tutoriel-3-36484-virtualisez-un-systeme-d-exploitation-avec-virtualbox.htmlhttp://www.secdev.org/projects/scapy/doc/installation.html#windowshttp://www.secdev.org/projects/scapy/doc/installation.html#mac-os-xhttp://www.v3.siteduzero.com/tutoriel-3-568537-manipulez-les-paquets-reseau-avec-scapy.html?pdf=1#qcmhttp://www.v3.siteduzero.com/tutoriel-3-568537-manipulez-les-paquets-reseau-avec-scapy.html?pdf=1#ss_part_5http://www.v3.siteduzero.com/tutoriel-3-568537-manipulez-les-paquets-reseau-avec-scapy.html?pdf=1#ss_part_4http://www.v3.siteduzero.com/tutoriel-3-568537-manipulez-les-paquets-reseau-avec-scapy.html?pdf=1#ss_part_3http://www.v3.siteduzero.com/tutoriel-3-568537-manipulez-les-paquets-reseau-avec-scapy.html?pdf=1#ss_part_2http://www.v3.siteduzero.com/tutoriel-3-568537-manipulez-les-paquets-reseau-avec-scapy.html?pdf=1#ss_part_1http://www.siteduzero.com/tutoriel-3-346829-comprendre-les-reseaux-tcp-ip-et-ie-fonctionnement-d-internet.htmlhttp://www.siteduzero.com/tutoriel-3-223267-apprendre-python.htmlhttp://www.v3.siteduzero.com/tutoriel-21-568537-manipulez-les-paquets-reseau-avec-scapy.htmlhttp://www.v3.siteduzero.com/membres-294-108877.html
  • 8/12/2019 568537 Manipulez Les Paquets Reseau Avec Scapy

    4/23

    $ sudo apt-get install python2.7 tcpdump graphviz imagemagick python-gnuplot python-crypto python-pyx nmap python-scapy

    Depuis Mercurial

    Si vous s ouhaitez disposer de la toute dernire version de Scapy, vous pouvez l'installer depuis les sources en les rcuprantdepuis le dpt mercurial.Si ce n'est pas dj fait, installez mercurial :

    Code : Console

    $ sudo apt-get install mercurial

    Rcuprez les sources et installez Scapy :

    Code : Console

    $ hg clone http://hg.secdev.org/scapy$ cd scapy$ sudo python setup.py install

    Scapy est maintenant install, c'est bien beau, mais passons s on ut ilisation.

    Utilisation

    Depuis l'interprteur

    Rien de plus simple, lancez la commande suivante :

    Code : Console

    $ sudo scapy

    Scapy manipule des paquets rseaux, ce qui ncess ite d'tre en root pour une majorit de tches

    Si tout se passe bien, vous vous retrouvez devant l'interprteur python :

    Code : Console

    WARNING: No route found for IPv6 destination :: (no default route?)Welcome to Scapy (2.1.0)>>>

    Dans un script Python (.py)

    Manipulez les paquets rseau avec Scapy 4/24

    www.openclassrooms.com

    http://fr.openclassrooms.com/
  • 8/12/2019 568537 Manipulez Les Paquets Reseau Avec Scapy

    5/23

  • 8/12/2019 568537 Manipulez Les Paquets Reseau Avec Scapy

    6/23

    WARNING: Mac address to reach destination notfound.Usingbroadcast. dst=ff:ff:ff:ff:ff:ff src=00:00:00:00:00:00 type=0x0>>>

    Comme on le voit, la cration d'une trame thernet se fait en instanciant la classe Ether(). Bien qu'on ne lui ai fournit aucunparamtre, on constate a l'appel de la mthode s how() que les attributs dst, srcet typeont des valeurs par dfaut.

    Que reprsentent ces diffrents attributs ?

    Pour ceux qui ne connaitraient pas le protocole thernet, voici la st ructure qu'une t rame thernet doit prsenter :

    Nous venons de crer une trame thernet "pure", c'est dire qu'on a rien dans data. Le CRC permet le contrle d'intgrit denotre trame : si on le modifiait, notre trame deviendrait invalide et inutile. Il ne nous reste donc que 3 champs modifiables :

    dst: reprsente l'adress e mac du destinatairesrc: reprsente l'adresse mac de l'metteurtype: reprsente le type de protocole (dpend du contenu de la partie "data" pour l'instant vide)

    Pour les modifier, c'est trs simple :

    Code : Python

    >>>ma_trame.dst ='00:19:4b:10:38:79'>>>ma_trame.show()###[ Ethernet ]### dst=00:19:4b:10:38:79 src=00:00:00:00:00:00 type=0x0>>>

    On aurait pu prciser l'adress e mac du des tinataire lors de la cration de la trame :

    Code : Python

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

    Les attributs dst, srcet typesont modifiables votre guise. Cela veut donc dire que vous pouvez facilement envoyer destrames en faisant croire que l'metteur es t quelqu'un d'autre !

    Les envoyer ? Non, je ne s ais pas faire ...

    Envoi de la trame

    Manipulez les paquets rseau avec Scapy 6/24

    www.openclassrooms.com

    http://fr.openclassrooms.com/
  • 8/12/2019 568537 Manipulez Les Paquets Reseau Avec Scapy

    7/23

    Pour envoyer une trame thernet, il existe la fonction sendp() :

    Code : Python

    >>>sendp(ma_trame).Sent 1packets.

    >>>

    Dans le jargon Scapy, un point "." reprsente un envoi.

    Voil, mon paquet a bien t envoy la machine dont j'avais prcis l'adress e mac.

    Gnial ! .. C'est tout ?

    Je vous vois bien du. Ce que nous venons de faire ne prsentait gure d'intrt, je vous l'accorde. En effet, une trame

    thernet pure ne sert pratiquement rien ; pour pouvoir faire quelque chose d 'intress ant, il faudrait donc mettre quelque chos edans le "data" vu plus haut...

    Nous allons donc faire de l'encapsulation.

    Encapsulons !

    Citation : Wikipdia

    L'encapsulation, en informatique et spcifiquement pour les rseaux informatiques, es t un procd consistant inclure lesdonnes d'un protocole dans un autre protocole.

    Encapsuler les protocoles : l'exemple du ping

    La commande ping permet de savoir si un hte, dsign par son adresse IP, existe. En version cambouis, la commande pingcons iste envoyer un paquet ICMP "echo-reques t" l'hte et dire si un paquet ICMP "echo-reply" a t renvoy.Forgeons donc un paquet ICMP echo-request !

    Code : Python

    >>>mon_ping =ICMP()>>>mon_ping.show()

    ###[ ICMP ]### type=echo-request code=0 chksum=None id=0x0 seq=0x0>>>

    On voit que par dfaut, l'instanciation de la classe ICMP() met le type du ping echo-request. On pourrait tout fait le modifier,tout comme les autres champs. Pour savoir ce qu'ils reprsentent, je vous renvoie l'article ICMP sur Wikipdia. Dans cet article,on peut notamment lire quelque chose d 'intress ant : un paquet ICMP est encapsul dans un datagramme IP. En effet, c'es t

    dans le datagramme IP qu'on va pouvoir renseigner l'adresse IP du des tinataire.

    L'encapsulation entre protocoles, dans Scapy, est ralise par l'oprateur / (slash). Rien voir avec une division, donc .

    Code : Python

    Manipulez les paquets rseau avec Scapy 7/24

    www.openclassrooms.com

    http://fr.openclassrooms.com/http://fr.wikipedia.org/wiki/ICMP%23Format_d.27un_paquet_ICMP
  • 8/12/2019 568537 Manipulez Les Paquets Reseau Avec Scapy

    8/23

    >>>mon_ping =Ether() /IP(dst='192.168.1.1') /ICMP()>>>mon_ping.show()###[ Ethernet ]### dst=00:19:4b:10:38:79 src=00:26:5e:17:00:6e type=0x800###[ IP ]### version=4 ihl=None tos=0x0 len=None id=1 flags=

    frag=0 ttl=64 proto=icmp chksum=None src=192.168.1.14 dst=192.168.1.1 \options\###[ ICMP ]###

    type=echo-request code=0 chksum=None id=0x0 seq=0x0>>>

    On cons tate que, en prcisant s implement l'adresse IP du destinataire, Scapy a compris tout s eul qu'il devait modifierles attributs dst, srcet typede Ether() ainsi que l'adresse IP de l'metteur (srcdans IP()) ! C'est trs pratique, maisvidemment nous aurions pu forcer Scapy mettre les valeurs que l'on voulait.

    Voyons maintenant si 192.168.1.1 (ma Livebox) va rpondre cela par un paquet ICMP echo-reply.

    Envoi du paquet

    L'envoi s'effectue comme auparavant :Code : Python

    >>>sendp(mon_ping).Sent 1packets.

    >>>

    H, on a toujours rien ! Tu nous aurais menti ?

    Oui et non !Oui, car la fonction sendp()ne fait qu'envoyer, c'est vrai. Pour envoyer et recevoir, il faut utiliser les fonctions srp()etsrp1().

    Non, car dans le cas d'une trame thernet pure, srp() et srp1() n'auraient de toute faon rien reu !

    srp()renvoie deux objets : le premier contient les paquets mis et leurs rponses as socies, l'autre contient les paquets sansrponse.

    Code : Python

    >>>rep,non_rep =srp(mon_ping)

    Manipulez les paquets rseau avec Scapy 8/24

    www.openclassrooms.com

    http://fr.openclassrooms.com/
  • 8/12/2019 568537 Manipulez Les Paquets Reseau Avec Scapy

    9/23

    Begin emission:Finished to send 1packets.*Received 1packets, got 1answers, remaining 0packets>>>rep>>>non_rep

    >>>

    Dans le jargon scapy, une toile reprsente une rponse.

    On voit qu'on a eu une rponse, zro checs , et que notre rponse es t un paquet ICMP ! Examinons-le :

    Code : Python

    >>>rep.show()0000Ether /IP /ICMP 192.168.1.14>192.168.1.1echo-request 0==>Ether /IP /ICMP 192.168.1.1>192.168.1.14echo-reply 0>>>

    Bingo, on a bien reu un ICMP echo-reply !

    rep contient en ralit une liste de couples de paquets . En l'occurence, la liste ne contient qu'un seul couple de paquets, qu'onpeut afficher ainsi comme on afficherai n'importe quel lment d'une liste en Python :

    Code : Python

    >>>rep[0](, )>>>

    Le rsultat est un couple (tuple deux valeurs). Pour afficher le paquet mis (notre ICMP echo-reques t), on fera donc

    rep[0][0].show(), et pour le paquet reu en rponse, rep[0][1].show():Secret (cliquez pour afficher)

    Code : Python

    >>>rep[0][0].show()###[ Ethernet ]### dst=00:19:4b:10:38:79 src=00:26:5e:17:00:6e type=0x800###[ IP ]### version=4 ihl=None tos=0x0 len=None id=1 flags=

    frag=0 ttl=64

    Manipulez les paquets rseau avec Scapy 9/24

    www.openclassrooms.com

    http://fr.openclassrooms.com/http://www.v3.siteduzero.com/tutoriel-3-568537-manipulez-les-paquets-reseau-avec-scapy.html?pdf=1#
  • 8/12/2019 568537 Manipulez Les Paquets Reseau Avec Scapy

    10/23

    proto=icmp chksum=None src=192.168.1.14 dst=192.168.1.1 \options\###[ ICMP ]### type=echo-request code=0

    chksum=None id=0x0 seq=0x0>>>rep[0][1].show()###[ Ethernet ]### dst=00:26:5e:17:00:6e src=00:19:4b:10:38:79 type=0x800###[ IP ]### version=4L ihl=5L tos=0x0 len=28 id=58681

    flags=frag=0L

    ttl=64 proto=icmp chksum=0x1248 src=192.168.1.1 dst=192.168.1.14 \options\###[ ICMP ]### type=echo-reply code=0 chksum=0xffff id=0x0 seq=0x0>>>

    Pour simplifier tout cela, on peut prfrer ici la fonction srp1(). Cette fonction renvoie renvoie un s eul objet : la premirerponse.

    Code : Python

    >>>rep =srp1(mon_ping)Begin emission:

    Finished to send 1packets.*Received 1packets, got 1answers, remaining 0packets>>>rep.show()###[ Ethernet ]### dst=00:26:5e:17:00:6e src=00:19:4b:10:38:79 type=0x800###[ IP ]### version=4L ihl=5L tos=0x0 len=28 id=3386

    flags=frag=0L

    ttl=64 proto=icmp chksum=0xea47 src=192.168.1.1 dst=192.168.1.14

    Manipulez les paquets rseau avec Scapy 10/24

    www.openclassrooms.com

    http://fr.openclassrooms.com/
  • 8/12/2019 568537 Manipulez Les Paquets Reseau Avec Scapy

    11/23

    \options\###[ ICMP ]### type=echo-reply code=0 chksum=0xffff id=0x0 seq=0x0>>>

    Enfin, souvent galement, on ne s 'intress era pas la partie thernet qui est de toute faon trs bien remplie de faonautomatique par Scapy. Il existe donc des fonctions send(), sr()et sr1()quivalentes sendp(), srp()et srp1()mis part le fait qu'elles se chargent toutes seules d'ajouter l'en-tte thernet.Un exemple :

    Code : Python

    >>>rep =sr1(IP(dst='192.168.1.1') /ICMP())Begin emission:

    Finished to send 1packets.*Received 1packets, got 1answers, remaining 0packets>>>rep.show()###[ IP ]### version=4L ihl=5L tos=0x0 len=28 id=3389 flags=

    frag=0L ttl=64 proto=icmp

    chksum=0xea44 src=192.168.1.1 dst=192.168.1.14 \options\###[ ICMP ]### type=echo-reply code=0 chksum=0xffff id=0x0 seq=0x0>>>

    Quand on procde ainsi, on voit que mme dans la rpons e, l'en-tte thernet n 'apparat plus .

    Ess ayons la mme chose sur un hte non existant :

    Code : Python

    >>>rep =sr1(IP(dst='192.168.1.2') /ICMP())Begin emission:.WARNING: Mac address to reach destination notfound.Using

    broadcast.Finished to send 1packets...................... CReceived 22packets, got 0answers, remaining 1packets>>>

    Manipulez les paquets rseau avec Scapy 11/24

    www.openclassrooms.com

    http://fr.openclassrooms.com/
  • 8/12/2019 568537 Manipulez Les Paquets Reseau Avec Scapy

    12/23

    J'ai arrt manuellement (Ctrl-C) l'envoi au bout de 30 secondes. A l'issue de ce temps, la variable rep est vide : rien n'a trenvoy, comme le laiss ait deviner le "got 0 answers".On peut rajouter une limite de temps (en secondes ) sr1()pour ne pas rester bloqu, grce au paramtre timeout.

    Code : Python

    >>>rep =sr1(IP(dst='192.168.1.2') /ICMP(), timeout=0.5)Begin emission:WARNING: Mac address to reach destination notfound.Usingbroadcast.Finished to send 1packets.

    Received 0packets, got 0answers, remaining 1packets>>>

    Pour voir les autres paramtres que peut prendre sr1(), faites help(sr1)

    Je vous encourage faire de mme pour sr()et send()

    Exercice : scan d'une plage d'adresse

    A la lumire des explications ci-dessus et avec quelques connaissances en Python, vous devriez maintenant tre capable decoder un programme qui effectue un p ing sur toute une plage d'adresses .

    Indice : pour dsigner une plage d'adresse, vous pouvez simplement mettre '192.168.1.1-15' dans l'attribut dstde IP.

    Secret (cliquez pour afficher)

    Code : Python

    #! /usr/bin/pythonfromscapy.allimport*

    rang ='192.168.1.1-15'rep,non_rep =sr( IP(dst=rang) /ICMP() , timeout=0.5)forelem inrep : # elem reprsente un couple (paquet mis,

    paquet reu)ifelem[1].type ==0: # 0 echo-reply

    printelem[1].src +' a renvoye un echo-reply '

    Pour savoir que le champ type d'ICMP valait 0 dans le cas de l'echo-reply, vous pouviez vous rens eigner sur la pageWikipdia vue plus tt, ou faire ls(mon_ping)avec mon_ping de type echo-reply.ls(un_paquet)affiche en effet les attributs du paquet de manire numrique, et affiche galement leur nom, leur type et leurvaleur par dfaut (entre parenthses) :

    Code : Python

    >>>ls(IP(dst='192.168.1.1') /ICMP(type='echo-reply'))version : BitField =4 (4)

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

    Manipulez les paquets rseau avec Scapy 12/24

    www.openclassrooms.com

    http://fr.openclassrooms.com/http://www.v3.siteduzero.com/tutoriel-3-568537-manipulez-les-paquets-reseau-avec-scapy.html?pdf=1#
  • 8/12/2019 568537 Manipulez Les Paquets Reseau Avec Scapy

    13/23

    proto : ByteEnumField =1 (0)chksum : XShortField =None (None)src : Emph ='192.168.1.14' (None)dst : Emph ='192.168.1.1' ('127.0.0.1')options : PacketListField =[] ([])--type : ByteEnumField =0 (8)code : MultiEnumField =0 (0)

    chksum : XShortField =None (None)id : ConditionalField =0 (0)seq : ConditionalField =0 (0)ts_ori : ConditionalField =62019678 (62019678)ts_rx : ConditionalField =62019678 (62019678)ts_tx : ConditionalField =62019678 (62019678)gw : ConditionalField ='0.0.0.0' ('0.0.0.0')ptr : ConditionalField =0 (0)reserved : ConditionalField =0 (0)addr_mask : ConditionalField ='0.0.0.0' ('0.0.0.0')unused : ConditionalField =0 (0)>>>

    Les listes de paquets

    Scapy permet, pour chaque attribut d'un paquet, de prciser une liste au lieu d'une valeur simple. On l'a vu juste avant, dans lecas de l'adresse IP du dest inataire, mais cela est valable pour tous les attributs !

    Liste simple

    Prenons un cas concret : nous voulons s avoir si un serveur web est accessible en http et en https. Nous pourrions tenter unscan des ports correspondant par dfaut : 80 et 443. Plutt que d'envoyer/recevoir deux fois en changeant simplement le port,nous allons utiliser une liste simple sur le port de des tination en mettant :

    Code : Python

    dport=[80,443]

    Je vais utiliser ici un scan SYN : pour ceux qui ne connaitraient pas, le principe est simple : j'envoie un paquet TCP sur

    le port dsir de la cible avec le flag SYN. Si son port accepte les connexions, il me renverra un paquet TCP avec lesflags SYN et ACK.

    Code : Python

    >>>ls(TCP)sport : ShortEnumField =(20)dport : ShortEnumField =(80)seq : IntField =(0)ack : IntField =(0)dataofs : BitField =(None)reserved : BitField =(0)flags : FlagsField =(2)window : ShortField =(8192)chksum : XShortField =(None)urgptr : ShortField =(0)options : TCPOptionsField =({})>>>mon_paquet =IP(dst='192.168.1.10') /TCP(sport=12345,

    Manipulez les paquets rseau avec Scapy 13/24

    www.openclassrooms.com

    http://fr.openclassrooms.com/
  • 8/12/2019 568537 Manipulez Les Paquets Reseau Avec Scapy

    14/23

    dport=[80,443], flags='S')>>>rep,non_rep =sr(mon_paquet)Begin emission:Finished to send 2packets.**Received 2packets, got 2answers, remaining 0packets>>>rep.show()0000IP /TCP 192.168.1.14:12345>192.168.1.10:www S ==>IP /TCP

    192.168.1.10:www >192.168.1.14:12345SA /Padding0001IP /TCP 192.168.1.14:12345>192.168.1.10:https S ==>IP /TCP192.168.1.10:https >192.168.1.14:12345RA /Padding>>>

    Lors de la cration de mon_paquet, je prcise le port source, le port de destination et je positionne le flag SYN. J'envoie cepaquet (qui en ralit reprsente deux paquets), comme d'habitude, avec sr().Le rsultat est compos des deux couples paquet mis / paquet reu.

    Le premier paquet reu correspond celui envoy sur le port 80. Les flags pos itionns sont bien SYN et ACK (SA) : le

    port es t ouvert.Le second paquet reu correspond celui envoy s ur le port 443. Les flags ne s ont pas SYN et ACK mais RESET et ACK: le port es t ferm.

    Les rpons es des htes aux paquets TCP peuvent parfois diffrer trs lgrement en fonction du systmed'exploitation. Par exemple, dans ce cas ci, je reois des paquets avec bourrage (padding), tandis qu'en envoyant lesmme paquets sur ma Livebox, il n'y en a pas . Ces diffrences de comportement peuvent tre trs pratique pour savoir quel systme d'exploitation on a faire : on parle alors d'OS fingerprinting.

    Rang

    Et s i la place de dport=[80,443], j'avais crit dport=(80,443)? (des parenthses au lieu des crochets)Eh bien il n'y aurait pas eu 2 paquets d'envoys , mais 364 : un pour chaque port de 80 443.

    Code : Python

    >>>mon_paquet =IP(dst='192.168.1.10') /TCP(sport=12345, dport=(80,443), flags>>>rep,non_rep =sr(mon_paquet)Begin emission:.*******************************************************************************to send 364packets.

    *Received 365packets, got 364answers, remaining 0packets>>>

    Et s i on dsire afficher ceux ouverts :

    Code : Python

    >>>foremis,recu inrep :

    ... ifrecu[1].flags==18: # 18 SYN+ACK

    ... print'port ouvert : ', recu[1].sport

    ...port ouvert : 80port ouvert : 111>>>

    Manipulez les paquets rseau avec Scapy 14/24

    www.openclassrooms.com

    http://fr.openclassrooms.com/
  • 8/12/2019 568537 Manipulez Les Paquets Reseau Avec Scapy

    15/23

    Exercice : programmer un traceroute

    La commande traceroute permet de savoir par o pas sent vos paquets avant d'atteindre leur destination. Pour cela, on se sert del'attribut ttl(time to live) de l'en-tte IP. Cet attribut diminue de 1 chaque routeur travers, et lorsqu'il atteint 0, il "meurt" et

    nous revient. On peut alors exploiter l'attribut srcde son en-tte IP pour connatre l'adresse IP du routeur o il est "mort".Pour connatre tous les routeurs traverss, il suffit donc de mettre, dans l'attribut ttl, un rang.

    Si vous ne comprenez pas tout, un bout de code vaut mieux qu'un grand discours :

    Secret (cliquez pour afficher)

    Code : Python

    >>>rep,non_rep=sr( IP(dst='209.85.143.100', ttl=(1,25)) /TCP(),timeout=1)Begin emission:********Finished to send 25packets.

    ***..Received 13packets, got 11answers, remaining 14packets>>>foremis,recu inrep:... printemis.ttl, recu.src...1192.168.1.1290.45.115.1310.125.164.104193.253.93.105581.253.130.146193.252.100.427193.251.254.18872.14.232.2119209.85.251.19010209.85.253.12511209.85.143.100>>>

    Prcisions: L'adresse IP de destination, '209.85.143.100', est celle d'un des nombreux datacenter de Google. J'encapsule dansmon paquet IP du TCP mais je pourrais y mettre de l'ICMP, de l'UDP, ou mme rien, mais les firewall des routeurs sur le cheminrisqueraient de ne pas laisser passer certains protocoles.Je fais varier le ttlde 1 25, mais on voit qu'en pratique le datacenter est atteint au bout de 11 sauts seulement.Au pass age, on peut voir que mes paquets traversent ma Livebox (routeur n1) et diffrents routeurs d 'Orange et de Google.

    La fonction sniff()

    Nous savons maintenant envoyer et recevoir des paquets, mais pour progresser dans notre comprhens ion des outils rseau, ilnous faudrait lire et dcortiquer leurs changes de paquets. Par exemple : comment procde rellement la commande ping ?Comment procde nmap pour scanner un port ? Comment procde firefox pour rcuprer http://www.siteduzero.com/index.html?

    C'est l qu'intervient la fonction sniff()de Scapy.

    Prsentation

    Voil une s implification de la signature de cette fonction :

    Code : Python

    sniff(filter="", count=0, prn=None, lfilter=None, timeout=None,

    Manipulez les paquets rseau avec Scapy 15/24

    www.openclassrooms.com

    http://fr.openclassrooms.com/http://www.siteduzero.com/index.htmlhttp://www.v3.siteduzero.com/tutoriel-3-568537-manipulez-les-paquets-reseau-avec-scapy.html?pdf=1#
  • 8/12/2019 568537 Manipulez Les Paquets Reseau Avec Scapy

    16/23

    iface=All)

    Elle renvoie une liste de paquets (en comparaison, sr() renvoie deux listes de paquets ).Ses paramtres sont :

    count: nombre de paquets capturer. 0 : pas de limite.timeout: stoppe le sniff aprs un temps donn.iface: dsigne l'interface sur laquelle sniffer. La liste de vos interfaces est donne par la commande ifconfig.filter: filtre les paquets garder d'aprs une chane de caractre.Exemple : filter="port 80"filtre les paquets ayant un lien avec le port 80.lfilter: mme chose, mais utilise une fonction plutt qu 'une chane.Exemple : lfilter=lambdax: x[1].src=='192.168.1.14'filtre les paquets mis par 192.168.1.14.prn:fonction appliquer chaque paquet. Si la fonction retourne quelque chose, cela s'affiche.Exemple : prn =lambdax: x.show()va afficher le dtail de chaque paquet.

    filter u tilise un filtre BPF. Le filtre "(port 80 or port 443) and dst host 192.168.1.14" va slectionner les paquets envoys

    (dst) moi-mme (host 192.168.1.14) et qui ont un rapport avec les ports http ou https (port 80 or port 443).

    Maintenant que les prsentations sont faites, passons l'tape suivante : explorons le rseau !

    Utilisation

    Que fait ping ?

    Je lance mon sniff en filtrant sur la cible du ping, 192.168.1.10 :

    Code : Python

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

    J'excute mon ping :

    Code : Console

    $ ping 192.168.1.10 -c 1

    Je vais voir les paquets sniffs :

    Code : Python

    >>>rep.show()0000Ether /IP /ICMP 192.168.1.14>192.168.1.10echo-request 0/Raw0001Ether /IP /ICMP 192.168.1.10>192.168.1.14echo-reply 0/Raw>>>

    C'est peu prs ce que nous avions tout l'heure !

    Manipulez les paquets rseau avec Scapy 16/24

    www.openclassrooms.com

    http://fr.openclassrooms.com/http://fr.wikipedia.org/wiki/BSD_Packet_Filter
  • 8/12/2019 568537 Manipulez Les Paquets Reseau Avec Scapy

    17/23

    part le RAW... Que contient-il ?

    RAW dsigne le payload, les donnes encapsules dans les multiples en-ttes de notre paquet. Lorsque l'on tlchargeun gros fichier, par exemple, celui ci est dcoups en petits paquets , et pour le reconstituer la fin, on doit rass emblertous les RAW.

    Code : Python

    >>>rep[0].show()###[ Ethernet ]### .... blabla ....###[ Raw ]### load='B\xdd\xa5N\x14\xf7\x02\x00\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x1!"#$%&\'()*+,-./01234567'>>>

    . Visiblement, rien de trs pertinent ! Plus srieusement, cette suite trange de caractre peut permettre au destinataire de

    savoir qu'il a t la cible d'un ping effectu par la commande ping de Linux.

    Que fait nmap ?

    Tentons un scan SYN du port 80 de 192.168.1.10 avec nmap :

    Code : Console

    $ sudo nmap -sS -p 80 192.168.1.10

    Les paquets sniffs sont alors :

    Code : Python

    >>>rep.show()0000Ether /ARP who has 192.168.1.10says 192.168.1.140001Ether /ARP isat 00:16:17:e3:ed:88says 192.168.1.10/Padding

    0002Ether /IP /TCP 192.168.1.14:50662>192.168.1.10:www S0003Ether /IP /TCP 192.168.1.10:www >192.168.1.14:50662SA /Padding0004Ether /IP /TCP 192.168.1.14:50662>192.168.1.10:www R>>>

    Pour rappel, dans notre version du scan SYN, nous n'avions que les paquets avec les flags S et SA d'changs . Mais en ralit,des paquets ARP taient galement changs : ceux cis servent dterminer l'adresse mac de la cible. Eh oui, on s 'conomisedepuis longtemps l'encaps ulation dans Ether(), mais Scapy le fait pour nous , et il a besoin de certaines informations.

    Quand au paquet RESET (R), nous ne nous en rendions pas compte, mais il tait galement envoy !

    En effet, le noyau Linux voyait arriver un paquet SYN + ACK sans deviner que Scapy l'avait demand. Le noyau envoyait doncun paquet RESET pour fermer cette connection qu'il pensait inexistante. On peut empcher cet envoi de RESET par la commande$ sudo iptables -A OUTPUT -p tcp --tcp-flags RST RST -j DROP .

    Finalement donc, nmap a fait comme nous !

    Que fait firefox ?

    Manipulez les paquets rseau avec Scapy 17/24

    www.openclassrooms.com

    http://fr.openclassrooms.com/
  • 8/12/2019 568537 Manipulez Les Paquets Reseau Avec Scapy

    18/23

  • 8/12/2019 568537 Manipulez Les Paquets Reseau Avec Scapy

    19/23

    ihl=5L tos=0x0 len=458 id=46027 flags=DF frag=0L ttl=64 proto=tcp

    chksum=0xe3ad src=192.168.1.14 dst=88.191.135.63 \options\###[ TCP ]### sport=36578 dport=www seq=1719662898 ack=4036772261L dataofs=8L reserved=0L flags=PA window=229 chksum=0xb742

    urgptr=0 options=[('NOP', None), ('NOP', None), ('Timestamp', (10767110,506925378))]###[ Raw ]### load='GET /anciensite/double.html HTTP/1.1\r\nHost:lalitte.com\r\nUser-Agent: Mozilla/5.0 (X11; Linux i686; rv:7.0.1)Gecko/20100101 Firefox/7.0.1\r\nAccept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\nAccepLanguage: fr-fr,en-us;q=0.7,en;q=0.3\r\nAccept-Encoding: gzip,deflate\r\nAccept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7\r\nConnection:keep-alive\r\nPragma: no-cache\r\nCache-Control: no-cache\r\n\r\n'>>>

    Les paquets 7 18 reprsentent la rception de la page web par paquets. firefox envoie un accus de rception (ACK)pour chaque paquet de donne reu.

    Et les paquets 19 31, ils sont l pour quoi ?

    Je vous laiss e trouver.

    Rponse :Secret (cliquez pour afficher)

    firefox recommence toute la manip' prcdente avec le site www.free-easy-counters.com, qui est un compteur de visiteurspour sites web. En effet, la page que j'ai charge contient un compteur de visite

    Je n'ai fait que survoler les rsultats de ce sniff ! vous d 'approfondir et de comprendre comment forger vos propresrequtes DNS, ou comment les attributs ack et seq des en-ttes IP voluent au fil des paquets quand ceux-cis s ontfragments, par exemple...

    Import et export des rsultats

    Dans des fichiers .pcap

    Le plus s imple pour sauvegarder et charger des paquets es t de passer par des fichiers .pcap. Ces fichiers peuvent galement trelus ou crits par d'autres programmes (tcpdump, wireshark, etc.).

    Manipulez les paquets rseau avec Scapy 19/24

    www.openclassrooms.com

    http://fr.openclassrooms.com/http://www.v3.siteduzero.com/tutoriel-3-568537-manipulez-les-paquets-reseau-avec-scapy.html?pdf=1#
  • 8/12/2019 568537 Manipulez Les Paquets Reseau Avec Scapy

    20/23

    Sauvegarder

    Pour sauvegarder p (qui peut tre un unique paquet tout comme une liste de paquets ) dans le fichier p.pcap, il faut utiliser lafonction wrpcap()(write pcap) :

    Code : Python

    >>>wrpcap('p.pcap', p)

    Charger

    Inversement, ici, il faut u tiliser la fonction rdpcap()(readpcap) :

    Code : Python

    >>>p =rdpcap('p.pcap')

    hexdump et pdfdump

    p est le paquet suivant :

    Code : Python

    >>>p

    Vous aurez peut tre reconnu une requte DNS demandant l'adresse IP du Site du Zro.

    hexdump

    La fonction hexdump()donne une reprsentation hexadcimale du paquet (ainsi qu'une reprsentation ASCII) et s'utilise ainsi:

    Code : Python

    >>>hexdump(p)

    0000 00194B 1038790026 5E 17006E 08004500..K.8y.&^..n..E.0010 004090E7 40004011 2666C0 A8 010E C0 A8.@..@.@.&f......0020 010197F1 0035002C 065A 6E 1801000001.....5.,.Zn.....0030 0000000000000377 77770A 7369746564

    Manipulez les paquets rseau avec Scapy 20/24

    www.openclassrooms.com

    http://fr.openclassrooms.com/
  • 8/12/2019 568537 Manipulez Les Paquets Reseau Avec Scapy

    21/23

    .......www.sited0040 757A 65726F 03636F 6D 0000010001uzero.com.....>>>

    Nous voyons l quoi ressemble concrtement un paquet rseau, aux yeux de l'ordinateur !

    pdfdump

    Encore plus fort, il est possible d'avoir la fois la reprsentation aux yeux de l'ordinateur et aux yeux d'uun humain dans un mmefichier .pdf ! Pour cela, il vous faudra le paquet python-pyx install.

    Code : Python

    >>>p.pdfdump('p.pdf')

    Voici le rs ultat :

    Manipulez les paquets rseau avec Scapy 21/24

    www.openclassrooms.com

    http://fr.openclassrooms.com/
  • 8/12/2019 568537 Manipulez Les Paquets Reseau Avec Scapy

    22/23

    Comme vous le voyez, les paquets un peu longs et un peu trop embriqus son got sont simplifis, et toute l'information n'est

    pas affiche. Cela dit, c'est dj assez brouillon comme cela !

    Q.C.M.

    Le premier QCM de ce cours vous est offert en libre accs.Pour accder aux suivants

    Connectez-vousInscrivez-vousQuelle est la diffrence entre les fonctions send()et sendp()?

    Aucune

    send() permet d'envoyer ET de recevoir

    send() se charge de l'ajout de l'en-tte thernetsendp() n'envoie que les trames thernet pures

    Quel code ne fonctionnera paspour recevoir et afficher un paquet ICMP echo-reply de la part de 192.168.1.1 ?

    rep = sr1(IP(dst='192.168.1.1') / ICMP(), timeout=0.5)

    Manipulez les paquets rseau avec Scapy 22/24

    www.openclassrooms.com

    http://fr.openclassrooms.com/http://www.v3.siteduzero.com/inscriptionhttp://www.v3.siteduzero.com/connexion
  • 8/12/2019 568537 Manipulez Les Paquets Reseau Avec Scapy

    23/23

    rep,non_rep = sr(IP(dst='192.168.1.1') / ICMP(), timeout=0.5)

    rep = srp1(Ether() / IP(dst='192.168.1.1') / ICMP() / "COUCOU", timeout=0.5)

    rep,non_rep = srp(IP(dst='192.168.1.1') / ICMP(), timeout=0.5)

    Comment dois-je procder si je ds ire faire un scan SYN sur tous les ports de 192.168.1.1 (des ports 0 65535) ?

    dport=[0,65535]

    dport=(0,65535)dport='0-65535'

    Il faut obligatoirement p asser p ar une boucle qui incrmente le port et envoie un paquet.

    Plus difficile : comment devons nous appeler la fonction sniff() pour qu'elle rcupre les paquets TCP avec les flags SYN + ACK, destination de moi-mme (adresse IP 192.168.1.14) ?

    r = sniff(filter="tcp and dst host 192.168.1.14",lfilter=lambda x: x[2].flags==18)

    r = sniff(filter="tcp and dst host 192.168.1.14",lfilter=lambda x: x[2].flags==24)

    Correction !

    Statistiques de rponses au QCM

    Ce tutoriel s'achve, et j'espre qu'il aura attis votre curiosit et vous aura permis de comprendre les mcanismes qui se cachentderrire les outils rseaux traditionnels

    Vous pouvez videmment approfondir vos connaiss ances grce la documentation officielle(en anglais), ou par la dcouverted'autres protocoles (je vous laisse dcouvrir tous lesprotocolesque gre s capy : tapez la commande ls()dans l'interprteur

    )

    Partager

    Manipulez les paquets rseau avec Scapy 23/24

    http://www.v3.siteduzero.com/tutoriel-rss/568537.xmlhttp://www.networksorcery.com/enp/topic/ipsuite.htmhttp://www.secdev.org/projects/scapy/doc/http://www.v3.siteduzero.com/tutoriel-15-568537.html