Про­токол STP был при­думан аж в 1985 году, но активно исполь­зует­ся до сих пор и нас­читыва­ет нес­коль­ко модифи­каций. Без при­мене­ния про­токо­ла STP не обхо­дит­ся прак­тичес­ки ни одна сеть. Исклю­чение сос­тавля­ют раз­ве что сов­ремен­ные сети ЦОД с раз­личны­ми про­токо­лами TRILL или тран­спортны­ми механиз­мами VXLAN, но это сов­сем дру­гая исто­рия. STP име­ет свои недос­татки и осо­бен­ности, и в этой статье мы пос­мотрим, как ими мож­но вос­поль­зовать­ся. Для начала крат­ко опи­шем тех­ничес­кую сос­тавля­ющую STP.
 

Как устроен STP

Клас­сичес­кие ком­мутато­ры работа­ют на каналь­ном уров­не (Data Link Layer) модели OSI. На уров­не L2 ком­мутато­ры работа­ют с кад­рами (frame) для переда­чи дан­ных. Отпра­витель добав­ляет к ори­гиналь­ным дан­ным заголов­ки кад­ра, в которые вклю­чен MAC-адрес источни­ка и MAC-адрес получа­теля. На осно­ве этих адре­сов при­меня­ется логика переда­чи кад­ра.

При получе­нии кад­ра ком­мутатор добав­ляет в свою таб­лицу MAC-адре­сов адрес источни­ка и интерфейс, на котором этот кадр получен. Таким обра­зом ком­мутатор запол­няет свою таб­лицу и, осно­выва­ясь на ней, сра­зу же при­нима­ет решение, на какой интерфейс отпра­вить кадр. Если у ком­мутато­ра нет в таб­лице нуж­ного адре­са, кадр будет отправ­лен во все пор­ты, кро­ме того, с которо­го кадр был получен, в надеж­де получить ответ от при­нима­юще­го устрой­ства. Такой тип тра­фика называ­ется Unknown unicast flooding — раз­новид­ность брод­каста.

Брод­каст — обыч­ная ситу­ация для сетей, нап­ример ког­да отправ­ляет­ся ARP request. ARP request име­ет адрес получа­теля в кад­ре FF:FF:FF:FF:FF: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 нет механиз­мов защиты. Так­же в нем нет встро­енных механиз­мов аутен­тифика­ции, паролей или про­верок источни­ка. STP доверя­ет всем.

При появ­лении в сети нового ком­мутато­ра, при­ори­тет которо­го будет ниже при­ори­тета текуще­го кор­невого ком­мутато­ра, выбира­ется новое кор­невое устрой­ство. Манипу­лируя такими сце­нари­ями, мы можем изме­нить опти­маль­ные пути тра­фика и даже поп­робовать их перех­ватить, зас­памить сеть спе­циаль­ными сооб­щени­ями STP — TCN, что при­ведет к очи­щению таб­лиц ком­мутации каж­дого ком­мутато­ра и вызовет потери, сни­жение про­изво­дитель­нос­ти сети и дру­гие проб­лемы.

Для при­мене­ния этой ата­ки дос­таточ­но под­клю­чить к сети компь­ютер с Linux и фрей­мвор­ком Yersinia, который поз­волит запус­тить STP на нашем хос­те, выдав себя за ком­мутатор. Это поз­волит нам манипу­лиро­вать нашим L2-сег­ментом.

Применение атаки и изменения в топологии STP при включении компьютера с фреймворком Yersinia
При­мене­ние ата­ки и изме­нения в тополо­гии STP при вклю­чении компь­юте­ра с фрей­мвор­ком Yersinia

Этот фрей­мворк пре­дос­тавля­ет нам боль­шой выбор атак на 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.

Дамп трафика в Wireshark
Дамп тра­фика в Wireshark

Эти сооб­щения озна­чают, что STP на ком­мутато­рах запущен и не заб­локиро­ван на под­клю­чен­ных к нам пор­тах. Объ­еди­няем наши интерфей­сы в bridge для того, что­бы тра­фик про­ходил через наше устрой­ство, запус­каем фрей­мворк Yersinia и видим, что нам дос­тупен STP на обо­их интерфей­сах.

Информация о полученных STP BPDU
Ин­форма­ция о получен­ных STP BPDU

За­пус­каем ата­ку и выбира­ем тип ата­ки Claiming Root Role, озна­чающий, что мы нач­нем анон­сировать себя в качес­тве ком­мутато­ра с мень­шим при­ори­тетом, что зас­тавит перес­тро­ить­ся дерево STP.

Выбираем тип атаки Claiming Root Role
Вы­бира­ем тип ата­ки Claiming Root Role

Как и ожи­далось, мы ста­ли кор­невым ком­мутато­ром для нашего сег­мента сети и теперь смо­жем уви­деть тра­фик, который ранее шел через 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 прош­ли через наш компь­ютер

info

ICMP тут исполь­зует­ся толь­ко для наг­ляднос­ти, таким обра­зом мож­но перех­ватить любой тра­фик, изме­нив струк­туру, пос­тро­енную STP.

Рас­смот­рим так­же дру­гие типы атак на STP, которые поз­воля­ет выпол­нять Yersinia.

Типы атак фреймворка Yersinia
Ти­пы атак фрей­мвор­ка Yersinia

Sending conf BPDU — мы еди­нож­ды отпра­вим BPDU, который зас­тавит ком­мутато­ры в нашем L2-сег­менте перес­тро­ить дерево и вер­нуть­ся к исходной схе­ме, так как BPDU с нашей машины боль­ше не отправ­ляет­ся.

Продолжение доступно только участникам

Вариант 1. Присоединись к сообществу «Xakep.ru», чтобы читать все материалы на сайте

Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее

Вариант 2. Открой один материал

Заинтересовала статья, но нет возможности стать членом клуба «Xakep.ru»? Тогда этот вариант для тебя! Обрати внимание: этот способ подходит только для статей, опубликованных более двух месяцев назад.


  • Подпишись на наc в Telegram!

    Только важные новости и лучшие статьи

    Подписаться

  • Подписаться
    Уведомить о
    2 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии