Содержание статьи
Как устроен STP
Классические коммутаторы работают на канальном уровне (Data Link Layer) модели OSI. На уровне L2 коммутаторы работают с кадрами (frame) для передачи данных. Отправитель добавляет к оригинальным данным заголовки кадра, в которые включен MAC-адрес источника и MAC-адрес получателя. На основе этих адресов применяется логика передачи кадра.
При получении кадра коммутатор добавляет в свою таблицу MAC-адресов адрес источника и интерфейс, на котором этот кадр получен. Таким образом коммутатор заполняет свою таблицу и, основываясь на ней, сразу же принимает решение, на какой интерфейс отправить кадр. Если у коммутатора нет в таблице нужного адреса, кадр будет отправлен во все порты, кроме того, с которого кадр был получен, в надежде получить ответ от принимающего устройства. Такой тип трафика называется Unknown unicast flooding — разновидность бродкаста.
Бродкаст — обычная ситуация для сетей, например когда отправляется ARP request. ARP request имеет адрес получателя в кадре FF:
. Все коммутаторы будут рассылать данный кадр на все свои порты (на все порты в пределах VLAN).
Enterprise-сети строятся с использованием резервирования оборудования, добавления избыточности на уровне линков и так далее. Так как в ethernet-кадрах нет поля TTL, которое используется в IP-пакетах для дополнительной защиты от петель, то каждый из них может передаваться по сети бесконечно, нагружая оборудование и переполняя CAM-таблицы.
Для предотвращения таких ситуаций применяется протокол STP, основная задача которого — избавить сеть от петель.
info
Существует несколько версий протокола STP. В данной статье мы рассматриваем 802.1D.
STP работает по следующему принципу. В домене L2 выбирается корневой коммутатор — root bridge. Выбор основывается на приоритете (по умолчанию 32768). Чем меньше приоритет, тем лучше. У всех коммутаторов значение стоит по умолчанию, выбор происходит по связке приоритет + MAC. Коммутатор, у которого значение MAC будет меньше (более старый коммутатор), станет root bridge, что повлияет на производительность сети.
Далее каждый non-root bridge коммутатор выбирает один порт, ведущий к root bridge, порты, используемые для передачи трафика, и порты, которые должны быть выключены, чтобы избежать появления петель коммутации.
По умолчанию в процессе выбора корневого коммутатора в протоколе STP нет механизмов защиты. Также в нем нет встроенных механизмов аутентификации, паролей или проверок источника. STP доверяет всем.
При появлении в сети нового коммутатора, приоритет которого будет ниже приоритета текущего корневого коммутатора, выбирается новое корневое устройство. Манипулируя такими сценариями, мы можем изменить оптимальные пути трафика и даже попробовать их перехватить, заспамить сеть специальными сообщениями STP — TCN, что приведет к очищению таблиц коммутации каждого коммутатора и вызовет потери, снижение производительности сети и другие проблемы.
Для применения этой атаки достаточно подключить к сети компьютер с Linux и фреймворком Yersinia, который позволит запустить STP на нашем хосте, выдав себя за коммутатор. Это позволит нам манипулировать нашим L2-сегментом.
Этот фреймворк предоставляет нам большой выбор атак на STP: флуд TCN, перехват ролей коммутаторов.
Практика
Перейдем к простому стенду для экспериментов.
В нашем примере используется часть стандартной топологии, чаще всего применяемой в корпоративном сегменте. 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.
Эти сообщения означают, что STP на коммутаторах запущен и не заблокирован на подключенных к нам портах. Объединяем наши интерфейсы в bridge для того, чтобы трафик проходил через наше устройство, запускаем фреймворк Yersinia и видим, что нам доступен STP на обоих интерфейсах.
Запускаем атаку и выбираем тип атаки Claiming Root Role, означающий, что мы начнем анонсировать себя в качестве коммутатора с меньшим приоритетом, что заставит перестроиться дерево STP.
Как и ожидалось, мы стали корневым коммутатором для нашего сегмента сети и теперь сможем увидеть трафик, который ранее шел через 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 прошли через наш компьютер.
info
ICMP тут используется только для наглядности, таким образом можно перехватить любой трафик, изменив структуру, построенную STP.
Рассмотрим также другие типы атак на STP, которые позволяет выполнять Yersinia.
Sending conf BPDU — мы единожды отправим BPDU, который заставит коммутаторы в нашем L2-сегменте перестроить дерево и вернуться к исходной схеме, так как BPDU с нашей машины больше не отправляется.
Продолжение доступно только участникам
Вариант 1. Присоединись к сообществу «Xakep.ru», чтобы читать все материалы на сайте
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее
Вариант 2. Открой один материал
Заинтересовала статья, но нет возможности стать членом клуба «Xakep.ru»? Тогда этот вариант для тебя! Обрати внимание: этот способ подходит только для статей, опубликованных более двух месяцев назад.
Я уже участник «Xakep.ru»