Перейти к содержимому

Обход сегментации VLAN при пентесте: разведка через ARP и DHCP-трафик

Обход сегментации VLAN при пентесте: разведка через ARP и DHCP-трафик
Время чтения: 15 мин.

На внутреннем пентесте логистической компании коммутатор Cisco в переговорной ответил на DTP-запрос за 11 секунд. Порт перешёл в trunk-режим — и три VLAN (пользователи, бухгалтерия, серверный сегмент), которые должны быть изолированы друг от друга, оказались доступны с одного ноутбука. Вся фаза разведки заняла 15 минут: tcpdump показал ARP-ответы от шлюзов четырёх подсетей, а DHCP Offer выдал маску и DNS серверного сегмента. Четыре строки конфига на порту — и этого бы не случилось. Но их не было.

Ниже — как вытаскивать карту сегментации из ARP- и DHCP-трафика, какие техники VLAN hopping работают на практике и при каких условиях они бесполезны.

Бизнес-логика атаки: зачем атакующему обход сегментации сети

VLAN (Virtual LAN) — технология, которая логически разделяет одну физическую сеть на изолированные сегменты. Бухгалтерия не видит серверный сегмент, гостевой Wi-Fi не добирается до SCADA-контроллеров — так задумано. На практике ошибки конфигурации коммутаторов позволяют атакующему «перепрыгнуть» из одного VLAN в другой. Этот класс атак называется VLAN hopping.

Если ты только начинаешь разбираться в наступательной безопасности, полезно сразу привязывать техники к общепринятой классификации. В матрице MITRE ATT&CK (открытая база тактик и техник реальных атак; T-коды вроде T1040 — её идентификаторы) разведка через ARP и DHCP попадает под Network Sniffing (T1040, тактики Credential Access и Discovery) и System Network Configuration Discovery (T1016, тактика Discovery). Обход сегментации — Adversary-in-the-Middle (T1557, тактики Credential Access и Collection) с подтехниками ARP Cache Poisoning (T1557.002) и DHCP Spoofing (T1557.003).

Финальная цель — lateral movement: из гостевого или пользовательского сегмента добраться до серверов, контроллеров домена или финансовых систем. На внутреннем пентесте один успешный VLAN hop часто превращает отчёт «сегментация работает» в «получен доступ к контроллеру домена и бэкапам 1С».

Разведка сети через ARP-трафик при внутреннем пентесте

Пассивный сбор ARP: что видно в эфире

ARP (Address Resolution Protocol) связывает IP-адрес устройства с его MAC-адресом в локальной сети. Каждое устройство периодически рассылает ARP-запросы и ответы. Они видны всем хостам в одном broadcast-домене — по сути, в одном VLAN.

Зачем это пентестеру: перехватывая ARP-трафик пассивно, без единого отправленного пакета, мы узнаём IP-диапазон текущего сегмента, MAC-адрес шлюза и количество живых хостов. Если порт ошибочно настроен как trunk или конфигурация «протекает», в дампе появятся ARP-пакеты из соседних VLAN — прямой маркер ошибки сегментации.

[Применимо: внутренний пентест, любая инфраструктура с L2-доступом]

Предусловия: Linux (Kali или любой дистрибутив с tcpdump), сетевой интерфейс подключён к порту коммутатора кабелем, права root.

Запускаем пассивный перехват ARP: sudo tcpdump -i eth0 -nn arp -c 200. Флаг -nn отключает резолв имён — чтобы не генерировать DNS-трафик и не выдавать присутствие. -c 200 ограничивает захват двумя сотнями пакетов; для первичной картины обычно хватает.

Ожидаемый вывод:

10:14:02 ARP, Request who-has 10.10.10.1 tell 10.10.10.45
10:14:02 ARP, Reply 10.10.10.1 is-at aa:bb:cc:00:01:01
10:14:03 ARP, Request who-has 10.10.20.1 tell 10.10.20.12
10:14:03 ARP, Reply 10.10.20.1 is-at aa:bb:cc:00:02:01

Что читать в этом дампе:

  • IP-адреса с разными октетами — здесь 10.10.10.x и 10.10.20.x. Два диапазона = вероятно два VLAN. Если порт настроен как access, вы должны видеть только один диапазон.
  • MAC-адреса шлюзов (поле is-at) — если MAC шлюзов совпадает, оба сегмента маршрутизируются через один L3-коммутатор. Разные MAC — разные устройства маршрутизации.
  • Количество уникальных IP — грубая оценка размера сегмента без активного сканирования nmap.

