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…
Traceroute

Dans cet exercice, nous allons coder un traceroute en scapy. Pour ce faire, lancez le réseau virtuel chain déjà configuré. Lancez cette topologie :

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

Ecrire un programme Scapy sur opeth qui réalise un traceroute vers grave. Le principe consiste à envoyer des pings avec des TTL (time-to-live) croissants. == 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 ! <code python> if b.payload.flags == ???: # remplacer les ??? … print “OPEN” … else: … print “CLOSED” … </code> 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. <code python> for i in range(1024): … print “open %s” %i … </code> ==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) ! - utiliser cette commande : <code>iptables -A OUTPUT -p tcp –tcp-flags RST RST -j DROP</code> - puis lancez Scapy. * Complétez le programme ci-dessous en respectant les étapes suivantes : - envoi du paquet SYN avec notamment les champs TCP sport=7777, dport=22, flags=“S” et seq=0. - réception du paquet SYNACK… - envoi du paquet ACK avec les champs TCP flags=“A”, seq=SYNACK.ack, ack=SYNACK.seq+1, … - 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 ! <code> SYN = IP(???)/TCP(???) SYNACK = sr1(SYN) ACK = IP(???)/TCP(???) MSG = sr1(ACK) print MSG.load </code> 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 ! * https://samsclass.info/124/proj11/proj18-scapy-tcp.html

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