Пентест и атака на протоколы HSRP и VRRP

Пентест hsrp vrrp

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

Еще по теме: Используем STP Root Hijacking для перехвата трафика

Пентест и атака на протоколы HSRP и VRRP

Для начала давайте разберемся, что такое FHRP, HSRP и VRRP.

Семейство  протоколов FHRP (First Hop Redundancy Protocol) обеспечивает избы­точ­ность сетево­го шлю­за. Если коротко, то смысл в том, что­бы объ­еди­нить нес­коль­ко физичес­ких мар­шру­тиза­торов в один логичес­кий с общим IP-адре­сом. Данный адрес вир­туаль­ного мар­шру­тиза­тора будет наз­начен на интерфейс мар­шру­тиза­тора с гла­венс­тву­ющей ролью, а тот, в свою оче­редь, зай­мет­ся перенаправлением тра­фика.

Самые популяр­ные про­токо­лы клас­са FHRP — это HSRP и VRRP, о них мы сегод­ня и погово­рим.

FHRP Hijacking

Тех­ника этой сетевой ата­ки зак­люча­ется в том, что­бы навязать свое устрой­ство в качес­тве глав­ного мар­шру­тиза­тора с помощью инъ­екции HSRP- или VRRP-пакета с мак­сималь­ным зна­чени­ем при­ори­тета. Успешная экс­плу­ата­ция при­водит к MITM-ата­ке, в резуль­тате которой вы смо­жете перех­ватить весь тра­фик внут­ри сети, про­вес­ти редирект или выз­вать DoS. Дос­таточ­но соб­рать HSRP- или VRRP-пакет с наивыс­шим зна­чени­ем при­ори­тета 255 и нап­равить его в сто­рону локаль­ной сети. Сог­ласитесь, не слиш­ком слож­но.

Как будет ходить трафик до атаки
Как будет ходить трафик до атаки
Как будет ходить тра­фик пос­ле ата­ки
Как будет ходить тра­фик пос­ле ата­ки
Так как во вре­мя ата­ки на FHRP надо вза­имо­дей­ство­вать с легитим­ными мар­шру­тиза­тора­ми — шлю­зами по умол­чанию для конеч­ных хос­тов, необ­ходимо очень быс­тро выпол­нять все свои дей­ствия, начиная от инъ­екции и закан­чивая орга­низа­цией фор­вардин­га все­го тра­фика на сто­роне вашей машины. Если будете мед­лить во вре­мя про­веде­ния ата­ки, конеч­ные хос­ты сло­вят DoS — ваш заказ­чик такой сце­нарий не оце­нит.

Подготовка кастомной инъекции

Я написал инс­тру­мен­ты для атак на FHRP-про­токо­лы, добавив их в свой репози­торий GatewayBleeding. Всег­да луч­ше писать собс­твен­ные инс­тру­мен­ты, так вы понима­ете весь про­цесс экс­плу­ата­ции с нуля, что очень важ­но. Кро­ме того, это будет выделять вас на фоне осталь­ных.

Что­бы вы понимали прин­цип экс­плу­ата­ции, я раз­беру весь прог­рам­мный код скрип­тов HSRPWN.py и VRRPWN.py.

Инс­тру­мен­ты написа­ны на Python вер­сии 3.

HSRPWN.py

Для начала нам необ­ходимо импорти­ровать биб­лиоте­ку Scapy, а так­же модуль для работы с L2-про­токо­лами и про­токо­лом HSRP. Кро­ме того, под­клю­чим модуль argparse, что­бы сде­лать скрипт парамет­ризиро­ван­ным.

В перемен­ную HSRPMulticastAddr запишем зна­чение IP-адре­са муль­тикас­товой рас­сылки HSRPv1.

Объ­явля­ем фун­кцию take_arguments. Она будет обра­баты­вать вве­ден­ные поль­зовате­лем вхо­дящие парамет­ры:

  • ин­терфейс, с которо­го будут отправ­лять­ся пакеты (перемен­ная interface);
  • но­мер груп­пы HSRP (перемен­ная group);
  • IP-адрес ата­кующе­го (перемен­ная attackerip);
  • вир­туаль­ный IP-адрес домена HSRP (перемен­ная vip);
  • ключ для аутен­тифика­ции (перемен­ная auth).

Пар­сить вве­ден­ные парамет­ры будет parser.parse_args(). Резуль­тат выпол­нения фун­кции запишет­ся в перемен­ную args.

