scapy Tips Collection (nacheinander hinzugefügt)
https://scapy.readthedocs.io/en/latest/
Scapy API reference https://scapy.readthedocs.io/en/latest/api/scapy.html
Tips
Verwenden Sie get_windows_if_list ().
Sie kann im Parameter jeder API auf iface gesetzt werden.
Referenz
[Scapy can't see_use some Ethernet interfaces on Windows · Issue #1542 · secdev_scapy · GitHub]( https://webcache.googleusercontent.com/search?q=cache:qS0tKu17dBoJ: https://github.com/secdev/scapy/issues/1542) geschrieben in gpotter2, kommentiert am 7. August 2018d
Code
from scapy.all import *
get_windows_if_list()
Ergebnis
Der Wert von name kann im Argument iface jeder API festgelegt werden. Im folgenden Beispiel "Ethernet 6", "Ethernet 2" usw. Suchen Sie den gewünschten Ethernet-Adapter anhand der MAC- oder IP-Adresse. Sie können den Namen auf iface setzen.
In [6]: from scapy.all import *
...: get_windows_if_list()
Out[6]:
[{'name': 'Ethernet 6',
'win_index': 15,
'description': 'ASIX AX88179 USB 3.0 to Gigabit Ethernet Adapter #2',
'guid': '{93E3CFB5-11A7-43F4-9BE0-E42AD69529A3}',
'mac': '74:03:bd:7f:83:21',
'ipv4_metric': 5,
'ipv6_metric': 5,
'ips': ['fe80::b964:9105:342:b0e1', '192.168.51.123']},
...
{'name': 'Ethernet 2',
'win_index': 11,
'description': 'Intel(R) Ethernet Connection (5) I219-LM',
'guid': '{6091155D-A8EA-491C-BA3D-CD5CB22B29BE}',
'mac': '40:b0:34:1a:78:6f',
'ipv4_metric': 25,
'ipv6_metric': 0,
'ips': ['10.168.38.67']},
...
~~ Nmap Loopback Adapter (ein virtueller Adapter zum Überprüfen der Kommunikation zwischen 127.0.0.1) wird auch hier angezeigt, aber wenn ich versuche, das von sniff () erhaltene Paket mit wrpcap () in pcap zu konvertieren, schlägt dies fehl. Nachforschungen anstellen. ~~
Es trat auch auf der realen Schnittstelle auf. Was in der realen Schnittstelle passiert ist, ist, dass das von sniff () erhaltene Paket in der Liste gespeichert ist. Es war, weil ich es an wrpcap () weitergab. In Bezug auf das Bild war es wie folgt.
[<Sniffed: TCP:0 UDP:5 ICMP:0 Other:5>, <Sniffed: TCP:0 UDP:5 ICMP:0 Other:5>, ...]
(Ich habe eine Liste von Instanzen von scapy.plist.PacketList erstellt.)
Obwohl append () usw. nicht unterstützt wurde, konnte + =
verwendet werden, sodass die folgende Schreibmethode möglich war.
all_packets = None
#Schleife
...
pkts = scpy.sniff(iface="Ethernet 4", count=10)
if all_packets :
all_packets += pkts #Nach dem ersten Mal+=Ich werde es mit hinzufügen.
else:
all_packets = pkts #Erstes Mal
wrpcap(fname, all_packets )
Es scheint nutzlos zu sein, wenn Loopback Pseudo-Interface 1 ausgewählt ist, wenn Sie Loopback ("127.0.0.1") sehen möchten.
File "C:\Python37\lib\site-packages\scapy\arch\windows\__init__.py", line 706, in dev_from_pcapname
raise ValueError("Unknown pypcap network interface %r" % pcap_name)
ValueError: Unknown pypcap network interface 'Loopback Pseudo-Interface 1'
Als ich "Npcap Loopback Adapter" auf ifcace stellte, konnte ich das pcap von "127.0.0.1" erhalten. Wenn Sie jedoch den "Npcap Loopback Adapter" direkt mit Wireshark messen, können Sie das Paket ordnungsgemäß analysieren. Wenn ich die erfasste PCAP öffne, wird N / A angezeigt, obwohl die Daten identisch sind.
Gibt es ein Problem, da Sie die eigentliche Schnittstelle erhalten können? .. .. Möchten Sie eine Qualitätssicherung mit Github- oder Stapelüberlauf durchführen? .. ..
https://github.com/nmap/nmap/issues/200 Durch https://wiki.wireshark.org/NullLoopback Es ist geworden?
Referenz
scapy.sendrecv.sniff(*args, **kwargs) https://scapy.readthedocs.io/en/latest/api/scapy.sendrecv.html#scapy.sendrecv.sniff
Code
Das Folgende ist eine synchrone Methode, daher müssen Sie sie mit Strg + C stoppen. Es ist auch möglich, Stoppbedingungen basierend auf der Anzahl der empfangenen Pakete und dem Timeout festzulegen.
from scapy.all import *
sniff(iface='Ethernet 4', prn=lambda x: x.summary())
Ergebnis
In [7]: from scapy.all import *
...: sniff(iface='Ethernet 4', prn=lambda x: x.summary())
Ether / IP / UDP 192.168.50.12:30490 > 237.50.0.1:30490 / Raw
Ether / IP / UDP 192.168.50.12:30490 > 237.50.0.1:30490 / Raw
Ether / IP / UDP 192.168.50.12:30490 > 237.50.0.1:30490 / Raw
Ether / IP / UDP 192.168.50.12:30490 > 237.50.0.1:30490 / Raw
Ether / IP / UDP 192.168.50.12:30490 > 237.50.0.1:30490 / Raw
Ether / IP / UDP 192.168.50.12:30490 > 237.50.0.1:30490 / Raw
Ether / IP / UDP 192.168.50.12:30490 > 237.50.0.1:30490 / Raw
Ether / ARP who has 192.168.51.2 says 192.168.51.1 / Padding
Ether / IP / UDP 192.168.50.12:30490 > 237.50.0.1:30490 / Raw
Ether / ARP who has 192.168.51.2 says 192.168.51.1 / Padding
Ether / ARP who has 192.168.51.2 says 192.168.51.1 / Padding
Ether / IP / UDP 192.168.50.12:30490 > 237.50.0.1:30490 / Raw
Ether / ARP who has 192.168.51.2 says 192.168.51.1 / Padding
Ether / ARP who has 192.168.51.2 says 192.168.51.1 / Padding
Ether / IP / UDP 192.168.50.12:30490 > 237.50.0.1:30490 / Raw
Ether / ARP who has 192.168.51.2 says 192.168.51.1 / Padding
Ether / ARP who has 192.168.51.2 says 192.168.51.1 / Padding
Out[7]: <Sniffed: TCP:0 UDP:10 ICMP:0 Other:7>
AsyncSniffer wird separat geschrieben.
Hier ist ein Beispiel einer Klasse, die eine Methode zum Erstellen von pcap basierend auf dem Artikel Netzwerkprogrammierung mit Python Scapy --Qiita hinzufügt.
Code
import threading
import scapy.all as scpy
import datetime
from logging import getLogger, basicConfig, NullHandler,DEBUG, INFO, WARNING
mylogger = getLogger(__name__)
mylogger.addHandler(NullHandler())
class Sniffer(threading.Thread):
def __init__(self, iface, count=20, timeout=3, logger=None):
self.stop_event = threading.Event() #Flagge zum Stoppen
self.thread = threading.Thread(target = self._sniffer_main_loop)
self.iface = iface
self.count = count
self.timeout = timeout
self.packets = None
if logger:
self.log = logger
else:
self.log = mylogger
def start(self):
self.log.debug(f"try to start thread.")
self.packets = None
self.stop_event.clear()
self.thread.start()
def stop(self):
self.log.debug(f"try to stop thread.")
self.stop_event.set()
self.thread.join()
def _sniffer_main_loop(self):
self.log.debug(f"start thread.")
try:
while not self.stop_event.is_set():
pkts = scpy.sniff(iface=self.iface, count=self.count, timeout=self.timeout)
if self.packets:
self.packets += pkts
else:
self.packets = pkts
except Exception as e:
self.log.error(f"exception occurred. stop sniffer main loop. {e}")
self.stop_event.set()
self.log.debug(f"end thread.")
def create_pcap(self, fname=datetime.datetime.now().strftime("doip_test_%H%M%S.cap")):
self.stop() if not self.stop_event.is_set() else None
scpy.wrpcap(fname, self.packets)
Ergebnis
Die Verwendung wird separat hinzugefügt.
Recommended Posts