Table des matières

Fabriquer des paquets réseaux avec Scapy

Remarques préalables

Créer une trame simple Ethernet simple

>>> trame = Ether()
>>> 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= 0x9000
>>>
  • Une trame éthernet est crée en instanciant la classe Ether().
  • la méthode show() de la classe affiche les informations de la trame. Comme aucun paramètre n'est fourni, ce sont les valeurs par défaut qui sont utilisées pour les attributs dst, src et type.

  • Envoi de la trame Ethernet sur le réseau. Utilisation de la fonction sendp() : <code python>
    sendp(trame)

    .

    Sent 1 packets.


    <

    /code>

    Le point “.” représente un envoi.

  • La trame Ethernet a été envoyée mais :

    Il faut maintenant encapsuler des données d'un protocole des couches supérieures dans cette trame vide.

    La commande sendp() permet d'envoyer un paquet créé (forgé) à partir du niveau 2 (couche Ethernet).

    La commande send() permet d'envoyer un paquet créé (forgé) à partir du niveau 3 (couche IP). Les informations du niveau 2 (la couche ethernet) sont alors automatiquement renseigné par scapy.

    Créer une trame Ethernet contenant un paquet ICMP

    La commande ping qui utilise le protocole ICMP permet :

    >>> ping = ICMP()
    >>> ping.show()
    ###[ ICMP ]###
      type= echo-request
      code= 0
      chksum= None
      id= 0x0
      seq= 0x0
    >>>

    Par défaut, l'instanciation de la classe ICMP() met le type du ping à echo-request.

    Page Wikipedia sur le protocole ICMP :

    Quelques précisions sur le fonctionnement du protocole ICMP :

    Pour envoyer un paquet ICMP, il faut :

    Avec Scapy, l'encapsulation entre protocoles se réalise avec l'opérateur / (slash).

    Seule l'adresse IP du destinataire a été renseignée. Cependant Scapy a complété automatiquement les autres champs :

    >>> rep, non_rep = srp(trame)
    Begin emission:
    ..Finished to send 1 packets.
    .*
    Received 4 packets, got 1 answers, remaining 0 packets
    >>> rep
    <Results: TCP:0 UDP:0 ICMP:1 Other:0>
    >>> non_rep
    <Unanswered: TCP:0 UDP:0 ICMP:0 Other:0>
    >>>

    Avec Scapy :