首页    新闻    下载    文档    论坛     最新漏洞    黑客教程    数据库    搜索    小榕软件实验室怀旧版    星际争霸WEB版    最新IP准确查询   
名称: 密码:      忘记密码  马上注册
网络知识 :: 网络安全

802.1D生成树协议弱点及攻击方式研究


http://www.gipsky.com/
前提:

本文所讨论的STP协议的攻击方式都是站在交换机连接你的攻击所用PC上的端口上运行了生成树协议的基础上。

1、抢占根桥

在一个存在冗余二层连接的网络中,根桥的正确选择是网络有效性的关键。如下图一的典型的二层冗余连接的一个示例拓朴:(红色代表被BLOCKING的链路)

[见下图一]

</script>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。

看下图:

[见下图二]

screen.width-500)this.style.width=screen.width-500;" border=0>

如果一台PC接到接入层的第二台交换机上,我们将在这台PC上运行一个生成树的实例,这个生成树实例用于抢占根桥。图上已经表示了,如果抢占根桥成功,核心交换机间的链路将被BLOCKING而且核心层与分布层交换机间的连接也将变成如图所示。

注:

在PVST(按VLAN的生成树环境下),当然攻击所影响的仅仅局限于本VLAN内的生成树实例。

2、伪装根桥导致交换机上联链路失效

[见下图三]

screen.width-500)this.style.width=screen.width-500;" border=0>

如图,设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[1]&&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. 第三种攻击方式未作过测试,因为手头确实缺乏能够用来作测试的交换机(前面的测试都是托朋友做滴)。如果哪位仁兄能有环境作个测试当然是再好不过。
附注
  1. !root_bridge(
<< 谈Google DeskTop的安全隐患 2004年上半年中国网络安全市场分析 >>
API:
gipsky.com& 安信网络
网友个人意见,不代表本站立场。对于发言内容,由发表者自负责任。

系统导航

 

Copyright © 2001-2010 安信网络. All Rights Reserved
京ICP备05056747号