-----------------------------------------------------------------------------------
- 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.
>>>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 |>>]