Port knocking mac os

Port Knocking — просто, безопасно и с централизованным обновлением.

Утилита Port Knocking для всех платформ, шифрованием алгоритма, и возможность централизованного обновления конфигурации, без передачи конфига

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

Для чего

Port Knocking — необходим тогда, когда вам необходимо получить доступ к ресурсу, который не хотеться открывать всем подряд, а определить IP адреса нет возможности, так как они динамические.

Как пользоваться

Я хотел написать инструкцию, для каждого аргумента, но решил сделать чуть по другому и показать на примере, как можно использовать данную программку.

У программы есть несколько аргументов, запустите —help чтобы посмотреть короткие и длинные обозначения.

Примеры

Создание Knocking

Программе необходимо передать специально сформированную строку с определённым синтаксисом, что бы программа могла правильно выполнить процедуру Knocking

Пока программа умеет использовать только два протокола, это TCP и UDP, настоятельно рекомендую не использовать порты 53, так как некоторые ОПСОС-ы заворачивают трафик DNS на свои сервера.

Итак, поставим задачу: необходимо организовать Knocking на хост 5.19.245.3 по портам TCP 40000,111,443,77 и по протоколу UDP 777 и 9000

При формировании строки первым символом вы должны указать ОБЯЗАТЕЛЬНО заглавную букву H обозначающую, что далее через разделитель двоеточие : будет идти адрес на который необходимо сделать процедуру Knocking.

H:5.19.245.3 — далее вы указываете порты и протоколы заглавными буквами, где T — tcp, а U — udp

H:5.19.245.3,T:40000,T:111,T:443,T:77,U:777,U:9000 — параметры разделены запятыми, обратите внимание, что программа читает строку слева направо, и в таком же направлении производит Knocking.

Запустите программу с аргументом —command=»H:5.19.245.3,T:40000,T:111,T:443,T:77,U:777,U:9000″

И Knocking сразу начнётся.

Доменное имя

Вы можете указать вместо IP адреса доменное имя H:mikrotik.me,T:40000,T:111,T:443,T:77,U:777,U:9000

Если для данного IP адреса есть несколько записей типа A, то для каждого IP адреса будет произведена процедура Knocking.

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

Централизованное хранение

Вы можете взять любой субдомен как пример testknk.mikrotik.me и создать TXT записи, где значение записей будет ваша строка Knocking, например, H:mikrotik.me,T:40000,T:111,T:443,T:77,U:777,U:9000 , записей может быть несколько и по каждой записи будет запущена процедура Knocking, технически мы не ограничивали, но и не проверяли на большом количестве записей.

В случае, если вы будете использовать DNS запросы, вам необходимо добавить параметр action со значением dns

Запуск будет выглядеть так —action=dns —command=»testknk.mikrotik.me»

DNS запросы

Обратите внимание, программа использует реализацию DOH (DNS over HTTPS), поэтому ей необходим выход в интернет. Причём используется несколько серверов и выберется самый быстрый из них относительно хоста. на котором запущена программа.

Шифрование данных

Да, конечно хранить в DNS в открытом виде строки Knocking не самая лучшая идея, хотя она имеет право на жизнь, но рано или поздно её обнаружат и сам процесс Knocking-a будет скомпрометирован.

Вы можете зашифровать вашу строку конфигурации, например, такой командой

