Scapy/8/en
Forger des paquets
Scapy permet de forger n’importe quel type de paquet (couche TCP, UDP, IP, etc.). Pour chaque couche, les valeurs qui ne sont pas renseignées manuellement le seront automatiquement. La commande ls(IP) permet de consulter l’attribution automatique de ces valeurs.
>>> 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 = ()
Initialisons tout d’abord un nouvel objet :
>>> a=IP()
Celui-ci contient dorénavant des valeurs par défaut :
>>> a.ttl 64 >>> a.src '127.0.0.1'
Il est possible de forcer ces valeurs par défaut :
>>> a.src='192.168.1.13' >>> a.src '192.168.1.13'
Pour consulter toutes les valeurs forcées, il suffit de rappeler l’objet :
>>> a <IP src=192.168.1.13 |>
Certaines valeurs sont dépendantes et donc recalculées. L’exemple ci-dessous illustre ce phénomène (la valeur de a.src par défaut est mise à jour par dépendance de mise à jour de la valeur de a.dst)
>>> a=IP() >>> a.src '127.0.0.1' >>> a.dst='192.168.1.1' >>> a.src '192.168.182.132'
La fonction del( ) permet de détruire tout ou partie d’un objet. L’exemple qui suit montre que la suppression d’une valeur forcée entraîne la réinitialisation de la valeur par défaut :
>>> del(a.dst) >>> a.dst, a.src ('127.0.0.1', '127.0.0.1') >>> a <IP |> >>> del(a) >>> a Traceback (most recent call last): File "<console>", line 1, in ? NameError: name 'a' is not defined
Pour compléter notre paquet, nous pouvons également spécifier les drapeaux TCP comme suit :
>>> a=IP(dst="192.168.1.1") >>> a <IP dst=192.168.1.1 |> >>> b=a/TCP(flags="SF") >>> b <IP frag=0 proto=tcp dst=192.168.1.1 | <TCP flags=FS |>>
Ou, pour une vue plus détaillée :
>>> b.show() ###[ IP ]### version= 4 ihl= 0 tos= 0x0 len= 0 id= 1 flags= frag= 0 ttl= 64 proto= tcp chksum= 0x0 src= 192.168.182.132 dst= 192.168.1.1 options= ###[ TCP ]### sport= ftp_data dport= www seq= 0 ack= 0 dataofs= 0 reserved= 0 flags= FS window= 8192 chksum= 0x0 urgptr= 0 options= {}
Il est également possible de spécifier plusieurs éléments par paramètre. L'exemple suivant montre comment spécifier deux ports de destination :
>>> b.ttl=(10,14) >>> b.dport=[80,443] >>> [k for k in b] [<IP frag=0 ttl=10 proto=tcp dst=192.168.1.1 |<TCP dport=www flags=FS |>>, <IP frag=0 ttl=10 proto=tcp dst=192.168.1.1 |<TCP dport=https flags=FS |>>, <IP frag=0 ttl=11 proto=tcp dst=192.168.1.1 |<TCP dport=www flags=FS |>>, <IP frag=0 ttl=11 proto=tcp dst=192.168.1.1 |<TCP dport=https flags=FS |>>, <IP frag=0 ttl=12 proto=tcp dst=192.168.1.1 |<TCP dport=www flags=FS |>>, <IP frag=0 ttl=12 proto=tcp dst=192.168.1.1 |<TCP dport=https flags=FS |>>, <IP frag=0 ttl=13 proto=tcp dst=192.168.1.1 |<TCP dport=www flags=FS |>>, <IP frag=0 ttl=13 proto=tcp dst=192.168.1.1 |<TCP dport=https flags=FS |>>, <IP frag=0 ttl=14 proto=tcp dst=192.168.1.1 |<TCP dport=www flags=FS |>>, <IP frag=0 ttl=14 proto=tcp dst=192.168.1.1 |<TCP dport=https flags=FS |>>]