Хакер - Господин Микротиков. Автоматизируем сбор и обработку данных с оборудования MikroTik
hacker_frei
NestorMahno
Содержание статьи
- Первый этап оптимизации жизнедеятельности сисадмина
- Второй этап оптимизации. Учим сервер делать работу за нас
- Планировщик cron или полная автоматизация скрипта
- Итоги
Представь, что у нас есть оборудование MikroTik, для которого написаны правила файрвола против сканирования портов. Нам нужно вести ежедневный учет IP-адресов и отправлять письмо с отчетом для отдела безопасности. Сегодня мы в духе известной цитаты с «Баша» о программисте, который автоматизировал все, что занимало у него больше 90 секунд, напишем скрипт, чтобы он выполнял всю эту работу. По дороге поупражняемся в администрировании сетей на основе MikroTik.
Как ты помнишь, первый этап любой кибератаки — это разведка. От нее‑то мы и будем защищаться. На некоем граничном маршрутизаторе MikroTik у нас настроены правила Firewall против стандартного скана портов (например, всеми уважаемым сканером Nmap).

Все правила настроены в таблице Raw для обработки трафика до попадания в Connection Tracking и меньшей нагрузки на процессор. В правилах задействована цепочка Prerouting, логика работы правил основана на флагах TCP (tcp-flags). Если нам с одного IP-адреса поочередно на разные порты маршрутизатора прилетает несколько пакетов TCP с флагами SYN (полуоткрытые соединения), то можно сделать вывод, что работает сканер портов. Добавляем IP-адрес в Address List и в конце делаем drop всего листа. Эти сигнатуры не претендуют на уникальность. Так что, как говорит мой начальник, «совершенствуй и улучшай».

INFO
Детальный разбор этих правил выходит за рамки статьи. Чтобы вникнуть подробнее, читай цикл статей «Стена огня» и изучай, как работают сканеры портов.

ПЕРВЫЙ ЭТАП ОПТИМИЗАЦИИ ЖИЗНЕДЕЯТЕЛЬНОСТИ СИСАДМИНА
Итак, нам нужно вести учет количества IP-адресов, которые сканируют сеть, и ежедневно отправлять Address List в отдел безопасности предприятия для дальнейшего анализа и предотвращения атак. Как известно, системный администратор существо ленивое занятое, и каждый день заходить на маршрутизатор и скидывать файл с адресами для него нерентабельно. Начал я с того, что написал скрипт для RouterOS, который ежедневно сохранял Address List в файл и отправлял письмо на электронную почту.
Пример локального скрипта на маршрутизаторе MikroTik RouterOS
:local sysname [/system identity get name];
:local sysdate [/system clock get date];
:local d [:pick $sysdate begin=4 end=6];
:local m [:pick $sysdate begin=0 end=3];
:local y [:pick $sysdate begin=7 end=11];
########SAVE_ADDRESS_LIST_TO_FILE#############
/ip firewall address-list print from=[ find where list=port_scanners] \
file="$sysname_$d$m$y_port_scanners_list.txt";
:delay 3s;
########SEND_ADDRESS_LIST_TO_MAIL############
/tool e-mail send to=tester025@protonmail.com from=tester075@protonmail.com \
subject=([/system identity get name] . " Port_scanners_address_list " . \
[/system clock get date]) body=("Port scanners address-list of $sysname\nTime and Date stamp: " . \
[/system clock get time] . " " . [/system clock get date] . "\n ") \
file="$sysname_$d$m$y_port_scanners_list.txt";
Скрипт брал основную информацию по оборудованию, имя устройства, дату, месяц и год, искал соответствующий Address List и сохранял файл.

А затем отправлял сообщение с вложенным файлом на почту.

Добавление этого скрипта в Scheduler немного облегчило жизнь, но нужно было заходить на почту сохранять логи и еженедельно подсчитывать IP-адреса.