Частая ошибка на старте: путать VLAN ID с номером подсети. VLAN 10 не обязательно содержит подсеть 10.x.x.x. VLAN ID — просто числовой тег в заголовке 802.1Q (стандарт инкапсуляции кадров для VLAN в Ethernet), а подсеть назначается администратором произвольно. Реальное соответствие «VLAN ID → подсеть» узнаём из DHCP-ответов или из конфигурации коммутатора.

ARP harvesting — построение карты сегмента через анализ ARP-трафика

ARP harvesting — систематический сбор ARP-ответов для составления таблицы «IP → MAC → vendor». Утилита arp-scan ускоряет процесс: sudo arp-scan -l -I eth0 отправляет ARP-запросы на все адреса текущей подсети и возвращает список живых хостов с OUI-производителем. OUI — первые три октета MAC-адреса, по ним определяется вендор сетевой карты.

Зачем: зная вендора, вы отличаете рабочие станции (Dell, Lenovo) от сетевого оборудования (Cisco, Juniper) и IP-телефонов (Polycom, Yealink). Это помогает понять структуру сегмента до сканирования портов и выбрать вектор атаки.

Для более глубокого анализа ARP-таблицы — arp -an на Linux. Команда покажет все записи ARP-кэша, включая неполные (incomplete). Если в кэше появились IP из чужого диапазона — порт коммутатора пропускает трафик из другого VLAN.

Когда техника НЕ работает:

  • Порт настроен как isolated (Private VLAN / PVLAN) — ARP-broadcast не выходит за пределы порта.
  • Включён Dynamic ARP Inspection (DAI) — коммутатор валидирует ARP-пакеты по DHCP Snooping binding table и дропает нелегитимные.
  • Применяется 802.1X (стандарт аутентификации на порту) без прохождения аутентификации — трафик блокируется полностью.

DHCP-трафик: анализ сегментации изнутри

Перехват DHCP Discover и Offer

DHCP (Dynamic Host Configuration Protocol) автоматически выдаёт IP-адреса. Когда устройство подключается к сети, оно отправляет широковещательный DHCP Discover, а сервер отвечает DHCP Offer с IP-адресом, маской подсети, шлюзом и DNS-серверами. Для пентестера DHCP Offer — концентрат информации о текущем сегменте.

[Применимо: внутренний пентест, инфраструктура с DHCP]

Предусловия: Linux с tcpdump или Wireshark, права root, интерфейс автоматически переводится в promiscuous-режим при захвате.

Запускаем перехват: sudo tcpdump -i eth0 -nn port 67 or port 68 -vvv -c 20. Порты 67 (DHCP-сервер) и 68 (DHCP-клиент) — стандартные. Флаг -vvv включает максимально подробный вывод, где видны все опции DHCP.

В DHCP Offer обращаем внимание на следующие поля:

  • yiaddr (your IP address) — IP, предложенный клиенту. Показывает подсеть текущего VLAN.
  • Subnet Mask (option 1) — маска. /24 (255.255.255.0) = до 254 хостов в сегменте, /22 = до 1022.
  • Router (option 3) — IP шлюза. Совпадает ли он со шлюзом из ARP-дампа? Несовпадение — признак нескольких маршрутизаторов или ошибки.
  • Domain Name Server (option 6) — DNS-серверы. Внутренний DNS часто раскрывает имя домена Active Directory.
  • Domain Name (option 15) — полный доменный суффикс (например, corp.example.ru).
  • DHCP Server Identifier (option 54) — IP самого DHCP-сервера.

Если в сети несколько VLAN, а DHCP relay agent настроен некорректно, в дампе могут появиться Offer-пакеты с параметрами чужих сегментов. Это прямой индикатор проблем сегментации.

Выявление VLAN через активный DHCP-запрос

Для активной разведки DHCP можно отправить Discover вручную через Scapy — Python-библиотеку для конструирования и отправки сетевых пакетов. Команда sudo scapy запускает интерактивную консоль.

Конструируем и отправляем DHCP Discover:

mac = str(RandMAC())
sendp(Ether(dst="ff:ff:ff:ff:ff:ff", src=mac) /
      IP(src="0.0.0.0", dst="255.255.255.255") /
      UDP(sport=68, dport=67) /
      BOOTP(chaddr=bytes.fromhex(mac.replace(':', ''))) /
      DHCP(options=[("message-type", "discover"), "end"]),
      iface="eth0")

