====== Scapy ====== ===== Einführung ===== * Einführungsvortrag von Tobias Rosenau: {{:ne:scapy_einführung.pdf|Scapy Einführung}} * https://0xbharath.github.io/art-of-packet-crafting-with-scapy/index.html - **The Art of Packet Crafting with Scapy** * https://thepacketgeek.com/series/building-network-tools-with-scapy/ * [[http://dirk-loss.de/scapy/Scapy_pyCologne_2010-01-13_DirkLoss_v1.1.pdf|Python user group Präsentation von Dirk Loss]] * Einführung auf Packetlevel.ch: http://www.packetlevel.ch/html/scapy/scapy.html * [[http://media.packetlife.net/media/library/36/scapy.pdf|Scapy Cheat Sheet]] * [[https://www.idsv6.de/Downloads/IPv6PacketCreationWithScapy.pdf|IPv6 Packet Creation With Scapy]] * [[https://www.youtube.com/watch?v=YKxKnVE5FaE&list=PLhfrWIlLOoKOc3z424rgsej5P5AP8yNKR|Python Network Hacking with Kali Linux and Scapy]] ===== Scapy benutzen ===== * Paket-Captures lesen und schreiben: [[ne:scapy_read_write_pcap|read/write *.pcap's]] * Pakete schnell versenden: [[scapy - fastest way to send packets]] **Übersicht:** ''ls()'' listet alle verfügbaren Protokolle und Protokoll-Optionen,\\ ''lsc()'' zeigt alle verfügbaren Scapy Kommandos. Man kann ''ls()'' auch auf ein generiertes Paket anwenden und zeigt die aktuellen sowie die Default-Werte der einzelnen Felder an: pkt = Ether()/IP()/UDP() ls(pkt) The ''summary()'' method provides a quick look at the packet’s layers: pkt.summary() The ''show()'' and ''show2()'' methods provide a deeper look into the packet structure: pkt.show() # hierarchische Ansicht pkt.show2() # fügt auch dynamisch berechnete Werte ein (Prüfsummen, etc.) The ''command()'' method returns a string with the commands necessary to recreate that packet: pkt.command() ''haslayer()'' and ''getlayer()'' test for the existence of a layer and return this layer. ===== Paketgenerierung ===== i = IP() t = UDP() # or TCP() t.sport = t.dport = 50000 d = "some data to send" p = i/t/d send(p) # sends at IP level sendp(Ether()/p) # sends at Ethernet level Auf die Felder der einzelnen Layer kann auch direkt zugegriffen werden: >>> p=IP()/UDP() >>> p[UDP].sport = 123 * [[ne:scapy:ipv6_ra|IPv6 Router Advertisements]] * [[ne:scapy:ipv6_na|IPv6 Neighbor Solicitations & Advertisements]] * https://github.com/mrizvic/scapy === Scapy-GUI === * https://github.com/albfan/scapy-gui-ipv6/blob/master/gui.py - **exportierter Code von Google** * https://github.com/Mellanox/scapy-ui ===== Generieren von Tunnelpaketen ===== * [[ne:scapy_6in4-paket|6in4 Tunnel-Paket]] * [[ne:scapy_6to4-paket|6to4 Tunnel Paket]] * [[ne:scapy_isatap-paket|ISATAP Tunnel Paket]] * [[ne:scapy_teredo-paket|Teredo Tunnel Paket]] * [[ne:scapy_ayiya-paket|AYIYA Tunnel Paket]] * [[ne:scapy_v4inv6-paket|IPv4-in-IPv6]] * [[ne:scapy_raw_data|Raw Daten encodieren/decodieren]] ===== Fehlende Protokolle ===== * IPsec ([[http://article.gmane.org/gmane.comp.security.scapy.general/4340|nicht geplant]]) * 6LoWPAN ([[http://article.gmane.org/gmane.comp.security.scapy.general/4299|projekt]]) * [[ne:scapy:new_protocol|Erstellung eines eigenen Protokoll-Layers]] ===== Fragmentierung ===== * [[ne:scapy_fragment_v6-packets|IPv6-Pakete fragmentieren]] ===== Dokumentation ===== * [[https://scapy.readthedocs.io/en/latest/troubleshooting.html|Troubleshooting FAQ]] * [[https://scapy.readthedocs.io/en/latest/routing.html|Routing & Netzwerk-Konfiguration]] ===== WLAN ===== * http://www.cs.toronto.edu/~arnold/427/18s/427_18S/indepth/scapy_wifi/scapy_tut.html * https://www.4armed.com/blog/forging-wifi-beacon-frames-using-scapy/ * https://stackoverflow.com/questions/10818661/scapy-retrieving-rssi-from-wifi-packets ===== Verschiedenes ===== * Das Capturing/Decoding ist langsam ([[http://article.gmane.org/gmane.comp.security.scapy.general/4319|cf]]) bei Problemen kann zusätzlich [[http://code.google.com/p/pypcap/|pypcap]] benutzt werden ([[http://article.gmane.org/gmane.comp.security.scapy.general/4421|cf]]) * Unter Windows sind möglicherweise nicht alle Interfaces nutzbar ([[https://github.com/secdev/scapy/issues/1542|nur die über pcap angebotenen]]): winList = get_windows_if_list() intfList = get_if_list() # Pull guids and names from the windows list guidToNameDict = { e["guid"]: e["name"] for e in winList} # Extract the guids from the interface list guidsFromIntfList = [(e.split("_"))[1] for e in intfList] # Using the interface list of guids, pull the names from the # Windows map of guids to names namesAllowedList = [guidToNameDict .get( e ) for e in guidsFromIntfList] * Für feste und wiederkehrende Test-Abläufe ist [[https://www.secdev.org/projects/scapytain/|scapytain]] praktisch. Es erlaubt die Definition vieler Tests (mit ja/nein-Resultaten) mit Gruppierungen und Abhängigkeiten. * anderes penetration test tool auf Scapy-Basis: http://inguma.eu/projects/inguma * Scapy-Pakete haben (undokumentiert) auch Zeitstempel. Alle Pakete haben das Attribut ''time'' für den Zeitpunkt der Erstellung (d.h. Instanziierung von ''Packet()''). -- Beim Senden wird zudem das Attribut ''sent_time'' gesetzt. Bsp.: >>> res,unans = srloop(IP(dst=server)/UDP()/DNS(rd=1, id=1, qd=DNSQR(qname=name, qtype=0xff, qclass="IN")), count = 3) >>> [res[x][0].time for x in range(len(res))] [1323265992.993212, 1323265992.993212, 1323265992.993212] >>> [res[x][0].sent_time for x in range(len(res))] [1323265993.054496, 1323265994.0183351, 1323265995.0216329] Aarghh... das ganze funktioniert allerdings nur für einzelne Pakete und nicht für Listen... m.E. ein [[http://trac.secdev.org/scapy/ticket/687|Bug]]. * Mit den ''stopper*''-Argumenten lässt sich die Funktion ''sniff'' auch in Threads benutzen und 'von außen' beenden ([[http://trac.secdev.org/scapy/wiki/PatchSelectStopperTimeout|Beispiel/Doku]]). Alternative Implementierung: mit [[http://trac.secdev.org/scapy/ticket/627|multiprocessing.Event]] ===== Installation ===== * https://changecheng.github.io/technology/2017/01/15/how-to-install-scapy-on-macos-sierra.html * https://stackoverflow.com/questions/46602880/importerror-no-module-named-scapy-all * https://hub.docker.com/r/travelping/scapy - **Scapy via Docker**