Categories: ⚔️, Hacking12.1 min read

VLAN Hopping Attack

In questo articolo parleremo del VLAN Hopping, approfondiremo la logica del suo funzionamento e le diverse metodologie con cui è possibile implementare questo tipo di attacco. Nel prossimo articolo verrà anche condivisa un’esperienza reale, fatta sia in un laboratorio virtuale che fisico. Le infrastrutture di rete utilizzate per la verifica e l’analisi dell’attacco sono state create utilizzando le tecnologie di Cisco, di conseguenza i riferimenti alla prevenzione, gli esempi e la comandistica riguarderanno esclusivamente questo mondo.

NOTE: Concetti base di networking come le VLAN, il modello ISO/OSI, la gestione dei pacchetti a Layer 2/3 effettuata dagli apparati di rete, il protocollo dot1q (classificato ufficialmente come IEEE 802.1Q), il DTP e così via rappresentano un prerequisito indispensabile per la corretta comprensione dell’attacco.

Cos’è il VLAN Hopping?

Il VLAN Hopping è un attacco di rete molto semplice ma efficace, il suo scopo è quello di ottenere un accesso non autorizzato ad una o più VLAN della rete anche se logicamente non sarebbe possibile. Tutto ciò si manifesta solo grazie ad una configurazione non attenta alla sicurezza informatica degli switch che gestiscono il Layer 2 dell’architettura di rete, o in casi più rari, da una o più vulnerabilità intrinseche nella gestione del protocollo dot1q.

Metodologie di attacco

Esistono due metodologie differenti per implementare l’attacco del VLAN Hopping, lo Switch Spoofing ed il Double Tagging. La scelta tra le due dipende essenzialmente dalla situazione in cui l’attaccante si trova nella rete.

  1. Switch Spoofing: In definitiva viene negoziato un Trunk tra il computer dell’attaccante e la porta dello switch su cui è direttamente connesso. La negoziazione può avvenire solo se il computer, fingendosi uno switch Cisco, inoltra un pacchetto DTP all’apparato di rete con la richiesta di creare un Trunk. Questo si formerà ovviamente solo se sulla porta dello switch è attivo il protocollo DTP (modalità dynamic desirable o dynamic auto). Una volta negoziato il Trunk l’attaccante avrà accesso a tutte le VLAN della rete, fatta eccezione ovviamente a tutte quelle che non sono state propagate verso lo switch ormai compromesso. Ricordati che le porte dello switch configurate staticamente in modalità Trunk o Access, non hanno il DTP abilitato, questo significa che la negoziazione può avvenire solo se la porta dello switch funziona seguendo le configurazioni predefinite, ovvero in modalità Access sulla VLAN 1.
    _
  2. Double Tagging: Nel caso in cui la prima metodologia non potesse essere applicata, l’unica alternativa possibile è quella di applicare due volte un tag 802.1q su tutti i frame che dovranno essere inoltrati alla macchina di destinazione (la vittima). Se per esempio l’attaccante si trova nella VLAN 10 e la macchina di destinazione si trova nella VLAN 80, questo dovrebbe inoltrare l’informazione taggando prima i pacchetti con l’ID della VLAN nativa configurata sullo switch (TAG 1) e successivamente con la VLAN di destinazione (TAG 2). Le interfacce configurate staticamente in modalità Access non hanno il dot1q abilitato, per cui la lettura del primo Tag da parte dello switch verrà ignorato, questo però solo se questo riguarda la VLAN nativa, altrimenti verrà scartato tutto il pacchetto. Il secondo Tag dot1q invece è quello più importante perché confonde lo switch facendogli credere di aver ricevuto il pacchetto su un’interfaccia differente, un’interfaccia appunto configurata in Trunk. Da qui in poi il discorso è semplice, tutti i pacchetti raggiungeranno la destinazione specificata dall’attaccante, ma ovviamente la comunicazione sarà a senso unico perché la destinazione, essendo una macchina genuina, non avrà modo di replicare correttamente ai pacchetti che riceve. Rispetto alla prima, questa rappresenta la metodologia più difficile e meno flessibile. Le machine moderne, infatti, scartano a prescindere tutti i pacchetti con un doppio Tag dot1q e la comunicazione a senso unico limita senza dubbio le attività di attacco.

Per comprendere meglio il discorso del Double Tagging, di seguito potete trovare un’illustrazione logica di due frame Ethernet taggati. Il primo è stato taggato una volta, il secondo invece due:

