User Tools

Site Tools


rx:tp5

This is an old revision of the document!


TP5 (Scapy)

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…
SYN Scan
  • Simuler un serveur HTTP sur syl à l'aide de cette commande :
   nc -l -vv -p 80    &
  • 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         
     ... 
Traceroute

Ecrire un programme Scapy qui réalise un traceroute entre nile et grave.

Connexion à un serveur TCP/IP (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.1455287632.txt.gz · Last modified: 2024/03/18 15:05 (external edit)