RandMAC() генерирует случайный MAC — каждый новый Discover выглядит как новое устройство. Если коммутатор поместил вас в VLAN 10, Offer вернётся с параметрами VLAN 10. Если порт пропускает тегированные кадры, можно повторить запрос с тегом 802.1Q другого VLAN и сравнить ответы — различие параметров подтвердит утечку между сегментами.

Когда техника НЕ работает:

  • DHCP Snooping включён — коммутатор дропает DHCP-пакеты с нетрастованных (untrusted) портов.
  • В сети нет DHCP (полностью статическая адресация) — Discover уходит в пустоту.
  • Rate limiting на порту — коммутатор ограничивает количество DHCP-запросов и блокирует порт при превышении.

VLAN hopping атака: техники обхода сегментации

Switch spoofing через DTP

DTP (Dynamic Trunking Protocol) — проприетарный протокол Cisco, который позволяет портам коммутатора автоматически договариваться о режиме trunk. Trunk — транковый канал, пропускающий трафик нескольких VLAN. Если порт оставлен в режиме dynamic desirable или dynamic auto (а это дефолт на многих моделях Cisco), атакующий отправляет DTP-фрейм и переводит порт в trunk. После этого весь тегированный трафик разрешённых на транке VLAN начинает приходить на интерфейс атакующего.

Звучит как баг, которому лет двадцать? Так и есть. И он до сих пор работает.

[Применимо: внутренний пентест, Cisco-инфраструктура с дефолтными настройками портов]

Предусловия:

  • Коммутатор Cisco с портом в режиме dynamic desirable или dynamic auto (не применены switchport mode access + switchport nonegotiate)
  • Kali Linux с установленным Yersinia: sudo apt install yersinia
  • Права root

Пошаговый сценарий:

Шаг 1. Проверяем, отправляет ли коммутатор DTP-фреймы: sudo tcpdump -i eth0 -nn ether proto 0x2004 -c 5. Ethertype 0x2004 — идентификатор DTP. Если в выводе есть пакеты — порт участвует в DTP-negotiation и потенциально уязвим. Если за 30 секунд тишина — порт, скорее всего, в режиме access с nonegotiate.

Шаг 2. Отправляем DTP Desirable через Yersinia. В интерактивном режиме: sudo yersinia -I (навигация по меню может отличаться между версиями — ориентируйтесь на подсказки на экране), выбираем протокол DTP, запускаем атаку enabling trunking. Альтернативно: sudo yersinia dtp -attack 1 -interface eth0, но синтаксис нестабилен между версиями — проверьте yersinia dtp -h. Если порт переключится в trunk, связь кратковременно прервётся на 1–3 секунды, затем восстановится.

Шаг 3. Проверяем результат: sudo tcpdump -i eth0 -nn vlan -c 10. Появление фреймов с тегом vlan X в выводе — подтверждение: trunk установлен, трафик чужих VLAN приходит на ваш интерфейс.

Шаг 4. Создаём виртуальные интерфейсы для целевых VLAN:

sudo modprobe 8021q
sudo ip link add link eth0 name eth0.20 type vlan id 20
sudo ip link set eth0.20 up
sudo dhclient -v eth0.20  # если dhclient нет: apt install isc-dhcp-client, или dhcpcd eth0.20

modprobe 8021q загружает модуль ядра для работы с тегированными кадрами 802.1Q. ip link add создаёт виртуальный подинтерфейс eth0.20 с VLAN ID 20. После ip link set up интерфейс активен. dhclient -v eth0.20 запрашивает IP у DHCP-сервера в VLAN 20 — флаг -v показывает процесс. Строка bound to 10.10.20.X в выводе = вы получили адрес внутри целевого VLAN.

Шаг 5. Проверяем доступ: ping -I eth0.20 10.10.20.1. Ответ от шлюза = сегментация обойдена. Теперь можно запускать nmap-сканирование через этот интерфейс.

Когда техника НЕ работает:

  • Порт жёстко настроен как switchport mode access + switchport nonegotiate — DTP-фреймы игнорируются.
  • Коммутатор не Cisco. DTP — проприетарный протокол, оборудование HP/Aruba, Juniper, Huawei его не поддерживает.
  • Включён port security с лимитом MAC-адресов — порт отключается при появлении нового MAC.
  • Настроен BPDU Guard — порт блокируется при получении любых управляющих фреймов.

Double tagging VLAN — атака двойного тегирования