В фун­кции inject про­исхо­дит сбор­ка инъ­екции HSRP-пакета с наиболь­шим зна­чени­ем при­ори­тета 255. Зна­чения для перемен­ных внут­ри сло­ев пакетов извле­кают­ся из ука­зан­ных зна­чений аргу­мен­тов поль­зовате­лем args.*. При этом:

  • в перемен­ной L2frame собира­ется Ethernet-фрейм;
  • в перемен­ной L3packet собира­ется сетевой пакет с IP-адре­сом источни­ка и IP-адре­сом наз­начения. TTL будет равен 1. Если отпра­вишь пакет не с этим TTL — мар­шру­тиза­торы отбро­сят его;
  • в перемен­ной UDP_layer соз­дает­ся UDP-слой с пор­том источни­ка 1985 и пор­том наз­начения 1985;
  • в перемен­ной evil_hsrp соз­дает­ся вре­донос­ный HSRP-пакет со зна­чени­ем при­ори­тета 255, номером груп­пы HSRP, зна­чени­ем вир­туаль­ного IP-адре­са и клю­чом аутен­тифика­ции;
  • в перемен­ной crafted собира­ется сам пакет с кад­ром, сетевым IP-пакетом, сло­ем UDP и самим про­токо­лом HSRP.
Да­лее с помощью метода sendp соб­ранный пакет через каж­дые три секун­ды отправ­ляет­ся с ука­зан­ного поль­зовате­лем интерфей­са. Работу скрип­та ни в коем слу­чае нель­зя прек­ращать: если он упа­дет, пакеты перес­танут рас­сылать­ся, легитим­ные мар­шру­тиза­торы приз­нают наше устрой­ство «погиб­шим» и перес­тро­ят свои роли в домене.

В кон­це скрип­та вызыва­ем фун­кции take_arguments и inject.

VRRPWN.py

Здесь поч­ти все то же самое, что и с HSRPWN.py, но име­ются и некото­рые отли­чия.

Им­порти­руем модуль для работы с про­токо­лом VRRP:

В перемен­ной VRRPMulticastAddr ука­зыва­ется IP-адрес муль­тикас­товой рас­сылки 224.0.0.18:

Фун­кция take_arguments будет обра­баты­вать вве­ден­ные поль­зовате­лем вхо­дящие парамет­ры:

  • ин­терфейс, с которо­го будут отправ­лять­ся пакеты (перемен­ная interface);
  • но­мер груп­пы HSRP (перемен­ная group);
  • IP-адрес ата­кующе­го (перемен­ная attackerip);
  • вир­туаль­ный IP-адрес домена HSRP (перемен­ная vip).
Что тут про­исхо­дит:

  • В L2frame собира­ется Ethernet-фрейм.
  • В L3packet собира­ется IP-пакет с IP-адре­сом источни­ка и IP-адре­сом наз­начения. TTL будет равен 255. Если отпра­вишь пакет не с этим TTL — мар­шру­тиза­торы отбро­сят его.
  • В evil_vrrp соз­дает­ся вре­донос­ный VRRP-пакет со зна­чени­ем при­ори­тета 255, номером груп­пы VRRP и зна­чени­ем вир­туаль­ного IP-адре­са.
  • В crafted собира­ется сам пакет с кад­ром, сетевым IP-пакетом и самим про­токо­лом VRRP.
В дан­ном скрип­те нет слоя про­токо­лов тран­спортно­го уров­ня. VRRP работа­ет исклю­читель­но на сетевом уров­не и не реали­зован поверх сте­ка про­токо­лов TCP/IP.

В кон­це скрип­та вызыва­ем фун­кции take_arguments и inject:

Виртуальная лаборатория

Что­бы показать экс­плу­ата­цию на прак­тике, я под­готовил неболь­шой лабора­тор­ный стенд.

Вза­имо­дей­ствие сети на логичес­ком уров­не
Вза­имо­дей­ствие сети на логичес­ком уров­не
IP-адре­сация стен­да
IP-адре­сация стен­да

Здесь: — Dustup — это FTP-сер­вер; — Kali выс­тупа­ет в качес­тве ата­кующей машины; — Radiant — кли­ент­ская машина с Windows 10 LTSC; — SW2 и SW4 — ком­мутато­ры Cisco vIOS; — R1 и R2 — мар­шру­тиза­торы Cisco vIOS.

Домен HSRP

Мы будем исполь­зовать вер­сию HSRPv1.

Схе­ма сети с HSRP
Схе­ма сети с HSRP

Домен VRRP

На этом стен­де исполь­зует­ся вер­сия VRRPv2.

Схе­ма сети с VRRP
Схе­ма сети с VRRP

Взлом MD5-аутентификации

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

Дамп HSRP-пакета с аутен­тифика­цией
Дамп HSRP-пакета с аутен­тифика­цией

