Scapy/8/en

From aldeid
Jump to navigation Jump to search

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       = ()
Note
La fonction ls( ) utilisée sans argument permet de lister les couches disponibles. Pour chacune d'entre elle, il est possible de consulter les paramètres.

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 |>>]
Note
Des valeurs distinctes s'écrivent entre crochets [v1,v2,…] et des intervalles entre parenthèses (val_min,val_max).