User Tools

Site Tools


rx:tp5

This is an old revision of the document!


TP5 (Scapy)

FIXME: à compléter…

Lancez la configuration du TP5.

$ /net/ens/qemunet/miage/qemunet.sh -x -s /net/ens/qemunet/miage/gw.tgz

Il s'agit du réseau ci-dessous qui est déjà configuré.

                             
               grave 
                 | .2
             ------------  147.210.0.0/24 
                 | .1 (eth0)
 Passerelle   immortal
                 | .1 (eth1)             
           --------------  192.168.0.0/24 
          .2 |        | .3              
          opeth      syl                  
                                          

Scapy est un interpréteur de commande en Python qui permet de forger des paquets IP. Vous trouverez de la documentation et un tutoriel sur Scapy ici :

Sur opeth, lancez la commande “scapy”. L'invite '»' indique que vous êtes maintenant dans l'interpréteur Scapy. Pour quitter Scapy, tapez 'ctrl-d'.

Ping & Pong
  • Pour forger un paquet IP, il suffit d'appeler le constructeur IP(). La fonction show() vous montre tous les champs du paquet IP initialisés avec des valeurs par defaut.
x = IP()
x.show()  
  • Pour effectuer un ping vers syl, il faut envoyer une requête 'echo' via le protocole ICMP au dessus d'IP. Tapez les commandes suivantes :
ping = IP(dst="192.168.0.3")/ICMP(type="echo-request")
pong = sr1(ping)
  • Que représentent les variables ping et pong ? A quoi sert la fonction sr1() ?
  • Utilisez la fonction show() pour afficher le contenu de ces paquets. Notez bien l'encapsulation de ICMP dans IP.
  • Maintenant, faire un ping vers grave de la même façon…
Traceroute

Dans cet exercice, nous allons coder un traceroute en scapy. Pour ce faire, nous utiliserons le réseau virtuel chain du TP3. Lancez cette topologie :

$ /net/ens/qemunet/miage/qemunet.sh -x -s /net/ens/qemunet/miage/chain.tgz

Les IPs et les tables de routage sont déjà configurés.

  • Tout d'abord, testez la commande traceroute entre opeth et nile.
  • Lancez scapy sur opeth. Testez le code ci-dessous :
x=IP(dst="147.210.15.2",ttl=1)/ICMP() # @nile
y=sr1(x)
y.show()
  • Que représente le champs TTL ? Qui a répondu ? Pourquoi ? Détaillez l'encapsulation de la réponse reçue ?
  • Recommencez avec ttl=2. Que constatez-vous ?
  • En s'appuyant sur ce principe, écrire une programme scapy qui effectue un traceroute !
SYN Scan
  • Qu'est-ce qu'un “syn scan” ? A quoi sert la commande 'nmap' ?
  • Depuis nile, lancez la commande 'nmap -sS -n @syl' pour scanner les ports de syl…
  • Pour effectuer la même chose avec scapy (sur immortal), il faut essayer d'établir une connexion TCP/IP vers l'ensemble des ports de nile (de 1 à 65535). Pour créer un paquet TCP/IP avec scapy, il faut taper :
   p = IP()/TCP()

La commande suivante détaille l'ensemble des champs que vous pouvez modifier au niveau de IP et de TCP.

   p.show()
  • Créez maintenant un paquet TCP/IP à destination du port 80 de syl avec le champs flags de TCP égal à “S” (SYN). Envoyez ce paquet et observer la réponse. A quoi sert ce flag ?
 a = IP(???)/TCP(???)           # remplacer les ???
 b = sr1(a)
  • Quel est le flag TCP en réponse, correspondant à la variable b.payload.flags ?
  • Recommencez pour le port 3333. Que remarquez-vous ? En déduire une manière de détecter un port ouvert ou fermé sur une machine distante, en complétant le programme suivant !
   if b.payload.flags == ???:     # remplacer les ???
   ... 	print "OPEN"
   ... else:
   ...  print "CLOSED"
   ...       

Attention : ne pas oublier d'ajouter un espace après '…' dans le corps de la boucle.

Complétez le programme suivant, pour découvrir les ports de nile (de 1 à 1024) qui sont ouverts et pour les afficher comme le fait nmap.

     for i in range(1024):
     ...  print "open %s" %i         
     ... 
Connexion à un serveur TCP/IP (Bonus)
rx/tp5.1456675667.txt.gz · Last modified: 2024/03/18 15:05 (external edit)