Сох­раня­ем дамп тра­фика в файл hsrp_encrypted.pcap. Далее исполь­зуем ути­литу pcap2john и пода­ем ей на вход дамп тра­фика HSRP с хешами.

Хе­ши, извле­чен­ные из дам­па HSRP-тра­фика
Хе­ши, извле­чен­ные из дам­па HSRP-тра­фика

Ко­пиру­ем хеши в отдель­ный файл hsrp_md5_hashes.txt и с помощью John The Ripper начина­ем переби­рать пароли, ука­зав сло­варь через параметр --wordlist. JTR сам опре­делит тип хеша, находя­щий­ся в фай­ле.

Взло­ман­ный пароль от домена HSRP
Взло­ман­ный пароль от домена HSRP

Па­роль от домена HSRP — admin.

Теперь раз­берем такой же кейс с доменом VRRP.

Дамп VRRP-пакета с аутен­тифика­цией
Дамп VRRP-пакета с аутен­тифика­цией

Сох­раня­ем дамп в файл vrrp_encrypted.pcap. Далее исполь­зуем ути­литу pcap2john и пода­ем ей на вход дамп тра­фика VRRP с хешами.

Хе­ши, извле­чен­ные из дам­па VRRP-тра­фика
Хе­ши, извле­чен­ные из дам­па VRRP-тра­фика

Ко­пиру­ем хеши в отдель­ный файл vrrp_md5_hashes.txt и с помощью John The Ripper начина­ем переби­рать пароли, ука­зав сло­варь через параметр --wordlist.

Как и в прош­лом слу­чае, тип хеша опре­деля­ется авто­мати­чес­ки.

Взло­ман­ный пароль от домена VRRP
Взло­ман­ный пароль от домена VRRP

Па­роль от VRRP-домена — cerberus.

Атака на HSRP и перехват трафика

Не­обхо­димо в пер­вую оче­редь перевес­ти сетевой интерфейс в нераз­борчи­вый режим и раз­решить фор­вардинг на машине:

За­пус­каем скрипт HSRPWN.py, ука­зыва­ем интерфейс, IP-адрес ата­кующе­го, вир­туаль­ный IP-адрес, номер груп­пы и ключ аутен­тифика­ции.

Дамп тра­фика во вре­мя HSRP-инъ­екции
Дамп тра­фика во вре­мя HSRP-инъ­екции

Кон­фигура­ция HSRP на мар­шру­тиза­торах R1 и R2 до выпол­нения инъ­екции:

А вот поведе­ние кон­фигура­ции HSRP на мар­шру­тиза­торах R1 и R2 пос­ле выпол­нения инъ­екции:

Как видите, мар­шру­тиза­торы R1 и R2 изме­нили свои роли. Теперь они приз­нают хост с IP-адре­сом 10.1.1.2 как Active-роутер.

На этом эта­пе нуж­но соз­дать вто­рич­ный IP-адрес на интерфей­се eth0 с ука­зани­ем вир­туаль­ного IP-адре­са груп­пы HSRP:

Да­лее необ­ходимо уда­лить все мар­шру­ты на вашей машине и соз­дать единс­твен­ный, который будет про­ходить через один из легитим­ных мар­шру­тиза­торов. В качес­тве сле­дующе­го шлю­за мож­но ука­зать IP-адрес одно­го из мар­шру­тиза­торов R1 или R2. Даже нес­мотря на то, что мы у него «отжа­ли» роль Active-роуте­ра, он все рав­но смо­жет выпол­нять мар­шру­тиза­цию и нап­равить тра­фик до хос­та либо сети наз­начения. Про­пишем все же мар­шрут через IP-адрес мар­шру­тиза­тора R1 — 10.1.1.100:

Сей­час вы видите толь­ко исхо­дящий тра­фик. Было бы неп­лохо получить так­же и вхо­дящий. Неболь­шое пра­вило для NAT решит эту задачу.

Пос­ле ата­ки я поп­робую с машины под име­нем Radiant под­клю­чить­ся к FTP-сер­веру под име­нем Dustup. Пос­мотрим, увен­чалась ли ата­ка успе­хом.

Дамп перех­вачен­ного FTP-тра­фика при ата­ке на HSRP
Дамп перех­вачен­ного FTP-тра­фика при ата­ке на HSRP

В конеч­ном сче­те мы смог­ли перех­ватить легитим­ный тра­фик. Даже добыли кре­ды от FTP-сер­вера mercy:i_dont_trust_you.

В этом кей­се вы перех­ватыва­ете абсо­лют­но весь тра­фик внут­ри сети, а под­клю­чение к FTP-сер­веру будет слу­жить при­мером, что­бы показать импакт от ата­ки.

Атака на VRRP и перехват трафика

