[PYTHON] Scapy-Tipps

Überblick

scapy Tips Collection (nacheinander hinzugefügt)

Offizielle Dokumentation

https://scapy.readthedocs.io/en/latest/

Scapy API reference https://scapy.readthedocs.io/en/latest/api/scapy.html

Tips

Ich möchte den Schnittstellennamen des Ethernet-Adapters wissen

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']},
   ...

Memo

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

image.png

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?

Ich möchte die Zusammenfassung (IP-Adresse, Port) des empfangenen Pakets vorerst einfach an die Konsole senden

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>

Ich möchte ein Paket in einem anderen Thread empfangen und an log + pcap ausgeben.

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

Scapy-Tipps
Python-Tipps
Jupyters Trick 4
numpy tipps
Jupyters Trick 5
Jupyters Trick 3
Jupyters Trick 2
scapy IPv6
Python-Tipps
Python-Tipps
Python Conda Tipps
Djangos persönliche Tipps
Tipps zum Python-Debuggen
Python-Klick-Tipps
[Pandas] GroupBy-Tipps
Unerwartet (?) Python Bean Wissen
Tensorflow meine eigenen Tipps
Tipps für Django-Vorlagen
Stoff Schreibtipps
LTTng Tracing-Tipps
Choregraphe Tips Collection