崔北亮,岳 阳
(1.南京工业大学 图书馆,江苏 南京 211800;2.南京工业大学 现代教育中心,江苏 南京 211800)
邻居发现协议(NDP[1])是IPv6的基础协议,它实现了IPv4中地址解析协议(ARP[2])和控制报文协议(ICMP)的功能,包括路由器和前缀发现、地址解析、下一跳地址确定、重定向、邻居不可达检测及重复地址检测等功能[3]。
在IPv4网络中,通信双方需知对方的IPv4地址和数据链路层地址(以太网中的体现是MAC地址)。若是不同IP子网间的通信,数据帧封装的目的数据链路层地址是网关或下一跳路由器的数据链路层地址,例如,局域网中的某台终端计算机要访问互联网中的某台服务器,终端计算机封装的目的数据链路层地址就是网关的MAC地址,ARP攻击方通过伪造网关对应的MAC地址来达到攻击的目的。ARP攻击[4]的原理是利用ARP的默认信任和不验证机制,这类攻击从始至终伴随着IPv4,造成的损失不可估量。
与IPv4一样,IPv6报文在局域网中传输时,仍会被封装在数据帧中。以常见的局域网为例,即需要将IPv6报文封装在以太网报文中。以太网报头中有源MAC地址和目的MAC地址,二层交换机根据目的MAC地址与端口的对应关系进行转发。在IPv4网络中,目的节点的MAC地址是通过广播ARP报文来获取的,然后就将IP和MAC地址的对应关系存入设备的ARP表中。而在IPv6网络中,ARP换成了NDP,ARP表也换成了IPv6邻居表,邻居表中记录着邻居IPv6地址与MAC地址的对应关系。当需要与邻居通信时,首先查看邻居表,若找到记录,则封装邻居的MAC地址;若没有记录,则使用NDP来查询邻居的MAC地址。
在IPv6网络中,NDP替代了ARP的功能,用于获取邻居IPv6地址对应的数据链路层地址,虽没有ARP攻击,但类似ARP攻击的NDP攻击[5]同样存在,除此之外,还有利用NDP的前缀通告攻击等其他攻击,所有这些NDP攻击都将始终伴随着IPv6,若不能很好地解决这些攻击问题,势必阻碍IPv6的发展。
解决NDP攻击,需要先了解NDP的工作机制和报文格式。NDP定义了5类ICMPv6[6]报文,即,路由器请求(RS)、路由器通告(RA)、邻居请求(NS)、邻居通告(NA)和路由重定向[7]。这5种类型的ICMPv6报文都是消息类型的报文,用来实现邻居链路层地址解析、网关发现、地址自动配置和路由重定向等功能。这里仅介绍容易发起NDP攻击的3种报文,即RA、NS、NA。
路由器会周期性地发送RA报文或收到RS报文后回应RA报文,向邻居节点通告路由前缀等参数信息。RA报文的格式如图1所示。
图1 RA报文格式Fig.1 RA packet format
通过抓包发现:不论是路由器主动周期性发送的RA报文,还是收到RS报文后被动回应的RA报文,RA报文的目的地址都是组播地址FF02::1(代表运行IPv6协议的所有节点)。图2为使用Wireshark[8]捕获的数据报文,其中序号1368是捕获的RA报文,“选项”(ICMPv6 Option)部分包含路由器接口的数据链路层地址、最大传输单元(MTU)、地址前缀等。
图2 捕获的RA报文Fig.2 Captured RA packet
NS报文用于查询邻居节点的数据链路层地址。NS报文格式如图3所示。
图3 NS报文格式Fig.3 NS packet format
图4中序号1371是捕获的NS报文。NS报文中的“Target Address”(目的地址)是要查询数据链路层地址的IPv6单播地址,“ICMPv6 Option”中有发送者的数据链路层地址。当被请求节点收到这样的NS报文,会先更新自己的邻居表(即IPv6地址和MAC地址的对应),然后再发送NA应答报文。
图4 捕获的NS报文Fig.4 Captured NS packet
NS报文除用于询问邻居数据链路层地址外,也用于邻居可达性检测。当NS报文用于邻居可达性检测时,目的地址是单播地址;当NS报文用于询问邻居数据链路层地址时,目的地址是被请求节点的组播地址FF02::1:FF00:0/104加上目的单播地址的最后24位,构成128位的目的IPv6地址。
IPv6节点使用NA报文来应答NS报文,回复数据链路层的地址,此时NA报文的目的地址是单播地址。IPv6节点也可主动发送NA报文来通告其存在,目的地址可以是某个IPv6地址,也可以是组播地址FF02::1,用以通告某个IPv6节点或所有IPv6节点更新自己的数据链路层地址信息。NA报文格式如图5所示。
图5 NA报文格式Fig.5 NA packet format
NA报文中有3个标志位:R(Router)、S(Solicited)和O(Override)位。当R位为1时,表示此报文是由路由器发送的;当S位为1时,表示这是NS报文的回复;当O位为1时,表示可以更新原先的邻居表条目。图6中序号1372是捕获的NA报文,“ICMPv6 Option”中包含发送NA报文的设备的数据链路层地址。
图6 捕获的NA报文Fig.6 Captured NA packet
NDP比较常见的几种攻击类型有:RA报文攻击[9]、NS报文攻击和NA报文攻击[10]。
网络拓扑见图7。图7中,局域网出口路由器e0/0接口配置了IPv6地址,该接口的IPv6链路本地地址是FE80::A8BB:CCFF:FE00:400,主机1是1台安装了Windows 10操作系统的计算机,正常情况下,主机1可以获得2001:DA8:1011:1::/64前缀,并把FE80::A8BB:CCFF:FE00:400作为默认网关。
图7 网络拓扑Fig.7 Network topology
图7中主机2是攻击者,假设也安装了Windows10操作系统,可以伪造1个RA报文发出,这里借助工具软件“科来数据包生成器”[11]。可以把图2中序号1368的数据包导出,再导入到科来数据包生成器中,如图8所示。为了方便表述,对数据包中的4个字段进行了编号:字段1是二层帧的源MAC地址,这里改成30:0D:9E:88:88:88;字段2是三层的源IPv6地址,这里改成FE80::9999:9999:9999:9999;字段3是ICMPv6选项中的链路层地址,这里改成30:0D:9E:99:99:99(该字段正常应该与字段1二层帧的源MAC地址相同,字段3与字段1的Mac地址设为不同,是为了增加排除故障的难度);字段4是ICMPv6选项中的前缀,这里改成2001:DA8:1011:9999::。选择正确的网卡,然后把该RA报文发送出去,为了攻击的效果,发送时可以选择周期性重复发送。
图8 生成RA报文Fig.8 Build RA packet
此时,在主机1上使用ipconfig命令查看IPv6地址配置情况,如图9所示。由图9可知,伪造的IPv6前缀和错误的网关都被终端计算机接受,这将导致终端计算机访问互联网异常。
图9 查看IPv6地址配置Fig.9 View IPv6 address configuration
正常RA报文中,二层帧的源MAC地址和ICMPv6选项中的链路层地址是相同的,但也允许不同,本实验把图8中的字段1和字段3设为2个不同的MAC地址。使用命令netsh interface ipv6 show neighbors查看主机1的IPv6邻居表,如图10所示。由图10可以看到,FE80::9999:9999:9999:9999对应的MAC地址是ICMPv6选项中字段3(也就是链路层地址30-0d-9e-99-99-99)。由于二层交换机的MAC地址表中记录的是字段1,这里又把字段3和字段1设成不同,导致无法从交换机的MAC地址表中找出字段3(也就是错误网关FE80::9999:9999:9999:9999)所对应的交换机端口,加大了排除攻击的难度。
图10 查看IPv6邻居表Fig.10 View IPv6 neighbor table
将图8中字段2改成真正网关对应的链路本地地址FE80::A8BB:CCFF:FE00:400,把该RA报文发送出去,会导致本网络中所有IPv6终端的邻居表中FE80::A8BB:CCFF:FE00:400对应的MAC地址变成30-0D-9E-99-99-99,结果是本网络中的所有IPv6终端都不能访问互联网。
由1.2节可知NS报文也可以更新被请求节点的IPv6邻居表,这里仍以图7的拓扑为例。在正常情况下,主机1 ping路由器接口的IPv6地址2001:DA8:1011:1::1,可以ping通,在路由器上执行show ipv6 neighbors命令,查看路由器的邻居表,输出的结果显示如下:
Router#show ipv6 neighbors
IPv6 Address Age Link-layer Addr State Interface
2001:DA8:1011:1:2106:9DD6:3620:D729 218 5000.0001.0000 STALE Et0/0
2001:DA8:1011:1:D5CC:3C3A:F2FD:28D0 0 5000.0001.0000 DELAY Et0/0
FE80::5D03:AE85:29E0:6B2B 5 5000.0002.0000 STALE Et0/0
FE80::89FD:64E4:4830:963E 226 0050.56c0.0008 STALE Et0/0
FE80::D57C:B6C:CF69:CEC6 0 5000.0001.0000 DELAY Et0/0
主机2通过发送NS报文阻断主机1与网关路由器的通信:主机2可以发送伪造的NS报文,冒充主机1去询问网关对应的MAC地址,达到攻击的目的。在主机2上运行“科来数据包生成器”,导入图4中序号1371的NS报文,如图11所示,修改各个字段。
图11 生成NS报文Fig.11 Build NS packet
把这个NS报文发送出去,此时在主机1上ping 2001:DA8:1011:1::1,网络不通,再次在路由器上执行show ipv6 neighbors命令,输出的结果显示如下:
Router#sho ipv6 neighbors
IPv6 Address Age Link-layer Addr State Interface
2001:DA8:1011:1:2106:9DD6:3620:D729 219 5000.0001.0000 STALE Et0/0
2001:DA8:1011:1:D5CC:3C3A:F2FD:28D0 3417.ebc9.70db DELAY Et0/0
FE80::5D03:AE85:29E0:6B2B 5 5000.0002.0000 STALE Et0/0
FE80::89FD:64E4:4830:963E 227 0050.56c0.0008 STALE Et0/0
FE80::D57C:B6C:CF69:CEC6 0 5000.0001.0000 REACH Et0/0
注意到主机1的临时IPv6地址2001:DA8:1011:1:D5CC:3C3A:F2FD:28D0对应的MAC地址已经从前面的5000.0001.0000被替换成图11中的ICMPv6选项中的链路层地址34:17:EB:C9:70:DB,主机1网络不通,NS报文攻击成功。主机2也可以冒充网关发送NS报文询问主机1的MAC地址,同样能达到阻止主机1和网关正常通信的目的。
通过NS报文攻击的难度在于,首先要找出被攻击的源和目的IPv6地址,由于IPv6地址的接口ID[12]一般是64位,很难通过IPv6地址扫描来探测网络中有哪些IPv6地址在使用。既然主动扫描不可行,可以采用被动监听的方式,开启网卡的混杂模式,然后编写1个RS、NS或NA的报文监听守候程序,记录下所有报文中的IPv6地址,经过一段时间的积累,可以获得本网络中在用的几乎所有IPv6地址。
NA报文是NS报文的应答报文,但并不是一定要接收到NS报文,才能回复NA报文,IPv6接点可以主动地发送NA报文。在“科来数据包生成器”中导入图6中序号1372的NA报文,如图12所示。字段1为目的MAC地址,要接收该NA报文的设备的MAC地址;字段2为发送NA报文的设备的MAC地址,这个字段可以任意填写而不会影响结果,正常情况下字段2的值与字段6的值相同;字段3为发送NA报文的设备的IPv6地址,这个字段也可任意填写而不会影响结果,正常情况下字段3的值等于字段5的值;字段4为接受该NA报文的设备的IPv6地址;字段5为发送NA报文的设备的IPv6地址;字段6为字段5的IPv6地址对应的MAC地址。当IPv6地址是字段4的设备收到这个NA报文后,会在IPv6邻居表中添加字段5的条目,对应的MAC地址是字段6。
图12 生成NA报文Fig.12 Build NA packet
可以利用NA报文实现3类攻击:拒绝服务攻击[13]、中间人攻击[14]和IPv6地址占用攻击[15]。
2.3.1 拒绝服务攻击
在图7中,主机2运行“科来数据包生成器”,把图12中字段1改成主机1的MAC地址;字段2、字段3任意填写;字段4填成主机1的链路本地地址;字段5填成网关对应的链路本地地址(即FE80::A8BB:CCFF:FE00:400);字段6任意填写1个错误的MAC地址(非图10中的aa-bb-cc-00-04-00)。主机2把该数据包从正确的网卡发送出去,为了攻击效果,可以选择周期性重复发送。在主机1上查看邻居表,可以发现FE80::A8BB:CCFF:FE00:400对应的MAC地址是字段6中填入的错误MAC地址,主机1访问互联网失败。由此看出,利用NA报文可以很容易地实现拒绝服务攻击。
该攻击的难点是如何获知主机1的链路本地地址,同样可以使用2.2节介绍的方法,在攻击主机上运行1个NDP的监听程序,收集网络中设备的IPv6地址和对应的MAC地址。
2.3.2 中间人攻击
该攻击类似2.3.1节介绍的攻击方法,仍以图7为例,主机2冒充主机1给网关发送1个NA报文,其他都是真实的,只是把字段6填成主机2的MAC地址;同样,主机2冒充网关给主机1发送一个NA报文,其他都是真实的,仍然是把字段6填成主机2的MAC地址。在主机2上持续不断地发送这2个报文,结果是主机1和网关之间的通信都将被交换机根据MAC地址转发给主机2。在主机2上修改注册表,开启路由功能,转发主机1和网关之间的数据包,保证主机1和网关可以正常通信。在主机1和网关不易察觉的情况下,它们之间的通信都由主机2中转,主机2可以获知主机1访问了哪些站点以及通信内容。
2.3.3 IPv6地址占用攻击
IPv6节点无论使用哪种方式获得IPv6地址,在IPv6地址生效前,都会发送NS报文,该NS报文询问的目的IPv6地址就是即将要使用的IPv6地址。如果该NS报文收到NA报文回应,并且回应的MAC地址与本节点不同,则认为该IPv6地址已经被使用,重新产生或分配新的IPv6地址,继续发送NS报文进行地址重复性检测。如果该NS报文没有收到NA报文回应,或收到NA报文的回应,但回答的MAC地址与本节点相同,则认为该IPv6地址没有被使用,IPv6地址生效。这类NS报文的特征比较明显,数据包的源IPv6地址为空(即::),捕获的数据报文如图13所示。在攻击的计算机上运行1个监听守候程序,当收到重复地址检测的NS报文,就回应1个NA报文,NA报文的内容参照图12:字段1是33:33:00:00:00:01(IPv6组播MAC地址);字段2任意填写;字段3是图13的NS报文中的Target Address;字段4是ff02::1;字段5仍然是图13的NS报文中的Target Address;字段6任意填一个MAC地址(该MAC地址不同于NS报文中的源MAC地址)。发送重复地址检测的IPv6节点,收到这样的NA报文后,会认为该IPv6地址已经被使用,IPv6地址失效。最终的结果是本子网中所有IPv6节点都没有IPv6地址,攻击成功。
图13 NS检测重复地址Fig.13 Detect for duplicate addresses of NS
根据RA攻击报文中“二层帧源MAC地址”和“选项中的链路层地址”是否相同,把RA攻击分为简单攻击和复杂攻击两种。对应的RA攻击解决方法有:简单RA攻击的解决方法、复杂RA攻击的解决方法和RA攻击的彻底解决方法。
3.1.1 简单RA攻击的解决方法
对于简单RA攻击,图8中的字段1(二层帧源MAC地址)和字段3(选项中的链路层地址)相同。在被攻击的计算机上使用ipconfig命令查看到假网关IPv6的地址,然后使用图10中的命令查找到该假网关对应的MAC地址,最后登录网管交换机,查看该MAC地址对应的交换机端口,进而找出攻击者。
3.1.2 复杂RA攻击的解决方法
攻击者可以把图8中的字段1和字段3设成不同,网管交换机上只记录了二层帧的MAC地址,并不能记录选项中的链路层地址,这样3.1.1节介绍的攻击解决方法失效。
改进解决方法:可以完善IPv6协议,对收到RA报文的二层帧源MAC地址和选项中的链路层地址(MAC地址)进行对比,若不相同,则丢弃该RA报文。该方法涉及IPv6低层协议的开发和标准的制定,实施难度较大,基本不可行。
可行的解决办法:在被攻击的计算机上运行类似Wireshark这样的数据包捕获软件,找出RA攻击报文对应的二层帧的源MAC地址,然后再根据该MAC地址,在网管交换机上找出对应的交换机端口,进而找出攻击者。这种解决方法需要专业的技术人员在被攻击的计算机安装数据包捕获软件,实际操作的难度较大且不方便。
3.1.3 RA攻击的彻底解决方法
对于简单的RA攻击,3.1.1节介绍的解决方法基本可行;对于复杂的RA攻击,3.1.2节介绍的解决方法实施难度较大。这里转换思路,考虑从交换机层面彻底解决RA攻击。图7中,交换机的eth0/2端口连接路由器。配置网管交换机,只有eth0/2端口才接受RA报文,其他端口对收到的RA报文进行丢弃。根据图1,交换机其他端口只要丢弃类型是134的ICMPv6报文即可,该方法已经被多个交换机生产厂商所采用,提供了相关的配置命令。
对于利用NS报文攻击的解决方法可以参照3.1.1节和3.1.2节,同样对于复杂的NS攻击,利用3.1.2节介绍的分析捕获数据包的方法实施难度较大。因任何IPv6节点都有可能发送NS报文,3.1.3节彻底解决RA攻击的方法也不适合NS攻击。针对NS报文的复杂攻击,后面再进行深入探讨。
根据NA报文攻击的类型不同,可以采用不同的解决方法。拒绝服务攻击的解决方法:若图12中的字段2和字段6相同,可以使用3.1.1节介绍的方法,很容易在交换机上找出攻击端口。若图12中的字段2和字段6不同,对于这样复杂的NA攻击,3.1.2节所述的分析捕获数据包的方法难度也较大,后面再进行深入的探讨。
中间人攻击的解决方法:由于中间人攻击不会影响正常的网络使用,很难被发现,可以通过静态绑定IPv6地址和MAC地址的方法来阻止中间人攻击的发生,Windows上对应的命令是“netsh interface ipv6 set neighbor ‘接口ID’ 邻居IPv6地址 邻居链路层MAC地址”,静态绑定的工作量较大且要实现双向绑定,实际操作难度也较大,后面再进行深入的探讨。若是意识到被中间人攻击,利用3.1.1节介绍的方法,可以很容易找出攻击者。
IPv6地址占用攻击的解决方法:利用3.1.2节所述的方法,在被攻击的计算机上运行类似Wireshark这样的数据包捕获软件,找出NA攻击报文对应的二层帧的源MAC地址,进而找出攻击者。这仍需要专业的技术人员到被攻击者的计算机上进行操作,同样实际操作难度也较大,后面再进行深入的探讨。
NDP是IPv6的基础协议,若没有一个好的解决办法,NDP攻击将一直伴随着IPv6,造成的损失同样不可估量。前面介绍的方法主要是解决简单的NDP攻击,对于复杂的NDP攻击,除了通过分析捕获的数据包外,几乎没有好的办法。
由于RA、NS和NA等报文都经由交换机转发,可以考虑对交换机进行功能改进来判断和阻止NDP攻击。3.1.3节介绍了通过对网管交换机进行功能改进,只在连接路由器的交换机端口上接收RA报文,该方法彻底解决了RA报文攻击。这里进一步对交换机进行功能改进,使之可以判断、减少和阻止NS攻击和NA攻击。
增加1个对所有流经的RA、NS和NA报文进行规范性检查的开关项,若打开此功能,则二层帧中的源MAC地址和三层数据包中的链路层地址(图8中的字段1和字段3、图11中字段2和字段6、图12中字段2和字段6)要相同,否则丢弃该数据包。开启此功能后,可以阻止复杂的RA、NS和NA报文攻击。
交换机的基本功能是学习二层帧的MAC地址,构造MAC地址表,然后对转发的数据帧进行过滤式转发。这里对二层的网管交换机功能稍做增强,使之不仅处理二层帧中的MAC地址,还检查三层数据包中的RA、NS和NA报文(即ICMP中类型为134、135和136的报文)。交换机只是查看NDP报文的内容,并不拆封数据包,也不涉及路由转发,二层交换机只要功能稍做加强,即可完成该功能。
二层交换机根据收到的数据包,记录以下这些信息:进入的交换机端口、二层帧的源MAC、IPv6地址(图8中的字段2、图11中的字段3和图12中的字段5)、链路层地址(图8中的字段3、图11和图12中的字段6)和类型(Type,动态学习的类型是dynamic,静态绑定的类型是static)。由这5个元素组成交换机的“IPv6地址五维表”,通过相关的命令进行查看,输出的结果可以如下所示:
Switch#show ipv6-address-table
Ipv6 MAC Address Link-layer address Interface Type
-------------------- --------- ------------ ----- -----
FE80::A8BB:CCFF:FE00:400 AABB.CC00.0400 AABB.CC00.0400 Eth 0/2 Dynamic
2001:DA8:1011:1:5557:1507:3D75:CF8E 5000.0001.0000 5000.0001.0000 Eth 0/0 Dynamic
该表已经记录了图7拓扑中主机1临时IPv6地址和路由器链路本地址。假设此时主机2冒充网关FE80::A8BB:CCFF:FE00:400给主机1发送一个NA报文,采用了复杂的NA攻击,MAC Address(假如设成AABB.CC11.1111)和Link-layer address(假如设成AABB.CC22.2222)的值不同。交换机收到此NA攻击报文后,发现“IPv6地址五维表”中已经存在FE80::A8BB:CCFF:FE00:400记录,弹出1条报警信息,提示该IPv6地址的MAC Address 、Link-layer address或Interface发生了改变,并把报警信息记录在日志中。交换机更新IPv6地址五维表,更新后的记录如下:
Switch#show ipv6-address-table
Ipv6 MAC Address Link-layer address Interface Type
----------------- -------- ------- ----- -----
FE80::A8BB:CCFF:FE00:400 AABB.CC11.1111 AABB.CC22.2222 Eth 0/1 Dynamic
2001:DA8:1011:1:5557:1507:3D75:CF8E 5000.0001.0000 5000.0001.0000 Eth 0/0 Dynamic
通过该记录,可以快速地找出攻击者所在的交换机端口。
IPv6地址占用攻击的解决方法:如果同一个交换机端口对应着大量的IPv6地址条目,且网络中节点IPv6地址获取失败,此时可以考虑是IPv6地址占用攻击,断开交换机相应端口的连线即可。
RA、NS和NA报文的拒绝服务攻击和中间人攻击的解决方法:考虑到IPv6地址空间巨大,几乎不可能自动产生2个相同的IPv6地址,可以把“IPv6地址五维表”中的记录锁定,不需要更新,收到与“IPv6地址五维表”中记录不一致的报文,直接丢弃。对于手工静态配置IPv6地址的情况,譬如网关或服务器等,若是更换硬件,管理员可以手动清除一下“IPv6地址五维表”。通过把“IPv6地址五维表”中的记录锁定,可以杜绝RA、NS和NA的报文攻击。
RA、NS和NA报文的规范性检查可以阻止复杂的NDP攻击,但方法过于简单,缺乏灵活性,不一定能适应所有的场合。构建“IPv6地址五维表”的功能改进灵活多变,适应性强,可视化度高,推荐优先考虑。
随着IPv6在全球的快速普及,与之相关的NDP攻击将普遍长期存在。介绍了NDP的几种报文格式和工作机制,分析了可能存在的攻击类型,针对不同的攻击方式,给出切实可行的解决方法。考虑到解决方法的简单易行,最后提出了对交换机进行功能改进,利用构建的“IPv6地址五维表”可快速找出攻击,甚至是杜绝NDP攻击。尽快把本研究的成果应用于各个交换机生产厂家,使交换机具备NDP攻击的预警和判断功能,有望彻底解决NDP攻击。