J'essaie d'envoyer un trafic enregistré précédemment (capturé au format pcap) avec scapy. Actuellement, je suis coincé dans la couche d'éther d'origine. Le trafic a été capturé sur un autre hôte et je dois fondamentalement changer à la fois les couches src et dst des couches Ether et Ether. J'ai réussi à remplacer la couche IP et à recalculer les sommes de contrôle, mais la couche Ether me pose problème.
Quelqu'un a-t-il de l'expérience dans l'envoi de paquets à partir d'un fichier de capture avec les modifications appliquées aux couches IP et Ether (src et dst)? En outre, la capture est plutôt un gros couple de Gb, que diriez-vous des performances de scapy avec une telle quantité de trafic?
vérifier cet exemple
from scapy.all import *
from scapy.utils import rdpcap
pkts=rdpcap("FileName.pcap") # could be used like this rdpcap("filename",500) fetches first 500 pkts
for pkt in pkts:
pkt[Ether].src= new_src_mac # i.e new_src_mac="00:11:22:33:44:55"
pkt[Ether].dst= new_dst_mac
pkt[IP].src= new_src_ip # i.e new_src_ip="255.255.255.255"
pkt[IP].dst= new_dst_ip
sendp(pkt) #sending packet at layer 2
commentaires:
sniff(offline="filename")
pour lire les paquets et vous pouvez utiliser le paramètre prn comme ceci sniff(offline="filename",prn=My_Function)
dans ce cas, My_Functions sera appliqué à chaque commande snifféeip="1.1.1.1"
et ainsi de suite, comme illustré ci-dessus.Si j'étais vous, je laisserais Scapy s'occuper de la couche Ether
et utiliser la fonction send()
. Par exemple:
ip_map = {"1.2.3.4": "10.0.0.1", "1.2.3.5": "10.0.0.2"}
for p in PcapReader("filename.cap"):
if IP not in p:
continue
p = p[IP]
# if you want to use a constant map, only let the following line
p.src = "10.0.0.1"
p.dst = "10.0.0.2"
# if you want to use the original src/dst if you don't find it in ip_map
p.src = ip_map.get(p.src, p.src)
p.dst = ip_map.get(p.dst, p.dst)
# if you want to drop the packet if you don't find both src and dst in ip_map
if p.src not in ip_map or p.dst not in ip_map:
continue
p.src = ip_map[p.src]
p.dst = ip_map[p.dst]
# as suggested by @AliA, we need to let Scapy compute the correct checksum
del(p.chksum)
# then send the packet
send(p)
Eh bien, avec scapy je suis venu avec ce qui suit (désolé pour mon python). Espérons que cela aidera quelqu'un. Il y avait un scénario plus simple possible dans lequel tous les paquets du fichier pcap sont lus en mémoire, mais cela pourrait entraîner des problèmes avec les gros fichiers de capture.
from scapy.all import *
global src_ip, dst_ip
src_ip = 1.1.1.1
dst_ip = 2.2.2.2
infile = "dump.pcap"
try:
my_reader = PcapReader(infile)
my_send(my_reader)
except IOError:
print "Failed reading file %s contents" % infile
sys.exit(1)
def my_send(rd, count=100):
pkt_cnt = 0
p_out = []
for p in rd:
pkt_cnt += 1
np = p.payload
np[IP].dst = dst_ip
np[IP].src = src_ip
del np[IP].chksum
p_out.append(np)
if pkt_cnt % count == 0:
send(PacketList(p_out))
p_out = []
# Send remaining in final batch
send(PacketList(p_out))
print "Total packets sent %d" % pkt_cn
Pour que la somme de contrôle soit correcte, j’avais également besoin d’ajouter del p[UDP].chksum