Double tagging — атака, при которой Ethernet-кадр получает два заголовка 802.1Q: внешний с native VLAN коммутатора и внутренний с целевым VLAN. Первый коммутатор снимает внешний тег (он совпадает с native VLAN и обрабатывается «прозрачно»), а второй видит внутренний тег и пересылает кадр в целевой сегмент.

Критическое ограничение: атака однонаправленная. Вы отправляете пакет в целевой VLAN, но ответ не вернётся через двойной тег. Это годится для инъекции — ARP poisoning в чужом сегменте, отправка эксплойта — но не для полноценной двусторонней связи.

[Применимо: внутренний пентест, legacy-инфраструктура с native VLAN 1 на транках]

Предусловия:

  • Атакующий находится в native VLAN транка (часто VLAN 1 — дефолт на Cisco)
  • Между атакующим и целью минимум два коммутатора, соединённых транком
  • Транк пропускает целевой VLAN
  • Коммутатор не тегирует кадры native VLAN (не применена команда vlan dot1q tag native)

Пример инъекции через Scapy:

from scapy.all import Ether, Dot1Q, IP, ICMP, sendp
frame = Ether(dst="ff:ff:ff:ff:ff:ff")
frame /= Dot1Q(vlan=1)    # внешний тег: native VLAN
frame /= Dot1Q(vlan=20)   # внутренний тег: целевой VLAN
frame /= IP(dst="10.10.20.1") / ICMP()
sendp(frame, iface="eth0")
# Scapy автоматически проставляет Ethertype 0x8100 через bind_layers,
# но проверьте итоговый кадр через hexdump(frame) перед отправкой.

Первый Dot1Q(vlan=1) — внешний тег, который первый коммутатор снимет как native. Второй Dot1Q(vlan=20) — внутренний, по которому второй коммутатор направит пакет в VLAN 20. Если на ICMP придёт reply (проверяем через tcpdump -i eth0 icmp), пакет достиг цели. Ответ вернётся только если маршрутизация настроена через ваш сегмент.

В некоторых публикациях упоминаются готовые скрипты для автоматизации double tagging (например, на HackTricks), но конкретные названия и синтаксис CLI стоит проверять в актуальных репозиториях перед использованием.

Когда техника НЕ работает:

  • Native VLAN на транках переназначен на неиспользуемый VLAN (например, 999) — стандартная контрмера.
  • Применена команда vlan dot1q tag native — коммутатор тегирует все кадры, включая native VLAN, и внешний тег не снимается.
  • Коммутатор дропает тегированные кадры на access-портах — поведение по умолчанию на многих современных моделях.

Voice VLAN hijacking через CDP и LLDP

В корпоративных сетях access-порт часто настроен с двумя VLAN: data VLAN для рабочей станции и voice VLAN для IP-телефона. Коммутатор сообщает voice VLAN ID через CDP (Cisco Discovery Protocol) или LLDP-MED (Link Layer Discovery Protocol — Media Endpoint Discovery). Атакующий имитирует IP-телефон и получает доступ к voice VLAN — даже если DTP отключён.

VoIP Hopper (есть в репозиториях Kali: sudo apt install voiphopper) автоматизирует процесс. Команда sudo voiphopper -i eth0 -c 2 запускает пассивное прослушивание CDP-фреймов: утилита извлекает voice VLAN ID из анонсов коммутатора. Для активной имитации телефона (CDP spoofing) — флаг -z, который автоматически создаёт подинтерфейс с DHCP-запросом в voice VLAN. Точный синтаксис зависит от версии — проверьте voiphopper --help.

Когда техника НЕ работает:

  • CDP и LLDP-MED отключены на пользовательских портах.
  • Port security привязывает порт к OUI конкретного вендора IP-телефонов.
  • Voice VLAN изолирован ACL от data-сегмента и не маршрутизируется.

Уязвимости оборудования: когда firmware подводит

Даже при корректной конфигурации баги прошивки могут сломать сегментацию. Два подтверждённых примера:

CVE-2022-20728 (CVSS 4.7, MEDIUM) — уязвимость в клиентском forwarding-коде беспроводных точек доступа Cisco Aironet и Catalyst AP (модели 1542D, 1542I, 1562I и другие). Неаутентифицированный adjacent-атакующий (AV:A — нужен доступ к беспроводному сегменту) с доступом к native VLAN может инъецировать пакеты клиентам в не-native VLAN. Эта уязвимость применима к беспроводной инфраструктуре Cisco AP и не связана с DTP-атакой на проводной коммутатор, описанной выше. Воздействие ограничено инъекцией пакетов (integrity low); конфиденциальность и доступность не затронуты. CVSS-вектор: AV:A/AC:L/PR:N/UI:N/S:C/C:N/I:L/A:N. Корневая причина — CWE-284, ненадлежащий контроль доступа. EPSS (оценка вероятности эксплуатации в ближайшие 30 дней по шкале 0–1) = 0.0025, percentile 15.95% — ниже медианы. По данным CISA SSVC: exploitation = none, automatable = no, impact = partial. Массовой эксплуатации нет, но при целевом пентесте беспроводной инфраструктуры — валидный вектор.

