Обзор атак на канальный уровень и защита от них

Tartuga

Бывалый
ПРОВЕРЕННЫЙ ПРОДАВЕЦ
PREMIUM USER

Tartuga

Бывалый
ПРОВЕРЕННЫЙ ПРОДАВЕЦ
PREMIUM USER
Регистрация
7 Фев 2020
Сообщения
525
Реакции
98
Репутация
147
Здравствуй, читатель, сегодня обсудим атаки на один из уровней модели OSI – канальный уровень. Надеюсь, ты знаешь хотя бы немного о том, что такое OSI? Если не врубаешься совсем, тогда почему ты всё ещё здесь? Не медли, мужик, узнай о этом всё. Ну ладно, от слов к делу приступаем, но только с ведающими.

Дисклеймер
Вся информация, описываемая далее, не побуждает к действию и несёт исключительно информативный характер! Используйте добытые знания с умом.

Наш план:

  • О первых двух уровнях модели OSI
  • Переполнение CAM таблицы: просто и со вкусом
  • VLAN Hopping
  • Вооружившись топором, рубим STP дерево
  • Подделка MAC-адреса
  • Нападаем на DHCP
  • Проникаем в PVLAN
  • Arp spoofing и с чем его едят
Про первые два уровня модели OSI

Почему нет статьи про физический уровень?

Как по мне не обязательно писать об этом. Или я не прав?

На физическом уровне у нас работает концентратор (hub). Эта вещь получает пакет на один порт и отправляет его на все остальные. Все в сети получат этот пакет - никакой приватности, банально включите wireshark и просматривайте трафик!

Переполнение CAM таблицы
Теория

В CAM таблицах храниться информация о том, какие MAC-адреса к каком портам привязаны. Таблицы имеют ограничения, если мы переполним таблицу - коммутатор станет концентратором.

Атака
Утилита macof в помощь нам, установим и рассмотрим простой пример использования:

И зачем нам тогда этот концентратор? Выкинем его?

