User Tools

Site Tools


rx:tp5

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
rx:tp5 [2016/02/12 14:43] orelrx:tp5 [2024/03/18 15:06] (current) – external edit 127.0.0.1
Line 1: Line 1:
-====TP5 (Scapy)====+======TP5 (Scapy)======
  
-Lancez la configuration du TP5.+Lancez la configuration suivante :
  
-  /net/ens/qemunet/miage/qemunet.sh -x -s /net/ens/qemunet/miage/gw.tgz+  /net/ens/qemunet/qemunet.sh -x -s /net/ens/qemunet/demo/gw.tgz
    
 Il s'agit du réseau ci-dessous qui est déjà configuré.                                Il s'agit du réseau ci-dessous qui est déjà configuré.                               
Line 24: Line 24:
 Sur //opeth//, lancez la commande "scapy". L'invite '>>' indique que vous êtes maintenant dans l'interpréteur Scapy. Pour quitter Scapy, tapez 'ctrl-d'. 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==+====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.   * 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.
Line 36: Line 36:
  
 <code python> <code python>
-ping = IP(dst="192.168.0.2")/ICMP(type="echo-request")+ping = IP(dst="192.168.0.3")/ICMP(type="echo-request")
 pong = sr1(ping) pong = sr1(ping)
 </code> </code>
Line 42: Line 42:
   * Que représentent les variables ping et pong ? A quoi sert la fonction sr1() ?   * 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.   * 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...+  * Maintenant, faire un ping vers //grave// de la même façon...
  
-== Traceroute ==+==== 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 :+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+  /net/ens/qemunet/qemunet.sh -x -s /net/ens/qemunet/demo/chain.tgz
      
 +Les IPs et les tables de routage sont déjà configurés. 
  
  
-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.  +  * Tout d'abord, testez la commande //traceroute// entre //opeth// et //nile//. 
-  +  * Lancez //scapy// sur //opeth//. Testez le code ci-dessous :
  
 +<code python>
 +x=IP(dst="147.210.15.2",ttl=1)/ICMP() # @nile
 +y=sr1(x)
 +y.show()
 +</code>
  
 +  * 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==+__ Astuce__ : Pour écrire une boucle Python...
  
-  * Simuler un serveur HTTP sur syl à l'aide de cette commande :+<code python> 
 +>>> for i in range(10): 
 +...   print "iteration",
 +...  
 +# résultat 
 +iteration 0 
 +iteration 1 
 +... 
 +iteration 8 
 +iteration 9 
 +</code>
  
-     nc -l -vv -p 80    &+__Attention__ : Il ne faut pas oublier d'ajouter un ou deux espaces après '...' dans le corps de la boucle.
  
-  * Qu'est-ce qu'un "syn scan" ? A quoi sert la commande 'nmap'+==== Syn Scan====
-  * 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()+Relancez la première configuration :
  
-La commande suivante détaille l'ensemble des champs que vous pouvez modifier au niveau de IP et de TCP.+  /net/ens/qemunet/qemunet.sh -x -s /net/ens/qemunet/demo/gw.tgz
  
-     p.show()+  * Qu'est-ce qu'un //syn scan// ?  
 +  * A quoi sert la commande 'nmap' ?  
 +  * Depuis opeth, lancez la commande 'nmap -sS -n @syl' pour scanner les ports de //syl//... 
 +  * Rappelez le principe de la //poignée de main// TCP. 
 +  * Lancez maintenant Scapy sur //opeth//.  
 +  
 +Pour effectuer un //syn scan// avec Scapy , il faut essayer d'établir une connexion TCP/IP vers l'ensemble des ports (de 1 à 65535de //syl//. Si un service est disponible sur un port de la machine cible, alors le serveur accepte la demande de connexion en répondant favorablement. 
  
-  * 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 ?+  * Pour faire un test en Scapy, créez un paquet TCP/IP à destination du port 80 de //syl// avec le champs //flags// de TCP égal à "S" (SYN). Envoyez ce paquet et observez la réponse. 
  
-   a = IP(???)/TCP(???          # remplacer les ???+   a = IP(???)/TCP(???         
    b = sr1(a)    b = sr1(a)
  
-  * Quel est le flag TCP en réponse, correspondant à la variable b.payload.flags ?  +  * Quel est le flag TCP en réponse.  
-  * 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 !+  * Recommencez pour le port 3333. Que remarquez-vous ? En déduire une manière de détecter un port ouvert ou fermé... 
 +  * 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> <code python>
-   if b.payload.flags == ???:     # remplacer les ??? +for p in range(1024): 
-   ...  print "OPEN" +...  if ???: 
-   ... else: +...    print "OPEN", p 
-   ...  print "CLOSED" +...        
-   ...        +</code>   
-</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> +__Attention__ : Le test ??? n'est pas si évident à trouver ! Google est votre ami ;-)
-      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 !+====Connexion à un serveur TCP/IP (Bonus====
  
-  * https://samsclass.info/124/proj11/proj18-scapy-tcp.html+[[rx:tp5-bonus|bonus]]
  
rx/tp5.1455288181.txt.gz · Last modified: 2024/03/18 15:05 (external edit)