Vous êtes sur la page 1sur 9

FOUKA Anisse 20/03/2024

BERRADA Mehdi Cyber 2A

TP1 - Scappy et Man in the Middle

Le but de ce TP est de découvrir les fonctionnalités de base de Scappy, puis de les utiliser afin de réaliser
une attaque MiM par ARP poisoning.

Pour PC Victime et PC Hacker, vous utiliserez une machine linux, ou un PC portable. PC Hacker devra
être équipé du service Apache2.

Les connections au switch se font par la deuxième interface des machines physiques.

Serveur Web sera une troisième machine équipée de Apache2.

Vous configurerez les IP conformément au schéma.

Installation de Scappy

Commencer par installer la bibliothèque scapy sur PC Hacker.

#sudo apt-get install scapy

Dans un interpréteur python (exécuté en mode root) importer le package scapy.all


#sudo python
Python 2.7.6 (v2.7.6 :3a1db0d2747e, Nov 10 2013, 00 :42 :54)
Type ”help”, ”copyright”, ”credits” or ”license” for more information.

>>> from scapy.all import

Installez également un serveur Apache dont vous modifierez la page d'accueil.

Une fois les outils installés, pensez à désactiver votre première carte réseau avec la commande
sudo ifconfig moninterface down

Branchez votre Serveur Web sur portail captif. Installez Apache. Débranchez-le du portail captif pour
l'intégrer à votre réseau local. Vérifiez que le serveur web est accessible depuis PC Victime.
FOUKA Anisse 20/03/2024
BERRADA Mehdi Cyber 2A

1. Création de la commande ping


La commande ping permet de savoir si un hôte, désigné par son adresse IP, existe. La commande ping
consiste à envoyer un paquet ICMP « echo-request » à l’hôte et à dire si un paquet ICMP «
echo-reply » a été renvoyé.

Construction du paquet

Forgeons donc un paquet ICMP echo-request à l'aide de Scappy !

>>> ping = ICMP()

>>> ping.show()

On voit que par défaut, l’instanciation de la classe ICMP() met le type du ping à echo-request. Par
contre, il n'y a pas d'encapsulation de ce protocole dans IP et Ethernet pour le moment.

D’après le protocole ICMP, Un paquet ICMP est encapsulé dans un datagramme IP. En effet, c’est dans
le datagramme IP qu’on va pouvoir renseigner l’adresse IP du destinataire. L’encapsulation entre
protocoles, dans scapy, est réalisée par l’opérateur / (slash).

>>> ping = Ether() / IP(dst=‘192.168.0.254’) / ICMP()

>>> ping.show()

On constate que, en précisant simplement l’adresse IP du destinataire, scapy a compris tout seul qu’il
devait modifier les attributs dst , src et type de Ether() ainsi que l’adresse IP de l’émetteur (src
dans IP()) !

Voyons maintenant si l’adresse indiquée va répondre à cela par un paquet ICMP echo-reply.

Envoi du paquet

L’envoi s’effectue comme ceci :

>>> sendp(ping)

Et …il ne se passe rien !

La fonction sendp() ne fait qu’envoyer le paquet. Pour envoyer et recevoir, il faut utiliser les fonctions
srp() ou srp1() .

srp() renvoie deux objets : le premier contient les paquets émis et leurs réponses associées, l’autre
contient les paquets sans réponse.

>>> rep,non_rep = srp(ping)

Envoyez le paquet … Analysez le résultat !


FOUKA Anisse 20/03/2024
BERRADA Mehdi Cyber 2A

Le ping entre la machine en 192.168.1.1 et la machine en 192.168.1.254 est passé. Nous avons 1
réponse.

On a bien reçu un ICMP echo-reply ! :)

rep contient en réalité une liste de couples de paquets. En l’occurrence, la liste ne contient qu’un seul
couple de paquets, qu’on peut afficher ainsi comme on afficherait n’importe quel élément d’une liste
en Python :

