Challenge Lab 03 — ARP & Scapy
⚠️ Avertissement légal & éthique — L’ARP spoofing perturbe le réseau et peut intercepter du trafic. N’exécutez ces exercices que sur un réseau de lab isolé (Host‑Only / Internal) que vous contrôlez intégralement. Jamais sur un réseau tiers (université, travail, domicile connecté à Internet).
Exercice 1 — OSI (rappel ciblé)
Objectif : situer ARP par rapport aux couches 2/3.
Énoncé : En 3–5 lignes, expliquez pourquoi ARP « relie » IP (couche 3) et Ethernet (couche 2). Donnez un exemple : « envoyer un paquet IP à 192.168.56.20 » implique quoi côté adresse MAC ?
Indices : IP a besoin d’un MAC destination pour encapsuler le paquet dans une trame Ethernet.
Exercice 2 — Champs d’une trame ARP
Objectif : identifier les champs utiles.
Énoncé : Dressez la correspondance op, psrc/pdst, hwsrc/hwdst et dites ce que vaut op pour Request et pour Reply. À quoi servent psrc et hwsrc dans un Reply forgé ?
Indices : op=1 (Request), op=2 (Reply).
Exercice 3 — Installation & smoke test Scapy
Objectif : vérifier l’environnement.
Énoncé : Installez Scapy puis lancez un mini‑script Python qui importe ARP et Ether et affiche « scapy OK ». Sous Linux, rappelez la contrainte d’exécution (droits).
Indices : pip install scapy; exécution avec sudo pour l’envoi de paquets bruts.
Exercice 4 — Construire une ARP Request (sans émission)
Objectif : manipuler les couches avec /.
Énoncé : En Python, créez : arp = ARP(op=1, pdst='192.168.56.20') puis frame = Ether(dst='ff:ff:ff:ff:ff:ff')/arp. Affichez frame.summary() et frame.show().
Indices : ls(ARP()) pour lister les champs ; hexdump(frame) pour voir les octets.
Exercice 5 — Résoudre l’adresse MAC d’une IP (Layer 2)
Objectif : interroger le réseau en broadcast.
Énoncé : Écrivez get_mac(ip) -> str|None qui envoie un broadcast Ether/ARP et retourne hwsrc de la réponse. Ne tentez que sur la plage 192.168.56.0/24 (lab Host‑Only) et ajoutez un petit timeout + retries.
Indices : srp(Ether()/ARP(...), timeout=2, verbose=False) renvoie (answered, unanswered).
Exercice 6 — send() vs sendp()
Objectif : distinguer L3 vs L2.
Énoncé : En une phrase pour chacun, indiquez quand utiliser send() et quand utiliser sendp() ; que faut‑il pour ARP ?
Indices : ARP vit en couche 2 → sendp().
Exercice 7 — Forger un ARP Reply (tir unique, lab‑safe)
Objectif : préparer un paquet de spoof.
Énoncé : Écrivez forge_reply(target_ip, target_mac, spoof_ip) qui retourne un Ether/ARP Reply prétendant « spoof_ip est à mon MAC ». N’envoyez pas encore ; contentez‑vous de show()/hexdump().
Indices : Dans ARP(...), définissez op=2, pdst, hwdst, psrc ; ne pas fixer hwsrc (Scapy mettra le MAC local).
Exercice 8 — Envoi unique (optionnel, 1 paquet)
Objectif : valider la forme sur le lab.
Énoncé : Ajoutez une fonction spoof_once(...) qui appelle sendp(frame, count=1, verbose=False). Exécutez‑la une seule fois et observez la table ARP de la victime (arp -n).
Indices : Limitez‑vous au lab isolé ; préférez un retour arrière rapide.
Exercice 9 — Restauration ARP
Objectif : remettre l’état légitime.
Énoncé : Écrivez restore(dest_ip, src_ip, dest_mac, src_mac) qui envoie 5 ARP Reply légitimes « src_ip est à src_mac » vers dest_ip.
Indices : même schéma Ether/ARP, mais cette fois hwsrc = src_mac.
Exercice 10 — Boucle d’empoisonnement (itérations limitées)
Objectif : simuler le rafraîchissement périodique.
Énoncé : Créez une boucle qui répète 3 cycles : (a) spoof vers victime (gateway→MAC attaquant), (b) spoof vers gateway (victime→MAC attaquant), (c) sleep(interval). Ne dépassez pas 3 itérations pour conserver un lab propre.
Indices : un vrai MITM enverrait en continu (1–2 s) — ici, on limite.
Exercice 11 — IP forwarding (lecture/écriture prudente)
Objectif : comprendre l’effet sur la connectivité.
Énoncé : Écrivez enable_ip_forwarding() et disable_ip_forwarding() qui lisent/écrivent /proc/sys/net/ipv4/ip_forward sous Linux. Ne modifiez que si nécessaire et restaurez l’état initial en fin d’exercice.
Indices : lire l’état d’abord ; ne pas désactiver si c’était déjà activé.
Exercice 12 — Détecteur ARP minimal
Objectif : repérer un ARP spoofing.
Énoncé : Écrivez un sniffer Scapy (filtre arp) qui garde un dict {psrc -> hwsrc} ; si une nouvelle réponse (op=2) annonce un psrc déjà connu avec un autre hwsrc, affichez Alerte.
Indices : sniff(filter='arp', prn=callback, store=False) ; testez pendant votre tir unique.
By Wahid Hamdi