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) !
- utiliser cette commande :
iptables -A OUTPUT -p tcp --tcp-flags RST RST -j DROP
- 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 !
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 !