>>> rep[0]

Le résultat est un couple (tuple à deux valeurs). Pour afficher le paquet émis (ICMP echo-request), on
fera donc rep[0][0].show() , et pour le paquet reçu en réponse, rep[0][1].show() :

>>> rep[0][0].show()

>>> rep[0][1].show()

Pour simplifier tout cela, on peut préférer ici la fonction srp1() . Cette fonction renvoie un seul objet

>>> rep = srp1(ping)

Exercice : scan d’une plage d’adresses

À la lumière des explications ci-dessus, codez un programme qui effectue un ping sur toute une plage
d’adresses.

Note : pour désigner une plage d’adresse, vous pouvez simplement mettre ‘192.168.0.1-254’
dans l’attribut dst de IP

Exercice : programmer un traceroute

La commande traceroute permet de savoir par où passent vos paquets avant d’atteindre leur
destination. Pour cela, on se sert de l’attribut ttl (time to live) de l’en-tête IP. Cet attribut diminue de
1 à chaque routeur traversé, et lorsqu’il atteint 0, il "meurt" et le paquet est détruit. On peut alors
exploiter l’attribut src de son en-tête IP pour connaître l’adresse IP du routeur où il est "mort".

Pour connaître tous les routeurs traversés, il suffit donc de mettre, dans l’attribut ttl , un rang.

Si vous ne comprenez pas tout, un bout de code vaut mieux qu’un grand discours :
FOUKA Anisse 20/03/2024
BERRADA Mehdi Cyber 2A

>>> rep,non_rep=sr( IP(dst=‘209.85.143.100’, ttl=(1,25)) / TCP(), timeout=1 )

La variable rep contiendra les paquets de réponse reçus avec succès, tandis que non_rep stockera les
paquets sans réponse dans le délai spécifié.

2. Le protocole ARP et l'Attaque Man in the Middle


ARP (Adresse Resolution Protocole) est un protocole qui sert de liaison entre la couche 2 et 3 du
modèle OSI, c’est à dire qu’il permet d’associer une Adresse MAC avec une Adresse IP.

De cette manière, le routage des paquets peut se dérouler correctement sur le réseau. Cette
association MAC/IP est stockée dans le cache ARP. Le protocole ARP peut envoyer une requête afin de
connaître à qui appartient une adresse IP (Opération who-has) et une réponse qui permet d’identifier
l’adresse IP avec l’adresse MAC (Opération is-at). Cependant, ARP peut faire le contraire en utilisant
RARP (Reverse ARP).

L’ARP Cache Poisoning est une attaque extrêmement simple et rapide à mettre en place, car il s’agit
juste de modifier l’adresse MAC d’une entrée dans le cache ARP avec une autre adresse MAC.

Pour se faire, il suffit simplement de forger un paquet ARP de type "is-at" et de l’envoyer, avec scapy,
cette attaque peut se faire en une seule ligne.

Avant tout, on va garder une trace d’une table MAC normale, avant l’attaque. Sur le client, pinguez le
hacker et le serveur. Notez les résultats des commandes arp :

arp -a sur Hacker :

192.168.1.1 = 00:50:da:36:23 :0A

192.168.1.254 = 34:17:eb :9d:18:95

arp -a sur Victime :

192.168.1.50 = 98:fc:84:e1:03:33

192.168.1.254 = 34:17:eb:9d:18:95

arp -a sur Serveur :


FOUKA Anisse 20/03/2024
BERRADA Mehdi Cyber 2A

192.168.1.1 = 00:50:da:36:23 :0A

192.168.1.50 = 98:fc:84:e1:03:33

Pour l'instant, Quand PC Victim communique avec Serveur Web, la communication se fait sans
intermédiaire.

REQUETE

REPONSE

C'est le contenu des tables ARP qui permet à PC Victime et à Serveur de transmettre la trame au bon
équipement du premier coup.

