[How To]Utilisation de Scapy

-----------------------------------------------------------------------------------
- Utilisation de Scapy -
-----------------------------------------------------------------------------------
------------ Auteur : Rémi LAURENT -----------------------------------
------------ Mail : cloud@madpowah.org -------------------------------
------------ Date : 18/09/2008 ----------------------------------
-----------------------------------------------------------------------------------

Scapy est un logiciel développé en python qui permet de forger des paquets, de sniffer et de faire bien d'autres actions bien utiles pour faire du réseau. Cependant il manque cruellement de documentation donc je vais essayer d'expliquer ici son fonctionnement.

Tout d'abord on lance scapy en se créant une session a notre nom pour y revenir plus tard si besoin est :

 #scapy -s cloudsession
 INFO: New session [cloudsession]
Welcome to Scapy (v1.1.1 / f88d99910220)

>>>
Commencons par regarder la liste des protocoles supportés par scapy
>>>ls()
ARP        : ARP
BOOTP      : BOOTP
CookedLinux : cooked linux
DHCP       : DHCP options
DNS        : DNS
DNSQR      : DNS Question Record
DNSRR      : DNS Resource Record
Dot11      : 802.11
Dot11ATIM  : 802.11 ATIM
.......
En gros beaucoup :). Tres bon point.

Commencons maintenant a jouer. Nous allons créer un paquet IP puis un segment TCP et lier les 2 pour l'envoyer :
>>>ip = IP(dst="www.site.com", ttl=32)
>>>tcp = TCP(dport=80)
>>>tcpip = ip / tcp
>>>send(tcpip)
.
Sent 1 packets.

C'est aussi simple que ca. Observons maintenant notre paquet avec la méthode show() :
>>>tcpip.show()
###[ IP ]###
  version= 4
  ihl= 0
  tos= 0x0
  len= 0
  id= 1
  flags= 
  frag= 0
  ttl= 32
  proto= tcp
  chksum= 0x0
  src= 192.168.1.10
  dst= Net('www.site.com')
  options= ''
###[ TCP ]###
     sport= ftp_data
     dport= http
     seq= 0
     ack= 0
     dataofs= 0
     reserved= 0
     flags= S
     window= 8192
     chksum= 0x0
     urgptr= 0
     options= {}
Vous souhaitez modifier le sport puis envoyer 5 paquets ? Rien de plus simple :
>>>tcpip.sport=1111
>>>send(tcpip, count=5)
.....
Sent 5 packets.
En envoyer a l'infini ?
>>>send(tcpip, loop=1)
Bien sur vous pouvez faire pareil avec n'importe quel protocole supporté par scapy. Par exemple pour un ICMP :
>>>send( IP(dst="www.site.com") / ICMP() )
Pour envoyer un paquet au niveau 2 afin de modifier l'adresse MAC :
>>>sendp( Ether(), IP(dst="www.site.com") / ICMP() )
Plus fort, on souhaite générer un graphique d'un paquet (le 423) que l'on a récolté lors d'un dump et sauvegardé dans un .cap. Pour cela il nous suffit de faire :
>>>a=rdpcap("/chemin/fichier.cap")
>>> a
<isakmp.cap: UDP:721 TCP:0 ICMP:0 Other:0>
>>> a[423].pdfdump(layer_shift=1)
>>> a[423].psdump("/tmp/fichier.eps",layer_shift=1)
Générons maintenant un petit Man In The Middle (MITM) qui consiste a usurper l'adresse MAC de la passerelle :
arpcachepoison(mon_adresse_MAC, ip_de_la_passerelle)

Pour sniffer le réseau, cela est tres simple aussi :
>>> sniff(iface="ath0", prn=lambda x: x.show())
La meme chose avec des filtres :
>>> sniff(iface="ath0", filter="tcp and host www.site.com", count=2, prn=lambda x: x.show))
Voyons maintenant l'option de traceroute qui nous permet en plus de faire des reports bien sympathique puis de les sauvegarder et meme de le produire en 3D :

rep, norep = traceroute(['www.site1.com', 'www.site2.com'])
rep.graph()
rep.graph(target="> /tmp/graph.svg")
rep.trace3D()
En tant que bon pen tester, nous allons fuzzer un host avec des paquet UDP en ne gardant en destination que le port NTP en v4, tout le reste sera randomizé :
send(IP(dst="www.site.com")/fuzz(UDP()/NTP(version=4)),loop=1)
Pour terminer, voyons comment générer une série de paquet tres simplement :

>> a=IP(dst="www.google.fr/30")
>>> a
<IP  dst=Net('www.google.fr/30') |>
>>> [p for p in a]
[<IP  dst=209.85.135.100 |>, <IP  dst=209.85.135.101 |>, <IP  dst=209.85.135.102 |>, <IP  dst=209.85.135.103 |>]
>>> b=IP(ttl=[1,2,(5,9)])

>>> b
<IP  ttl=[1, 2, (5, 9)] |>
>>> [p for p in b]
[<IP  ttl=1 |>, <IP  ttl=2 |>, <IP  ttl=5 |>, <IP  ttl=6 |>, <IP  ttl=7 |>, <IP  ttl=8 |>, <IP  ttl=9 |>]

>>> c=TCP(dport=[80,443])
[<IP  frag=0 proto=tcp dst=209.85.135.100 |<TCP  dport=http |>>,
<IP  frag=0 proto=tcp dst=209.85.135.100 |<TCP  dport=https |>>,
<IP  frag=0 proto=tcp dst=209.85.135.101 |<TCP  dport=http |>>,
<IP  frag=0 proto=tcp dst=209.85.135.101 |<TCP  dport=https |>>,
<IP  frag=0 proto=tcp dst=209.85.135.102 |<TCP  dport=http |>>,

<IP  frag=0 proto=tcp dst=209.85.135.102 |<TCP  dport=https |>>,
<IP  frag=0 proto=tcp dst=209.85.135.103 |<TCP  dport=http |>>,
<IP  frag=0 proto=tcp dst=209.85.135.103 |<TCP  dport=https |>>]

Scapy est l'outil indispensable pour analyser le réseau ou pentester. A utiliser sans modération :)