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

На внутреннем пентесте логистической компании коммутатор 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 к виртуальному коммутатору
Сценарий:
-
В GNS3 создайте коммутатор с тремя VLAN: 10 (users, подсеть 10.10.10.0/24), 20 (servers, 10.10.20.0/24), native VLAN 1. Порт Kali оставьте в режиме
dynamic desirable— намеренно уязвимая конфигурация. -
На Kali запустите пассивный ARP-захват:
sudo tcpdump -i eth0 -nn arp -c 50. Убедитесь, что видите ARP только из VLAN 10 — адреса 10.10.10.x. Это ваша baseline-картина «до атаки». -
Выполните DTP-атаку:
sudo yersinia -I(интерактивный режим → DTP → enabling trunking по подсказкам на экране) илиsudo yersinia dtp -attack 1 -interface eth0(проверьте синтаксис через-h). Подождите 5 секунд. -
Повторите ARP-захват. Если в дампе появились адреса 10.10.20.x — trunk установлен, трафик серверного VLAN виден.
-
Создайте виртуальный интерфейс для VLAN 20, получите IP через
dhclient, пропингуйте шлюз 10.10.20.1. Ответ = обход сегментации подтверждён. -
Теперь переключите порт в защищённый режим:
switchport mode accessиswitchport nonegotiate. Повторите шаг 3 — DTP-атака не должна сработать. ARP-дамп покажет только трафик VLAN 10. Это проверка контрмеры. -
Для 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.