В компаниях, где отлажены процессы информационной безопасности, а также в центрах реагирования и мониторинга, используется ПО для автоматизации принятия решений при возникающих инцидентах, но даже в этом случае многим все еще необходимо писать сценарии для автоматизации рутинных операций. Что делать, если вы хотите автоматизировать рутину, но не хотите покупать дорогостоящее специализированное решение, разбираться с ним, а затем настраивать его в течение длительного времени в соответствии со своими потребностями? Более того, вы не хотите изобрестать велосипед со скриптами и делать что-то самостоятельно, изучая программирование и работая с базами данных?
n8n — это просто конструктор, набор ингредиентов для готовки. Цель n8n — помочь обычному человеку завершить его рутинные рабочие процессы путем интеграции целого ряда различных объектов в единый оркестр. Это совсем не похоже на программирование.Однако, чтобы создать действительно мощный сборщик средств автоматизации, который соответствует вашим потребностям, желательно иметь опыт программирования на уровне Паскаля, способность находить и копировать код переполнения и, по крайней мере, иметь представление о том, как работает ваша сеть (интерфейс — это просто! ). n8n поможет приготовить чашку кофе в автомате по рекомендации любимого Telegram.
n8n играет роль серверной части процессов автоматизации, своего рода связующего звена между различными сущностями (скрипты, файлы, мессенджеры, веб-сайты, системы отчетности, CRM-системы, системы IP-телефонии, системы мониторинга — то есть почти все). Это помогает связать любое приложение с API и без него с любым другим приложением, и вы можете реализовать практически любую логику. Но, что наиболее важно, он может реализовать свою собственную логику с помощью программирования на JavaScript и запускать сценарии на сервере.
Настройка workflow интуитивно понятна и проста в модном веб-интерфейсе, рабочий процесс очень легко настроить. Отношения между сущностями и n8n реализуются с использованием различных архитектурных концепций, основной из которых является REST API. Данные могут поступать в различных форматах, для REST API обычно используется JSON / XML. Поскольку это открытый исходный код, вы можете написать свой собственный компонент или скрипт n8n на любом языке. N8n — отличный выбор для новичков в автоматизации.
Поскольку обзор функций решения немного утомительный и очень длинный, вы можете самостоятельно изучить руководства, изучить варианты интеграции и изучить примеры рабочих процессов, чтобы получить некоторые идеи. Также есть отличные статьи с примерами на medium и хорошая статья по установке в блоге LogRocket. Для начала вполне достаточно.
Многие слышали об OSINT и использовали различные инструменты для сбора информации о ресурсах и оценки своих инструментов безопасности. Все использовали мобильные приложения с простым и понятным интерфейсом. Было интересно изучить простой интерфейс Telegram со сложными инструментами, такими как Shodan и Masscan, а также проверить, чего стоит n8n в автоматизации. Это было первое, что пришло в голову после знакомства с n8n, и нужно было выяснить, как он справится с этим заданием.
Цель состоит в том, чтобы продемонстрировать процесс автоматизации случайно выбранной предметной области путем написания простого бота для Telegram, который, согласно информации от Shodan, может получать список возможных уязвимостей / эксплойтов по IP / URL. Для этого необходимо получить информацию об открытых портах, службах на этих портах и возможных эксплойтах для этих служб. Полученную информацию в будущем придется проверять вручную. Это выходит за рамки данной статьи.
n8n написан на Node.JS, может работать как на Windows, так и на Linux. Всю информацию о рабочих процессах он хранит локально в БД SQLite. Может быть развернут как в докер-контейнере, так и прямо на хосте. Рассмотрим вариант установки прямо на хост Linux, для простоты. Есть опыт установки на CentOS 8.2 и Ubuntu 20.40 Desktop, отличия в установке минимальны.
Установка необходимых пакетов:
sudo apt-get install nodejs npm build-essential python –y
Запуск поддержки БД:
sudo npm install sqlite3 --save
Установка n8n глобально на хост:
sudo npm install n8n -g
Запуск n8n с параметром —tunnel:
n8n start --tunnel
Параметр --tunnel
нужен для правильной работы веб-хуков если на сервере отсутствует адрес, доступный из сети Интернет.
После запуска видим адрес, по которому доступен редактор, http://localhost:5678/, если доступ будет с другой машины в сети, то вместо localhost используем IP-адрес (не забыв открыть порт 5678 на файрволе).
Чтобы быстро приступить к работе, вам нужно будет ознакомиться с этим разделом документации, он очень простой. После создания пустого рабочего процесса у нас есть несъемный стартовый узел. Узел — это единое целое в рабочем процессе. Рабочий процесс начинается либо на стартовом узле при запуске рабочего процесса, либо в триггере, когда процесс активен и сообщение было получено от внешней системы (API, сценарий на хосте).Триггер тем или иным образом получает информацию о событии от внешней системы и обрабатывает ее. Ноды взаимодействуют друг с другом через соединения. Нода может иметь несколько подключений к другим нодам. Нода выполняет все действия с информацией — получение, обработку / изменение, вывод во внешние системы. Полный список узлов есть в документации. На этом краткий обзор завершен, перейдем к практике.
Про создание ботов в telegram написано огромное количество материалов. Опираемся на официальную документацию и на вот эту статью по созданию telegram бота для n8n. С помощью бота BotFather создаем своего бота, получаем его токен. Добавляем несколько команд и их описание:
hostinfo - <IP/URL> Show host info from Shodan
scan - <127.0.0.1> Show output of masscan for some open ports. Please, be patient..
whatweb - <URL> Show whatweb output
exploit - <name> Show searchsploit output
Для удобства работы с ботом создаем группу, куда добавляем бота и сохраняем id группы для дальнейшей настройки.
Запускаем n8n в режиме «—tunnel», для корректного получения обновления от серверов telegram. При первом запуске в веб-интерфейсе видим пустой лист с одной лишь нодой Start. Добавляем на лист триггер telegram, в настройках забиваем Credentials (токен доступа, полученный ранее). В Updates выбираем либо *, либо Message. Так как это триггер, его не нужно соединять со стартовой нодой.
Сохраняем workflow и делаем его активным с помощью переключателя в верхнем правом углу. Нажимаем Execute Workflow и пишем что-либо в окно чата с ботом. Видим, что статус «Waiting for webhook call..» меняется на Execute Workflow. На ноде триггера появляется зеленый круг, сигнализирующий об успешном выполнении триггера. В свойствах триггера видим результат – полученное сообщение об обновлении в формате JSON с содержанием сообщения и кучей полей.
Далее добавляем на поле ноду Switch, которая отвечает за обработку команды, полученной от бота. Соединяем ее линией с триггером Telegram. В свойствах ноды Switch видим простейший выбор из 4-х вариантов. Выбираем Mode – Rules, Data Type – string, в Value после нажатия на шестеренку выбираем Add Expression и видим следующее окно:
Проваливаемся по списку входных данных – Current Node -> Input Data -> JSON -> message -> text для выбора содержимого сообщения. В нижней части результат Expression – содержимое нашего сообщения. Закрываем окно, в настройках Switch добавляем правило роутинга, сообщение должно содержать первую команду «host». Выбираем выход «0» для дальнейшей ветки обработки. Для четырех команд бота у нас должно быть четыре правила роутинга. Получился вот такой workflow:
В дальнейшем не будем расписывать настолько подробно, механика создания workflow действительно очень проста. В ходе работ не забываем сохраняться.
У любого workflow есть два варианта работы – testing (при нажатии на кнопку Execute Workflow) и production – когда активен переключатель Active в верхнем правом углу. В тестовом варианте работы workflow выполняется только один раз, в варианте работы production он работает постоянно и запускается при старте сервиса n8n. В тестовом режиме мы можем видеть данные для обработки в веб-интерфейсе n8n, в отличие от режима production.
Перечень активных процессов можно увидеть через меню, выбрать пункт Open:
Немного отвлечемся от процесса создания нашего workflow и углубимся во внутренности работы триггера telegram. В данном случае для получения обновлений от API Telegram используется механизм веб-хуков. В отличие от традиционного метода обмена информацией по протоколу HTTP «запрос – ответ», механизм веб-хуков работает асинхронно. Заключается он в том, что серверу n8n необходимо «зарегистрироваться» на сервере Telegram с указанием URL-адреса, на котором он будет получать HTTPS-запрос POST, содержащий сериализованное обновление в формате JSON. Регистрация производится методом setWebhook при переводе workflow в активный режим либо при тестовом прогоне workflow. В этот момент сервер n8n отправляет с помощью запроса setWebhook свой URL-адрес для интеграции с API Telegram с целью получения обновлений. В момент остановки сервиса либо в момент окончания тестового процесса производится удаление интеграции с веб-хуком для того, чтобы уведомить API Telegram о том, что никто не сможет принять запросы об обновлении.
Поскольку у нас нет общедоступного URL-адреса для веб-хука в условиях тестирования, нам нужно получить его с помощью утилиты localtunnel. Для этого только при запуске указываем параметр –tunnel. Мы видим URL-адрес, полученный на консоли, и он также отправляется в Telegram API для обработки обновлений. URL-адрес создается динамически и отличается для каждого запуска службы.
Все началось с того, что я заметил странную работу триггера Telegram – при остановке и последующем запуске сервиса не приходили обновления от бота. Они приходили, если еще раз сделать workflow активным. Я еще раз изучил API Telegram и воспользовался методом getWebhookInfo для просмотра текущего URL веб-перехватчика. Оказалось, что после остановки сервиса n8n на хосте не производится отмена регистрации старого URL-адреса. Также при новом запуске сервиса не производится установка нового URL. Баг был отправлен разработчику, подтвержден и был исправлен в релизе n8n@0.79.3.
В качестве примера давайте получим данные о хосте от широко известного в узких кругах поисковика Shodan. У него есть REST API, а у нас есть желание упростить себе жизнь в части инструментального анализа уязвимостей, получая информацию прямо в чат (или куда-то еще). Для этого нам необходимо зарегистрироваться и получить API -ключ для Shodan в настройках нашего аккаунта.
В любом случае перед тем, как делать любой workflow, необходимо ответить себе на вопросы: что он будет делать, как он будет это делать, что потребуется для этого. В идеале рекомендую нарисовать простую блок-схему процесса на листке бумаги, чтобы было легче.
Но так мы уже определились с целями, то приступим к реализации.
Формат нашей команды – «/host example.com», где первая часть – это команда, вторая часть IP или корневой URL. Так как API Shodan выдает нам информацию только по IP-адресу, корневой URL переводить в IP мы будем с помощью новой технологии DoH в реализации Google. Можно сделать это множеством способов, но используем этот модный и стильный способ взаимодействия с DNS. Получаем IP-адрес и через Shodan API получаем и обрабатываем информацию, отправляя выжимку из нее в тот же чат в telegram. Звучит все просто. Для начала нам нужно знать, что подали на вход команды – IP или URL. JavaScript, функции на котором можно легко писать прямо в интерфейсе n8n, нам в этом поможет. Для этого добавим ноду типа Function и соединим ее с нодой sw_cmd.
Сейчас будет немного программирования, это просто. Просто, потому что n8n позволяет нам писать код на JS, который имеет порог вхождения где-то около нуля и позволяет делать магию.
Ищем, как отличить IP от URL и на stackoverflow находим нужное регулярное выражение. Пишем код в ноде func_isIP:
items[0].json.IP = items[0].json.message.text.split(' ')[1];
items[0].json.isIP = false;
if (/^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/.test(items[0].json.IP)) {
items[0].json.isIP = true;
return (items);
}
return (items);
Код получает на вход сериализованное JSON-сообщение, из него берет вторую часть после пробела, прогоняет ее регулярным выражением и в новую переменную isIP присваивает значение true, если это IP-адрес. Опережая комментарии про проверку ввода пользователя – не в данной статье, в ней мы минимально затрагиваем тему программирования. В случае неверного или нестандартного ввода в n8n есть процесс обработки ошибок, который необходимо настраивать.
Далее добавляем ноду IF_is_IP для выбора дальнейшей ветки алгоритма. В зависимости от содержимого, нам надо будет с помощью ноды типа HTTP Request выполнить запрос через API. Добавляем ноду http_req_shHost, соединяем с нодой IF_is_IP и настраиваем параметры запроса в соответствии с документацией производителя API (в данном случае Shodan). Аналогично настраиваем еще одну ноду http_req_DoH для получения информации от DNS. Методы запроса и методы аутентификации описаны в документации, все делаем в соответствии с ней.
Нужные переменные прокликиваем мышкой из Input Data, перед этом выполнив тестовый запуск workflow для получения ответа на запрос. Конструируем запрос:
Результат выполнения запроса DoH URL: ya.ru в формате JSON:
Ноду http_req_DoH соединяем с копией ноды http_req_shHost и мышкой прокликиваем ее новые параметры, меняя значение IP в параметрах запроса, чтобы получилось нужное значение: api.shodan.io/shodan/host{{$node[«http_req_DoH»].json[«Answer»][1][«data»]}}?key=<api_key_cutted>. Далее конструируем отчет, который будет отправлен в чат нодой Telegram2 (отправка сообщения в чат), выбирая нужные поля из Input Data:
В чате видим сообщение с данным отчетом:
Так как область, которую мы автоматизируем, не ограничивается получением информации через различные API (а многие API еще и стоят денег за каждый запрос), давайте попробуем скрипты. Для работы с ними в n8n есть нода типа Execute Command, добавим ее в нужную ветку sw_cmd под именем cmd_masscanPorts. Перед этим извлечем IP-адрес из строки сообщения с помощью функции func_getIP.
Поставим на хост с n8n известный сканер masscan. Если у нас n8n работает в докер-контейнере, то ставить masscan нужно в контейнер. Установка довольно проста. После установки тестируем команды, с помощью которых мы будем сканировать порты. У меня получилась строка вида masscan -p 1-1024,8080 127.0.0.1. Диапазон портов ограничен до 1-1024,8080, чтобы сократить время ожидания. В свойствах ноды cmd_masscanPorts мы настраиваем входные данные от функции func_getIP (значок шестеренки, Add Expression).
Получается команда masscan -p 1-1024,8080 {{$node[«func_getIP»].json[«IP»]}}. Запускаем для теста workflow, вводим команду /scan 92.53.96.181 Обращаем внимание, что нода cmd_masscanPorts может выдавать для обработки как результат выполнения (stdout), так и результат ошибки или ход выполнения сканирования (stderr). Тестируем выполнение workflow, смотрим на выходные данные. Добавляем снова ноду для отправки сообщения в чат Telegram3, проверяем, видим в чате (спустя некоторое время выполнения команды masscan) стандартный вывод команды:
Отлично, мы научились выполнять скрипты и обрабатывать их вывод.
Как и в прошлом разделе, ставим whatweb на хост с n8n. Конструируем команду, пришлось отключить цветовое выделение, так как вывод некорректно обрабатывался при отправке сообщения в telegram. Получилась команда вида whatweb itlanit.ru —color=never. Результаты также отправляем сообщением в чат.
Вы можете искать эксплойты по версиям программного обеспечения несколькими способами. Оставляем в стороне платные запросы API. Посмотрим, как это можно сделать бесплатно без смс и регистрации, помня при этом основы JS. Ставим searchsploit на хост, изучаем документацию, смотрим примеры команд и их вывод. Подозрение сразу вызывает два параметра, которые могут быть полезны:
-j, --json Show result in JSON format -w, --www Show URLs to Exploit-DB.com rather than the local path
Добавляем ноду функции, которая должна вырезать нам имя софта из команды /exploit notepad, аналогично примеру выделения IP адреса из пункта про Shodan. При этом не забываем, что у нас может быть в запросе как название, так и версия софта, а значит из сообщения нам надо отбросить только команду. То есть надо выполнить простые операции со строками и массивами в JS. Итоговая функция func_getName:
emp = items[0].json.message.text.split(' '); temp = temp.slice(1, temp.length); items[0].json.soft = temp.join(' '); return items;
Добавляем ноду Execute Command, в команде указываем выражение:
searchsploit -j -w {{$node[«func_getName»].json[«soft»]}}
И у нас опять есть проблема, в результате получаем JSON, но в формате простого текста. Для преобразования используем метод json.parse в функции func_getJSON:
items[0].json.p_json = JSON.parse(items[0].json.stdout);
return items;
Теперь у нас есть JSON, который можно разбирать и конструировать из него сообщение. Отметим, что количество эксплойтов может быть произвольным, а значит нам понадобится цикл для обработки. Итоговый код func_getMsg:
items[0].json.msg_text = '*Exploits list: *\n';
items[0].json.p_json.RESULTS_EXPLOIT.forEach(function (RESULTS_EXPLOIT){
items[0].json.msg_text = items[0].json.msg_text + RESULTS_EXPLOIT.Title + ' \n '+ RESULTS_EXPLOIT.URL + '\n';
});
return items;
Звездочки добавлены для разметки Markdown, URL умеет распознавать сам Telegram. Добавляем ноду для отправки сообщения Telegram. Вот наше итоговое сообщение в чате:
На этом завершим. У нас есть робот, который может собирать информацию из разных источников.
Как еще можно использовать n8n для выполнения рутинных операций специалистом по информационной безопасности? Например, получать обновления об уязвимостях, обнаруженных в RSS-каналах, и анализировать обновления по ключевым словам — названию программного обеспечения, используемого в организации. Если найдена новая уязвимость в ПО, то отправлять сообщение администратору безопасности. Также допустим, если мы собираем хэш-суммы файлов на рабочей станции, то n8n может дополнительно проверять их на VirusTotal, и проверять, не пропустил ли установленный антивирус нового зловреда и отправлять уведомление администратору.
Плюсы
Минусы
Подводя итоги, могу сказать, что продукт мне понравился. Да, он не уникален, и у него много конкурентов (Zapier, IFTT, automate.io и т. д.). Но вы можете видеть, что концепция продукта была хорошо продумана. Особенно с точки зрения простоты использования и расширяемости.
В статье рассматриваются различные случаи использования n8n. Надеюсь, статья была полезной и подтолкнула читателя к некоторым идеям по автоматизации своей деятельности.
Чтобы взломать сеть Wi-Fi с помощью Kali Linux, вам нужна беспроводная карта, поддерживающая режим мониторинга…
Работа с консолью считается более эффективной, чем работа с графическим интерфейсом по нескольким причинам.Во-первых, ввод…
Конечно, вы также можете приобрести подписку на соответствующую услугу, но наличие SSH-доступа к компьютеру с…
С тех пор как ChatGPT вышел на арену, возросла потребность в поддержке чата на базе…
Если вы когда-нибудь окажетесь в ситуации, когда вам нужно взглянуть на спектр беспроводной связи, будь…
Elastic Security стремится превзойти противников в инновациях и обеспечить защиту от новейших технологий злоумышленников. В…