CVE-2024-20465 (CVSS 5.8, MEDIUM) — уязвимость в ACL programming в Cisco IOS Software на коммутаторах Cisco Industrial Ethernet 4000, 4010, 5000 Series. После включения и отключения REP (Resilient Ethernet Protocol) IPv4 ACL на SVI (Switched Virtual Interface — L3-интерфейс VLAN на коммутаторе) перестают применяться. Удалённый неаутентифицированный атакующий обходит ACL и получает доступ к ресурсам. CVSS-вектор: AV:N/AC:L/PR:N/UI:N/S:C/C:N/I:L/A:N. CWE-284. EPSS = 0.0042. CISA SSVC: automatable = yes — автоматизация возможна, хотя массовой эксплуатации пока нет.

Минилаб: отработка обхода сегментации VLAN на стенде

Требования к окружению:

  • ПК с 8+ ГБ RAM
  • GNS3 или EVE-NG с образом Cisco IOS L2 (c2960, c3750 или vIOS L2)
  • Kali Linux VM (2 ГБ RAM, установлены tcpdump, Yersinia, Scapy)
  • Два виртуальных интерфейса от Kali к виртуальному коммутатору

Сценарий:

  1. В GNS3 создайте коммутатор с тремя VLAN: 10 (users, подсеть 10.10.10.0/24), 20 (servers, 10.10.20.0/24), native VLAN 1. Порт Kali оставьте в режиме dynamic desirable — намеренно уязвимая конфигурация.

  2. На Kali запустите пассивный ARP-захват: sudo tcpdump -i eth0 -nn arp -c 50. Убедитесь, что видите ARP только из VLAN 10 — адреса 10.10.10.x. Это ваша baseline-картина «до атаки».

  3. Выполните DTP-атаку: sudo yersinia -I (интерактивный режим → DTP → enabling trunking по подсказкам на экране) или sudo yersinia dtp -attack 1 -interface eth0 (проверьте синтаксис через -h). Подождите 5 секунд.

  4. Повторите ARP-захват. Если в дампе появились адреса 10.10.20.x — trunk установлен, трафик серверного VLAN виден.

  5. Создайте виртуальный интерфейс для VLAN 20, получите IP через dhclient, пропингуйте шлюз 10.10.20.1. Ответ = обход сегментации подтверждён.

  6. Теперь переключите порт в защищённый режим: switchport mode access и switchport nonegotiate. Повторите шаг 3 — DTP-атака не должна сработать. ARP-дамп покажет только трафик VLAN 10. Это проверка контрмеры.

  7. Для double tagging: верните порт в access VLAN 1, создайте между двумя виртуальными свитчами trunk и отправьте Scapy-кадр с двумя тегами. Проверьте через tcpdump на целевом хосте в VLAN 20, дошёл ли пакет.

На практике VLAN часто остаётся основным методом сегментации в организациях, которые не внедрили дополнительные слои защиты. Но VLAN — L2-механизм. Он не проектировался как граница безопасности. То, что я наблюдаю на большинстве внутренних пентестов: защитные рекомендации известны уже лет пятнадцать. switchport mode access, switchport nonegotiate, смена native VLAN — четыре строки конфига на порт. И всё равно DTP-атака через Yersinia срабатывает с первой попытки. Проблема не в технологии, а в операционной дисциплине: шаблон конфигурации написан, но никто не проверяет, что он применён на каждом из двух тысяч портов. Один порт в переговорке, один в серверной стойке, один на этаже «который пока не используется» — и сегментация превращается в декорацию.

Реальная граница — firewall между сегментами, microsegmentation на уровне хостов, Zero Trust-политика с проверкой каждого соединения. VLAN должен быть первым слоем, не единственным. Если только начинаешь в сетевой безопасности и хочешь пройти базу системно — IB Basics на codeby.school ведёт от нуля до первых задач, без академического тона.

Эту тему и смежные навыки разбирают на практике в курсе «Компьютерные сети» Codeby Academy.