user@linuxtrack:~ $ python -c 'print("Soyez les bienvenus !")'

Vous n'êtes pas identifié(e).

#1 24-11-2014 14:12:29

Lostyx
Membre

Scapy - Le manipulateur de packet et de trame en python

Hello,
ça fait un bail que je suis pas passé par ici, mais étant plus ou moins de retour,j'annonce un retour avec un petit thread :
Bon je tiens à dire que c'est un sujet plus ou moins long donc je vais l'éditer au fur et à mesure, le rendre plus joli, bref faire ce que je peux pour le rendre le plus accessible à nos chers cybertrackxiens (ouaip ça fait alien j'aime bien)

pré-requis:
-une connaissance de base du langage python
-connaissances en réseaux basiques ( vous pouvez même lire sans ça hein wink )
-être curieux big_smile

About scapy :
Premièrement c'est une librairie python que l'on peut considérer comme un tool à part entière.
Elle est très prisée par les personnes s'intéressant de près au Pentest car il permet de manipuler des paquets, créer, envoyer diverses requêtes etc...
On peut aussi s'en servir dans une optique d'audit de son propre système bien évidemment, ou juste pour faire joujou.

A vérifier : il me semble qu'il est compatible avec les versions < 2.5 (  mais pas les 3.x , reste à vérifier)

Pour l'installation vous êtes des grands, vous savez faire hein ? wink
Comment ça non?
bon:

[== Indéfini ==]
sudo apt-get install python-scapy

et yumi pour les fans de redhat smile

Comme le python, vous pouvez vous en servir en ligne de commande, ou dans un script, par contre petite subtilité :

[== Indéfini ==]
sudo scapy

En effet, scapy manipule les paquets et pour certaines manipulations aura donc besoin des droits administrateur.
De plus vous pouvez par exemple faire un ifconfig en ligne de commande une fois scapy lancé. ( ouais c'est sympas :rolleyes: )

Ou si vous voulez l'utiliser dans un script:
from scapy.all import *

Commencons !

Il faut savoir que sous scapy, les protocoles sont des objets : IP(),ICMP(),UDP() ...

La création et l'assignation de variables se fait de la même manière qu'en python :

-ip=IP()  <-- On déclare notre variable ip comme un objet IP()

-ip.src=”1.2.3.4” <-- notre Objet IP peut prendre une source (qui a envoyer le paquet)

-ip.dst=”google.com” <-- de la même manière il peut prendre une destination(qui va le recevoir)

Mais comme on aime tout faire en même temps :
-ip=IP(src=”1.2.3.4”, dst=”google.com”) <-- oui,ça marche :rolleyes:

Vous avez remarqué ? ]:D
Et oui on peut même mettre ce que l'on veut dans la source et donc faire croire qu'on est un petit enfant méchant du bangladesh cool

Les commandes pour envoyer et recevoir les paquets :
(Layer 2)
-sendp() - layer 2 sending
-srp() - send and receive on Layer 2
-srp1() - send and receive a single response
(Layer 3)
-send() - layer 3 sending
-sr() - layer 3 send and receive
-sr1() - send and receive a single response

Oui je sors ça de la documentation anglophone big_smile (lire la doc est toujours essentiel avant de poser une question soit dit en passant pour les newbies wink j'en suis un je sais de quoi je parle )

Si vous ne savez pas à quoi correspondent les layers :
(physique c'est le layer 1, applicatif le 7)
url?sa=i&rct=j&q=&esrc=s&source=images&cd=&cad=rja&uact=8&ved=0CAcQjRw&url=https%3A%2F%2Fsupportforums.cisco.com%2Fdocument%2F12199841%2Fmobile-ip&ei=jRZzVKiwJpHnapqbglg&psig=AFQjCNEbUXoWD1ZqWNWn4q8_M6kBnojmjg&ust=1416914953047801


Passons à un aspect un peu plus pratique

Nous pouvons créer un paquet ethernet et afficher avec :

[== Indéfini ==]
trame = Ether() 
trame.show()

La commande show va vous montrer votre objetc avec plein d'informations ! (non j'exagère )
quelque chose ressemblant à :
dst= ff:ff:ff:ff:ff:ff
src= 00:00:00:00:00:00
type= 0x0

Si vous ne savez pas ce que cela représente une trame ethernet est constituer de la manière suivante :
L'adresse de destination MAC |  L'adresse de source MAC | Ethertype | DATA | CRC (checksum)
Les deux premiers sont assez explicite, le troisième correspond au type du protocole qui dépends de ce qui est dans la partie DATA.
Et le checksum permet de contrôler l'intégrité de notre trame. Bref celle là on y touche pas.

Ici nous affichons les valeurs par défaut.
Vous pouvez les modifier par exemple en faisant ' trame.dst = machin ' ou 'trame.src=machin'

Pour envoyer la trame et bien ... j'ai mis les commandes plus haut, nous sommes au layer 2 donc

[== Indéfini ==]
sendp(trame)

Si vous le faites vous aurez une réponse de type '.' puis 'sent 1 packets'
Le point en scapy signifie l’envoi.

Cette trame était vide et donc, inintéressante, mais on le fait d'un point de vue pédagogique !

Maintenant nous allons encapsuler des données, c'est à dire que l'on va mettre des informations dans la partie DATA (youppiiii big_smile )
En gros, on commence les choses intéressantes!

Un peu plus de pratique avec l'encapsulation !

Je vous propose de créer votre premier "paquet" avec scapy !
Pour cela nous allons faire quelque chose appelé de l'encapsulation, qui consiste à inclure un protocole dans un autre protocole.

Pour ce faire, je vais, non ON va créer (oui faites le c'est plus intéressant)
un paquet basé sur le protocole ICMP -> donc en gros on va faire un ping !

Pour ceux ne connaissant pas la commande ping, honte à vous ! neutral
En pratique, un ping consiste à savoir si un hôte existe, c'est à dire si il y a une machine à l'adresse x.x.x.x !
En version technique, le ping va envoyer un paquet ICMP echo-request à un hôte et nous informer si un paquet echo-reply à était reçu .

Bref, créons notre objet de la même manière que précédemment :

[== Indéfini ==]
mon_ping = ICMP()
mon_ping.show()

Là on voit que notre type est à echo-request, car c'est le type de base du protocole ICMP.

On va désormais créer un vrai paquet !

[== Indéfini ==]
mon_ping = Ether() / IP(dst='192.168.1.3') / ICMP()
mon_ping.show()

Pour les questions 192.168.1.3 là c'est l'ip de ma coloc wink
c'est son ip privé, donc inutile d'essayer de lui dire bonjour sur cet ip big_smile (pour les ip privées/ip publiques je vous invite à chercher ça sur google) 

Remarque que le type est 0x800, scapy mets les informations de source et de type comme un grand mais on peut les modifier nous même !

à partir de là vous pouvez envoyer le paquet avec sendp(mon_ping), mais vous n'allez pas recevoir de réponses, car ?
...
Si vous avez bien suivis oui sendp() envoit SEULEMENT .
Pour recevoir il faut utiliser srp() wink

Essayer :

[== Indéfini ==]
rep,non_rep = srp(mon_ping)

Là, on a une réponse ! (une petite '*' s'affiche, cela signifie "ouaip j'ai reçu un truc")
et vous pouvez consulter rep et non_rep voir ce qu'ils contiennent !

Ensuite vous pouvez consulter la réponse avec rep.show() !
rep est une liste de couple de paquets vous pouvez donc le regarde comme une liste classique :
rep[0][0].show()

Je vous laisse analyser ces informations comme des grands, ça vous fera réfléchir un peu wink
Si vous voulez analyser une seul réponse n'oubliez pas srp1() !

Si on approfondis un peu, on va oubliez la partie ethernet parce que bon, scapy s'en charge très bien et elle ne nous intéresse pas tant que ça !

On peut donc faire :

[== Indéfini ==]
rep = sr1(IP(dst='192.168.1.3') / ICMP())

Voila les bases, à partir de là laissez votre imagination travailler.
Faite du scan sur des plages d'ip, générez des paquets, manipuler !
C'est en forgeant qu'on devient forgeron !

D'ailleurs dans le jargon on dit que l'on forge un paquet ! Cela rend l'expression encore plus adapté cool


Ce que je peux faire ensuite :
-Vous écrire un petit script pour faire un scan de plage ip.
-Un petit script qui appel nmap sur une ip pour faire du scan de port (on peut mixer avec le scan d'ip)
-Je pense le faire c'est décrire la fonction sniff() de scapy, c'est surtout pour cela que je l'utilise, c'est vraiment mais alors vraiment bien foutu !
Mais je ferais peut être un autre thread dessus?



En espérant que ça aide. c'est un des premiers articles que je fais donc si vous avez des remarques faites les.
Orthographe, présentation tout ça.
Mon but est aussi d'apprendre à faire des cours, des tutoriels, etc ...
Donc un maximum de retour serait génial !


Au passage niveau balise, ya ni console ni python :S

Sources :

http://hackmiami.org/wp-content/uploads … pypres.pdf
http://www.secdev.org/projects/scapy/doc/
en pdf :
http://www.secdev.org/projects/scapy/files/scapydoc.pdf

Et le cours du site du zéro, qui a la même structure en fait *_*
Mais avec des images et tout,et tout ... (mais euh sad )
http://openclassrooms.com/courses/manip … avec-scapy


-L'anonymat complet n'existe pas , il faudra vous y faire .
-La plus grande faille informatique ? l'homme sans aucun doute .

Hors ligne

#2 25-11-2014 02:43:09

Dam's
Membre

Re : Scapy - Le manipulateur de packet et de trame en python

Bonjour,
Merci pour cette belle présentation. C'est une chouette api très intéressante à découvrir.

Hors ligne

#3 25-11-2014 14:33:16

Yzeew
Membre d'or

Re : Scapy - Le manipulateur de packet et de trame en python

Pour le moment le mode blackhat n'est pas disponible dans mes neurones, mais je garde ce thread dans mes marque-pages wink


>> Good things come to those who, Wait.. <<

>> sip:yzeew@ekiga.net << and >> #Pouni3 <<

Hors ligne

#4 25-11-2014 17:19:52

manon
#! Crunchikette #!

Re : Scapy - Le manipulateur de packet et de trame en python

Merci pas encore le niveau .. mais j'atend la suite wink notament la description de la fonction sniff()  ]:D

Hors ligne

Pied de page des forums