À l'aide du schéma suivant, réfléchissez à ce qu'il faudrait modifier dans les tables ARP pour que les
équipement PC Victim et Serveur Web envoient systématiquement leurs trames à PC Hacker comme
intermédiaire.

REQUETE REQUETE

REPONSE
REPONSE
FOUKA Anisse 20/03/2024
BERRADA Mehdi Cyber 2A

Sur la machine PC Hacker, nous allons créer un script Python permettant de modifier les tables ARP de
PC Victim et Serveur Web. Pour cela nous allons transmettre des message ARP de type « is-at »
spontanément. C'est ce qu'on appelle un ARP gratuitous.

Mais nous allons falsifier le contenu de ces trames ARP en modifiant les MAC associés aux IP. Ainsi
nous forcerons PC Victime et Serveur Web à mettre à jour leur tables ARP avec des valeurs erronées.

Le script suivant est à enregistrer dans le fichier mitm.py sur PC Hacker. Vous complèterez les zones
en point d'interrogation. La commande = getmacbyip("IPdontjeveuxlaMAC") vous sera utile...

Le type d'opération peut être « whois » ou « is-at »

Exécutez le script et vérifiez le contenu des tables ARP.

arp -a sur Hacker :

192.168.1.1 = 34:17:eb:9d:18:95

192.168.1.254 = 34:17:eb:9d:18:95

arp -a sur Victime :

192.168.1.50 = 98:fc:84:e1:03:33

192.168.1.254 = 98:fc:84:e1:03:33

arp -a sur Serveur :

192.168.1.1 = 98:fc:84:e1:03:33

192.168.1.50 = 98:fc:84:e1:03:33

Que s'est-il passé ? Avez-vous bien réussi votre attaque ?

La construction de la trame est correcte, avec l'adresse MAC du PC Hacker associée à


l'adresse IP du Hacker pour à la fois le client et le serveur, ce qui est attendu. Cependant, l'adresse
MAC du PC Hacker est également associée à l'adresse IP du client dans la table ARP du serveur, et à
l'adresse IP du serveur dans la table ARP du client. Cela indique que l'usurpation de l'adresse MAC
dans l'attaque Man In The Middle a réussi, nous plaçant ainsi entre le serveur et le client. Les
adresses IP sont différentes mais pas les adresses MAC sur le serveur et le client.
FOUKA Anisse 20/03/2024
BERRADA Mehdi Cyber 2A

Faites un ping du client vers le serveur. Fonctionne-t-il ?

Les pings échouent car ils parviennent au PC Hackeur mais ne sont pas acheminés vers la
machine appropriée. Pour résoudre cela, il est nécessaire d'activer le forwarding IP sur le PC Hackeur,
ce qui lui permettra de fonctionner comme un routeur et de diriger le trafic réseau entre les victimes,
à savoir du Serveur au Hacker puis au Client.

Sur la machine Hacker, activez le forwarding IP.

echo 1 > /proc/sys/net/ipv4/ip_forward

Testez le ping à nouveau. Fonctionne-t-il ? Pourquoi ?

Oui le ping fonctionnes, le trafic a été redigéré.

Faites un traceroute de PC Victime vers Serveur. Remarque ?

En lançant un traceroute, nous constatons que le flux traverse notre machine hackeur, ce qui se
traduit par la présence de deux lignes dans le traceroute au lieu d'une seule. De plus, même lors d'un
simple ping, nous observons une redirection.

Lancez Wireshark sur votre PC Hacker. Lancez la capture.

Depuis PC Victime, affichez la page du serveur dans un navigateur. La page est-elle la bonne ?

Que voit-on dans Wireshark ? En quoi a-t-on réussi notre attaque ?

Nous constatons une tentative d'accès à la page HTTP du serveur, mais nous observons également
une redirection effectuée par la machine attaquante. Cela confirme que notre machine attaquante
FOUKA Anisse 20/03/2024
BERRADA Mehdi Cyber 2A

