原文发表于2017年第7期《网络安全与信息化》,转发到博客。
更多相关资料可参看视频教程“局域网安全实战”,http://edu.51cto.com/course/10348.html
MAC泛洪***是一种针对局域网交换机的***方式,目的在于窃取局域网内用户的通信数据。本文以神州数码CS6200交换机为例,从原理、实施、防御三个方面对MAC泛洪***进行了全面介绍。
交换机的主要功能是在局域网内的主机之间转发数据帧。交换机接收从主机上传来的比特流之后,要先将其缓存成数据帧,然后通过分析帧头中的MAC地址,交换机就可以判断出数据的发送方和接收方,从而将数据转发给目的主机。
交换机的工作核心是端口/MAC地址映射表,这张表里记录了交换机每个端口同与之相连的主机MAC地址之间的对应关系。交换机刚启动时,端口/MAC地址映射表是空白的,当某台主机发送了一个数据帧到相应端口上后,交换机首先将数据帧里的源MAC地址与该端口的对应关系记录在映射表里,然后再去映射表里查找与数据帧的目的MAC地址相对应的端口,而此时肯定是找不着的,这时交换机就以广播的方式将这个数据帧向除了源端口以外的其它所有端口转发,从而将数据发送给了目的主机。经过这一个过程之后,在映射表里便已经产生了第一条记录。因而只要网络中的每台主机都发送了一次数据,在地址表中便会记录下所有主机MAC地址与端口的对应关系,从而建立起一个完整的端口/MAC地址映射表。映射表建好之后,交换机便可以在所有主机之间直接转发数据帧,而再也无需广播了。
在交换机中执行“showmac-address-table”命令就可以查看到MAC地址表。
CS6200#showmac-address-table
Readmac address table….
Vlan Mac Address Type Creator Ports
1 00-03-0f-3e-e6-90 STATIC System CPU
1 ec-a8-6b-61-64-a1 DYNAMIC Hardware Ethernet1/0/10
通常情况下,交换机的每个端口只会连接一台主机,因而在MAC地址表中每个端口只会对应1个MAC地址。但由于交换机还要用于级联其它的交换机,因而在相应的级联端口上就会对应多个MAC地址,从而在地址表产生大量记录。
由于交换机的缓存有限,因此它所能够记忆的MAC地址数量也是有限的,所以交换机不会永久地记住所有的端口与MAC地址的对应关系。在端口/MAC地址映射表中每一项记录都被设定了一个自动老化时间,若某MAC地址在一定时间内(默认为300秒)不再出现,那么交换机将自动把该MAC地址从地址表中清除。当下一次该MAC地址重新出现时,将会被当作新地址处理,从而使交换机可以维护一个精确、有用的MAC地址表。交换机档次越低,交换机的缓存就越小,它能记住的MAC地址数也就越少。
以神州数码DCRS-6200交换机为例,它的MAC地址表中最多可以记录16384个MAC地址。执行“showmac-address-table count”命令可以查看到MAC地址表的容量以及当前已经记录的地址数目。
CS6200#showmac-address-table count
Computethe number of mac address…..
Maxentries can be created in the largest capacity card:
Total Filter Entry Number is: 16384
Static Filter Entry Number is: 16384
Unicast Filter Entry Number is: 16384
Multicast Filter Entry Number is: 4096
Currententries have been created in the system:
Total Filter Entry Number is: 2
Individual Filter Entry Number is: 2
Static Filter Entry Number is: 1
Dynamic Filter Entry Number is: 1
Multicast(Insert) Filter Entry Number is: 0
Multicast(Wait) Filter Entry Number is: 0
MAC泛洪***就是由***者通过***工具产生大量的数据帧,这些数据帧中的源MAC地址都是伪造的,并且不断变化。因而交换机将在***主机所连接的端口上产生大量的MAC地址表条目,从而在短时间内将交换机的MAC地址表填满,直到再无法接收新的条目。
此时对于网络中那些事先没有在交换机的MAC地址表中留下记录的主机,它们之间的数据通信就会全部采用广播的方式进行,这样虽然并不影响数据的发送和接收,但此时的交换机实质上就成为了一台集线器,***者在网络中的任何一台主机上打开Wireshark,就可以监听到网络中的这些流量。
下面我们搭建一个如图1所示的实验环境,实验目的是通过在KaliLinux上发动MAC泛洪***,从而捕获目标主机访问目标服务器的数据。在实验过程中需要注意,先不要将目标主机和目标服务器连接到交换机上,待MAC泛洪***成功之后,再将它们连接上去,这样才能保证不会在交换机的MAC地址表中产生它们的记录,从而使得它们之间的数据通信采用广播方式。
图 1实验环境
在KaliLinux中已经集成了MAC泛洪工具macof,执行macof之后,工具就开始不停向外发送伪造的源MAC地址不断变化的数据帧,如图2所示。如果一个macof的效果不明显,可以打开多个命令行界面,同时执行macof。
图 2利用macof进行MAC泛洪***
此时在交换机上执行“showmac-address-table count”命令检查***效果,发现整个MAC地址表已被全部填满。
CS6200#showmac-address-table count
Computethe number of mac address…..
Maxentries can be created in the largest capacity card:
Total Filter Entry Number is: 16384
Static Filter Entry Number is: 16384
Unicast Filter Entry Number is: 16384
Multicast Filter Entry Number is: 4096
Currententries have been created in the system:
Total Filter Entry Number is: 16384
Individual Filter Entry Number is: 16384
Static Filter Entry Number is: 1
Dynamic Filter Entry Number is: 16383
Multicast(Insert) Filter Entry Number is: 0
Multicast(Wait) Filter Entry Number is: 0
执行“showmac-address-table”命令查看MAC地址表,可以看到绝大部分MAC地址都是从10号端口(Kali Linux所连接的端口)学习到的。
CS6200#showmac-address-table
Readmac address table….
Vlan Mac Address Type Creator Ports
1 00-03-0f-3e-e6-90 STATIC System CPU
1 ec-a8-6b-61-64-a1 DYNAMIC Hardware Ethernet1/0/10
1 00-07-72-01-47-8b DYNAMIC Hardware Ethernet1/0/10
1 00-0a-b5-14-d5-dd DYNAMIC Hardware Ethernet1/0/10
……
这时将目标主机和目标服务器连接到交换机上,然后在Kali Linux中打开Wireshark,就可以监听到它们之间的通信数据了。由于此时Kali Linux中存在大量的MAC泛洪数据,所以在抓包之前最好先设置捕获过滤器,比如设置过滤规则“host 10.39.1.11”,只抓取主机10.39.1.11发出和接收的数据。
然后在目标主机上访问目标服务器中的一个网站登录页面,并输入用户名admin以及密码123456,此时在Kali Linux的Wireshark中成功抓获了它们之间的流量,为了更精确的显示我们所需要的数据,在Wireshark中又设置了显示过滤器http,只显示HTTP协议产生的数据,这时就可以轻松看到之前所输入的用户名和密码了,如图3所示。
图 3在Wireshark中抓取的用户名和密码
通过Port-Security(端口安全性)技术可以有效防范MAC泛洪***,Port-Security可以限制交换机端口上所允许的有效MAC地址的数量,这样交换机就不会无限制的从端口获取MAC条目。如果某个端口的有效MAC地址个数已经达到最大值,那么当该端口再次接收到新的MAC地址时,就被认为发生安全违规,交换机将自动采取相应的动作。
管理员可以配置发生安全违规后交换机将采取的动作:
l 关闭(shutdown):在此模式下,安全违规将造成端口变为错误禁用状态,并关闭端口LED。当端口处于错误禁用状态时,可以先输入shutdown,再输入no shutdown,使其脱离此状态。此模式为默认模式。
l 保护(protect):在此模式下,当有效MAC地址的数量达到端口允许的限制时,带有未知源地址的数据帧将被丢弃。
l 限制(restrict):与保护模式基本相同,区别是在此模式下除了将数据帧丢弃之外,还会发出SNMP消息,并记录日志等。
下面在神州数码CS6200交换机上配置Port-Security。
首先执行命令“clear mac-address-table dynamic”清除之前地址表中的记录。
然后在Kali Linux所连接的10号端口上启用Port-Security,并采用默认设置,有效MAC地址只有一个。
CS6200(config)#mac-address-learning cpu-control //开启CPU控制学习功能
CS6200(config)#interface ethernet 1/0/10 //进入端口配置模式
CS6200(config-if-ethernet1/0/10)#switchport port-security //启用Port-Security
这时在Kali Linux中再次实施MAC泛洪***,就会发生安全违规,10号端口被关闭。执行“show Interface ethernet 1/0/10”命令查看端口信息,可以发现提示“Ethernet 1/0/10 is shutdown by port security”的提示信息。
CS6200(config)# show Interface ethernet 1/0/10
Interfacebrief:
Ethernet1/0/10 is administratively down,lineprotocol is down
Ethernet1/0/10 is shutdown by port security
Ethernet1/0/10is layer 2 port,alias name is (null),indexis 1;
Hardwareis Fast-Ethernet,address is 00-03-0f-3e-e6-91
由于默认情况下每个端口的有效MAC地址只有一个,这时如果在端口所连接的主机上开启一个桥接模式的虚拟机,就会导致发生安全违规,从而将端口关闭。因而建议将端口的有效MAC地址的数量设置的大一些,这样端口就不会轻易被关闭了。比如将端口的有效MAC地址数量设置为5个:
CS6200(config-if-ethernet1/0/10)#switchport port-security maximum 5
我们还可以改变发生安全违规后的动作,比如将违规动作改为restrict,这样就只丢弃包而不关闭端口。
CS6200(config-if-ethernet1/0/10)# switchportport-security violation restrict
由于Port-Security需要在交换机的每个端口上依次设置,因而对于那些确定不会级联其它交换机的端口,建议都启用Port-Security,并根据实际情况将有效MAC地址的数量设置的稍微大一些,从而增强局域网的安全性。