Тема сегодняшней статьи «Атака и защита протокола STP». Протокол STP имеет свои плюсы и минусы. Далее мы рассмотрим, как можно воспользоваться особенностями STP для атаки на STP. В конце поговорим о защите STP от атак.
Еще по теме: Уязвимости SSL и TLS-протокола в небраузерном софте
Не будем пересказывать интернет и разбираться в протоколе STP, и сразу перейдем к делу.
STP атака
Для атаки и защиты STP на понадобится стенд.
В этом примере показана часть стандартной топологии, которая чаще всего применяется в корпоративном сегменте. 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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
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 |
Для проверки запустим пинг:
1 2 3 4 |
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 прошли через нашу машину.
Далее рассмотрим другие типы атак на STP, которые можно реализовать с помощью Yersinia.
Sending conf BPDU — мы единожды отправим BPDU, который заставит коммутаторы в нашем L2-сегменте перестроить дерево и вернуться к исходной схеме, так как BPDU с нашей машины больше не отправляется.
Root-bridge с интервалом в две секунды отправляет configuration BDPU, в котором указаны основные параметры: например, приоритет текущего коммутатора, его MAC, MAC интерфейса, с которого BPDU был отправлен, сведения о том, нужно ли запустить механизм FLUSH для очистки CAM таблиц. Так как в данном сценарии мы пытались выдать себя за root bridge, мы отправляем configuration BPDU с приоритетом, равным приоритету текущего RB, но с меньшим MAC.
Sending TCN BPDU заставит root bridge запустить механизм очистки CAM-таблиц от MAC-адресов, трафик с которых не приходит более 15 секунд.
По умолчанию время, в течение которого MAC-адрес хранится в таблице, равен 300 секундам. При изменении состояния порта (например, UP/DOWN) участвующий в STP коммутатор должен отправить служебный фрейм TCN (topology change notification) в сторону root bridge для уведомления его о том, что произошло изменение в сети. Остальные коммутаторы не знают, какие именно MAC-адреса находились за этим портом конкретного коммутатора, в результате чего запускается процесс flush CAM-таблицы. Все адреса, которые не были изучены в течение 15 секунд, будут удалены. Такого рода атака позволяет нам увеличить нагрузку на сеть и CPU коммутаторов. TCN отправляется единожды.
Пример сброса таймера CAM-таблицы при получении TC BPDU
1 2 3 4 5 6 7 8 9 10 11 |
SW1#show spanning-tree VLAN0001 Spanning tree enabled protocol ieee Root ID Priority 8193 Address aabb.cc00.1000 This bridge is the root 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 300 sec |
После отправки TCN BPDU:
1 2 3 4 5 6 7 8 9 10 11 |
SW1#show spanning-tree VLAN0001 Spanning tree enabled protocol ieee Root ID Priority 8193 Address aabb.cc00.1000 This bridge is the root 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 |
Sending conf BPDUs и Sending TCN BPDU’s делают все вышеописанное, но в формате DoS. То есть при отправке configuration BPDU и topology change BPDU сеть начинает «штормить», CPU коммутатора сильно загружается.
Счетчик полученных BPDU
1 2 3 4 5 6 7 8 9 10 |
SW2#show spanning-tree interface ethernet 0/2 detail Port 3 (Ethernet0/2) of VLAN0001 is designated forwarding Port path cost 100, Port priority 128, Port Identifier 128.3. Designated root has priority 8193, address aabb.cc00.1000 Designated bridge has priority 32769, address aabb.cc00.2000 Designated port id is 128.3, designated path cost 100 Hello is pending, Topology change is set Timers: message age 0, forward delay 0, hold 0 Number of transitions to forwarding state: 1 Link type is shared by default BPDU: sent 2330, received 6650463 |
Claiming root, other role и claiming root role with MITM— атаки, аналогичные нашему примеру: изменяя приоритет или MAC, мы можем перестраивать текущее дерево STP.
Защита STP
В протоколе STP заложены механизмы, которые позволяют пресечь появление новых устройств в качестве root bridge, блокировать порты, на которые пришел BPDU, либо включать полную фильтрацию BPDU.
Root guard
При получении лучшего BPDU, чем нынешний, получающий этот BPDU интерфейс будет переведен в режим root-inconsistent.
1 2 |
SW2(config)#interface ethernet 0/2 SW2(config-if)#spanning-tree guard root |
Состояние порта при получении BPDU:
1 2 3 4 5 |
*Aug 1 13:58:03.304: %SPANTREE-2-ROOTGUARD_CONFIG_CHANGE: Root guard enabled on port Ethernet0/2. SW2#show spanning-tree interface ethernet 0/2 Vlan Role Sts Cost Prio.Nbr Type ------------------- ---- --- --------- -------- -------------------------------- VLAN0001 Desg BKN*100 128.3 Shr *ROOT_Inc |
Несложно догадаться, что при использовании этой функции атака с помощью фреймворка будет недоступна.
BPDU guard
Позволяет ограничивать домен L2. При получении любого BPDU порт переводится в состояние err disable BPDU guard error.
1 2 |
SW2(config)#interface ethernet 0/2 SW2(config-if)#spanning-tree bpduguard enable |
После получения BDPU на порте с функцией BPDU guard:
1 2 3 4 5 6 7 |
*Aug 1 15:12:50.120: %SPANTREE-2-BLOCK_BPDUGUARD: Received BPDU on port Et0/2 with BPDU Guard enabled. Disabling port. SW2# *Aug 1 15:12:50.120: %PM-4-ERR_DISABLE: bpduguard error detected on Et0/2, putting Et0/2 in err-disable state *Aug 1 15:12:51.120: %LINEPROTO-5-UPDOWN: Line protocol on Interface Ethernet0/2, changed state to down *Aug 1 15:12:52.120: %LINK-3-UPDOWN: Interface Ethernet0/2, changed state to down SW2#show interfaces ethernet 0/2 Ethernet0/2 is down, line protocol is down (err-disabled) |
BPDU filter
BPDU filter не отправляет и не получает BPDU на порте. Иными словами, протокол STP на этом интерфейсе выключен.
1 |
SW2(config-if)#spanning-tree bpdufilter enable |
Несложно догадаться, что при использовании этих функций атаки с применением фреймворка будут недоступны.
Заключение
Вот так легко, не прибегая к сложным схемам, можно перехватывать трафик в сети. STP — достаточно простой протокол с отсутствующей по умолчанию функцией защиты. Многие пренебрегают установкой защитных механизмов в L2-домене, что может привести к довольно тяжким последствиям. Так как STP избавляет от петель и не заставляет весь трафик идти обязательно через RB, необходимо точно определиться с направлением трафика и вектором атаки.
Еще по теме: Атака DNS rebinding
«Порты SW2 0/1 SW3 0/0 используются для передачи трафика»
и тут же
«0/0 и 0/1 на SW2 и SW3 заблокированы во избежание петель»
порты заблокированы или нет?