ВТОРОЙ ЭТАП ОПТИМИЗАЦИИ. УЧИМ СЕРВЕР ДЕЛАТЬ РАБОТУ ЗА НАС
План действий будет следующий.
- Мы напишем на Bash скрипт, который будет заходить на маршрутизатор по SSH, сохранять файл из Address List и по SCP забирать файл себе.
- Напишем еще один Bash-скрипт, который будет вести еженедельный подсчет IP-адресов и отправлять безопасникам эту информацию по почте, прикладывая сам список.
- Выполним всякие вспомогательные задачи: настройку cron и почтового клиента на сервере, генерацию ключей SSH и, конечно, настройку телеграм‑бота для получения служебных сообщений и (при некоторой доработке) управления работой скрипта.
Из инструментов нам понадобится Unix-образная система (я тестировал на Ubuntu, Armbian и Manjaro), прямые руки и баночка пива (опционально). Приступаем к работе!
Сначала создаем директорию для хранения наших скриптов и служебных файлов:
mkdir /home/user/.scripts/cyber
И еще одну — для хранения списка адресов, с которых происходило сканирование:
mkdir /home/user/.scripts/cyber/port_scanners
Также нужно на сервере сгенерировать ключи SSH:
ssh-keygen
И вручную найти публичный ключ (id_rsa.pub) в каталоге ~/.ssh. На маршрутизаторе создаем пользователя (например, uServer) и кладем публичный ключ SSH (id_rsa.pub) в директорию Files. Далее открываем вкладку System → Users → SSH Keys и выбираем публичный ключ SSH (id_rsa.pub) для созданного пользователя.

