Скрипт блокировки ip-адресов, с которых пытаются подобрать пользователей роутера

Здесь выкладываем скрипты
Правила форума
Уважаемые Пользователи форума, обратите внимание!
Ни при каких обстоятельствах, Администрация форума, не несёт ответственности за какой-либо, прямой или косвенный, ущерб причиненный в результате использования материалов, взятых на этом Сайте или на любом другом сайте, на который имеется гиперссылка с данного Сайта. Возникновение неисправностей, потерю программ или данных в Ваших устройствах, даже если Администрация будет явно поставлена в известность о возможности такого ущерба.
Просим Вас быть предельно осторожными и внимательными, в использовании материалов раздела. Учитывать не только Ваши пожелания, но и границы возможностей вашего оборудования.
Ответить
Ruslan.Berezko
Сообщения: 3
Зарегистрирован: 23 ноя 2020, 13:02

Добрый! у меня вот такие ошибки валятся в логе при работе скрипта

>>> Script error. Not found string 'login failure for user' in log.
>>> Script error. Not found string 'login failure for user' in log.
>>> Script error. Not found string 'login failure for user' in log.
>>> Script error. Not found string 'login failure for user' in log.
>>> Script error. Not found string 'login failure for user' in log.
>>> Script error. Not found string 'TCP connection established from' in log.
>>> Script error. Not found string 'TCP connection established from' in log.
>>> Script error. Not found string 'TCP connection established from' in log. эта строчка из-за того что я добавил в скрипт свою запись

# ----------- Stage 6 - search for TCP connection established from -----------
foreach dangerString in=[ /log find message~"TCP connection established from"; ] do={
do {
:local stringTemp ([ /log get $dangerString message ]);
:local dangerIP ([ :pick $stringTemp ([ :find $stringTemp "from" ] + 5) ([ :len $stringTemp ]) ]);
if ([ /ip firewall address-list find list="BlockDangerAddress" address=$dangerIP ] = "" ) do={
/ip firewall address-list add address=$dangerIP list="BlockDangerAddress" timeout=14d;
:log warning (">>> Added in black list IP ".$dangerIP." (not TCP connection established from)");
}
} on-error={ :log warning ">>> Script error. Not found string 'TCP connection established from' in log."; }
}


Аватара пользователя
drpioneer
Сообщения: 142
Зарегистрирован: 30 май 2013, 10:20

Добрый день.
Чуть ранее я уже описывал причину появления подобных сообщений...
Такие сообщения выводятся когда нужная запись в LOG-файле изначально была обнаружена, но при попытке её обработать вдруг выясняется, что её нет...
Вероятно имеют место быть какие-то проблемы с LOG-файлом.


Denisov
Сообщения: 3
Зарегистрирован: 13 авг 2018, 23:06

drpioneer, привет! Я тоже столкнулся с такой информацией в логах "denied winbox/dude connect from ...". И благодаря твоему скрипту, мне удалось заблокировать многие адреса. Спасибо тебе огромное, огромный тебе RESPECT. Но, могу ли внести некоторые замечания в скрипт. Смотри, когда подключил твой скрипт, который благополучно отработал свою задачу, скрипт стал блокировать адреса, скажем так "которые не нужно" на основе лога. То есть, если я, при входе на микротик со своего адреса, пытался зайти и набрал пароль не верно, то мои действия микротик записал в log, а скрипт тем временем отработал, и мой адрес забанил.
1) Можно ли в скрипт внести условия проверки адреса с названием "White List" или "NoDangerAddress". То есть, сказать скрипту, прежде чем заблокировать адрес, проверить его в списке "White List" или "NoDangerAddress", если адрес есть, этот адрес пропустить, если его нет - заблокировать.
2) Можно ли, чтобы все заблокированные IP адреса, чтобы сохранялись в Address Lists - DropDangerAddress. Чтобы, можно было зайти в этот список, найти IP адресс заблокированный, удалить его оттуда или перенести в белый список. Было бы ОЧЕНЬ удобно. А не вычищать через "Firewall->>Filters ->> Reset All Counters"
P.S. Возможно, я что-то на форуме пропустил и не заметил соообшения. Поправьте меня, если такое уже есть.


Аватара пользователя
Virtue
Сообщения: 142
Зарегистрирован: 07 мар 2014, 10:17

Denisov писал(а): 29 дек 2020, 12:24 1) Можно ли в скрипт внести условия проверки адреса с названием "White List" или "NoDangerAddress". То есть, сказать скрипту, прежде чем заблокировать адрес, проверить его в списке "White List" или "NoDangerAddress", если адрес есть, этот адрес пропустить, если его нет - заблокировать.
2) Можно ли, чтобы все заблокированные IP адреса, чтобы сохранялись в Address Lists - DropDangerAddress. Чтобы, можно было зайти в этот список, найти IP адресс заблокированный, удалить его оттуда или перенести в белый список. Было бы ОЧЕНЬ удобно. А не вычищать через "Firewall->>Filters ->> Reset All Counters"
Здравствуйте. В вашем случае будет удобно:

1. добавить адрес в белый лист с помощью команды:

Код: Выделить всё

/ip firewall address-list add address=ВАШ АДРЕС list="White List"
2. в правилах фаервола добавить разрешающее правило:

Код: Выделить всё

/ip firewall filter add chain=input comment="White List" src-address-list="White List"
3. Не забудте поднять это правило выше запрещающего..

В последующем, если в списке заблокированных адресов BlockDangerAddress вы увидите адрес, который блокировать не нужно, просто добавьте его командой, указанной в пункте 1


Denisov
Сообщения: 3
Зарегистрирован: 13 авг 2018, 23:06

Virtue, благодарю огромное. Я попробую и напишу о результатах.


Denisov
Сообщения: 3
Зарегистрирован: 13 авг 2018, 23:06

Denisov писал(а): 29 дек 2020, 18:17 Virtue, благодарю огромное. Я попробую и напишу о результатах.
Парни Virtue и dpioneer! Сделал по Вашему совету. Поставил правила "White List" выше запрещающих правил в Firewall ->>Filter. Занес все адреса, также в "White List" в Address Lists , запустил скрипт, скрипт отработал свою задачу и меня не выбросило из сессии. Также, проверив, вышел из сессии и попытался зайти. Зашел, все отлично! Хотя, мой туннельный адрес и внешний адрес висят в обработке BlockDangerAddress заблокированных. Парни, ОГРОМНЫЙ Вам RESPECT :co_ol:
Но, парни, хочу Вас спросить: Ну вот, предположим, забыл или не вспомнил внести IP адрес в White List и кому-то из админов нужно зайти на микротик, а его адрес заблокирован. Как можно было, вытащить IP из заблокированного "Черного списка". Было бы круто, видеть, какие адреса висят в черном списке. Благодарю Вас!
Изображение


Аватара пользователя
Virtue
Сообщения: 142
Зарегистрирован: 07 мар 2014, 10:17

Пожалуйста :-):
Denisov писал(а): 30 дек 2020, 11:01 Как можно было, вытащить IP из заблокированного "Черного списка"
Вы имеете ввиду кто должен вытаскивать из блэклиста? Вы? или тот, кого уже забанили?
Если речь про вас,то тут все просто, смотрите в IP-Firewall-Address Lists - DropDangerAddress, упорядочиваете адреса по колонке Timeout и смотрите какой адрес был забанен последним (его тайм будет самым большим, скорее всего это и будет нужный адрес, его и вытаскиваем)
Ну а если же тот, кого забанили, должен сам себя вытащить из блэклиста, то тут приходят в голову 2 варианта:
1. Тот админ, которого забанили, должен сменить у себя адрес (например использовать альтернативный доступ в интернет, либо применить VPN), после этого у него появляется еще одна попытка аторизации с нового адреса.
2. Вы можете добавить проброс с нестандартного порта (правило NAT), а в фаерфоле разрешить соединения на данный нестандартный порт.


Аватара пользователя
drpioneer
Сообщения: 142
Зарегистрирован: 30 май 2013, 10:20

Приветствую.

Подправил скрипт на предмет корректного вывода служебной информации в LOG-файл.
Ранее, при стечении некоторых событий, выведенная в LOG-файл информация становилась источником новых неверных сообщений в LOG-файле :)

Код: Выделить всё


# Script for blocking dangerous addresses that tried to connect to the router by drPioneer
# https://forummikrotik.ru/viewtopic.php?t=4781&start=20
# tested on ROS 6.48
# updated 2021/01/16

# ----------- Stage 1 - search for a device login attempt ----------- 
foreach routerUser in=[ /user find disabled=no; ] do={
    do {
        foreach dangerString in=[ /log find message~"login failure for user"; ] do={
            do { 
                :local stringTemp ([ /log get $dangerString message ]);
                :local dangerUser ([ :pick $stringTemp ([ :find $stringTemp "user" ] + 5) ([ :find $stringTemp "from" ] - 1) ]);
                :local dangerIP ([ :pick $stringTemp ([ :find $stringTemp "from" ] + 5) ([ :find $stringTemp "via" ] - 1) ]);
                :local dangerVia ([ :pick $stringTemp ([ :find $stringTemp "via" ]) ([ :find $stringTemp "via" ] + 20)]);
                if ($routerUser != $dangerUser) do={
                    if ([ /ip firewall address-list find list="BlockDangerAddress" address=$dangerIP ] = "" ) do={ 
                        /ip firewall address-list add address=$dangerIP list="BlockDangerAddress" timeout=14d;
                        :log warning (">>> Added in black list IP ".$dangerIP." (wrong router user '".$dangerUser."' ".$dangerVia.")");
                    } 
                }
            } on-error={ :log warning ">>> Script error. Not found string 'Login failure for user' in log."; } 
        }
    } on-error={ :log warning ">>> Script error. Not found active router user."; }
}

# ----------- Stage 2 - search for an attempt to enter through IPSec password ----------- 
foreach dangerString in=[ /log find message~"parsing packet failed, possible cause: wrong password"; ] do={
    do {
        :local stringTemp ([ /log get $dangerString message ]);
        :local dangerIP ([ :pick $stringTemp 0 ([ :find $stringTemp "parsing" ] - 1) ]);
        if ([ /ip firewall address-list find list="BlockDangerAddress" address=$dangerIP ] = "" ) do={ 
            /ip firewall address-list add address=$dangerIP list="BlockDangerAddress" timeout=14d;
            :log warning (">>> Added in black list IP ".$dangerIP." (wrong IPSec password)");
        }
    } on-error={ :log warning ">>> Script error. Not found string 'Parsing packet failed, possible cause: wrong password' in log."; }
}

# ----------- Stage 3 - search for an attempt to enter through IPSec proposal ----------- 
foreach dangerString in=[ /log find message~"failed to get valid proposal"; ] do={
    do {
        :local stringTemp ([ /log get $dangerString message ]);
        :local dangerIP ([ :pick $stringTemp 0 ([ :find $stringTemp "failed" ] - 1) ]);
        if ([ /ip firewall address-list find list="BlockDangerAddress" address=$dangerIP ] = "" ) do={ 
            /ip firewall address-list add address=$dangerIP list="BlockDangerAddress" timeout=14d;
            :log warning (">>> Added in black list IP ".$dangerIP." (wrong IPSec proposal)");
        } 
    } on-error={ :log warning ">>> Script error. Not found string 'Failed to get valid proposal' in log."; }
}

# ----------- Stage 4 - search for an attempt to enter through L2TP ----------- 
foreach dangerString in=[ /log find message~"user" message~"authentication failed"; ] do={
    do {
        :local stringTemp ([ /log get $dangerString message ]);
        :local dangerUser ([ :pick $stringTemp ([ :find $stringTemp "user" ] + 5) ([ :find $stringTemp "authentication" ] - 1) ]);
        :local dangerIP ([ :pick $stringTemp ([ :find $stringTemp "<" ] + 1) ([ :find $stringTemp ">" ]) ]);
        if ([ /ip firewall address-list find list="BlockDangerAddress" address=$dangerIP ] = "" ) do={ 
            /ip firewall address-list add address=$dangerIP list="BlockDangerAddress" timeout=14d;
            :log warning (">>> Added in black list IP ".$dangerIP." (wrong L2TP user '".$dangerUser."')");
        }
    } on-error={ :log warning ">>> Script error. Not found string 'User' & 'Authentication failed' in log."; }
}    

# ----------- Stage 5 - search for login attempts via WinBox  ----------- 
foreach dangerString in=[ /log find message~"denied winbox/dude connect from"; ] do={
    do {
        :local stringTemp ([ /log get $dangerString message ]);
        :local dangerIP ([ :pick $stringTemp ([ :find $stringTemp "from" ] + 5) ([ :len $stringTemp ]) ]);
        if ([ /ip firewall address-list find list="BlockDangerAddress" address=$dangerIP ] = "" ) do={ 
            /ip firewall address-list add address=$dangerIP list="BlockDangerAddress" timeout=14d;
            :log warning (">>> Added in black list IP ".$dangerIP." (not allowed WinBox user IP-address)");
        }
    } on-error={ :log warning ">>> Script error. Not found string 'Denied winbox/dude connect from' in log."; }
}


Улучшения кода только приветствуются...

Хочется добавить, что в моем случае, накиданные в фаервол правила для защиты WinBox-порта от перебора по вот этой статье с указанием помимо 8291 еще и 8728 порта, отсеивают бОльшую часть желающих подоить роутер уже на этом этапе :men: .
Последний раз редактировалось drpioneer 20 фев 2021, 08:55, всего редактировалось 1 раз.


muslim
Сообщения: 1
Зарегистрирован: 01 фев 2021, 00:02

А что нужно сделать что бы скрипт сам отрабатывал ? а то мне приходится в ручную нажимать ран и он тогда банит адреса
Изображение


Аватара пользователя
Virtue
Сообщения: 142
Зарегистрирован: 07 мар 2014, 10:17

muslim писал(а): 01 фев 2021, 00:05 А что нужно сделать что бы скрипт сам отрабатывал ?
добавьте его в расписание (шедулер) с нужной периодичностью


Ответить