Приветствую, скрипт отлично отрабатывает, но у меня есть сообщения в логе как на картинке. Как забанить IP из лога?
Скрипт блокировки ip-адресов, с которых пытаются подобрать пользователей роутера
Правила форума
Уважаемые Пользователи форума, обратите внимание!
Ни при каких обстоятельствах, Администрация форума, не несёт ответственности за какой-либо, прямой или косвенный, ущерб причиненный в результате использования материалов, взятых на этом Сайте или на любом другом сайте, на который имеется гиперссылка с данного Сайта. Возникновение неисправностей, потерю программ или данных в Ваших устройствах, даже если Администрация будет явно поставлена в известность о возможности такого ущерба.
Просим Вас быть предельно осторожными и внимательными, в использовании материалов раздела. Учитывать не только Ваши пожелания, но и границы возможностей вашего оборудования.
Уважаемые Пользователи форума, обратите внимание!
Ни при каких обстоятельствах, Администрация форума, не несёт ответственности за какой-либо, прямой или косвенный, ущерб причиненный в результате использования материалов, взятых на этом Сайте или на любом другом сайте, на который имеется гиперссылка с данного Сайта. Возникновение неисправностей, потерю программ или данных в Ваших устройствах, даже если Администрация будет явно поставлена в известность о возможности такого ущерба.
Просим Вас быть предельно осторожными и внимательными, в использовании материалов раздела. Учитывать не только Ваши пожелания, но и границы возможностей вашего оборудования.
-
- Сообщения: 4
- Зарегистрирован: 21 ноя 2021, 19:13
- drpioneer
- Сообщения: 149
- Зарегистрирован: 30 май 2013, 10:20
Приветствую.
Таких сообщений у себя в журнале я не встречал, поэтому для понимания, как обрабатывать такие события, приходится вопросы задавать вам:
- что означает <15> во второй строке?
- что нужно сделать, чтобы гарантированно получить такое же сообщение у себя?
- можете еще накидать похожие примеры из своего лога?
Заранее спасибо.
-
- Сообщения: 1484
- Зарегистрирован: 23 ноя 2018, 11:08
- Откуда: Харкiв
дел
1-е Правило WiFi - Везде где только можно откажитесь от WiFi!
2-е Правило WiFi -Устройство, которое пользователь не носит с собой постоянно, должно подключаться кабелем!!
Микротики есть разные: черные, белые, красные. Но все равно хочется над чем нибудь заморочится.
2-е Правило WiFi -Устройство, которое пользователь не носит с собой постоянно, должно подключаться кабелем!!
Микротики есть разные: черные, белые, красные. Но все равно хочется над чем нибудь заморочится.
-
- Сообщения: 4
- Зарегистрирован: 21 ноя 2021, 19:13
Приветствую, мне удается воспроизвести данное сообщение если я пробую подключиться к микротик с компьютера через LTE используя неправильный логин через PPTP. Если хотите напишите мне в ПМ ваш IP, я попробую подключитьсяdrpioneer писал(а): ↑21 ноя 2021, 23:32Приветствую.
Таких сообщений у себя в журнале я не встречал, поэтому для понимания, как обрабатывать такие события, приходится вопросы задавать вам:
- что означает <15> во второй строке?
- что нужно сделать, чтобы гарантированно получить такое же сообщение у себя?
- можете еще накидать похожие примеры из своего лога?
Заранее спасибо.
- drpioneer
- Сообщения: 149
- Зарегистрирован: 30 май 2013, 10:20
Добрый день.
Мне удалось спровоцировать подобные события на своём оборудовании. Спасибо.
Вроде определился, как блокировать такие события.
Прилагаю обновленный скрипт:
Код: Выделить всё
# Script for blocking dangerous addresses that tried to connect to the router by drPioneer
# https://forummikrotik.ru/viewtopic.php?p=82374#p82374
# tested on ROS 6.49
# updated 2021/11/23
:do {
:local outMsg "Dangerous addresses detected:";
:local lenMsg [:len $outMsg];
# ----------- 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;
:set outMsg ($outMsg."\r\n>>> Added in black list IP ".$dangerIP." (wrong router user '".$dangerUser."' ".$dangerVia.")");
}
}
} on-error={ :set outMsg ($outMsg."\r\n>>> Script error. Not found string 'Login failure for user' in log."); }
}
} on-error={ :set outMsg ($outMsg."\r\n>>> Script error. Not found active router user."); }
}
# ----------- Stage 2 - 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;
:set outMsg ($outMsg."\r\n>>> Added in black list IP ".$dangerIP." (not allowed WinBox user IP-address)");
}
} on-error={ :set outMsg ($outMsg."\r\n>>> Script error. Not found string 'Denied winbox/dude connect from' in log."); }
}
# ----------- Stage 3 - 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;
:set outMsg ($outMsg."\r\n>>> Added in black list IP ".$dangerIP." (wrong IPSec password)");
}
} on-error={ :set outMsg ($outMsg."\r\n>>> Script error. Not found string 'Parsing packet failed, possible cause: wrong password' in log."); }
}
# ----------- Stage 4 - 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;
:set outMsg ($outMsg."\r\n>>> Added in black list IP ".$dangerIP." (wrong IPSec proposal)");
}
} on-error={ :set outMsg ($outMsg."\r\n>>> Script error. Not found string 'Failed to get valid proposal' in log."); }
}
# ----------- Stage 5 - search for an attempt to enter through L2TP -----------
foreach dangerString in=[ /log find topics~"l2tp" 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;
:set outMsg ($outMsg."\r\n>>> Added in black list IP ".$dangerIP." (wrong L2TP user '".$dangerUser."')");
}
} on-error={ :set outMsg ($outMsg."\r\n>>> Script error. Not found string of L2TP 'User' & 'Authentication failed' in log."); }
}
# ----------- Stage 6 - search for an attempt to enter through PPTP -----------
foreach dangerStr1 in=[ /log find topics~"pptp" message~"user" message~"authentication failed"; ] do={
do {
foreach dangerStr2 in=[ /log find topics~"pptp" message~"TCP connection established from"; ] do={
do {
:local stringId1 ("0x".[:pick $dangerStr1 ([:find $dangerStr1 "*"] + 1) [:len $dangerStr1]]);
:local stringId2 ("0x".[:pick $dangerStr2 ([:find $dangerStr2 "*"] + 1) [:len $dangerStr2]]);
if (($stringId1 - $stringId2) = 1) do={
:local stringTemp ([ /log get $dangerStr1 message ]);
:local dangerUser ([ :pick $stringTemp ([ :find $stringTemp "user" ] + 5) ([ :find $stringTemp "authentication" ] - 1) ]);
:local stringTemp ([ /log get $dangerStr2 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;
:set outMsg ($outMsg."\r\n>>> Added in black list IP ".$dangerIP." (wrong PPTP user '".$dangerUser."')");
}
}
} on-error={ :set outMsg ($outMsg."\r\n>>> Script error. Not found string of PPTP 'User' & 'Authentication failed' in log."); }
}
} on-error={ :set outMsg ($outMsg."\r\n>>> Script error. Not found string of PPTP 'User' & 'Authentication failed' in log."); }
}
# ----------- Output searching results -----------
if ([:len $outMsg] > $lenMsg) do={
:put $outMsg;
:log warning $outMsg;
}
}
Заранее благодарю.
-
- Сообщения: 4
- Зарегистрирован: 21 ноя 2021, 19:13
Приветствую, затестил норм работает, респект!!!
-
- Сообщения: 2
- Зарегистрирован: 29 ноя 2021, 13:56
drpioneer писал(а): ↑22 май 2020, 22:54
Теперь в черный список отправляются все граждане, пытающиеся:
[*] залогиниться на роутер с несуществующим именем роутера (строка в логе: 'login failure for user XXXXXXX'),
[*] 3 и более раз подобрать пароль IPSec (строка в логе: 'parsing packet failed, possible cause: wrong password'),
[*] подключиться по IPSec c несовпадающим proposal (2 строки в логе: 'failed to get valid proposal' и 'failed to pre-process').
[*] 3 и более раз подобрать пароль L2TP (строка в логе: 'user XXXXXXX authentication failed'),
[/list]
Доброго времени суток, давно и часто пользуюсь вашим скриптом, огромное вам за это спасибо! Возникла проблема, надо сделать дать пользователям шансы на 3 попытки для # ----------- Stage 6 - search for an attempt to enter through PPTP ----------- . Пытался сам мозгов не хватило. Можете помочь?
- drpioneer
- Сообщения: 149
- Зарегистрирован: 30 май 2013, 10:20
Добрый день.
Для себя считаю вариант с 3-мя попытками входа бесперспективным потому-что:
- у пользователя заранее должен быть преднастроен вход с правильными логином и паролем в угоду безопасности VPN.
- шансы на 3 попытки за какой период? Как этот период описать в скрипте не громоздя кучу кода и не нагружая роутер всякой фигней?
Поэтому, чисто для отвлечения и разминки мозгов, по вашей просьбе написал костыль:
Код: Выделить всё
:do {
:local outMsg "Dangerous addresses detected:";
:local lenMsg [:len $outMsg];
# ----------- Stage 6 - search for an attempt to enter through PPTP -----------
:local counter 0;
foreach dangerStr1 in=[ /log find topics~"pptp" message~"user" message~"authentication failed"; ] do={
do {
foreach dangerStr2 in=[ /log find topics~"pptp" message~"TCP connection established from"; ] do={
do {
:local stringId1 ("0x".[:pick $dangerStr1 ([:find $dangerStr1 "*"] + 1) [:len $dangerStr1]]);
:local stringId2 ("0x".[:pick $dangerStr2 ([:find $dangerStr2 "*"] + 1) [:len $dangerStr2]]);
if (($stringId1 - $stringId2) = 1) do={ :set counter ($counter + 1); }
if ($counter > 2) do={
:local stringTemp ([ /log get $dangerStr1 message ]);
:local dangerUser ([ :pick $stringTemp ([ :find $stringTemp "user" ] + 5) ([ :find $stringTemp "authentication" ] - 1) ]);
:local stringTemp ([ /log get $dangerStr2 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;
:set outMsg ($outMsg."\r\n>>> Added in black list IP ".$dangerIP." (wrong PPTP user '".$dangerUser."')");
}
}
} on-error={ :set outMsg ($outMsg."\r\n>>> Script error. Not found string of PPTP 'User' & 'Authentication failed' in log."); }
}
} on-error={ :set outMsg ($outMsg."\r\n>>> Script error. Not found string of PPTP 'User' & 'Authentication failed' in log."); }
}
# ----------- Output searching results -----------
if ([:len $outMsg] > $lenMsg) do={
:put $outMsg;
:log warning $outMsg;
}
}
Обратите внимание, счетчик считает ВСЕ невалидные попытки входа, зарегистрированные в журнале, со всеми вытекающими из этого обстоятельства последствиями.
-
- Сообщения: 2
- Зарегистрирован: 29 ноя 2021, 13:56
Спасибо огромное! И извините за беспокойство)drpioneer писал(а): ↑29 ноя 2021, 15:28
Добрый день.
Для себя считаю вариант с 3-мя попытками входа бесперспективным потому-что:
- у пользователя заранее должен быть преднастроен вход с правильными логином и паролем в угоду безопасности VPN.
- шансы на 3 попытки за какой период? Как этот период описать в скрипте не громоздя кучу кода и не нагружая роутер всякой фигней?
Поэтому, чисто для отвлечения и разминки мозгов, по вашей просьбе написал костыль:
-
- Сообщения: 1
- Зарегистрирован: 06 дек 2021, 09:47
Привет! а у меня этот скрипт не работает. Предыдущий работает, а вот именно этот нет, просто тихо и все. В чем может быть проблема? У меня много попыток соединения, в которых нет IP адреса, а указан просто порядковый номер (<53>: user admin authentication failed). На скринах красным это неудачные попытки, без IP адресов, а синим это работа предыдущего скрипта, котрый блокирует порядковые номера, но пользы от этого нет...drpioneer писал(а): ↑23 ноя 2021, 09:09Добрый день.
Мне удалось спровоцировать подобные события на своём оборудовании. Спасибо.
Вроде определился, как блокировать такие события.
Прилагаю обновленный скрипт:Пробуйте и отпишите о результате.Код: Выделить всё
# Script for blocking dangerous addresses that tried to connect to the router by drPioneer # https://forummikrotik.ru/viewtopic.php?p=82374#p82374 # tested on ROS 6.49 # updated 2021/11/23 :do { :local outMsg "Dangerous addresses detected:"; :local lenMsg [:len $outMsg]; # ----------- 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; :set outMsg ($outMsg."\r\n>>> Added in black list IP ".$dangerIP." (wrong router user '".$dangerUser."' ".$dangerVia.")"); } } } on-error={ :set outMsg ($outMsg."\r\n>>> Script error. Not found string 'Login failure for user' in log."); } } } on-error={ :set outMsg ($outMsg."\r\n>>> Script error. Not found active router user."); } } # ----------- Stage 2 - 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; :set outMsg ($outMsg."\r\n>>> Added in black list IP ".$dangerIP." (not allowed WinBox user IP-address)"); } } on-error={ :set outMsg ($outMsg."\r\n>>> Script error. Not found string 'Denied winbox/dude connect from' in log."); } } # ----------- Stage 3 - 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; :set outMsg ($outMsg."\r\n>>> Added in black list IP ".$dangerIP." (wrong IPSec password)"); } } on-error={ :set outMsg ($outMsg."\r\n>>> Script error. Not found string 'Parsing packet failed, possible cause: wrong password' in log."); } } # ----------- Stage 4 - 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; :set outMsg ($outMsg."\r\n>>> Added in black list IP ".$dangerIP." (wrong IPSec proposal)"); } } on-error={ :set outMsg ($outMsg."\r\n>>> Script error. Not found string 'Failed to get valid proposal' in log."); } } # ----------- Stage 5 - search for an attempt to enter through L2TP ----------- foreach dangerString in=[ /log find topics~"l2tp" 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; :set outMsg ($outMsg."\r\n>>> Added in black list IP ".$dangerIP." (wrong L2TP user '".$dangerUser."')"); } } on-error={ :set outMsg ($outMsg."\r\n>>> Script error. Not found string of L2TP 'User' & 'Authentication failed' in log."); } } # ----------- Stage 6 - search for an attempt to enter through PPTP ----------- foreach dangerStr1 in=[ /log find topics~"pptp" message~"user" message~"authentication failed"; ] do={ do { foreach dangerStr2 in=[ /log find topics~"pptp" message~"TCP connection established from"; ] do={ do { :local stringId1 ("0x".[:pick $dangerStr1 ([:find $dangerStr1 "*"] + 1) [:len $dangerStr1]]); :local stringId2 ("0x".[:pick $dangerStr2 ([:find $dangerStr2 "*"] + 1) [:len $dangerStr2]]); if (($stringId1 - $stringId2) = 1) do={ :local stringTemp ([ /log get $dangerStr1 message ]); :local dangerUser ([ :pick $stringTemp ([ :find $stringTemp "user" ] + 5) ([ :find $stringTemp "authentication" ] - 1) ]); :local stringTemp ([ /log get $dangerStr2 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; :set outMsg ($outMsg."\r\n>>> Added in black list IP ".$dangerIP." (wrong PPTP user '".$dangerUser."')"); } } } on-error={ :set outMsg ($outMsg."\r\n>>> Script error. Not found string of PPTP 'User' & 'Authentication failed' in log."); } } } on-error={ :set outMsg ($outMsg."\r\n>>> Script error. Not found string of PPTP 'User' & 'Authentication failed' in log."); } } # ----------- Output searching results ----------- if ([:len $outMsg] > $lenMsg) do={ :put $outMsg; :log warning $outMsg; } }
Заранее благодарю.