Python et Scapy !
by Florent on Dec.16, 2007, under Uncategorized
Ca faisait longtemps que j’avais envie de faire du python, et l’article d’Alex m’a poussé à m’y mettre.
Je cherchais donc à créer un petit script pour pinger des gens mais en pouvant spoofer l’adresse source.
Et au gré de mes recherches je suis tombé sur Scapy ..
Grosso modo Scapy est un programme qui va nous permettre de manipuler les paquets. On pourra notamment forger nos propres paquets. Et c’est ce qui m’interessait dans un premier temps.
Je pars du principe que python est deja installé.
Pour commencer il fallait donc installer scapy.
Je suis sous Ubuntu alors un petit
apt-get install scapy
Et ca marche. Pour ceux qui auraient des soucis, vous pouvez télécharger le fichier scapy.py toujours sur le site de scapy.
Il suffit de placer ce fichier dans le dossier courant ou vous placerez vos scripts.
Si vous avez installer scapy vous pouvez lancer scapy directement depuis un terminal en tapant scapy (j’ai 2 warning qui apparaissent et que je zappe ici car peu important).
Une fois dans scapy vous pouvez taper la commande ls() pour voir toutes les fonctions a disposition, plus ou moins bien documenté.
bdg@tahiti:~$ scapy
Welcome to Scapy (v1.1.1 / f88d99910220)
>>> ls()
ARP : ARP
ASN1_Packet : None
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
Dot11AssoReq : 802.11 Association Request
Dot11AssoResp : 802.11 Association Response
Dot11Auth : 802.11 Authentication
Dot11Beacon : 802.11 Beacon
Dot11Deauth : 802.11 Deauthentication
Dot11Disas : 802.11 Disassociation
Dot11Elt : 802.11 Information Element
Dot11ProbeReq : 802.11 Probe Request
Dot11ProbeResp : 802.11 Probe Response
[...]
PPP : PPP Link Layer
PPPoE : PPP over Ethernet
PPPoED : PPP over Ethernet Discovery
Packet : None
Padding : Padding
PrismHeader : Prism header
RIP : RIP header
RIPEntry : RIP entry
Radius : Radius
[...]
TCP : TCP
TCPerror : TCP in ICMP
UDP : UDP
UDPerror : UDP in ICMP
_IPv6OptionHeader : IPv6 not implemented here.
>>>
Disons maintenant que nous voulons utiliser la fontion IP(), alors on va voir ce qu’on peut modifier dans cette fonction.
>>> 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 = (”)
Voila qui est intéressant, on voit notamment qu’on pourra modifier plusieurs champs, src et dst par exemple qui vont correspondre a l’ip source et l’ip destination dans le paquet IP.
Voila donc mon code qui permettra de pinger un host ou un reseau en spoofant l’adresse source:
#!/usr/bin/python
import sys
from scapy import *
conf.iface=”eth0″
if len(sys.argv) != 4:
print “Erreur noob! ./spoof.py <ip source> <ip destination> <nombre de ping>”
sys.exit(1)
source=sys.argv[1]
dest=sys.argv[2]
nb=sys.argv[3]
ip=IP()
icmp=ICMP()
ip.dst=dest
ip.src=source
a=ip/icmp
k=0
while (int(nb) <> int(k)):
send(a)
time.sleep(0.5)
k+=1
else:
print “sorti”
Une fois le fichier créé, on lui donnera les droits d’exécution
bdg@tahiti:~/python$ sudo chmod +x spoof.py
Et on le lance de cette maniere
bdg@tahiti:~/python$ sudo ./spoof.py 1.1.1.1 192.168.0.2 5
.
Sent 1 packets.
.
Sent 1 packets.
.
Sent 1 packets.
.
Sent 1 packets.
.
Sent 1 packets.
sorti
Le premier parametre sera l’adresse IP source dans le paquet, le deuxième parametre l’adresse IP qui va recevoir l’echo request et le troisieme parametre le nombre d’echo request qu’on enverra.
Sur la machine 192.168.0.2 cela donne
Voir en commentaire pour une solution plus élégante. (Enfin moins code de porc quoi.).
January 29th, 2008 on 8:44 pm
hum j’atteris sur ce site en suivant ton profil Facebook et là, evidemment je pige rien lol
moi aussi j’aime les reptiles (python) et spoofer ta vibe hihi
bon ok mon com n’a rien a faire sur ce site serieux, tu peux l’effacer lol
January 30th, 2008 on 10:28 pm
Les aléas de la collaboration sur le web 2.0 …
July 30th, 2008 on 8:25 pm
Il y a plus propre
Je viens de voir une fonction de scapy, srloop().
on supprime:
k=0
while (int(nb) <> int(k)):
send(a)
time.sleep(0.5)
k+=1
else:
print “sorti”
et on remplace par:
srloop(a,count=int(nb))