Inhaltsverzeichnis
Scapy
Einführung
- Einführungsvortrag von Tobias Rosenau: Scapy Einführung
- https://0xbharath.github.io/art-of-packet-crafting-with-scapy/index.html - The Art of Packet Crafting with Scapy
- Einführung auf Packetlevel.ch: http://www.packetlevel.ch/html/scapy/scapy.html
Scapy benutzen
- Paket-Captures lesen und schreiben: 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
Scapy-GUI
- https://github.com/albfan/scapy-gui-ipv6/blob/master/gui.py - exportierter Code von Google
Generieren von Tunnelpaketen
Fehlende Protokolle
- IPsec (nicht geplant)
- 6LoWPAN (projekt)
Fragmentierung
Dokumentation
WLAN
Verschiedenes
- Unter Windows sind möglicherweise nicht alle Interfaces nutzbar (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 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 vonPacket()
). – Beim Senden wird zudem das Attributsent_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 Bug.
- Mit den
stopper*
-Argumenten lässt sich die Funktionsniff
auch in Threads benutzen und 'von außen' beenden (Beispiel/Doku). Alternative Implementierung: mit multiprocessing.Event