Продолжаем цикл статей посвященных пентесту на канальном уровне. При атаке на канальном уровне, можно перепрыгнуть через все средства защиты, настроенные на более высоких уровнях. В данной статье мы с вами рассмотрим один из векторов атак самый низкий уровень сети — атаки на сети VLAN.
Еще по теме: Техники туннелирования при пентесте
Для понимания этого материала нужно иметь бэкграунд знаний компьютерных сетей, в частности знать, как работает коммутация и маршрутизация.
Атаки на сети VLAN
Исходя из личного опыта пентестов, могу сказать, что протоколы уровня L2 очень часто остаются без должного внимания и в большинстве случаев работают с конфигурацией по умолчанию. Этим может воспользоваться хакер.
Устройства уровня L2 работают на канальном уровне и выполняют физическую адресацию. Работа на этом данном уровне выполняется с кадрами, или как некоторые еще называют «фреймами». На данном уровне нет никаких IP-адресов, устройство идентифицирует получателя и отправителя только по MAC-адресу и передает кадры между ними.
Динамический транк и побег в другие сегменты VLAN
Эта атака применима только к коммутаторам Cisco. Суть атаки заключается в том, чтобы принудительно перевести порт в режим магистрального канала. За автоматический транкинг на коммутаторах Cisco отвечает протокол DTP.
По умолчанию все порты коммутатора Cisco находятся в режиме DTP Dynamic Auto. Это означает, что порт будет ожидать инициацию транка с соседнего порта. Атакующему остается только отправить специально подготовленный кадр DTP Desirable, и он сможет совершить прыжок абсолютно в любую сеть VLAN и видеть трафик всех сетей VLAN.
Соберем кадр DTP Desirable с помощью Scapy. Для начала необходимо импортировать модуль для работы с протоколом DTP:
1 |
>>> from.scapy.contrib.dtp import * |
Собираем фрейм Ethernet 802.3, MAC-адрес источника будет рандомизированным, а в качестве MAC-адреса назначения будет адрес мультикастовой L2-рассылки 01:00:0C:CC:CC:CC.
Мультикастовый адрес 01:00:0C:CC:CC:CC используется не только протоколом DTP, но и другими, например CDP, VTP, PAgP, UDLD. Чтобы протоколы отличались друг от друга при отправке объявлений по одинаковому мультикастовому адресу, для них реализовано уникальное значение в заголовке SNAP на уровне LLC (Logical Link Control). Для DTP это значение равно 0x2004.
Не забываем о слоях LLC и SNAP с указанием значения 0x2004, определяющего, что это именно протокол DTP. Значения заголовков в tlvlist оставляем по умолчанию, кроме DTPNeighbor. И в конце зациклим отправку собранного кадра — пусть шлется раз в три секунды. Потому что если порт был сконфигурирован динамически, то время его жизни всего 300 секунд (5 минут).
1 2 3 4 5 |
>>> mymac = RandMAC() >>> dtp_frame = Dot3(src=mymac, dst="01:00:0C:CC:CC:CC") >>> dtp_frame /= LLC(dsap=0xaa, ssap=0xaa, ctrl=3)/SNAP(OUI=0x0c, code = 0x2004) >>> dtp_frame /= DTP(tlvlist=[DTPDomain(),DTPStatus(),DTPType(),DTPNeighbor(neighbor=mymac)]) >>> sendp(dtp_frame, iface="eth0", inter=3, loop=1, verbose=1) |
Почему‑то в Scapy в дефолтном кадре DTP по умолчанию хранятся все необходимые значения, чтобы собрать именно кадр DTP Desirable. Я пока не знаю, с чем это связано, но нам это на руку: сэкономим время. Поэтому мы оставили параметры DTP по умолчанию (за исключением DTPNeighbor).
Однако вкратце расскажу о самых важных для нас заголовках и их значениях:
- DTPType = '\xa5' — значение заголовка, указывающее на использование инкапсуляции 802.1Q;
- DTPStatus = '\x03' — значение заголовка, указывающее на статус DTP-кадра. Это статус Desirable, то, что нам нужно для инициации магистрального режима порта.
После проведения атаки мы можем видеть трафик всех сетей VLAN. В результате сетевой разведки обнаружены сети VLAN 100, 200, 220 и 250. Эти значения VLAN ID расположены в одном из заголовков протокола STP — Root Identifier (Root Bridge System ID Extension).
Теперь необходимо создать виртуальные интерфейсы VLAN, поднять их и запросить адрес по DHCP. В итоге мы сможем взаимодействовать со всеми хостами во всех сетях VLAN.
1 2 3 4 5 6 7 8 9 10 11 12 |
c0ldheim@PWN:~$ sudo vconfig add eth0 100 c0ldheim@PWN:~$ sudo vconfig add eth0 200 c0ldheim@PWN:~$ sudo vconfig add eth0 220 c0ldheim@PWN:~$ sudo vconfig add eth0 250 c0ldheim@PWN:~$ sudo ifconfig eth0.100 up c0ldheim@PWN:~$ sudo ifconfig eth0.200 up c0ldheim@PWN:~$ sudo ifconfig eth0.220 up c0ldheim@PWN:~$ sudo ifconfig eth0.250 up c0ldheim@PWN:~$ sudo dhclient -v eth0.100 c0ldheim@PWN:~$ sudo dhclient -v eth0.200 c0ldheim@PWN:~$ sudo dhclient -v eth0.220 c0ldheim@PWN:~$ sudo dhclient -v eth0.250 |
См. также Атака и защита протокола STP
VTP-инъекции и манипуляции базами данных VLAN
Протокол VTP был создан для того, чтобы автоматически и централизованно управлять базами данных VLAN на коммутаторах Cisco. Для этого используются номера ревизии конфигурации. С их помощью коммутатор определяет самую свежую базу данных VLAN, принимает объявления VTP и обновляет БД VLAN, увидев больший номер ревизии.
Роли коммутаторов в домене VTP
- VTP Server. Коммутатор в роли VTP Server может создавать новые VLAN, удалять старые или менять информацию в самих VLAN. Также он занимается генерированием объявлений VTP для остальных членов домена.
- VTP Client. Коммутатор в этой роли будет получать специальные анонсы VTP от других коммутаторов в домене, чтобы обновлять базы данных VLAN у себя. Клиенты ограничены в возможностях создавать VLAN и даже не имеют права локально изменять конфигурацию VLAN. Иначе говоря, доступ read only.
- VTP Transparent. В этом режиме коммутатор не участвует в процессах VTP и может вести у себя полное и локальное администрирование всей конфигурации VLAN. Работая в прозрачном режиме, коммутаторы занимаются только передачей объявлений VTP от других коммутаторов, не затрагивая свою конфигурацию сетей VLAN. У таких коммутаторов номер ревизии всегда будет равен нулю, и против них атаки с инъекцией VTP не провести.
Доступ ко всем сетям VLAN
- Summary Advertisement — объявление VTP, отправляемое сервером VTP каждые 300 секунд (5 минут). В этом объявлении хранится имя домена VTP, версия протокола, отметка времени и значение MD5-хеша конфигурации;
- Subset Advertisement — объявление VTP, которое отправляется при каждом изменении конфигурации VLAN;
- Advertisement Request — это запрос от клиента VTP к серверу VTP на сообщение Summary Advertisement. Обычно рассылается в ответ на сообщение о том, что коммутатор обнаружил Summary Advertisement с бóльшим номером ревизии конфигурации.
Чтобы атаковать домен VTP, необходимо, чтобы порт, к которому вы подключены во время атаки, был в режиме магистрального канала. Кстати говоря, атака на VTP может быть следующим шагом после того, как вы атаковали протокол DTP и стали транковым каналом. Злоумышленник сможет проводить VTP-инъекции и отправлять якобы «обновленные» базы данных VLAN с бóльшим номером ревизии. Легитимные коммутаторы, в свою очередь, примут и обновят свои базы данных VLAN.
Провести такую атаку нам поможет Yersinia. Рассмотрим атаку на VTPv1 с последующим удалением всех VLAN.
Yersinia сгенерирует специальные VTP-объявления Summary Advertisement и Subset Advertisement.
Как видим, после проведения атаки все созданные VLAN были удалены. VLAN 1 и VLAN в диапазоне 1002–1005 никуда не денутся, поскольку созданы по умолчанию.
Атака двойного тегирования
Атака двойного тегирования основана на использовании особенностей инкапсуляции 802.1Q в сетях Ethernet. В большинстве случаев коммутаторы исполняют только один уровень процесса, деинкапсуляции 802.1Q. Это открывает путь для эксплуатации, поскольку такая особенность позволяет пентестеру скрыть в кадре Ethernet вторую метку 802.1Q.
Вот как в деталях происходит атака:
- Злоумышленник собирает кадр Ethernet с двумя тегами и отправляет его в сторону коммутатора. VLAN ID первой метки 802.1Q должна совпадать со значением Native VLAN порта, находящегося в магистральном режиме. Для удобства восприятия представим, что первая метка 802.1Q будет VLAN 1, а вторая метка 802.1Q — VLAN 100
- Кадр попадает на коммутатор SW 1. Коммутатор проверяет первые четыре байта метки 802.1Q. Коммутатор видит, что кадр предназначен для VLAN 1, которая в его конфигурации является сетью Native VLAN. Коммутатор SW1 уничтожает эту метку. В это же время вторая метка VLAN 100 остается целой и никуда не пропадает.
Native VLAN — это специальный VLAN, к которому коммутатор ассоциирует все кадры без тега 802.1Q. По умолчанию идентификатор Native VLAN равен единице.
- Далее коммутатор SW2 проверяет только внутреннюю метку 802.1Q и видит, что данный кадр предназначен для сети VLAN 100. Этот коммутатор отправляет кадр на порт, который принадлежит сети VLAN 100, и кадр достигает своего пункта назначения.
Воспользуемся Scapy, чтобы собрать широковещательный кадр Ethernet с двумя метками 802.1Q. Также будет добавлен слой ICMP, чтобы наглядно показать, как кадр доберется до назначения и ответит на фальсифицированный запрос ICMP. Отправим этот запрос якобы от машины Nefarian под IP-адресом 10.10.200.1.
1 2 3 4 5 6 7 8 |
>>> frame = Ether(dst="FF:FF:FF:FF:FF:FF") >>> first_DOT1Q_tag = Dot1Q(vlan=1) >>> second_DOT1Q_tag = Dot1Q(vlan=100) >>> ip_packet = IP(src="10.10.200.1", dst="10.10.100.1") >>> icmp_layer = ICMP() >>> crafted = frame / first_DOT1Q_tag / second_DOT1Q_tag / ip_packet / icmp_layer >>> sendp(crafted, iface="eth0", count=40, loop=0, verbose=1) |
Как видим, пакет прибежал на хост назначения, но с одной меткой VLAN ID 100, поскольку первый тег VLAN 1 был уничтожен первым коммутатором SW1. Имейте в виду, что это односторонняя атака. Возможно, она будет полезна при нападении на сегмент DMZ во время пентеста.
Заключение
Атаки L2 в последнее время утратили актуальность и немного вышли из моды: сейчас мало кто обращает на них внимание. Возможно, эта статья подарит пентестерам новые варианты атак, а сетевые инженеры после прочтения смогут повысить уровень защищенности своих сетей.
Другие статьи на тему пентеста:
- Истощение и подмена DHCP-сервера
- Используем STP Root Hijacking для перехвата трафика
- Использование атаки CAM Table Overflow в пентесте