-a=»encrypt» -p=»dondslk((» -c=»H:mikrotik.me,T:40000,T:111,T:443,T:77,U:777,U:9000″

Результатом выполнения будет вернувшаяся кодированная строка base64, а внутри неё byte код, результат шифрования строки конфигурации, с типом шифрования aes-cgm 128.

Чтобы убедиться, что всё работает вы можете и должны проверять обратное преобразование, выполните команду

-a=»decrypt» -p=»dondslk((» -c=»3OKtTRqg0h4Dl7xmLYfu/QCCWSx4ut9mMLCW4rcEZWRhncqly89bJFTe+CjuuOZnvs66OYyHmQady8nRyEdBmlByg1ceUe1o1IqKGNl3+g==»

Результатом выполнения данной команды должна быть строка, которую вы закодировали.

Теперь вы можете поместить данный результат в TXT запись домена, и в этом случае указать в аргументе пароль, которым был зашифрован конфиг.

Обратите внимание, пока можно использовать ТОЛЬКО один пароль для всех записей. Возможно в будущем мы это поправим.

Читайте также:  Восстановление системы linux после сбоя

Также вы можете указать данную зашифрованную строку непосредственно в аргумент Command, но тогда action должен быть либо со значением Knocking, либо не указан.

Обязательно укажите пароль

Если ваш хост, с которого вы запускаете Knocking, находится в таких условия, что ваш внешний IP адрес может поменяться, вы можете указать аргумент —loop= и указать число, с каким тайм-аутом повторять Knocking, значение указывается в минутах. Например —loop=1 будет повторять Knocking каждую минуту.

Также вы можете использовать данную процедуру для тех кейсов, когда у вас адрес листы с маленьким тайм-аутом.

Debug

Это пока мало похоже на debug, но всё же вы можете добавить аргумент —verbose и получить дополнительный вывод.

Мелочи

Программа не пытаеться установить соединение.

Если вы используете MikroTik, настоятельно рекомендую использовать при настройке Knocking таблицу raw.

Тестирование

Попробуйте, запустите программу со следующими параметрами и исследуйте вывод

-v -a=»dns» -p=»dondslk((» -c=»knocktest.mikrotik.me»

Планы на будущее

  1. Дать возможность пользователю принудительно отказаться от DoH
  2. Реализовать возможность также через DNS отправки сообщения пользователям, например если не смогли расшифровать ключей и есть определённая запись, вывести сообщение, что пароль изменён.
  3. Динамический ключ, ключ будет рассчитываться из даты или других параметров.
  4. Совсем не быстро, но реализовать напрямую расчёт общего ключа по алгоритму DH, но для это понадобиться веб сервис.
  5. Получение конфигурации по http.
  6. Мы используем данный софт и для своих целей, и как показала практика при большом количестве записей Knocking, уходит приличное время, например при 200 ростах, может потребоваться около 5 минут на прохождения всех списков, так как мы в самом начале заложили к код модульность выполнения Knocking, сейчас мы не можем реализовать распараллеливание Knocking, но для нас это приоритетная задача.

Программа пишется сразу с учётом множества операционных систем единым кодом, для Windows, Linux и MacOS а также других ОS.

Источник

Записки IT специалиста

Технический блог специалистов ООО»Интерфейс»

  • Главная
  • Настраиваем Port Knocking в Mikrotik

Настраиваем Port Knocking в Mikrotik

Достаточно часто системные администраторы сталкиваются с дилеммой: необходимо иметь возможность подключиться к собственным системам из любой точки мира, но при этом не выставлять открытыми наружу служебные порты. Отчасти это решается использованием VPN, но такая возможность присутствует не всегда, а в некоторых ситуациях единственной возможностью может оказаться только прямое подключение к системе. Но есть и другой способ, называемый Port Knocking, дословно обозначающий «постучать в порт», но не просто постучать, а особым образом, после чего вы сможете получить доступ, стучите — и вам откроют.

Освоить MikroTik вы можете с помощью онлайн-курса «Настройка оборудования MikroTik». В курсе изучаются все темы из официальной программы MTCNA. Автор — официальный тренер MikroTik. Материал подходит и тем, кто уже давно работает с оборудованием MikroTik, и тем, кто еще не держал его в руках. В состав входят 162 видеоурока, 45 лабораторных работ, вопросы для самопроверки и конспект.

Но сначала хочется предупредить вас о некоторых заблуждениях относительно этой технологии. Являясь инструментом, обеспечивающим дополнительную безопасность, Port Knocking никак не повышает безопасность защищаемого им сервиса. Это всего лишь способ получить доступ, причем далеко не самый надежный.

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

Кроме того, стучащийся клиент может находиться в публичной сети, за VPN-сервером или прокси, да даже за NAT провайдера, в этом случае доступ к сервису, хоть и кратковременно, могут получить все пользователи, находящиеся с ним на одном IP-адресе.

Также трафик может быть перехвачен и проанализирован, что позволит вычислить правильную последовательность «стука» и чем чаще вы будете использовать Port Knocking, тем быстрее можно будет это сделать.

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

Port Knocking с использованием портов

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

Читайте также:  Wpi драйвера для windows 10

При реализации данного метода следует соблюдать правильную последовательность правил в цепочке INPUT межсетевого экрана и основным правилом, вокруг которого будет строиться наша система будет разрешение уже установленных и связанных соединений (ESTABLISHED, RELATED) и если вы настраивали роутер по нашей инструкции, то данное правило будет стоять вторым в цепочке, после «правила-пустышки» разрешающего доступ из локальной сети.

В нашем примере для получения доступа мы выберем последовательное обращение к портам 7890 и 9870, данные значения выбраны исключительно из удобочитаемости, на практике желательно разносить порты подальше друг от друга, так как такое сочетание достаточно легко «простучать» любым сканером сети, но к этому мы вернемся позже.

А пока добавим новое правило. На закладке General укажем: Chain — input, Protocol — tcp, Dst. Port — 7890.

На закладке Action добавим действия: Action — add src to address list, Address List — KNOCK-1, Timeout — 00:00:30

Данное правило при обращении к порту 7890 добавит адрес источника в список KNOCK-1 на 30 секунд, в течении этого времени мы должны успеть обратиться к следующему порту, чтобы получить доступ. Поэтому не следует указывать слишком высокие значения, на наш взгляд 30 секунд вполне достаточно для выполнения нужных команд в терминале, в ряде случаев можно незначительно увеличить таймаут.

Теперь добавим еще одно правило. Закладка General: Chain — input, Protocol — tcp, Dst. Port — 9870. Закладка Advanced: Src. Address List — KNOCK-1.

Закладка Action: Action — add src to address list, Address List — KNOCK-ACCEPT, Timeout — 00:01:00.

Данное правило добавит в лист KNOCK-ACCEPT адрес того источника, который обратится к порту 9870 и при этом находится в списке KNOCK-1, время жизни записи в новом листе — 1 минута, за это время мы должны будем установить соединение с устройством.

Тоже самое в терминале:

Оба этих правила следует расположить выше правила, разрешающего уже установленные соединения. Ниже этого правила добавим разрешающее для подключения к целевому порту, в нашем случае это будет порт Winbox — 8291.

На закладке General укажем: Chain — input, Protocol — tcp, Dst. Port — 8291, на Advanced: Src. Address List — KNOCK-ACCEPT, вкладку Action не трогаем, так как accept действие по умолчанию.

В терминале для этого выполните:

Данное правило следует расположить ниже разрешающего установленные и связанные подключения.

Теперь пару слов о том, как это работает. Первые два правила заполняют листы с адресом источника, чтобы попасть в последний — KNOCK-ACCEPT — нам нужно в течении 30 секунд обратиться к последовательно к портам 7890 и 9870. Затем в течении минуты мы должны подключиться к целевому порту, в нашем случае это Winbox. После чего все пакеты этого соединения пойдут по правилу, разрешающему уже установленные соединения. Таким образом по истечении минуты новых соединений установить не удастся, а уже установленные будут продолжать работать до отключения.

Что же, правила есть, теперь попробуем постучаться. В Linux для этого можно использовать команду netcatnc, для того чтобы постучаться на TCP-порт используйте:

Где XXX.XXX.XXX.XXX — IP-адрес вашего роутера. Ключ -z указывает сканировать порт без посылки данных, ключ -w задает таймаут в 1 секунду.

Для UDP-портов используйте:

В Windows постучаться немного сложнее, из стандартных средств можно использовать PowerShell:

Но данная команда будет ожидать ответа от узла в течении таймаута около 20 секунд и указанного нами времени для обращения ко второму порту может не хватить, в этом случае имеет смысл увеличить время ожидания. Также таким образом можно постучать только на TCP-порт.

Другой вариант — использование утилиты tcping, которая проще и удобнее в использовании, но позволяет опять таки стучать только в TCP-порты:

Ключ -n указывает количество посылаемых пакетов, в нашем случае один.

Также существуют специальные утилиты, позволяющие автоматизировать этот процесс, например, PortKnock, которая умеет работать как с TCP, так и с UDP портами и может обращаться последовательно к 4 портам.

Читайте также:  Windows phone как установить приложения xap

Подведем небольшие итоги, Port Knocking с использованием портов достаточно прост в реализации, позволяет строить цепочки с нужным количеством портов и времени обращения к ним, но также имеет ряд недостатков. Прежде всего это ограниченность возможностей Windows, а ситуации бывают разные и не всегда есть время и возможности искать дополнительное ПО и качать его. Также близко расположенные порты без особых проблем можно простучать сканером.

Мы провели небольшой эксперимент, простая утилита Advanced Port Scanner без проблем простучала последовательности 7890-9870 и более сложную 7890-9870-8790, но не смог справиться с 17890-9870. Поэтому не используйте близко расположенные порты и устанавливайте минимальное время действия адресов в списках.

Кроме того, подобные последовательности достаточно легко выявляются при возможности перехвата и анализа трафика, что вполне возможно при использовании публичных сетей и сторонних VPN-сервисов. Имейте это ввиду и уделите должное внимание безопасности основного сервиса, доступ к которому вы ограничиваете данной технологией.

Port Knocking с использованием ICMP

Данный вариант отличается от классического тем, что вместо определенных портов мы будем использовать ICMP-пакеты различного размера. Это проще сделать стандартными средствами ОС и труднее поддается анализу при перехвате трафика, так как не столь бросается в глаза.

Несмотря на стандартный размер MTU в 1500 байт, это значение может быть уменьшено при использовании VLAN, VPN и т.д., поэтому мы не советуем использовать пакеты размером более 1000 байт, также учтите размер заголовков ICMP-пакета в 28 байт.

Просто выберите два (или более) произвольных числа до 1000, которые и будут вашими ключами для Port Knocking, в нашем случае это будут 250 и 209. Точно также, как и в предыдущем способе правила будут строиться относительно разрешения для уже установленных соединений.

Нам снова понадобится создать два правила для добавления адреса источника в соответствующие листы. В первом правиле укажем на General: Chain — input, Protocol — icmp, а на Advanced: Packet Size — 278 (250 + 28) — размер нашего первого пакета, на Action: Action — add src to address list, Address List — KNOCK-1, Timeout — 00:00:30.

Во втором зададим следующие значения: General: Chain — input, Protocol — icmp, Advanced: Src. Address List — KNOCK-1, Packet Size — 237 (209 + 28) — размер второго пакета, на Action: Action — add src to address list, Address List — KNOCK-ACCEPT, Timeout — 00:01:00.

Либо выполним в терминале:

Данные правила следует расположить выше правила разрешающего установленные и сопутствующие соединения. Остальные настройки полностью повторяют предыдущий способ.

Чтобы постучаться таким образом из Linux выполним:

Где ключ -s задает размер пакета (без учета заголовка), а ключ количество посылаемых пакетов, в нашем случае один.

В Windows синтаксис будет немного иной:

Здесь за размер пакета отвечает ключ -l, а за количество пакетов -n.

Принцип работы не отличается от предыдущего метода, получив ICMP-пакет размером в 250 байт адрес источника будет занесен в первый список. Затем в течении 30 секунд мы должны прислать второй пакет размером в 209 байт, в этом случае адрес будет занесен в список KNOCK-ACCEPT и в течении минуты с устройством можно будет установить соединение.

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

Освоить MikroTik вы можете с помощью онлайн-курса «Настройка оборудования MikroTik». В курсе изучаются все темы из официальной программы MTCNA. Автор — официальный тренер MikroTik. Материал подходит и тем, кто уже давно работает с оборудованием MikroTik, и тем, кто еще не держал его в руках. В состав входят 162 видеоурока, 45 лабораторных работ, вопросы для самопроверки и конспект.

Дополнительные материалы:

Mikrotik

The Dude

Помогла статья? Поддержи автора и новые статьи будут выходить чаще:

Или подпишись на наш Телеграм-канал:

Источник

Оцените статью