L’immagine mostra anche la lunghezza in byte ed i nomi di ciascun campo presenti sia nel Frame Ethernet che nel Tag dot1q.

Frame Ethernet (descritto nello standard IEEE 802.3):

  1. Destination MAC Address: Indica l’indirizzo MAC di destinazione del pacchetto.
  2. Source MAC Address: Indica l’indirizzo MAC sorgente del pacchetto.
  3. 802.1Q VLAN TAG: Indica il tag dot1q.
  4. Type/Len: Specifica la lunghezza in bytes del campo DATA.
  5. DATA: Specifica l’informazione che il frame sta trasportando.
  6. Frame Check (FCS): Indica un hash value creato dall’algoritmo Cyclic Redundancy Check (CRC) effettuato sul pacchetto stesso. Serve a chi riceverà il pacchetto per determinare se ci sono stati degli errori durante la trasmissione dell’informazione.

Tag dot1q (descritto nello standard IEEE 802.1Q):

  1. Tag Protocol ID: Serve ad identificare il tipo di Tag usato, il valore esadecimale 0x8100 indica il protocollo dot1q.
  2. User Priority: Idnetifica il livello di priorità del Frame. L’utilizzo di quest campo è definito nel protocollo IEEE 802.1p.
  3. Canonical Format Indicator: Viene utilizzato assieme al campo User Priority e può indicare o meno un pacchetto che può essere scartato in caso di congestione.
  4. VLAN ID: Indica l’identificativo numerico associato alla VLAN.

Prevenzione

Per prevenire che qualcuno possa sfruttare le vulnerabilità su cui si appoggia l’attacco del VLAN Hopping è consigliabile seguire queste indicazioni:

  1. Bisogna fare sempre uso, dove possibile, di apparati recenti, sia a livello di tecnologia che di sistema operativo.
  2. Disabilitare il DTP su tutte le interfacce di rete che ne fanno uso e configurare i Trunk sempre manualmente.
  3. Cambiare la VLAN nativa di tutti i Trunk della rete con un ID differente dalla 1, ovvero il valore predefinita.
  4. Disabilitare l’inoltro dei pacchetti BPDU su tutte le interfacce di rete che non dovrebbero essere coinvolte nella gestione del protocollo STP.
  5. Disabilitare l’inoltro dei pacchetti CDP su tutte le interfacce di rete che non guardano apparati di rete Cisco.

Gli ultimi due punti non aiutano a prevenire il VLAN Hopping, ma indirettamente aiutano a contrastarlo, perché impediscono all’attaccante di studiare la rete. Dai pacchetti BPDU, infatti, si possono capire quali VLAN sono in uso, e dai pacchetti CDP si possono apprendere importanti informazioni inerenti allo switch su cui l’attaccante è direttamente connesso.

Comandi (Cisco IOS)

Gli esempi qua di seguito mostrano come applicare i consigli di prevenzione descritti nel paragrafo precedente attraverso il Cisco IOS:

Comandistica
# disabilito il protocollo DTP su un’interfaccia specifica dello switch:
Example-SW(config)#interface gigabitEthernet 0/3
Example-SW(config-if)#switchport nonegotiate# NOTE: il comando “switchport nonegotiate” può essere dato solo se la porta è stata prima configurata staticamente in access o in trunk mode. Se così non fosse il Cisco IOS rifiuterà il comando col seguente messaggio di errore: “Command rejected: Conflict between ‘nonegotiate’ and ‘dynamic'”
# verifico lo stato del protocollo DTP su una specifica interfaccia dello switch (soluzione 1):
Example-SW # show dtp interface g0/3
DTP information for GigabitEthernet0/3:
TOS/TAS/TNS:                              ACCESS/OFF/ACCESS
TOT/TAT/TNT:                              NATIVE/NEGOTIATE/NATIVE
Neighbor address 1:                       000000000000
Neighbor address 2:                       000000000000
Hello timer expiration (sec/state):       never/STOPPED
Access timer expiration (sec/state):      never/STOPPED
Negotiation timer expiration (sec/state): never/STOPPED
Multidrop timer expiration (sec/state):   never/STOPPED
FSM state:                                S1:OFF
# times multi & trunk                     0
Enabled:                                  no
In STP:                                   noStatistics
———-
0 packets received (0 good)
0 packets dropped
0 nonegotiate, 0 bad version, 0 domain mismatches,
0 bad TLVs, 0 bad TAS, 0 bad TAT, 0 bad TOT, 0 other
0 packets output (0 good)
0 native, 0 software encap isl, 0 isl hardware native
0 output errors
0 trunk timeouts
1 link ups, last link up on Fri Feb 10 2023, 16:42:36
1 link downs, last link down on Fri Feb 10 2023, 16:44:11
# verifico lo stato del protocollo DTP su una specifica interfaccia dello switch (soluzione 2):
Example-SW#show interfaces gigabitEthernet 0/3 switchport
Name: Gi0/3
Switchport: Enabled
Administrative Mode: static access
Operational Mode: static access
Administrative Trunking Encapsulation: negotiate
Operational Trunking Encapsulation: native
Negotiation of Trunking: Off
Access Mode VLAN: 1 (default)
Trunking Native Mode VLAN: 1 (default)
Administrative Native VLAN tagging: enabled
Voice VLAN: none
Administrative private-vlan host-association: none
Administrative private-vlan mapping: none
Administrative private-vlan trunk native VLAN: none
Administrative private-vlan trunk Native VLAN tagging: enabled
Administrative private-vlan trunk encapsulation: dot1q
Administrative private-vlan trunk normal VLANs: none
Administrative private-vlan trunk associations: none
Administrative private-vlan trunk mappings: none
Operational private-vlan: none
Trunking VLANs Enabled: ALL
Pruning VLANs Enabled: 2-1001
Capture Mode Disabled
# configuro una porta dello switch in Trunk con una VLAN nativa diversa dalla predefinita. Lo stesso andrà fatto ovviamente anche sull’altra interfaccia dello switch:
Example-SW(config)#interface gigabitEthernet 0/0
Example-SW(config)#switchport trunk encapsulation dot1q
Example-SW(config)# switchport mode trunk
Example-SW(config)#switchport trunk native vlan 100
# disabilito il protocollo STP su una specifica interfaccia dello switch:
Example-SW(config)#interface gigabitEthernet 0/4
Example-SW(config-if)#spanning-tree bpdufilter enable
# disabilito il protocollo CDP su una specifica interfaccia dello switch:
Example-SW(config)#interface gigabitEthernet 0/4
Example-SW(config-if)#no cdp enable

Esempio pratico

In questo paragrafo costruiremo un’infrastruttura di rete, sia virtuale che reale, nel quale implementeremo l’attacco del VLAN Hopping attraverso le due metodologie descritte precedentemente, ovvero lo Switch Spoofing ed il Double Tagging.

NOTE: L’utilizzo del laboratorio virtuale è stato indispensabile perché è l’unico in cui il Double Tagging ha funzionato (vedi il paragrafo 5.5).

Strumenti di lavoro

Di seguito tutti gli strumenti utilizzati sia per la creazione dell’infrastruttura di rete che per l’implementazione e la verifica dell’attacco:

  1. EVE-NG: Appliance virtuale di infrastrutture di rete. Viene distribuito in due versioni, Community e Professional. La prima è gratuita ma con delle limitazioni, la seconda è più completa ma a pagamento.
  2. vIOS: Appliance virtuale del classico Cisco IOS. Si tratta sostanzialmente di un Multilayer Switch virtuale. Purtroppo, viene rilasciata solo ai Cisco Partners.
  3. VLANPWN: Si tratta di un tool-kit molto semplice utilizzato per fare VLAN Hopping. È composto da due script scritti in Python, DTPHijacking.py e DoubleTagging.py entrambi disponibili gratuitamente su Github.
  4. Windows 10: Il sistema operativo di Microsoft. I client del laboratorio fanno uso di questo sistema.
  5. Wireshark: Software gratuito e professionale per lo sniffing dei pacchetti di rete. Indispensabile per verificare l’efficacia dell’attacco.
  6. Switch Catalyst: La versione reale del laboratorio, perfettamente speculare alla sua controparte virtuale, è stata costruita facendo uso di due Catalyst c2960.

Siccome la logica del Double Tagging si basa su una vulnerabilità presente negli apparati di rete, la tabella seguente mostra le versioni esatte degli switch utilizzati nel laboratorio:

Topologia

L’immagine qua di seguito mostra una topologia di rete molto semplice suddivisa in tre VLAN, dove il Layer 3, per ciascuna di esse, non esiste. Questo significa che l’intera infrastruttura è solo Layer 2 e che i client/server, non avendo un gateway, non possono comunicare al di fuori della loro subnet di origine, almeno in teoria:

