方欣
(长春职业技术学院,吉林 长春 130000)
在对TCP/IP协议栈内各种网络协议的研究中发现,许多网络协议如ARP、STP、DHCP、DNS等都存在安全漏洞,攻击者通过构造攻击报文发向目标网络或主机,致使被攻击者遭受不同程度的损害[1]。本文为了研究RIP路由协议的安全性,首先在实验环境下搭建网络拓扑,利用Python程序构造RIP攻击报文发送给被攻击路由器实施路由欺骗,通过查看被攻击路由器的路由表,获悉目标路由器已被攻击且无法正常转发路由信息;然后通过Python编写RIP抓包嗅探程序,捕获攻击者的攻击报文,分析攻击报文以掌握其攻击手法;最后提出相应的安全防护措施,保护RIP路由协议的安全运行。
Python 是一个结合了解释性、编译性、互动性和面向对象的脚本语言。Python 语言注重的是如何解决问题而不是编程语言的语法和结构,是一种简单易学、功能强大的编程语言,可以简单有效地实现面向对象编程[2]。Python 简洁的语法和对动态输入的支持,再加上解释性语言的本质,使得它在协议安全型研究上是一个理想的脚本语言,特别适用于快速的应用程序开发[3]。
Scapy 是一款基于Python 开发的开源软件,可以运行于Linux 和Windows 等主流操作系统平台。目前,在国外应用较为广泛,具有良好的开放性和可扩展性。Scapy 是一款强大的交互式数据包处理工具、数据包生成器、数据包嗅探与分析工具,它能方便地对数据包进行修改、发送、嗅探、应答等操作,利用它可以构造各种数据包用于网络协议分析与研究[4]。
在安装Scapy 之前,我们需要为Python 配置环境变量。首先,进入“控制面板”,找到并点击“系统和安全”,然后点击进入“系统”,再点击“高级系统设置”,就可以看到右下方的“环境变量”了;接着,点击进入“环境变量”,在“系统变量”中找到Path,在Path 中增加C:Python27 和C:Python27Scripts两条路径;最后,进入Windows 命令行,在命令行输入“python27”可以进入Python 命令行模式,输入print(“hello python”),控制台输出hello python,则说明Python 环境变量已配置完成。
配置完python 的环境变量后,将解压完的Scapy 安装包拷贝到C盘根目录下,打开Windows命令行,进入Scapy解压目录,运行python setup.py install 安装Scapy 程序。Scapy 程序安装完毕之后,输入“scapy”,若出现Scapy 的交互式运行界面,则表示Scapy已安装成功[5]。
RIP(路由信息协议)是一种内部网关协议,也是一种动态路由选择协议,用于自治系统(AS)内路由信息的传递。RIP协议基于距离矢量算法,使用“跳数”来衡量到达目标地址的路由距离。这种协议的路由器只与自己相邻的路由器交换信息,范围限制在15跳之内,16跳为不可达。
我们首先需要搭建实验环境,并在网络设备上运行RIP路由协议。本实验利用长春职业技术学院网络攻防实训室中真实的路由器与交换机设备,搭建如图1所示的网络拓扑,在三层交换机ESW1、路由器R1 和路由器R2 上运行RIP 路由协议。
图1 RIP路由协议安全性研究实验拓扑图
在三层交换机ESW1中,查看ESW1的原始路由表,路由表信息如图2。从图中我们可以知道,ESW1中有2条从RIP协议学习到的路由,分别是去往2.0.0.0 和3.0.0.0 网段的RIP路由。
图2 三层交换机ESW1原始路由表
在编写攻击程序之前,我们需要先了解RIP 报文的结构,RIP报文的格式见表1。RIP路由协议首部包括命令(1为请求,2 为响应或路由更新)、版本和未使用三个字段。每条路由20 个字节,包括地址族标识(网络层所使用的地址协议)、路由标记(外部路由标记,一般值为0)、网络地址、子网掩码、下一跳路由器地址、距离等字段。一个RIP 报文最多通告25条路由,每条路由为20字节。RIP协议在传输层上使用UDP协议,源端口号与目的端口号均为520[6]。
表1 RIP协议报文结构
根据RIP协议的报文结构,我们利用Python程序编写攻击程序,用于后续实施RIP协议的攻击,攻击代码如下:
在PC1中运行上述攻击程序,几分钟后查看ESW1的路由表信息,ESW1新的路由表项如图3。从图中我们可以发现,ESW1去往3.0.0.0网段的跳数从之前的1跳变为了2跳,并且路由表中多了一条去往4.0.0.0网段的RIP路由。ESW1的路由表被攻击成功,网络中的用户无法正常访问3.0.0.0网段,且攻击者让网络设备学习到了本不存在的路由信息(图4)。
图3 三层交换机ESW1被攻击后的路由表
图4 攻击后网络中的用户PC1无法正常访问3.0.0.0网段
利用Python 程序编写抓包嗅探程序,抓取网络中的RIP攻击报文,抓包程序代码如下:
分析抓包程序捕获的攻击报文,我们可以从中发现,攻击者通过向网络中的所有路由器组播发送伪造的RIP 路由更新报文,让其他路由器学习攻击者所发送的RIP 路由,并更新自身的路由表,使被攻击的路由器被虚假路由所欺骗,导致路由器无法正常转发数据包[7]。
通过上述分析得知,利用RIP协议漏洞进行路由欺骗的后果严重,攻击者在窃取敏感信息的同时可能造成网络的瘫痪,为了防止路由器的RIP 路由信息被非法篡改,可以采取认证的方式进行安全防范。
RIPv2可以进行MD5加密认证,只有相互认证的路由器发送过来的路由信息才会被写入到路由表中。当一方开启认证之后,另一方也需要开启认证,并且双方密钥一致,才能互相传送路由信息。认证是基于接口配置的,密钥使用key chain来定义,key chain中可以定义多个密钥,每个密钥都有一个序号,双方需要配置相同的序号和密钥[8]。
以ESW1为例,认证配置命令如下:
本文使用Python 初步实现了RIP 协议的攻击与报文捕获,分析了RIP协议的安全漏洞,并提出了RIP协议的安全防护措施。通过对RIP协议的安全性研究,不仅可以更深入地理解RIP协议攻击的机理,而且对其他网络协议如STP、OSPF、DHCP 等的安全性研究有很好的借鉴意义,同时为后续开展网络协议的研究与教学打下了坚实的基础。