用Python发送手工构建的BPDU(生成树协议包)

2024-09-24 08:27:29 发布

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

我试图发送手工制作的BPDU-TCN包(以及其他一些属于不同协议的包)来测试我的网络实验室是否存在DoS攻击。在

我找到了this answer,但没用。在

我尝试过使用原始套接字和scapy,但没有成功。在

这是我使用原始套接字的代码:

from socket import *
from struct import pack
class EthFrame():
    def __init__(self, dst_addr='', src_addr='',  llc_header ='',  payload =''):
        self.dst_addr = dst_addr
        self.src_addr = src_addr
        self.llc_header = llc_header
        self.payload = payload
        self.header = pack('!s', self.dst_addr + self.src_addr + self.llc_header)  
        self.frame = pack('s',  self.header + self.payload)

    def sendFrame(self,  interface):
        s = socket(AF_PACKET,  SOCK_RAW)
        s.bind((interface, 0))
        s.send(self.frame)

p = EthFrame(b'\x01\x80\xC2\x00\x00\x00',  b'\x00'*6,  b'\x42\x42\x03',  b'\x00\x00\x00\x80')
p.sendFrame('eth0')

结果是一个格式错误的数据包,只包含一个字节-“00000010”。 就我在文档中读到的,NIC应该自己添加CRC和填充位。在

{这是我的代码:

^{pr2}$

它还发送一个格式错误的包,这次包含两个字节。在

我正在准备的数据包在第5页中描述,共this pdf document。在

我在用Linux。在

----编辑: 按照奥利弗的建议,我将从链接文档中添加信息。在

TCN(拓扑更改通知)BPDU包是第2层以太网(I)包。根据硬件供应商的不同,BPDU包的结构也有细微的差别。在这个例子中,我使用的是CISCO实现。在

以太网头应始终将目标地址设置为01:80:C2:00:00:00(STP多播地址)。在

在以太网报头之后,TCN BPDU应包括:
逻辑链路控制-3字节,始终设置为[0x42,0x42,0x03]
BPDU头-4字节,对于TCN BPDU始终设置为[0x00,0x00,0x00,0x80]

后跟填充(在本例中,39字节设置为0x00)


Tags: 代码fromselfsrc字节thispackdst
1条回答
网友
1楼 · 发布于 2024-09-24 08:27:29

您忘记了包中的以太网长度,即源以太网地址和LLC之间的长度。在您的情况下,它将是7(LLC为3字节,STP为4字节)。在代码中,替换:

        self.header = pack('!s', self.dst_addr + self.src_addr + self.llc_header)  
        self.frame = pack('s',  self.header + self.payload)

签署人:

^{pr2}$

但正如@Yoel所建议的,您最好的选择是使用Scapy:

>>> sendp(Dot3(dst="01:80:c2:00:00:00")/LLC()/STP(bpdutype=128))

或者,如果你想直接打造自己的有限责任公司级别:

>>> sendp(Dot3(dst="01:80:c2:00:00:00")/LLC('\x42\x42\x03\x00\x00\x00\x80'))

相关问题 更多 >