如何从pcap文件中提取TCP SYN标志并使用Python(Scapy)检测SYN Flood攻击?

时间:2016-07-01 22:37:36

标签: python python-3.x tcp

我正在解析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() 

1 个答案:

答案 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()tcpdumptshark来代替Scapy PcapReader来生成来源}。