INFO
Не забывай, что после того, как мы положили ключ для пользователя, нужно первый раз зайти на маршрутизатор под этим пользователем по протоколу SSH.
Для мониторинга работы скриптов мы будем использовать телеграм‑бота. Его код я здесь приводить не буду, но смастерить его несложно — ищи бота BotFather и дерзай.
INFO
Подробнее о том, как писать ботов для Telegram, читай в статье «Телеграфирует робот. Пишем бота для Telegram на Python».
Дальше создаем группу или канал, даем ей соответствующее название (например, MikrotControl). Добавляем бота в группу и даем ему права для публикации сообщений.
Дальше узнаем chat id нашей группы. Для этого открываем специальный URL:
https://api.telegram.org/bot<ваш_токен_телеграм_бота>/getUpdates
В ответе нас интересует параметр message → chat → id, в нем хранится уникальный идентификатор чата группы с нашим ботом.
Вывод в формате JSON:
"chat": {
"id": -1524684857943,
"title": "MikrotControl",
"type": "supergroup"
},
Теперь отправим тестовое сообщение от бота в группу или канал. Для этого есть специальный URL:
https://api.telegram.org/bot<ваш_токен_телеграм_бота>/sendMessage?chat_id=<ідентифікатор_групи>&text=test123
В нашем случае chat ID -1524684857943. Именно так, со знаком минус.
В группе мы должны получить сообщение от бота с текстом test123. Дальше нужно настроить бота на сервере. Я возьму за основу готовый скрипт monit2telegram.
Устанавливаем клиент Git:
sudo pacman -S git
Переходим в директорию /usr/src:
cd /usr/src
Загружаем необходимые ресурсы с GitHub и переходим в загруженную директорию:
sudo git clone https://github.com/matriphe/monit2telegram.git
cd monit2telegram
Затем необходимо скопировать файл конфигурации и скрипты в соответствующие директории файловой системы и дать скриптам права на исполнение:
sudo cp telegramrc /etc/telegramrc
sudo cp sendtelegram.sh /usr/local/bin/sendtelegram
sudo chmod +x /usr/local/bin/sendtelegram
sudo cp monit2telegram.sh /usr/local/bin/monit2telegram
sudo chmod +x /usr/local/bin/monit2telegram
Установить необходимые зависимости (jq):
cd /usr/src
sudo wget https://github.com/stedolan/jq/releases/download/jq-1.6/jq-linux64
sudo ln -s /usr/src/jq-linux64 /usr/bin/jq
В первоначальном конфиге /etc/telegramrc нужно указать уникальный TOKEN бота и CHATID нашей группы:
TOKEN='...'
CHATID='...'
Проверить, приходят ли сообщения, можно так:
sendtelegram -m "test message from server"
В нашей группе мы должны получить сообщение от бота с указанным текстом.
Ну и наконец, пишем наш скрипт.
/home/user/.scripts/cyber/port_scanners.sh
#!/bin/bash
DIR_FILES="/home/user/.scripts/cyber/port_scanners";
# Переменные команд для работы в любых оболочках
CMD_WC=$(which wc)" -l";
CMD_SSH=$(which ssh);
CMD_SCP=$(which scp);
CMD_GREP=$(which grep);
CMD_NMAP=$(which nmap);
CMD_DATE=$(date +%d_%m_%Y);
CMD_SEND2TG=$(which sendtelegram)" -m";
# Переменные для доступа по SSH и работы скрипта
IDL_TIME="5s";
HOST="192.168.100.12";
USER="uServer";
PORT="4200";
IDENTITY="CRT001";
FILE_NAME=$(echo $IDENTITY"_"$CMD_DATE".txt");
SSH_OPT=" -o ConnectionAttempts=5 -o ConnectTimeout=5s \
-o PasswordAuthentication=no -o PreferredAuthentications=publickey \
-o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null \
-o GlobalKnownHostsFile=/dev/null -o CheckHostIP=no ";
# Переменные для телеграм-бота
DATE1="$(date "+%H:%M:%S")"
DATE2="$(date "+%d %B %Y")"
TEXT="
Port scanners file загружен на сервер *$HOSTNAME* в директорию *$DIR_FILES*
Время: $DATE1
Дата: $DATE2"
PAYLOAD="$TEXT&parse_mode=Markdown&disable_web_page_preview=true"
# Копирование файла с RouterOS на localhost
SCP_STR_FILE="$CMD_SCP -2 -4 -B $SSH_OPT -P $PORT $USER@$HOST:/$FILE_NAME $DIR_FILES";
# Сохранение address-list на RouterOS в файл
FILE_CRT="/ip firewall address-list print from=[ find where list=port_scanners] file=$FILE_NAME";
# Удаление файла из address-list на RouterOS
FILE_CLN="/file remove [find name=$FILE_NAME];/ip firewall address-list remove [find where list=port_scanners]";
# Подключение по протоколу SSH на RouterOS
SSH_STR="$CMD_SSH -p $PORT $USER@$HOST $SSH_OPT";
# Проверка доступности целевого хоста (маршрутизатор MikroTik) для написания условий
DEST_HOST=$($CMD_NMAP -p $PORT $HOST -Pn | $CMD_GREP -ic open);
# Если хост недоступен, отправляем сообщение в группу
if [ "$DEST_HOST" = 0 ]; then
$CMD_SEND2TG "cannot connect to $HOST"
fi;
# Если доступен, то сохраняем файл, копируем его в заданную директорию, удаляем с маршрутизатора и пишем об удачной отработке скрипта в группу
if [ "$DEST_HOST" = 1 ]; then
$SSH_STR $FILE_CRT
sleep $IDL_TIME && $SCP_STR_FILE
sleep $IDL_TIME && $SSH_STR $FILE_CLN
$CMD_SEND2TG "$PAYLOAD";
fi;
Думаю, логика скрипта понятна, поэтому идем дальше.
Для генерации электронного письма нам необходимо создать файл old_date с датой отправки первого письма для ИБ‑отдела:
echo 05.09.2021 > /home/user/.scripts/cyber/old_date
Также создаем дополнительный файл mail_body_text с текстом сообщения для нашего электронного письма:
echo Cybersecurity report with port scanners files > /home/user/.scripts/cyber/mail_body_text
Для электронной почты установим mutt:
yaourt mutt
Далее необходимо создать файл конфигурации home/user/.scripts/cyber/.muttrc:
sudo vi home/user/.scripts/cyber/.muttrc
Основные настройки файла home/user/.scripts/cyber/.muttrc:
set from = "username@protonmail.com" set realname = "Nestor" \
set imap_user = "username@protonmail.com" set imap_pass = "security_password" \
set folder = "imaps://imap.protonmail.com:993" set spoolfile = "+INBOX" \
set postponed ="+[Protonmail]/Drafts" set header_cache =~/.mutt/cache/headers \
set message_cachedir =~/.mutt/cache/bodies set certificate_file =~/.mutt/certificates \
set smtp_url = "smtp://username@smtp.protonmail.com:587/" set smtp_pass = "security_password" \
set move = no set imap_keepalive = 900
Для проверки электронной почты используем такую команду:
mutt -s Subject -a /home/user/.scripts/cyber/Cybersecurity_report.txt -- recepient_name@protonmail.com < Test message body
Теперь напишем скрипт для подсчета IP-адресов и отправки электронного письма для синей команды vim /home/user/.scripts/cyber/report_mail.sh. Все функции скрипта прописаны в комментариях в нем.
#!/bin/bash
# Переменные команд для работы в любых оболочках
CMD_DATE=$(date +%d.%m.%Y);
CMD_WC=$(which wc)" -l";
CMD_RM=$(which rm)" -r";
CMD_CAT=$(which cat);
CMD_EXPR=$(which expr);
CMD_SEND2TG=$(which sendtelegram)" -m";
CMD_MUTT=$(which mutt)" -s Cybersecurity_logs -a";
# Переменные директорий
DIR_FILES="/home/user/.scripts/cyber/port_scanners";
DIR_REPORT="/home/user/.scripts/cyber";
# Переменные файлов
FILE_REPORT="Cybersecurity_report.txt";
FILE_OLD_DATE="old_date";
FILE_MAIL="mail_body_text";
# Переменные для телеграм-бота
DATE1="$(date "+%H:%M:%S")"
DATE2="$(date "+%d %B %Y")"
TEXT="$DATE2 : Доклад и $RESULT IP-адресов для отдела ИБ отправлен на электронную почту recepient_name@protonmail.com";
# Берем старую дату предыдущего доклада для генерации нового
OLD_DATE=$($CMD_CAT "$DIR_REPORT/$FILE_OLD_DATE");
# Подсчет IP-адресов из сохраненных за неделю файлов
IP_SUM=$($CMD_CAT "$DIR_FILES"/* | $CMD_WC);
RESULT=$($CMD_EXPR $IP_SUM - 35);
# Удаляем старый Cybersecurity_report.txt
$CMD_RM "$DIR_REPORT/$FILE_REPORT";
# Генерируем рапорт для синей команды
if ! [[ -r $DIR_REPORT/$FILE_REPORT ]];
then
echo "
Доклад на 10:00 с $OLD_DATE г. по $CMD_DATE г. зафиксировано $RESULT IP адресов, с которых производилось сканирование сети. Файлы с ІР-адресами во вложении к докладу.
Системный администратор Нестор Иванович Махно
$CMD_DATE года" > $DIR_REPORT/$FILE_REPORT;
# Замена переменной старой даты для последующего доклада
echo $CMD_DATE > "$DIR_REPORT/$FILE_OLD_DATE";
# Отправка электронного письма с вложениями
$CMD_MUTT "$DIR_REPORT/$FILE_REPORT" "$DIR_FILES"/* --recepient_name@protonmail.com < "$DIR_REPORT/$FILE_MAIL";
# Сообщение в группу «Телеграма» об удачной отправке
$CMD_SEND2TG "$TEXT";
# Удаление файлов с address-list port_scanners
#$CMD_RM "$DIR_FILES"/*;
else
# Сообщение в группу «Телеграма» о неудачной отработке скрипта
$CMD_SEND2TG "cyber.sh не отработал";
fi;
Приведу краткое пояснение части скрипта для подсчета IP-адресов из сохраненных файлов за неделю.
IP_SUM=$($CMD_CAT "$DIR_FILES"/* | $CMD_WC);
RESULT=$($CMD_EXPR $IP_SUM - 35);
Вот как выглядит экспорт списка адресов.

Как мы видим, первые пять строк не несут смысловой нагрузки.
С помощью утилиты wc мы считаем все строки в файлах из директории /home/user/.scripts/cyber/port_scanners, а так как доклад у нас за целую неделю, то 35 служебных строк мы не учитываем.
Ну и посмотрим, как работает оповещение телеграм‑бота в нашей группе.

ПЛАНИРОВЩИК CRON ИЛИ ПОЛНАЯ АВТОМАТИЗАЦИЯ СКРИПТА
Для нормального запуска наших скриптов создадим символические ссылки:
sudo ln -s /home/user/.script/cyber/port_scanners.sh /usr/bin/port_scanners.sh
sudo ln -s /home/user/.script/cyber/report_mail.sh /usr/bin/report_mail.sh
Дальше необходимо открыть планировщик cron:
crontab -e
И прописать в нем следующие строки для запуска наших символических ссылок на скрипты:
00 10 * * * /usr/bin/port_scanners.sh
30 12 * * 3 /usr/bin/report_mail.sh
Теперь каждый день в 10:00 будет запускаться наш скрипт для сбора адресов, а каждую среду в 12:30 подсчитывается число айпишников, генерируется и отправляется электронное письмо.
ИТОГИ
Отдел безопасности получает необходимые данные, информация не занимает память маршрутизатора MikroTik, а всю работу выполняет наш сервер. Системный администратор при этом контролирует выполнение в группе или канале Telegram, а в сэкономленное время почитывает «Хакер»!
Читайте ещё больше платных статей бесплатно: https://t.me/hacker_frei