Questa topologia è stata creata utilizzando EVE-NG. La medesima infrastruttura è stata replicata anche nella realtà usando due Cisco Catalyst c2960 e delle macchine reali per i client/server.

Switch Spoofing

Lo script DTPHijacking.py ci permette di negoziare un Trunk tra il nostro computer e lo switch Cisco direttamente connesso attraverso l’inoltro periodico di un pacchetto DTP:

python DTPHijacking.py –interface “Ethernet”

I parametri sono chiari, deve essere solo specificata l’interfaccia di rete su cui si vuole inoltrare il pacchetto, ed ovviamente mantenere attivo lo script per tutto il tempo necessario ad implementare l’attacco. Dopo qualche minuto, infatti, se non si inviano più pacchetti DTP lo switch cancella il Trunk creato automaticamente.

Per questa prova le configurazioni associate all’interfaccia Gi0/0 dello switch IOSv-SW01 sono state cambiate seguendo quelle predefinite, ovvero modalità access sulla VLAN 1:

IOSv-SW01#show run interface gigabitEthernet 0/0
interface GigabitEthernet0/0

media-type rj45

negotiation auto

spanning-tree portfast edge

end

Di seguito la prova che sullo switch IOSv-SW01 si è creato automaticamente un Trunk sull’interfaccia Gi0/0, ovvero quella su cui è connesso il computer dell’attaccante:

Da qua in poi andrebbero configurate delle interfacce virtuali per ciascuna VLAN su cui si vuole comunicare, ma questo va oltre lo scopo illustrativo di questo articolo.

Double Tagging

Lo script DoubleTagging.py ci permette di inoltrare dei pacchetti ICMP di tipo Echo Request verso qualsiasi tipo di destinazione utilizzando la logica del Double Tagging.

In questo esempio inoltreremo questi pacchetti dal PC dell’attaccante (VLAN 10) verso il Server-FTP (VLAN 80) facendo finta però che sia un PC qualsiasi ad inoltrare la richiesta, un computer con un IP 1.1.1.1. Per farlo attiviamo lo script via CLI facendo uso del comando:

python DoubleTagging.py –interface “Ethernet” –nativevlan 100 –targetvlan 80 –victim 192.168.80.12 –attacker 1.1.1.1

I parametri sono chiari, deve essere specificato il nome dell’interfaccia di uscita, la VLAN nativa configurata sugli switch della rete, la VLAN su cui risiede la vittima, il suo indirizzo IP e l’IP sorgente dal quale vogliamo far credere che sia partita la connessione (fake IP).

Questo è il risultato attraverso uno sniffing effettuato con WireShark sia sulla macchina dell’attaccante che su quella della vittima:

Dagli screenshot si evince che l’attacco è riuscito perfettamente. L’attaccante è riuscito ad inoltrare delle informazioni dalla VLAN 10 alla VLAN 80 anche se entrambe logicamente sono segregate.

NOTE: In questo esempio abbiamo dato per scontato che l’attaccante già conoscesse l’ID della VLAN nativa, ma quasi sempre è quella predefinita, ovvero la 1. Anche se non lo previene dunque, cambiare l’ID della VLAN nativa può senza dubbio aiutare a limitare questo tipo di attacco.

I problemi del Double Tagging

Il VLAN Hopping seguendo la logica del Double Tagging non è molto efficace, per varie ragioni:

  1. Le macchine moderne scartano a prescindere tutti i pacchetti con un doppio Tag dot1q e infatti, nel laboratorio reale, l’attacco non ha funzionato. Ma allora come mai in quello virtuale invece sì? Tenendo presente che le versioni del Cisco IOS e del vIOS utilizzate per questa prova, oltre ad essere molto simili, sono entrambe delle versioni recenti, è molto probabile che ciò che previene il Double Tagging sia scritto in ASIC, ovvero nei circuiti stampati della macchina stessa ed il vIOS, essendo solo il software, non può usufruirne.
  2. Un altro problema riscontrato nel laboratorio virtuale, è che l’attacco funziona solo se il Trunk permette il passaggio della VLAN 10, ovvero della VLAN di origine dell’attacco. Questo logicamente non ha molto senso, ma essendo sfruttata una vulnerabilità del sistema può darsi che anche questo sia un comportamento anomalo del vIOS.
  3. Come già accennato nei paragrafi precedenti, anche se si riuscisse ad implementare l’attacco per mezzo del Double Tagging, la comunicazione sarebbe solo a senso unico.

Andrea Querci

Go to Top