Не стоит, он не пригоден в локальных сетях, но для отказоустойчивых сетях это сетевое устройство как нельзя кстати. Узлам кластера нужно всегда общаются друг с другом, а именно говорить 'Я живой' (I'm alive). Концентратор не составляет CAM таблиц и шлёт пакеты напрямую. В тех случаях, если один из узлов сети "умер", другой узнает о "смерти" первого.

git clone

Пожалуйста Авторизуйтесь или Зарегистрируйтесь для просмотра скрытого текста.



cd macof.py

install -m 755 -D -t /usr/local/bin ./macof.py

mkdir -p /usr/local/share/man/man1

gzip -c ./macof.py.1 >/usr/local/share/man/man1/macof.py.1.gz

macof [-i interface] [-s src] [-d dst] [-e tha] [-x sport] [-y dport] [-n times]


-i Интерфейс для отправки.

-s IP-адрес источника.

-d IP-адрес назначения.

-e Целевой аппаратный адрес.

-x Порт источника TCP.

-y Порт назначения TCP.

-n Количество отправляемых пакетов.

Переполним CAM таблицу коммутатора случайными MAC-адресами, предназначенными для 192.168.0.1:

macof -i eth0 -d 192.168.0.1
Это всё равно, если мы сменим mac-адресс утилитой macchanger, перезагрузим интерфейс, затем подключимся к коммутатору, который добавит новый mac в таблицу, затем всё по новой.



Немного macchanger:

macchanger -r

macchanger --mac XX:XX:XX:XX:XX:XX

macchanger -r # сменить на рандомный mac-адрес

macchanger --mac XX:XX:XX:XX:XX:XX # меняем mac на указанный
Защита
Один из способов - ограничить количество подключаемых mac-адресов к порту. Рассматривать дальше всё будем на примере коммутаторов cisco, у которого есть 24 порта. Задача такова: чтобы только два mac-адреса могли подключиться к одному порту.



Подключимя к коммутатору с помощью консоли или удалённо. Вводим:

conf t
int range f0/1-24
switchport mode access
switchport port-security
switchport port-security violation shotdown
switchport port-security maximum 2
switchport port-security mac-address sticky
conf t # перевод в режим глобального конфигурирования



int range f0/1-24 # перевод в режим конфигурирования всех портов

switchport mode access # указываем, что все выбранные порты будут работать в режиме доступа

switchport port-security # включаем функицию port-security

switchport port-security violation shotdown # указываем коммутатору что нужно отключить порт (shutdown)

switchport port-security maximum 2 # указываем сколько mac-адресов можно подключиться к порту

switchport port-security mac-address sticky # Переводим в режим обучения. Будет сохранять в running-config первые подключившиеся mac-адреса (в нашем случае 2 mac'a)
VLAN Hopping
Всезнающая википедия расскажет нам о VLAN и DTP



VLAN (Virtual Local Area Network, виртуальная локальная сеть) — это функция в роутерах и коммутаторах, позволяющая на одном физическом сетевом интерфейсе (Ethernet, Wi-Fi интерфейсе) создать несколько виртуальных локальных сетей.



DTP (англ. dynamic trunking protocol — динамический протокол транкинга) — проприетарный сетевой протокол канального уровня, разработанный компанией Cisco для реализации транкинговой системы для связи в сети VLAN между двумя сетевыми коммутаторами и для реализации инкапсуляции.

Рекомендую для лучшего пониманию ознакомиться со

Пожалуйста Авторизуйтесь или Зарегистрируйтесь для просмотра скрытого текста.

на хабре.



Если режим коммутатора один из этих трёх: dynamic desirable, dynamic auto или trunk, коммутаторы могут отправлять DTP пакеты. Эти пакеты нужны для VLAN в режиме trunk, а по умолчанию коммутаторы Cisco в режиме dynamic desirable. Задачей нашей есть перевести этот коммутатор в режим TRUNK.



Создайте в вашей голове воображаемого друга воображаемую сеть с тремя компьютерами. Злоумышленник c IP-Адресом 192.168.0.100 и VLAN 100, жертва 1 192.168.0.102 с VLAN 100, жертва 2 10.0.0.1 c VLAN 200. VLAN 100 не может общаться с VLAN 200.


Внутри коммутатора:


Интерфейсы (G0/0, G0/1) назначаются VLAN 100, которые являются (Kali и PC-1), а интерфейс (G0/2) назначается VLAN 200.



Administative Mode: dynamic desirable.

Атака
Мы можем использовать Yersinia, PackETH или Scapy. Рассмотрим первую утилиту.



Утилита работает в консоли и с графическим интерфейсом (-G):

Нажимаем «Launc Attack», выбираем протокол DTP, нажимаем «enabling trunking».



Что на данный момент в коммутаторе:


Окей, коммутатор в режиме trunk, далее вводим:

modprobe 8021q
vconfig add eth0 200
ifconfig eth0.200 up
ifconfig eth0.200 10.0.0.6 up

modprobe 8021q # добавим модуль VLAN в ядро

vconfig add eth0 200 # добавим интерфейс VLAN с ID 200

ifconfig eth0.200 up # включаем новый интерфейс

ifconfig eth0.200 10.0.0.6 up # добавим новый IP и включим его
Сейчас мы можем отправлять пакеты в VLAN 200.

Защита


Давайте-ка настроим коммутатор, чтобы такие "кузнечики" не попрыгали в другие VLAN'ы:

conf t
int range f0/1
switchport mode access
vlan 880
vlan World
exit
int range f0/2-24
switchport access vlan 880
shut
conf t # перевод в режим глобального конфигурирования



int range f0/1 # перевод в режим конфигуратора

switchport mode access # указываем, что порт будет работать в режиме доступа

vlan 880 # даём ID новому VLAN

vlan World # имя нового VLAN

exit # выходим

int range f0/2-24 # выбираем все остальные порты

switchport access vlan 880 # переводим порты в vlan 800

shut # выключаем эти порты
Вооружившись топором, рубим STP дерево
Теория



Задача STP - предотвращение зацикливания пакетов в сети при наличии дублирующихся маршрутов.

  1. Производиться обнаружение коммутаторов связанных между собой
  2. Выбирается корневой, главный коммутатор (Root switch). Выборка идёт по наименьшему значению идентификатора или заданному администратором. (Это число из восьми байт, шесть младших - MAC адрес блока управления, а два старших - конфигурируются вручную.
  3. По специальному алгоритму блокируются порты которые создают петли.
По умолчанию протокол STP выбирает порты с наименьшим MAC. Нам необходимо отправить BDPU-пакет, в котором будет указан наш идентификатор, остальные коммутаторы тоже их отправят. Наш идентификатор должен быть наименьшим и мы станем корневым узлом.

Атака

Включаем Yersinia. Нажимаем «Launch Attack», затем выбираем «Sending conf BDPU».



Мы видим, что появился коммутатор. Опять нажимаем «Launch Attack», но сейчас выбираем «Claiming Root Role».



Вы корень дерева STP. Этим можно гордиться!

Защита
Вначале запретим BPDU пакеты с портов, на которых нет никаких коммутаторов. Ну, если же пакетик пришёл, тогда переводим порт в shutdown режим. Переключим все порты в режим portfast, а после, клиент подключенный к порту, не будет принимать участия в разрешении маршрутов по STP:

conf t
int range f0/1-24
spanning-tree portfast
spanning-tree portfast bpguard default
int f0/1
spanning-tree guard root
conf t # перевод в режим глобального конфигурирования



int range f0/1-24 # перевод в режим конфигурирования всех портов

spanning-tree portfast # включаем portfast

spanning-tree portfast bpguard default # запрещаем "гуляние" bdpu пакетов

int f0/1 # выбираем 1 порт

spanning-tree guard root # указываем что порт - корневой
Подделка MAC-адреса
Атака



Тут всё просто. Меняем наш mac на другой с помощью macchanger, тем самым можем представиться другим хостом.



Напомню:

macchanger -r
macchanger --mac XX:XX:XX:XX:XX:XX

macchanger -r # сменить на рандомный mac-адрес

macchanger --mac XX:XX:XX:XX:XX:XX # меняем mac на указанный
Защита



Команды для защиты почти одинаковы как в ситуации с переполнением CAM таблицы:

conf t
int range f0/1-24
switchport mode access
switchport port-security
switchport port-security violation shotdown
switchport port-sec
urity maximum 2
arp timeout 60

conf t # перевод в режим глобального конфигурирования


int range f0/1-24 # перевод в режим конфигурирования всех портов

switchport port access # указываем, что все выбранные порты будут работать в режиме доступа

switchport port-security # включаем функицию port-security

switchport port-security violation shotdown # указываем коммутатору что нужно отключить порт (shutdown)

switchport port-security maximum 2 # указываем сколько mac-адресов можно подключиться к порту

arp timeout 60 # если в течении минуты подключиться больше максимума, тогда отключаем порт

Также можем указать статический mac-адрес. (

switchport port-security mac-address XXXX.XXXX.XXXX
Нападаем на DHCP
Теория

  1. Dos атака. Пентестер посылает огромное количество DHCP пакетов с разными MAC-адресами. Сервер выделяет ip-адрес из нула, а нул имеет ограничения и может закончиться. После такого сервер не сможет обслуживать клиентов больше.
  2. Можно развернуть свой собственный сервер и выдавать наши настройки сети клиентам. Затем появляются возможности от прослушивания трафика до подделки DNS ответов и т.д. Для этого способа требуется вывести настоящий сервер, используя 1 способ.
Данная атака уже есть на форуме. И даже инструмент такой же. Клик

Защита

Нам поможет DHSP Snooping или ограничение запросов. Коммутатор получает пакет, затем сравнивает MAC-адрес в запросе с MAC-адресом, который был прописан на порту. В этой технологии существуют доверительные порты (trasted) и недоверительные (untrasted).

conf t
ip dhcp snooping
ip dhcp snooping vlan 5
int f0/1
ip dhcp snooping trust
conf t # перевод в режим глобального конфигурирования



ip dhcp snooping # включаем dhcp snooping

ip dhcp snooping vlan 5 # # указывем vlan 5

int f0/1 # выбираем порт, подключенный напрямую к DHCP

ip dhcp snooping trust # включаем режим trust для этого порта
Или ограничение запросов:

conf t
int f0/24
ip dhcp snooping limit range 125

conf t # перевод в режим глобального конфигурирования


int f0/24 # выбираем все порты

ip dhcp snooping limit range 125 # устанавливаем ограничение в 125 запросов в секунду
Проникаем в PVLAN
Теория



Воспользуемся этой атакой для получения доступа к соседнему PVLAN через маршрутизатор. PVLAN использует три вида портов: isolated, promiscuus, community. Данные клиентов можно передать только с помощью двух последних.



Если у нас в сети есть маршрутизатор, он может установить связь с клиентами в одном PVLAN на isolated портах. Можно изменить IP-адрес назначения на цель находящуюся на другом порту isolated, а MAC-адрес назначения на адрес маршрутизатора.



Защита



Что-бы такого не случилось на маршрутизаторе создадим access list, где запрещается прямая передача данных между сегментом сети:

conf t
ip access list extended vlan
deny ip 192.168.0.0 0.0.0.255
permit any any
exit
int f0/1
ip access group pvlan in
conf t # перевод в режим глобального конфигурирования



ip access list extended vlan # создаём access list

deny ip 192.168.0.0 0.0.0.255 # указываем подсети для запрета (в нашем случае наши)

permit any any # указываем, что всё остальное передавать разрешено

exit # выходим

int f0/1 # выбираем 1 порт

ip access group pvlan in # привязываем к нашему списку с названием pvlan
 
Сверху