est placée entre le client et le serveur. Cependant, pour l'instant, l'attaquant se contente de recevoir
et de router les paquets. Ainsi, il est nécessaire de rediriger la requête vers le serveur Apache2 du PC
Hacker.

Pour modifier la page affichée par le client, on peut utiliser la redirection avec iptable :

iptables -t nat -A PREROUTING -p tcp -s 192.168.1.1 -d 192.168.1.254 --dport 80 -j REDIRECT --to-


ports 80

ou

iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 192.168.1.50

Lancez à nouveau la page web sur PC Victim. La page est-elle la bonne ?

Dans ce cas, la page web qui s'affiche provient du serveur malveillant, identifiable par son contenu
distinct. Pourtant, l'adresse IP du serveur est correctement affichée dans la barre d'adresse du
navigateur, ce qui confirme le succès de l'attaque MITM. Nous avons donc réussi à détourner la
requête de la victime et à la rediriger vers un site web frauduleux.

3. Les parades
Sécurité du switch

Sur un switch Cisco, quelle commande permet de limiter le nombre de MAC qui peuvent se
connecter à un switch ?

Avec la commande "switchport port-security" sur l'interface de configuration du switch, nous avons
la capacité de restreindre le nombre d'adresses MAC pouvant se connecter à un port à un seul, tout
en autorisant l'utilisation d'adresses MAC statiques sur ce même port.

Comment peut-on exploiter cette commande pour empêcher l'attaque ?

Dans notre configuration, où tous les ports ne sont pas utilisés comme dans une entreprise, nous
allons autoriser uniquement une adresse MAC (différente de celle du Hackeur) sur une interface
spécifique du switch. Pour ce faire, nous utilisons les commandes suivantes :

Switch(config-if)# switchport port-security mac-address 0022.191d.95bf (adresse MAC aléatoire)

Switch(config-if)# switchport port-security violation protect

Nous avons configuré le mode "protect" pour éviter que le port ne soit mis hors service, comme le
ferait le mode "shutdown" ou "restrict".
FOUKA Anisse 20/03/2024
BERRADA Mehdi Cyber 2A

Testez cette solution. Notez vos résultats :

Cette solution fonctionne mais le port reste allumé.

Sécurité sur les hôtes

Recherchez sur le web une solution permettant de désactiver les ARP gratuitous sur les hôtes. Notez
cette commande :

Sur les systèmes Linux, il existe un fichier situé à l'emplacement


/proc/sys/net/ipv4/conf/<interfaces>/drop_gratuitous_arp. Ce fichier peut avoir deux valeurs : 0, qui
est la valeur par défaut et permet de recevoir des trames ARP de type 'is-at' sans qu'une demande
'whois' préalable ait été faite, et 1, qui rejette les paquets ARP non sollicités. Nous avons donc
exécuté la commande suivante :

echo 1 > /proc/sys/net/ipv4/conf/all/drop_gratuitous_arp

Ensuite, nous avons redémarré la machine.

Testez la solution. Résultats ?

Après le redémarrage, nous remarquons que l'attaque est contrecarrée car elle ne parvient plus à
modifier les entrées de la table ARP.

Cette solution peut poser des problèmes en empêchant certaines fonctionnalités du réseau.
Désactivez là.

Recherchez maintenant une solution permettant de figer la correspondance entre MAC et IP dans la
table ARP à l'aide d'une option de la commande arp.

Il est envisageable d'ajouter manuellement les associations ARP en utilisant la commande suivante :
arp -s <@ip> <@Mac>. Suite à cette opération, la table ARP cesse d'être mise à jour
automatiquement.

Mettre en oeuvre cette solution. Conclusion ?

En effectuant des tests, nous constatons que l'attaque cesse de fonctionner et que la table ARP reste
inchangée, ne se mettant pas à jour.

Vous aimerez peut-être aussi