前提:
本文所讨论的STP协议的攻击方式都是站在交换机连接你的攻击所用PC上的端口上运行了生成树协议的基础上。
1、抢占根桥
在一个存在冗余二层连接的网络中,根桥的正确选择是网络有效性的要害。如下图一的典型的二层冗余连接的一个示例拓朴:(红色代表被BLOCKING的链路)
[见下图一]
如上图,两台核心交换机间互相连接并使用冗余连接到分布层交换机(我们假设它在一个二层网络中,虽然实际上网络拓朴有区别,但没关系,只要是通过STP技术做的冗余连接就一个道理)。这时左边交换机成为根桥,右边交换机连接到分布层交换机的链路被BLOCKING。
看下图:
[见下图二]
假如一台PC接到接入层的第二台交换机上,我们将在这台PC上运行一个生成树的实例,这个生成树实例用于抢占根桥。图上已经表示了,假如抢占根桥成功,核心交换机间的链路将被BLOCKING而且核心层与分布层交换机间的连接也将变成如图所示。
注:
在PVST(按VLAN的生成树环境下),当然攻击所影响的仅仅局限于本VLAN内的生成树实例。
2、伪装根桥导致交换机上联链路失效
[见下图三]
如图,设SW1本为根桥,下联SW2&SW3为100M链路,开销为推荐值19,SW2&SW3分别与SW4&SW5相连。
正常情况下:
这本身是一无环拓朴,生成树得到良好收敛。
攻击情况:
设PC连接至SW4-PORT2上,该端口参数为SW4-Port2-0x0002-100-10M即端口ID为2,开销为100,链路为10M。
我们在PC上运行一生成树实例,本实例在初始化的时候首先侦听当前根桥的BPDU参数(如根ID、根配置相关参数-FR_DELAY/hello_time/max_age等)然后以当前真实的根桥的ID运行一个生成树实例,用于欺骗SW4,似乎在SW4-PORT2直接连接到了SW1的某个端口一样。这时将产生以下变化:
SW4重新计算生成树将改变根端口从PORT1->PORT2(因为在PORT2上的根路径成本只有100,PORT1上的根路径成本有119),
SW4的PORT1不再是根端口,然而它在和SW2的PORT2之间进行指定端口选举的时候,SW4-PORT1将失败(不能成为指定端口,因为SW4-PORT1的指定成本为100,SW2-PORT2的指定成本为19),所以本端口既不能成为根端口也不能成为指定端口,它将进入BLOCKING状态。
3、升序伪造配置BPDU耗费交换机处理资源
先看看配置BPDU接收的处理:
void receive_config_bpdu(int portno,strUCt _stp_config *bpdu)
{
int isroot;
isroot=root_bridge();
if(!port[portno].flag)
return;
if(port_info[portno].state==DISABLED)
return;
DEBUG_WRAP(PRintf("Receive config bpdu ok\n");)
if(supersedes_port_info(portno,bpdu)){将接收到的BPDU与端口相关数据结构进行比较,是否有必要进行下一步的更新动作
record_config_information(portno,bpdu);记录配置信息到端口数据结构里面
configuration_update();执行配置更新即重新选举根及其它
port_state_selection();端口状态的重新决定
if((!root_bridge())&&isroot){假如以前是根桥,而现在不再是根桥
stop_hello_timer();
if(bridge_info.topology_change_detected==TRUE){
stop_topology_change_timer();
transmit_tcn();
start_tcn_timer();
}
}
if(portno==bridge_info.root_port){假如说收到配置BPDU的端口成为了根端口
record_config_timeout_values(bpdu);要记录配置超时值
config_bpdu_generation();并在所有的指定端口上生成BPDU
if(bpdu->tp_change_ack)
topology_change_acknowledged();
}
}
else if(designated_port(portno))
reply(portno);
else
;
return;
}
这种攻击方式的思路是:
在PC上发送配置BPDU声明自己为根,发送的配置BPDU的根ID以降序发送。就是第二个配置BPDU发送总比第一个配置BPDU要具有更好的根抢占选举的条件,以不断的要求上面的交换机对发送的BPDU实施生成树协议的计算及更新,耗费交换机的资源。
注:
1. 第一种方式完全可以实现,并且在PC上运行生成树实例的代码已经完成,它是第二、三种攻击方式实现的基础。
2. 第二种攻击方式经过测试已经成功,但有一点不足是“在PC所连接的交换机到根交换机间跨过N个交换机的时候,无法精确控制哪个交换机的上联链路被BLOCKING,因为它跟链路成本计算有关”。
3. 第三种攻击方式未作过测试,因为手头确实缺乏能够用来作测试的交换机(前面的测试都是托朋友做滴)。假如哪位仁兄能有环境作个测试当然是再好不过。