简体   繁体   English

使用 Scapy 设置 BGP 层

[英]Setting up BGP Layer Using Scapy

I am trying to use Scapy to send packets that have a BGP layer我正在尝试使用 Scapy 发送具有 BGP 层的数据包

I am currently stuck on a rudimentary part of this problem because I am unable to set up the BGP layer.我目前停留在这个问题的基本部分,因为我无法设置 BGP 层。 I followed the instructions to set up the regular IP and TCP Layer.我按照说明设置了常规的 IP 和 TCP 层。

Eg:例如:

>>a=IP(src="192.168.1.1",dst="192.168.1.2")/TCP(sport=179,dport=50)

But the problem arises when I do this:但是当我这样做时出现了问题:

>>a=a/BGP()
NameError: name BGP is not defined

I have seen the BGP implementations in the contrib file from Scapy Github ( https://github.com/secdev/scapy/blob/9201f1cf1318edd5768d7e2ee968b7fba0a24c5e/scapy/contrib/bgp.py ) so I think Scapy does support BGP implementations我在 Scapy Github ( https://github.com/secdev/scapy/blob/9201f1cf1318edd5768d7e2ee968b7fba0a24c5e/scapy/contrib/bgp.py ) 的 contrib 文件中看到了 BGP 实现,所以我认为 Scapy 确实支持 BGP 实现

I am new to.networking so I was wondering if you could help me set up the BGP layer我是网络新手,所以我想知道您是否可以帮助我设置 BGP 层

Thanks for taking the time to read this!感谢您抽时间阅读!

We want a BGP Layer using scapy.我们想要一个使用 scapy 的 BGP 层。 As BGP travels over TCP. So we must have a established ( 3 way handshake ) tcp socket.由于 BGP 遍历 TCP。所以我们必须有一个已建立的( 3 次握手)tcp 套接字。 And TCP travels over IP. Thus we can represent full packet in the below format. TCP 遍历 IP。因此我们可以用以下格式表示完整的数据包。

packet = IP Layer / TCP Layer / BGP Layer
But BGP itself is divided in two parts, BGP Header and BGP Payload (EG: OPEN, UPDATE, etc ).但是 BGP 本身分为两部分,BGP Header 和 BGP Payload (EG: OPEN, UPDATE, etc )。 So the above layer is represented as given below.所以上面的层表示如下。

packet = IP Layer / TCP Layer / BGP Header / BGP payload
Here BGP Header specifies authentication, length and type of BGP Payload.To represent whole thing in scapy, we can do the following excercise.这里 BGP Header 指定 BGP 有效载荷的身份验证、长度和类型。为了在 scapy 中表示整个事物,我们可以进行以下练习。 (I am assuming here that you have an established TCP socket.) (我在这里假设您有一个已建立的 TCP 套接字。)

from scapy.layers.inet import IP, TCP
from scapy.contrib.bgp import BGPHeader, BGPUpdate, BGPPathAttr, BGPNLRI_IPv4, BGPPALocalPref

base = IP(src=src_ipv4_addr, dst=dst_ipv4_addr, proto=6, ttl=255)  # proto=6 represents that, TCP will be travelling above this layer. This is simple IPV4 communication.
tcp = TCP(sport=established_port, dport=179, seq=current_seq_num, ack=expected_seq_num, flags='PA')  # dport=179 means, we are communicating with bgp port of the destination router/ host. sport is a random port over which tcp is established. seq and ack are the sequence number and acknowledgement numbers. flags = PA are the PUSH and ACK flags.
hdr = BGPHeader(type=2, marker=0xffffffffffffffffffffffffffffffff)  # type=2 means UPDATE packet will be the BGP Payload, marker field is for authentication. max hex int (all f) are used for no auth.
up = BGPUpdate(path_attr=[BGPPathAttr(type_flags=64, type_code=5, attribute=BGPPALocalPref(local_pref=100))], nlri=BGPNLRI_IPv4(prefix=NLRI_PREFIX))      # update packet consist of path attributes and NLRI (Network layer reachability information),  type_code in path attributes is for which type of path attribute it is. [more][3]

packet = base / tcp / hdr / up
packet.show2()

Using the following variable values (for example purpose).使用以下变量值(用于示例目的)。

src_ipv4_addr = '10.110.99.2'  # eth0
dst_ipv4_addr = '10.110.99.50'
established_port = 1223
expected_seq_num=1000 # ack
current_seq_num=1500 # seq
NLRI_PREFIX = '10.110.99.0/24'

Output will be following. Output 将跟随。

###[ IP ]### 
  version   = 4
  ihl       = 5
  tos       = 0x0
  len       = 74
  id        = 1
  flags     = 
  frag      = 0
  ttl       = 255
  proto     = tcp
  chksum    = 0xe09c
  src       = 10.110.99.2
  dst       = 10.110.99.50
  \options   \
###[ TCP ]### 
     sport     = 1223
     dport     = bgp
     seq       = 1500
     ack       = 1000
     dataofs   = 5
     reserved  = 0
     flags     = PA
     window    = 8192
     chksum    = 0x102d
     urgptr    = 0
     options   = []
###[ HEADER ]### 
        marker    = 0xffffffffffffffffffffffffffffffff
        len       = 34
        type      = UPDATE
###[ UPDATE ]### 
           withdrawn_routes_len= 0
           \withdrawn_routes\
           path_attr_len= 7
           \path_attr \
            |###[ BGPPathAttr ]### 
            |  type_flags= Transitive
            |  type_code = LOCAL_PREF
            |  attr_len  = 4
            |  \attribute \
            |   |###[ LOCAL_PREF ]### 
            |   |  local_pref= 100
           \nlri      \
            |###[ IPv4 NLRI ]### 
            |  prefix    = 10.110.99.0/24

Just going to try and help here.只是想尝试在这里提供帮助。 I have zero experience with BGP type packets, but... I copied the bgp.py file from the link you provided into scapy/layers.我对 BGP 类型数据包的经验为零,但是......我将 bgp.py 文件从你提供的链接复制到 scapy/layers 中。 Using ls() I found the following:使用 ls() 我发现了以下内容:

BGPAuthenticationData : BGP Authentication Data
BGPErrorSubcodes : BGP Error Subcodes
BGPHeader  : BGP header
BGPNotification : BGP Notification fields
BGPOpen    : BGP Open Header
BGPOptionalParameter : BGP Optional Parameters
BGPPathAttribute : BGP Attribute fields
BGPUpdate  : BGP Update fields

I could then use say ls(BGPUpdate) to show this:然后我可以使用 ls(BGPUpdate) 来显示:

withdrawn_len : ShortField           = (None)
withdrawn  : FieldListField       = ([])
tp_len     : ShortField           = (None)
total_path : PacketListField      = ([])
nlri       : FieldListField       = ([])

and was able to create this packet:并且能够创建这个数据包:

pkt = pkt = IP()/TCP()/BGPUpdate()
pkt.show()
###[ IP ]###
  version   = 4
  ihl       = None
  tos       = 0x0
  len       = None
  id        = 1
  flags     = 
  frag      = 0
  ttl       = 64
  proto     = tcp
  chksum    = None
  src       = 127.0.0.1
  dst       = 127.0.0.1
  \options   \
###[ TCP ]###
     sport     = ftp_data
     dport     = http
     seq       = 0
     ack       = 0
     dataofs   = None
     reserved  = 0
     flags     = S
     window    = 8192
     chksum    = None
     urgptr    = 0
     options   = {}
###[ BGP Update fields ]###
        withdrawn_len= None
        withdrawn = []
        tp_len    = None
        \total_path\
        nlri      = []

I'm not sure what all of the different types of BGP layers/packets are used for or where the Communities Number would be set.我不确定所有不同类型的 BGP 层/数据包用于什么或社区编号将设置在哪里。 Possibly in BGPPathAttribute(type=x).可能在 BGPPathAttribute(type=x) 中。 Type 5 is "LOCAL_PREF" which may correspond to Community Values.类型 5 是“LOCAL_PREF”,它可以对应于社区值。 Try this Link.试试这个链接。

pkt = BGPPathAttribute(type=5)
pkt.show()
###[ BGP Attribute fields ]###
  flags     = Transitive
  type      = LOCAL_PREF
  attr_len  = None
  value     = ''

Anyway, hope that helps a little.无论如何,希望能有所帮助。

Edit: Forgot.编辑:忘记了。 I also added "bgp" to the load_layers section of scapy/config.py.我还在 scapy/config.py 的 load_layers 部分添加了“bgp”。 Line 373. Like this:第 373 行。像这样:

   load_layers =  ["l2", "inet", "dhcp", "dns", "dot11", "gprs", "hsrp", "inet6", "ir", "isakmp", "l2tp",
               "mgcp", "mobileip", "netbios", "netflow", "ntp", "ppp", "radius", "rip", "rtp",
               "sebek", "skinny", "smb", "snmp", "tftp", "x509", "bluetooth", "dhcp6", "llmnr", "sctp", "vrrp",
               "ipsec","bgp"]   

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM