Содержание статьи
Как устроен STP
Классические коммутаторы работают на канальном уровне (Data Link Layer) модели OSI. На уровне L2 коммутаторы работают с кадрами (frame) для передачи данных. Отправитель добавляет к оригинальным данным заголовки кадра, в которые включен MAC-адрес источника и MAC-адрес получателя. На основе этих адресов применяется логика передачи кадра.
При получении кадра коммутатор добавляет в свою таблицу MAC-адресов адрес источника и интерфейс, на котором этот кадр получен. Таким образом коммутатор заполняет свою таблицу и, основываясь на ней, сразу же принимает решение, на какой интерфейс отправить кадр. Если у коммутатора нет в таблице нужного адреса, кадр будет отправлен во все порты, кроме того, с которого кадр был получен, в надежде получить ответ от принимающего устройства. Такой тип трафика называется Unknown unicast flooding — разновидность бродкаста.
Бродкаст — обычная ситуация для сетей, например когда отправляется ARP request. ARP request имеет адрес получателя в кадре FF:
. Все коммутаторы будут рассылать данный кадр на все свои порты (на все порты в пределах VLAN).
Enterprise-сети строятся с использованием резервирования оборудования, добавления избыточности на уровне линков и так далее. Так как в ethernet-кадрах нет поля TTL, которое используется в IP-пакетах для дополнительной защиты от петель, то каждый из них может передаваться по сети бесконечно, нагружая оборудование и переполняя CAM-таблицы.
![Широковещательный шторм Широковещательный шторм](https://static.xakep.ru/images/c593f99f9021dd83a59d461a6515462d/21895/01.png)
Для предотвращения таких ситуаций применяется протокол STP, основная задача которого — избавить сеть от петель.
info
Существует несколько версий протокола STP. В данной статье мы рассматриваем 802.1D.
STP работает по следующему принципу. В домене L2 выбирается корневой коммутатор — root bridge. Выбор основывается на приоритете (по умолчанию 32768). Чем меньше приоритет, тем лучше. У всех коммутаторов значение стоит по умолчанию, выбор происходит по связке приоритет + MAC. Коммутатор, у которого значение MAC будет меньше (более старый коммутатор), станет root bridge, что повлияет на производительность сети.
Далее каждый non-root bridge коммутатор выбирает один порт, ведущий к root bridge, порты, используемые для передачи трафика, и порты, которые должны быть выключены, чтобы избежать появления петель коммутации.
![Результат работы протокола STP для защиты от петель Результат работы протокола STP для защиты от петель](https://static.xakep.ru/images/c593f99f9021dd83a59d461a6515462d/21896/02.png)
По умолчанию в процессе выбора корневого коммутатора в протоколе STP нет механизмов защиты. Также в нем нет встроенных механизмов аутентификации, паролей или проверок источника. STP доверяет всем.
При появлении в сети нового коммутатора, приоритет которого будет ниже приоритета текущего корневого коммутатора, выбирается новое корневое устройство. Манипулируя такими сценариями, мы можем изменить оптимальные пути трафика и даже попробовать их перехватить, заспамить сеть специальными сообщениями STP — TCN, что приведет к очищению таблиц коммутации каждого коммутатора и вызовет потери, снижение производительности сети и другие проблемы.
Для применения этой атаки достаточно подключить к сети компьютер с Linux и фреймворком Yersinia, который позволит запустить STP на нашем хосте, выдав себя за коммутатор. Это позволит нам манипулировать нашим L2-сегментом.
![Применение атаки и изменения в топологии STP при включении компьютера с фреймворком Yersinia Применение атаки и изменения в топологии STP при включении компьютера с фреймворком Yersinia](https://static.xakep.ru/images/c593f99f9021dd83a59d461a6515462d/21897/03.png)
Этот фреймворк предоставляет нам большой выбор атак на STP: флуд TCN, перехват ролей коммутаторов.
Практика
Перейдем к простому стенду для экспериментов.
![Топология стенда в виртуальной лаборатории Топология стенда в виртуальной лаборатории](https://static.xakep.ru/images/c593f99f9021dd83a59d461a6515462d/21898/04.png)
В нашем примере используется часть стандартной топологии, чаще всего применяемой в корпоративном сегменте. SW1 выступает в качестве root bridge, SW2 и SW3 — non-root bridge коммутаторы. Порты SW1 0/0 и 0/1, SW2 0/1 и 0/3, SW3 0/0 и 0/2 используются для передачи трафика, 0/0 и 0/1 на SW2 и SW3 заблокированы во избежание петель.
Трафик идет по пути SW2 → SW1 → SW3. Далее мы подключаем нашу Linux-машину к двум access-коммутаторам SW2 и SW3 и видим, что нам приходят сообщения STP.
![Дамп трафика в Wireshark Дамп трафика в Wireshark](https://static.xakep.ru/images/c593f99f9021dd83a59d461a6515462d/21899/05.png)
Эти сообщения означают, что STP на коммутаторах запущен и не заблокирован на подключенных к нам портах. Объединяем наши интерфейсы в bridge для того, чтобы трафик проходил через наше устройство, запускаем фреймворк Yersinia и видим, что нам доступен STP на обоих интерфейсах.
![Информация о полученных STP BPDU Информация о полученных STP BPDU](https://static.xakep.ru/images/c593f99f9021dd83a59d461a6515462d/21900/06.png)
Запускаем атаку и выбираем тип атаки Claiming Root Role, означающий, что мы начнем анонсировать себя в качестве коммутатора с меньшим приоритетом, что заставит перестроиться дерево STP.
![Выбираем тип атаки Claiming Root Role Выбираем тип атаки Claiming Root Role](https://static.xakep.ru/images/c593f99f9021dd83a59d461a6515462d/21901/07.png)
Как и ожидалось, мы стали корневым коммутатором для нашего сегмента сети и теперь сможем увидеть трафик, который ранее шел через SW1:
SW2-LINUX-SW3
SW1#show spanning-tree
VLAN0001
Spanning tree enabled protocol ieee
Root ID Priority 8193
Address aabb.cc00.0f00
Cost 300
Port 2 (Ethernet0/1)
Hello Time 2 sec Max Age 20 sec Forward Delay 15 sec
Bridge ID Priority 8193 (priority 8192 sys-id-ext 1)
Address aabb.cc00.1000
Hello Time 2 sec Max Age 20 sec Forward Delay 15 sec
Aging Time 15 sec
Interface Role Sts Cost Prio.Nbr Type
------------------- ---- --- --------- -------- --------------------------------
Et0/0 Altn BLK 100 128.1 Shr
Et0/1 Root FWD 100 128.2 Shr
SW2
SW2#show spanning-tree
VLAN0001
Spanning tree enabled protocol ieee
Root ID Priority 8193
Address aabb.cc00.0f00
Cost 200
Port 3 (Ethernet0/2)
Hello Time 2 sec Max Age 20 sec Forward Delay 15 sec
Bridge ID Priority 32769 (priority 32768 sys-id-ext 1)
Address aabb.cc00.2000
Hello Time 2 sec Max Age 20 sec Forward Delay 15 sec
Aging Time 15 sec
Interface Role Sts Cost Prio.Nbr Type
------------------- ---- --- --------- -------- --------------------------------
Et0/0 Desg FWD 100 128.1 Shr
Et0/1 Desg FWD 100 128.2 Shr
Et0/2 Root FWD 100 128.3 Shr
Et0/3 Desg FWD 100 128.4 Shr
SW3#show spanning-tree
VLAN0001
Spanning tree enabled protocol ieee
Root ID Priority 8193
Address aabb.cc00.0f00
Cost 200
Port 4 (Ethernet0/3)
Hello Time 2 sec Max Age 20 sec Forward Delay 15 sec
Bridge ID Priority 32769 (priority 32768 sys-id-ext 1)
Address aabb.cc00.3000
Hello Time 2 sec Max Age 20 sec Forward Delay 15 sec
Aging Time 15 sec
Interface Role Sts Cost Prio.Nbr Type
------------------- ---- --- --------- -------- --------------------------------
Et0/0 Desg FWD 100 128.1 Shr
Et0/1 Altn BLK 100 128.2 Shr
Et0/2 Desg FWD 100 128.3 Shr
Et0/3 Root FWD 100 128.4 Shr
Для проверки попробуем запустить пинг:
R4#ping 192.168.0.5
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 192.168.0.5, timeout is 2 seconds:
.!!!!
Мы видим, что все пакеты ICMP прошли через наш компьютер.
![Пакеты ICMP прошли через наш компьютер Пакеты ICMP прошли через наш компьютер](https://static.xakep.ru/images/c593f99f9021dd83a59d461a6515462d/21902/08.png)
info
ICMP тут используется только для наглядности, таким образом можно перехватить любой трафик, изменив структуру, построенную STP.
Рассмотрим также другие типы атак на STP, которые позволяет выполнять Yersinia.
![Типы атак фреймворка Yersinia Типы атак фреймворка Yersinia](https://static.xakep.ru/images/c593f99f9021dd83a59d461a6515462d/21903/09.png)
Sending conf BPDU — мы единожды отправим BPDU, который заставит коммутаторы в нашем L2-сегменте перестроить дерево и вернуться к исходной схеме, так как BPDU с нашей машины больше не отправляется.
Продолжение доступно только участникам
Вариант 1. Присоединись к сообществу «Xakep.ru», чтобы читать все материалы на сайте
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее
Вариант 2. Открой один материал
Заинтересовала статья, но нет возможности стать членом клуба «Xakep.ru»? Тогда этот вариант для тебя! Обрати внимание: этот способ подходит только для статей, опубликованных более двух месяцев назад.
Я уже участник «Xakep.ru»