我正在解析PCAP文件,我只需要提取TCP标志(SYN)来检测SYN Flood攻击。 我使用Python和scapy。
主要目标是检测SYN泛洪攻击! 我需要为每个IP地址计算一些TCP标志(SYN)并打印一个列表: {IP:SYN标志的数量}按SYN标志的数量排序。 有人能帮助我吗?
# -*- coding: utf-8 -*-
from scapy.all import *
pkts = PcapReader("test.pcap")
dict_ips = dict()
答案 0 :(得分:2)
您尝试执行的操作的最佳对象是Counter
(来自collections
)。
“不那么Pythonic”(但如果你不熟悉Python则更容易阅读)的写作方式是:
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
很容易将其理解为:
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
)
然后,Counter
的行为类似于dict
对象:
>>> count["1.2.3.4"]
12
但是Counter
有一个方便的.most_common()
方法:
>>> count.most_common(1)
[('1.2.3.4', 12)]
>>> count.most_common()
[('1.2.3.4', 12), [...]]
作为结论,我必须提到Scapy在解析大量数据包时表现不佳(如果我们谈论洪水,可能就是这种情况)。如果我是你,我仍会使用Counter
,但我会使用subprocess.Popen()
来tcpdump
或tshark
来代替Scapy PcapReader
来生成来源}。