1、链路伪造攻击教学文稿将目前几种主流控制器与Mininet一起搭建测试组网,Mininet负责构造网络拓扑。针对SDN中存在的链路伪造安全问题,如下图,通过侵入主机h1向交换机s1发送伪造的LLDP数据包,构造出h3到h1的单向伪造链路。用wireshark抓取交换机各端口的LLDP包,可分析并伪造出想要的LLDP数据包以达到链路伪造的目的。控制器链路伪造攻击伪造LLDP包注入LLDP包重传Opendaylight可实现注:修改source MAC、Chassis ID、Port ID、System Name、Unknown Subtype Content(有两段要改,每个端口的是固定值)可实现
2、Floodlight可实现注:修改source MAC、 Chassis ID、Port ID、Unknown Subtype Content(有两段,只需改第一段,第二段同一个端口的每个LLDP包的值都不一样)可实现POX可实现注:修改source MAC、 Chassis ID、Port ID、System Description可实现伪造LLDP包注入:只需一个妥协的主机;LLDP包重传:需要伪造链路两端的交换机各连着一个妥协的主机。单向伪造链路和双向伪造链路(POX只认定双向链路为有效的链路) 链路发现服务基于两个约束条件:(1)链路发现过程中LLDP包的来源是诚信的;(2)LLDP包
3、的传播路径只包含OpenFlow交换机。 不同OpenFlow控制器发送的LLDP数据包的语法不同,如:POX和Floodlight用一个整数变量来代表交换机的端口号,而Opendaylight采用的是特定ASCII码值;一些控制器增加了额外的TLVs,如Floodlight增加了一个起源认证作为LLDP包额外的TLV,然而该认证在设置后始终保持不变。当前的控制器没有机制来确保LLDP包的完整性。一些OpenFlow控制器如Floodlight和Opendaylight提出了一个APIsupressLinkDiscovery来阻止LLDP包传播给连接主机的端口。Denial of Servic
4、e Attack采用POX控制器,用Mininet创建3个交换机相连的线性拓扑,使能routing模块(l2 learning.py), link discovery模块(discovery.py) 和spanning tree模块(spanning tree.py),得到如下结果: 通过h1向s1发送伪造数据包,构造s1和s3之间的伪造链路: 伪造链路攻击后发现spanning tree服务改变了交换机端口的状态: 拓扑更新时,生成树服务被触发来关闭冗余的交换机端口,攻击者可利用此来发动拒绝服务攻击。被攻击交换机原本可用的端口被误关闭,流可能不再从原来的链路走,而是从虚假链路走,导致连接到该
5、端口的用户无法再使用网络资源。Man-In-The-Middle Attack: 使用Floodlight控制器,用Mininet构建图1中的拓扑,其中h4为妥协的主机,它与两个目标交换机s1和s3相连。图1 实际拓扑用h1主机ping主机h3,此时h4的端口并不能监听到h1和h3之间的通信,说明h1与h3通信的数据流经过的路径不包括h4。 接下来进行伪造链路攻击。h4将s3转发的LLDP包重传给s1,控制器会误以为s1和s3之间存在一条链路直接相连(如图2),则s1与s3之间传输的消息都会被h4窃听到。图2 控制器视角下的拓扑再用h1主机ping主机h3,发现控制器选择的通信路径包括伪造链路
6、,显然ping不通,而h4此时能监听到h1和h3之间的通信。验证LLDP数据包采用HMAC,一种密钥散列消息认证码:其中是密钥;是HMAC计算出的信息,包含相关的LLDP TLVs,如Classic ID和Port ID;是加密哈希函数;|表示级联;表示异或运算;和是衰减值常量。定义HMAC需要一个加密用散列函数(表示为h(),如MD5算法)和一个密钥K。我们用B来表示数据块的字节数(例如MD5的散列函数的分割数据块字长B=64),用L来表示散列函数的输出数据字节数(MD5中L=16)。鉴别密钥的长度可以是小于等于数据块字长的任何正整数值,若使用的密钥长度比B大,则首先用散列函数h()作用于它
7、,然后用h()输出的L长度字符串作为在HMAC中实际使用的密钥。一般情况下,推荐的最小密钥K长度是L个字节。opad 用0x5c重复B次,ipad 用0x36重复B次。HMAC运算步骤:(1) 在密钥K后面添加0来创建一个字长为B的字符串(例如,如果K的字长是20字节,B=64字节,则K后会加入44个零字节)。(2) 将上一步生成的B字长的字符串与ipad做异或运算。(3) 将数据流text填充至第二步的结果字符串中。(4) 用h()作用于第三步生成的数据流。(5) 将第一步生成的B字长字符串与opad做异或运算。(6) 再将第四步的结果填充进第五步的结果中。(7) 用h()作用于第六步生成的数据流,输出最终结果。阻止重传攻击:注意基础HMAC对重传攻击无效。若攻击者掌握两个主机,主机1会把接收到的加密LLDP包以外带通道传给主机2,同样能构造这两个主机间的虚假链路。为阻止重传攻击,传统方法是使用独特的信息标识符以确保每个HMAC值是惟一的。本文选择了一种变换方法:将静态密钥换成动态值,它是为链路发现回合中LLDP包选择的随机值,这样攻击者几乎无法猜出的值。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1