Chinaunix首页 | 论坛 | 博客
  • 博客访问: 19279244
  • 博文数量: 7460
  • 博客积分: 10434
  • 博客等级: 上将
  • 技术积分: 78178
  • 用 户 组: 普通用户
  • 注册时间: 2008-03-02 22:54
文章分类

全部博文(7460)

文章存档

2011年(1)

2009年(669)

2008年(6790)

分类: 网络与安全

2008-03-22 16:44:02

前提:
    本文所讨论的STP协议的攻击方式都是站在交换机连接你的攻击所用PC上的端口上运行了生成树协议的基础上。
1、抢占根桥
在一个存在冗余二层连接的网络中,根桥的正确选择是网络有效性的关键。如下图一的典型的二层冗余连接的一个示例拓朴:(红色代表被BLOCKING的链路)

img(this)" style="WIDTH: 627px; CURSOR: pointer; ZOOM: 70%; HEIGHT: 196px" onclick=javascript:window.open(this.src); height=264 src="/Fsmanage/RoUpimages/2004101994534.jpg" onload="javascript:if(this.width>screen.width-500)this.style.width=screen.width-500;" border=0>
如上图,两台核心交换机间互相连接并使用冗余连接到分布层交换机(我们假设它在一个二层网络中,虽然实际上网络拓朴有区别,但没关系,只要是通过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. 第三种攻击方式未作过测试,因为手头确实缺乏能够用来作测试的交换机(前面的测试都是托朋友做滴)。如果哪位仁兄能有环境作个测试当然是再好不过。

阅读(1140) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~