2016-07-01 8 views
1

Ich analysiere eine PCAP-Datei und ich muss nur TCP-Flags (SYN) extrahieren, um einen SYN-Flood-Angriff zu erkennen. Ich benutze Python und Scapy.Wie kann ich TCP-SYN-Flag aus PCAP-Datei extrahieren und SYN-Flood-Angriff mit Python (Scapy) erkennen?

Das Hauptziel ist eine Möglichkeit, einen SYN-Überflutungsangriff zu erkennen! Ich muss eine Anzahl von TCP-Flags (SYN) für jede IP-Adresse zählen und eine Liste drucken mit: {IP: Nummer des SYN-Flags} sortiert nach der Nummer des SYN-Flags. Könnte mir jemand helfen?

# -*- coding: utf-8 -*- 
from scapy.all import * 
pkts = PcapReader("test.pcap") 
dict_ips = dict() 
+0

Danke. Wie kann ich eine Liste drucken mit: {IP: Nummer des SYN-Flags} sortiert nach der Nummer des SYN-Flags? –

+0

Sie können die IP-Adresse in ein Wörterbuch als den Schlüssel und die Zählung als Wert setzen, dann sortieren – spicyramen

+0

Ich habe versucht, aber funktioniert nicht: https://bpaste.net/show/0094b136f276 –

Antwort

1

Das beste Objekt für das, was Sie zu tun versuchen, ist ein Counter (von collections).

Der „nicht-so-Pythonic“ (aber einfacher zu lesen, wenn Sie nicht zu Python gewohnt sind) wäre Weg, dies zu schreiben:

from scapy.all import PcapReader, TCP 
from collections import Counter 
count = Counter() 
for pkt in PcapReader("test.pcap"): 
    if TCP in pkt and pkt[TCP].flags & 2: # TCP SYN packet 
     src = pkt.sprintf('{IP:%IP.src%}{IPv6:%IPv6.src%}') 
     count[src] += 1 

Es ist einfach, dies als ein Verständnis zu schreiben:

Dann
from scapy.all import PcapReader, TCP 
from collections import Counter 
count = Counter(
    pkt.sprintf('{IP:%IP.src%}{IPv6:%IPv6.src%}') 
    for pkt in PcapReader('test.pcap') 
    if TCP in pkt and pkt[TCP].flags & 2 
) 

, ein Counter verhält sich wie ein dict Objekt:

>>> count["1.2.3.4"] 
12 

Aber ein Counter hat eine handliche .most_common() Methode:

>>> count.most_common(1) 
[('1.2.3.4', 12)] 
>>> count.most_common() 
[('1.2.3.4', 12), [...]] 

Als Schlussfolgerung, die ich erwähnen muß, dass scapy schlechte Leistungen, wenn es um das Parsen eine Menge von Paketen kommt (und wenn wir über Flut sprechen, das auch sein mag der Fall). Wenn ich Sie wäre, würde ich immer noch eine Counter verwenden, aber ich würde die Quellen mit einem subprocess.Popen() Anruf tcpdump oder tshark anstelle von Scapys PcapReader generieren.

+1

Danke für Ihre Hilfe! –