За­пус­каем скрипт VRRPWN.py:

Вы можете заметить, что толь­ко 10.1.1.2 рас­сыла­ет объ­явле­ния. Это говорит о том, что мы ста­ли Master-роуте­ром.

Дамп во вре­мя VRRP-инъ­екции
Дамп во вре­мя VRRP-инъ­екции

Вот поведе­ние VRRP на мар­шру­тиза­торах R1 и R2 до инъ­екции:

А вот поведе­ние VRRP на мар­шру­тиза­торах R1 и R2 пос­ле инъ­екции:

Мар­шру­тиза­торы R1 и R2 изме­нили свои роли. Теперь они приз­нают хост с IP-адре­сом 10.1.1.2 как Master-роутер.

За­тем нуж­но соз­дать вто­рич­ный IP-адрес на интерфей­се eth0 с ука­зани­ем вир­туаль­ного IP-адре­са груп­пы VRRP:

Да­лее уда­ляем все мар­шру­ты на машине и соз­даем единс­твен­ный через роутер R1:

И напос­ледок пра­вило для SNAT:

Пос­ле ата­ки я поп­робую под­клю­чить­ся с машины под име­нем Radiant к FTP-сер­веру под име­нем Dustup.

Дамп перех­вачен­ного FTP-тра­фика при ата­ке на VRRP
Дамп перех­вачен­ного FTP-тра­фика при ата­ке на VRRP

В ито­ге получил­ся тот же сце­нарий: мы видим абсо­лют­но весь тра­фик, но в рам­ках дан­ного кей­са меня инте­ресо­вал толь­ко FTP-тра­фик. Перех­вачен­ные кре­ды — betrayal:punish_you.

Как защититься от пентеста FHRP (HSRP и VRRP)

Приоритет 255

Из сооб­ражений безопас­ности рекомен­дует­ся на Master- или Active-мар­шру­тиза­торе выс­тавить мак­сималь­ный при­ори­тет. В таком слу­чае, если зло­умыш­ленник отпра­вит вре­донос­ный пакет с при­ори­тетом 255, у него не вый­дет стать «глав­ным», пос­коль­ку таковой уже име­ется.

В этой статье я ори­енти­руюсь на прин­ципы и коман­ды Cisco IOS CLI.

Кон­фигура­ция для HSRP, груп­па 1:

Кон­фигура­ция для VRRP, груп­па 1:

Аутентификация

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

Кон­фигура­ция MD5-аутен­тифика­ции для HSRP, груп­па 1:

Кон­фигура­ция MD5-аутен­тифика­ции для VRRP, груп­па 1:

Кста­ти говоря, обо­рудо­вание Cisco может пох­вастать­ся наличи­ем keychain-аутен­тифика­ции. В таком слу­чае кон­фигури­руют­ся два клю­ча и даже мож­но нас­тро­ить интерва­лы вре­мени, ког­да будет при­нимать­ся и отправ­лять­ся ключ.

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

Ни­же я при­вожу при­мер кон­фигура­ции keychain в отно­шении мар­шру­тиза­тора R1 для HSRP, для VRRP она тоже подой­дет. Такую же кон­фигура­цию сле­дует нас­тро­ить на осталь­ных мар­шру­тиза­торах в рам­ках одно­го домена.

Ограничение трафика HSRP

HSRP исполь­зует про­токол тран­спортно­го уров­ня UDP для при­ема и переда­чи слу­жеб­ных объ­явле­ний. С помощью нас­трой­ки ACL (Access List Control) мы можем огра­ничить тра­фик UDP по пор­там источни­ка и наз­начения 1985. Если зло­умыш­ленник будет про­водить инъ­екцию HSRP-пакетов, эти пакеты будут отбро­шены механиз­мом ACL.

При­мер кон­фигура­ции рас­ширен­ного ACL для безопас­ности HSRPv1:

Рас­ширен­ный ACL для вер­сии HSRPv2:

Во вре­мя нас­трой­ки ACL исполь­зуют­ся обратные мас­ки (Wild Card masks).

Заключение

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

Кста­ти говоря, FHRP Hijacking может слу­жить аль­тер­нативой ARP-спу­фин­гу. В сетях AD откры­вают­ся все воз­можнос­ти для Relay-атак и сбо­ра информа­ции, так­же мож­но реали­зовать фишин­говые ата­ки и мно­гое дру­гое. Эта статья под­ска­жет новые век­торы атак для пен­тесте­ров, а сетевые адми­нис­тра­торы обза­ведут­ся новыми кей­сами, что­бы повысить безопас­ность сво­ей сети.

Полезные ссылки:

ВКонтакте
OK
Telegram
WhatsApp
Viber

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *