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.2")/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 nile 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)

bonus

Le but de cet exercice est d'ouvrir une connexion TCP/IP vers un serveur SSH (port 22) en effectuant la traditionnelle poignée de main avec Scapy. Pour établir la connexion TCP/IP avec Scapy vers le serveur SSH, il faut réaliser la traditionnelle poignée de main TCP en trois étapes (envoi de SYN → réception de SYN-ACK → envoi de ACK).

  • Sur immortal (uniquement) !
    1. utiliser cette commande :
      iptables -A OUTPUT -p tcp --tcp-flags RST RST -j DROP
    2. puis lancez Scapy.
  • Complétez le programme ci-dessous en respectant les étapes suivantes :
    1. envoi du paquet SYN avec notamment les champs TCP sport=7777, dport=22, flags=“S” et seq=0.
    2. réception du paquet SYNACK…
    3. envoi du paquet ACK avec les champs TCP flags=“A”, seq=SYNACK.ack, ack=SYNACK.seq+1, …
    4. réception du message MSG envoyé par le serveur, qui doit contenir du texte indiquant la version du serveur OpenSSH, enfin si tout marche bien !
      SYN = IP(???)/TCP(???)
      SYNACK = sr1(SYN)
      ACK = IP(???)/TCP(???)
      MSG = sr1(ACK)
      print MSG.load 

Attention : Il faut effectuer ces commandes rapidement pour éviter un “timeout” du serveur (sinon, le mieux serait d'utiliser une fonction Python) ! De plus, pour effectuer plusieurs tests consécutifs, il faut changer à chaque fois le numéro du port source TCP (sport=5467,…) car on ne ferme pas les connexions correctement !

rx/tp5.1456139671.txt.gz · Last modified: 2024/03/18 15:05 (external edit)