====== 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**