Материал просмотрен 3,214 раз(а)

Всем привет! Давно не садился за письмо, вот наконец решил поработать. Сегодня будем налаживать такую тему как PortKnocking на оборудовании Микротик (кстати, делал подобную тему на Linux). Как водится, рекомендую к покупке это железо именно в магазине Mikrotik нашего партнёра и товарища.

Что такое PortKnocking

Этот механизм позволяет совершать определённые действия при получении сетевых пакетов с определёнными параметрами. Такими параметрами может быть размер, номер порта, протокол и др. Не рекомендуется использовать TTL, т.к. это число может изменяться в зависимости от пути прохождения пакета и можно банально “не угадать”. Впрочем, обо всём по порядку.

Возможные сценарии применения PK

  1. Доступ на веб-интерфейс закрыт на файрволле. При получении последовательности ICMP-пакетов (ping) определённого размера добавляем IP источника в исключающее правило и для этого источника будет открыт доступ на веб-интерфейс;
  2. При получении последовательности пакетов на определённые TCP/UDP порты добавляем правило DNAT для IP источника внутрь локалки, например на RDP;

Да мало ли чего ещё! Это можно использовать как дополнительный уровень защиты, ведь фактически порт закрыт для всех. Но стоит получить некоторые сетевые пакеты в нужном порядке, как для источника пакетов добавляется правило (обычно на определённое время). Брутом простукать порты не получится, можно установить некоторые ловушки. Об этом будем говорить ниже. А в сценарии с ICMP важно угадать верные размеры пакетов, что опять же, не так просто сделать.

Ладно, я думаю, стало понятно, что это за механизм.

Реализация PortKnocking на Mikrotik

Будем делать первый сценарий.

Сценарий:

  1. Все ICMP обрабатываем в отдельной цепочке;
  2. Если пришёл пинг в 329 байт, затем в 429 байт, затем в 529 байт, то добавить адрес источника в белый список;
  3. Закрыть доступ на веб-морду для всех, кроме белого списка;

Счастливое число 28

Откуда взялась прибавка в 28 байт? Сейчас покажу.

Пошлём пустой пинг на любой хост (параметры -n 1 -l 0):

ping

ping

Открываем пойманный пакет WireShark-ом и видим следующее:

Wireshark frame

Wireshark frame

За вычетом L2, у нас ровно 28 байт нагрузки IP-ICMP (я выделил зелёным). Т.е. пакет с нулевыми данными будет нести 28 байт L3. Это число нужно прибавлять к пакету, чтобы получить его фактический размер. Например, если мы посылаем пинг размером 301, то ловить нужно пакет 301+28=329 байт! Проверим.

План сети

Над планом сети я особо не заморачивался. У меня есть wlan1 интерфейс, соединяется по WIFI с точкой доступа, которая раздаёт Интернет.

Построен bridge1, в который входит этот самый wlan1 и ether2, к которому подключен мой ноутбук. На ether2 висит IP 192.168.100.1.

Поднят DHCP-сервер на порту bridge1, который раздаёт адреса из диапазона 192.168.100.2-192.168.100.254.

Попутно DHCP-клиент принимает настройки от общей точки доступа на интерфейсе wlan1. Кажется ничего не забыл.

Правила файрволла Mikrotik

  1. add action=drop chain=input dst-address=192.168.100.1 dst-port=80 in-interface=bridge1 protocol=tcp src-address=192.168.100.0/24 src-address-list=!WIN
  2. add action=jump chain=input dst-address=192.168.100.1 in-interface=bridge1 jump-target=KnockKnockKnock protocol=icmp src-address=192.168.100.0/24
  3. add action=add-src-to-address-list address-list=Gate1 address-list-timeout=10s chain=KnockKnockKnock dst-address=192.168.100.1 in-interface=bridge1 log=yes \
    packet-size=329 protocol=icmp src-address=192.168.100.0/24
  4. add action=add-src-to-address-list address-list=Gate2 address-list-timeout=10s chain=KnockKnockKnock dst-address=192.168.100.1 in-interface=bridge1 log=yes \
    log-prefix=KNOCK packet-size=429 protocol=icmp src-address=192.168.100.0/24 src-address-list=Gate1
  5. add action=add-src-to-address-list address-list=WIN chain=KnockKnockKnock dst-address=192.168.100.1 in-interface=bridge1 log=yes log-prefix=KNOCK2 \
    packet-size=529 protocol=icmp src-address=192.168.100.0/24 src-address-list=Gate2
  6. add action=return chain=KnockKnockKnock
Так настраиваем mikrotik firewall rules

Так настраиваем mikrotik firewall rules

Указываем протокол icmp, так же укажем src и dst адреса

Указываем протокол icmp, так же укажем src и dst адреса

На вкладке Advanced укажем список адресов, если таковой будет нам нужен (в следующих правилах)

Здесь укажем размер пакета

Здесь укажем размер пакета

На вкладке Action указываем действия – нам нужно внести адрес источника в определённый список на указанное время. Пусть будет 10 секунд. Так же не помешает вести логи таких событий, чтобы можно было отслеживать (хоть и постфактум) проникновение извне в нашу схему.

Укажем действие - добавить в список

Укажем действие – добавить в список

Вот такие список правил у нас получился.

Правила файрволла Mikrotik

Правила файрволла Mikrotik

Объясняю правила:

  1. Блокируем все поползновения на веб-морду с нашей подсети кроме тех хостов, кто содержится в списке WIN.
  2. Все ICMP из нашей подсети перекидываем на цепочку KnockKnockKnock.
  3. Если пришёл ICMP-пакет размером 329 на bridge1, то помечаем хост отправитель в список Gate1 на 10 секунд.
  4. Если пришёл ICMP-пакет размером 429 на bridge1 и хост-отправитель содержится в списке Gate1, то помечаем хост отправитель в список Gate2 на 10 секунд.
  5. Если пришёл ICMP-пакет размером 529 на bridge1 и хост-отправитель содержится в списке Gate2, то помечаем хост отправитель в список WIN на 10 секунд.
  6. Возвращаемся из цепочки KnockKnockKnock (в INPUT)

Открываем WebFig:

WebFig Mikrotik

WebFig Mikrotik

Посылаем серию пингов:

Серия Ping

Серия Ping

Наш адрес ноута последовательно проходил через все списки и вот он в списке WIN:

Mikrotik Address Lists

Mikrotik Address Lists

И Веб-интерфейс у нас доступен:

Mikrotik WebFig

Mikrotik WebFig

Нетрудно заметить, что перед этими манипуляциями с пингами он не работал 🙂

Как можно прокачать тему?

  1. Обязательно установить пароль на пользователя;
  2. Серёга рекомендует также сменить дефолтного админа на другое имя;
  3. Сменить порт по умолчанию для WebFig;
  4. Установить таймаут нахождения адреса в списке WIN;
  5. Логгировать все этапы прохождения PortKnocking-а;

Одним словом – чистое творчество. Далее мы обязательно рассмотрим пример классического кноккинга с портами, ну а пока.. ) До встречи!

— UPDATE —

Я решил дополнить статейку примером классического кноккинга. Вот код для файрволла:

  1. add action=drop chain=input dst-port=80 in-interface=bridge1 protocol=tcp src-address-list=!WIN
  2. add action=add-src-to-address-list address-list=Step1 address-list-timeout=20s chain=input connection-state=new dst-port=1987 in-interface=bridge1 log=yes \
    log-prefix=KNOCK-1 protocol=tcp
  3. add action=add-src-to-address-list address-list=Step2 address-list-timeout=20s chain=input connection-state=new dst-port=2016 in-interface=bridge1 log=yes \
    log-prefix=KNOCK-2 protocol=tcp src-address-list=Step1
  4. add action=add-src-to-address-list address-list=WIN address-list-timeout=30m chain=input connection-state=new dst-port=12345 in-interface=bridge1 log=yes \
    log-prefix=WIN! protocol=tcp src-address-list=Step2

Объяснение правил весьма тривиально.

  1. Блокируем входящие tcp:80 пакеты для всех, кто не в списке WIN
  2. Добавляем в список Step1 тех, кто стукнул по tcp на порт 1987;
  3. Добавляем в список тех, кто уже в списке Step1 и стукнул на tcp порт 2016;
  4. Добавляем в список WIN тех, кто уже в списке Step2 и стукнул на tcp порт 12345;

В принципе всё. Стучать можно прямо в адресной строке браузера:

http://192.168.100.1:1987
http://192.168.100.1:2016
http://192.168.100.1:12345
http://192.168.100.1

По последней ссылке откроется админка. Если на борту есть телнет или ещё какая-нибудь прога для коннекта, то можно использовать её. Да хоть встроенный ftp клиент. Можно также усложнить правила ещё и udp протоколом, правда посылать пакеты придётся хитрее (навскидку, мне не приходит ни одного варианта, как послать udp пакет на произвольный порт в Windows). Можно ещё и скомбинировать этот способ с ICMP-кноккингом. Тогда защита станет на порядок запутаннее.