验证网络转储(PCAP文件)上的DoS/DDoS攻击

2024-09-26 18:14:56 发布

您现在位置:Python中文网/ 问答频道 /正文

from scapy.all import *
import dpkt

f1 = open("semAtaque.pcap")
pcap = dpkt.pcap.Reader(f1)
f1.close()

f2 = open("Ataques.pcap")
pcap = dpkt.pcap.Reader(f2)
f2.close()

我有两个实验室实验的网络流量:一个没有攻击(塞马塔克.pcap)另一个是DDoS攻击(攻击.pcap). 在

为了验证实验是否有效,我需要首先检查服务器是否拒绝了服务、何时发生以及服务器缓冲区在整个攻击期间的情况(攻击.pcap). 在

遭受攻击的服务器的IP:192.168.1.5

如何在攻击前后检查服务器缓冲区的状态?在

如何检查服务器是否拒绝服务以及何时拒绝服务?在

^{pr2}$

我需要知道在服务器崩溃之前请求了多少个连接!!在


Tags: fromimport服务器closepcapopenallreader
1条回答
网友
1楼 · 发布于 2024-09-26 18:14:56

您可以在Python中使用一个简单的lambda函数从数据包中提取源IP地址和目标IP地址,因此我将其与队列结合起来计算移动平均值,并围绕它设计了这个脚本。这是一个黑客,但它能满足你的需要。在

要了解服务器的服务(或缺少服务)是如何随时间变化的,您可以遍历所有数据包,并查找以服务器IP作为源或目标的数据包。如果一个数据包被发送到服务器,我们将其称为+1,如果从服务器发送数据包,我们将其称为-1。现在我们可以开始量化流量是传入还是传出。在

把这些放在一起,我们使用一个固定长度(即窗口大小)的Python双头队列(deque)来移动数据包,当我们发现一个数据包到达或来自服务器时,我们将a+1或a-1存储在deque中。现在,如果我们取deque中所有数字的平均值,我们将得到该服务器的出站流量与入站流量的比率。平均值接近-1表示移动窗口主要看到来自服务器的出站流量;平均值为0表示出站和入站数据包的数量相等;平均值接近+1意味着我们有大量的入站流量。这将打印队列中所有值的平均值。在

这使用了30个数据包的移动窗口;这肯定需要根据您的流量水平进行调整。这将筛选每个数据包,并在找到符合条件的数据包时填充队列。一旦队列满了,它将弹出旧值并推送新值,向前推进30个数据包或N个数据包的移动窗口,并在每次提前窗口时打印窗口中所有出列值的平均值。在

from scapy.all import *
from collections import deque

def print_attack_measure(pcap_file):
    plist = rdpcap(pcap_file)
    server_ip = "127.0.0.1"
    n = 300
    d = deque(maxlen=n)

    # If you want source/destination IP addresses
    getsrcdst = lambda x:(x.src,x.dst)
    # If you want MAC addresses
    getmacs   = lambda x:(x.addr1, x.addr2, x.addr3)

    def filterpackets(ip):
        for p in plist:
            try:
                c = getsrcdst(p)
                if(ip in c[0]):
                    # server IP is source IP of packet
                    yield -1
                if(ip in c[1]):
                    # server IP is destination IP of packet
                    yield 1
            except AttributeError:
                pass


    print("This prints a measure of packets received to packets sent, using a moving average of %d packets."%(n))
    print("0 indicates a perfect balance of sent-received.")
    print("+1 indicates all packets are sent to the server.")
    print("-1 indicates all packets are sent by the server.")
    print("A larger positive number indicates an unresponsive server.")

    count = 0
    for pack in filterpackets(server_ip):
        d.append(pack)
        count += 1
        if(count>n):
            print("%0.4f"%(sum(d)/(1.0*n)))

然后可以对两个pcap文件调用函数,并检查/比较输出:

^{pr2}$

您也可以将上面的print函数更改为打印到一个文件,并在Matplotlib或电子表格程序中可视化输出。在

注意:此脚本使用数据包到达率(而不是基于时间的速率)来计算服务器可用性的变化,但这是一个很好的首次通过解决方案。您可以以此为基础,通过(例如)从每个数据包中提取时间戳、按时间间隔对数据包进行分块(使用字典)以及再次使用+1/-1系统来设计基于时间的内容。在

编辑:i有一种方法可以一次读取一个大的pcap文件,而不是将它们加载到内存中。Scapy Readme结尾的示例:

with PcapReader('filename.pcap') as pcap_reader:
    for pkt in pcap_reader:
        #do something with the packet

你应该换掉

    plist = rdpcap(pcap_file)

有了这个:

    with PcapReader(pcap_file) as plist:

相关的Scapy issue on Github。在

相关问题 更多 >

    热门问题