barozzzy
14-02-2025, 14:19
Доброго времени суток.
Есть такая задача:
Имеется Mikrotik на базе Router OS 7.17, нужен скрипт, который будет проверять не лог на предмет не верной авторизации (api, Winbox, ssh), брать ip адрес и добавлять его в Adress List.
Используя ИИ (ChatGPT и DeepSeek) пробовал сгенерировать код (не силен в написании кодов), при каждом варианте лог сообщал
executing script blockbruteforce from winbox failed, please check it manually
А вот сами варианты скрипта:
/system logging action add name=bruteforce target=memory
/system logging add topics=login action=bruteforce
:global blocklist "bruteforceblock"
/ip firewall address-list add list=$blocklist address=0.0.0.0 comment="Temporary list for brute-force attackers"
:local maxAttempts 5
:local banTime 1d
:while (true) do={
:local logEntries [/log find where topics~"login failure"]
:foreach entry in=$logEntries do={
:local message [/log get $entry message]
:if ([:find $message "via ssh" -1] != -1 || [:find $message "via winbox" -1] != -1 || [:find $message "via api" -1] != -1) do={
:local ip [:pick $message ([:find $message "from "]+5) [:find $message " via"]]
:local count [/ip firewall address-list find where list=$blocklist && address=$ip]
:if ([:len $count] = 0) do={
/ip firewall address-list add list=$blocklist address=$ip timeout=$banTime comment="Blocked due to brute-force"
:log warning "Blocked IP $ip due to multiple failed SSH/Winbox/API login attempts."
}
}
}
:delay 10s
}
/system logging action add name=bruteforce target=memory
/system logging add topics=login action=bruteforce
:global blocklist "bruteforceblock"
:local maxAttempts 5
:local banTime "1d"
:while (true) do={
:local logEntries [/log find where topics~"critical"]
:foreach entry in=$logEntries do={
:local message [/log get $entry message]
:log info "Checking message: $message"
:if ([:find $message "via ssh" -1] != -1 || [:find $message "via winbox" -1] != -1 || [:find $message "via api" -1] != -1) do={
:local ipStart ([:find $message "from "] + 5)
:local ipEnd [:find $message " via"]
:if ($ipEnd > 0) do={
:local ip [:pick $message $ipStart $ipEnd]
:log info "Extracted IP: $ip"
:local count [/ip firewall address-list find where list=$blocklist && address=$ip]
:if ([:len $count] = 0) do={
/ip firewall address-list add list=$blocklist address=$ip timeout=$banTime comment="Blocked due to brute-force"
:log warning "Blocked IP $ip due to multiple failed login attempts."
}
} else={
:log error "Failed to extract IP from message: $message"
}
}
}
:delay 10s
}
{
:local blocklist "bruteforceblock" # Название списка блокировки
:local maxAttempts 5 # Максимальное количество попыток
:local banTime "1d" # Время блокировки
:local failedIPs [:toarray {}] # Массив для хранения количества попыток
:local logEntries [/log find where topics~"critical"]
:foreach entry in=$logEntries do={
:local message [/log get $entry message]
:log info "Checking message: $message"
# Проверяем, связано ли сообщение с неудачной попыткой входа
:if ([:find $message "login failure for user"] != nil) do={
:local ipStart ([:find $message "from "] + 5)
:local ipEnd [:find $message " via"]
:local ip [:pick $message $ipStart $ipEnd]
:if ($ip != "") do={
:log info "Extracted IP: $ip"
:local ipCount 1
# Проверяем, есть ли уже запись об этом IP в массиве
:foreach ipEntry in=$failedIPs do={
:if ([:pick $ipEntry 0 [:find $ipEntry "="]] = $ip) do={
:set ipCount ([:pick $ipEntry ([:find $ipEntry "="] + 1) [:len $ipEntry]] + 1)
:set $failedIPs [:tostr [:replace $failedIPs $ipEntry ($ip . "=" . $ipCount)]]
}
}
# Если IP не найден в массиве, добавляем его
:if ($ipCount = 1) do={
:set $failedIPs [:tostr [:merge $failedIPs [:toarray [$ip . "=" . $ipCount]]]
}
# Если попыток больше maxAttempts, блокируем IP
:if ($ipCount >= $maxAttempts) do={
/ip firewall address-list add list=$blocklist address=$ip timeout=$banTime comment="Blocked due to brute-force"
:log warning "Blocked IP $ip due to $ipCount failed login attempts."
}
} else={
:log error "Failed to extract IP from message: $message"
}
}
}
}
/system script add name=block_bruteforce source="
:local blockTime 1d # Время блокировки (например, 1 день)
:local maxAttempts 3 # Количество неудачных попыток до блокировки
:local addressList \"BruteForce_Block\" # Название списка блокировки
:local failedIPs [:toarray {}] # Используем массив для хранения данных
:foreach logEntry in=[/log find where topics~\"account,info\"] do={
:local logMsg [/log get \$logEntry message]
# Проверяем, есть ли в сообщении 'login failure'
:if ([:find \$logMsg \"login failure for user\"] != nil) do={
:local startIndex [:find \$logMsg \"from\"]
:local failedIP [:pick \$logMsg (\$startIndex + 5) [:len \$logMsg]]
# Проверяем, не в списке ли уже этот IP
:if ([:len [/ip firewall address-list find where address=\$failedIP]] = 0) do={
:local ipCount 1
# Проверяем, есть ли уже запись об этом IP в массиве
:foreach ipEntry in=\$failedIPs do={
:if ([:pick \$ipEntry 0 [:find \$ipEntry \"=\"]] = \$failedIP) do={
:set ipCount ([:pick \$ipEntry ([:find \$ipEntry \"=\"] + 1) [:len \$ipEntry]] + 1)
:set \$failedIPs [:tostr [:replace \$failedIPs \$ipEntry (\$failedIP . \"=\" . \$ipCount)]]
}
}
# Если IP не найден в массиве, добавляем его
:if (\$ipCount = 1) do={
:set \$failedIPs [:tostr [:merge \$failedIPs [:toarray [\$failedIP . \"=\" . \$ipCount]]]]
}
# Если попыток больше maxAttempts, блокируем IP
:if (\$ipCount >= \$maxAttempts) do={
/ip firewall address-list add list=\$addressList address=\$failedIP timeout=\$blockTime
:log warning \"Blocked IP \$failedIP after \$ipCount failed login attempts!\"
}
}
}
}"
Вариантов было намного больше, но я выложил крайние.
Может кто нибудь поможет в данном вопросе?
Есть такая задача:
Имеется Mikrotik на базе Router OS 7.17, нужен скрипт, который будет проверять не лог на предмет не верной авторизации (api, Winbox, ssh), брать ip адрес и добавлять его в Adress List.
Используя ИИ (ChatGPT и DeepSeek) пробовал сгенерировать код (не силен в написании кодов), при каждом варианте лог сообщал
executing script blockbruteforce from winbox failed, please check it manually
А вот сами варианты скрипта:
/system logging action add name=bruteforce target=memory
/system logging add topics=login action=bruteforce
:global blocklist "bruteforceblock"
/ip firewall address-list add list=$blocklist address=0.0.0.0 comment="Temporary list for brute-force attackers"
:local maxAttempts 5
:local banTime 1d
:while (true) do={
:local logEntries [/log find where topics~"login failure"]
:foreach entry in=$logEntries do={
:local message [/log get $entry message]
:if ([:find $message "via ssh" -1] != -1 || [:find $message "via winbox" -1] != -1 || [:find $message "via api" -1] != -1) do={
:local ip [:pick $message ([:find $message "from "]+5) [:find $message " via"]]
:local count [/ip firewall address-list find where list=$blocklist && address=$ip]
:if ([:len $count] = 0) do={
/ip firewall address-list add list=$blocklist address=$ip timeout=$banTime comment="Blocked due to brute-force"
:log warning "Blocked IP $ip due to multiple failed SSH/Winbox/API login attempts."
}
}
}
:delay 10s
}
/system logging action add name=bruteforce target=memory
/system logging add topics=login action=bruteforce
:global blocklist "bruteforceblock"
:local maxAttempts 5
:local banTime "1d"
:while (true) do={
:local logEntries [/log find where topics~"critical"]
:foreach entry in=$logEntries do={
:local message [/log get $entry message]
:log info "Checking message: $message"
:if ([:find $message "via ssh" -1] != -1 || [:find $message "via winbox" -1] != -1 || [:find $message "via api" -1] != -1) do={
:local ipStart ([:find $message "from "] + 5)
:local ipEnd [:find $message " via"]
:if ($ipEnd > 0) do={
:local ip [:pick $message $ipStart $ipEnd]
:log info "Extracted IP: $ip"
:local count [/ip firewall address-list find where list=$blocklist && address=$ip]
:if ([:len $count] = 0) do={
/ip firewall address-list add list=$blocklist address=$ip timeout=$banTime comment="Blocked due to brute-force"
:log warning "Blocked IP $ip due to multiple failed login attempts."
}
} else={
:log error "Failed to extract IP from message: $message"
}
}
}
:delay 10s
}
{
:local blocklist "bruteforceblock" # Название списка блокировки
:local maxAttempts 5 # Максимальное количество попыток
:local banTime "1d" # Время блокировки
:local failedIPs [:toarray {}] # Массив для хранения количества попыток
:local logEntries [/log find where topics~"critical"]
:foreach entry in=$logEntries do={
:local message [/log get $entry message]
:log info "Checking message: $message"
# Проверяем, связано ли сообщение с неудачной попыткой входа
:if ([:find $message "login failure for user"] != nil) do={
:local ipStart ([:find $message "from "] + 5)
:local ipEnd [:find $message " via"]
:local ip [:pick $message $ipStart $ipEnd]
:if ($ip != "") do={
:log info "Extracted IP: $ip"
:local ipCount 1
# Проверяем, есть ли уже запись об этом IP в массиве
:foreach ipEntry in=$failedIPs do={
:if ([:pick $ipEntry 0 [:find $ipEntry "="]] = $ip) do={
:set ipCount ([:pick $ipEntry ([:find $ipEntry "="] + 1) [:len $ipEntry]] + 1)
:set $failedIPs [:tostr [:replace $failedIPs $ipEntry ($ip . "=" . $ipCount)]]
}
}
# Если IP не найден в массиве, добавляем его
:if ($ipCount = 1) do={
:set $failedIPs [:tostr [:merge $failedIPs [:toarray [$ip . "=" . $ipCount]]]
}
# Если попыток больше maxAttempts, блокируем IP
:if ($ipCount >= $maxAttempts) do={
/ip firewall address-list add list=$blocklist address=$ip timeout=$banTime comment="Blocked due to brute-force"
:log warning "Blocked IP $ip due to $ipCount failed login attempts."
}
} else={
:log error "Failed to extract IP from message: $message"
}
}
}
}
/system script add name=block_bruteforce source="
:local blockTime 1d # Время блокировки (например, 1 день)
:local maxAttempts 3 # Количество неудачных попыток до блокировки
:local addressList \"BruteForce_Block\" # Название списка блокировки
:local failedIPs [:toarray {}] # Используем массив для хранения данных
:foreach logEntry in=[/log find where topics~\"account,info\"] do={
:local logMsg [/log get \$logEntry message]
# Проверяем, есть ли в сообщении 'login failure'
:if ([:find \$logMsg \"login failure for user\"] != nil) do={
:local startIndex [:find \$logMsg \"from\"]
:local failedIP [:pick \$logMsg (\$startIndex + 5) [:len \$logMsg]]
# Проверяем, не в списке ли уже этот IP
:if ([:len [/ip firewall address-list find where address=\$failedIP]] = 0) do={
:local ipCount 1
# Проверяем, есть ли уже запись об этом IP в массиве
:foreach ipEntry in=\$failedIPs do={
:if ([:pick \$ipEntry 0 [:find \$ipEntry \"=\"]] = \$failedIP) do={
:set ipCount ([:pick \$ipEntry ([:find \$ipEntry \"=\"] + 1) [:len \$ipEntry]] + 1)
:set \$failedIPs [:tostr [:replace \$failedIPs \$ipEntry (\$failedIP . \"=\" . \$ipCount)]]
}
}
# Если IP не найден в массиве, добавляем его
:if (\$ipCount = 1) do={
:set \$failedIPs [:tostr [:merge \$failedIPs [:toarray [\$failedIP . \"=\" . \$ipCount]]]]
}
# Если попыток больше maxAttempts, блокируем IP
:if (\$ipCount >= \$maxAttempts) do={
/ip firewall address-list add list=\$addressList address=\$failedIP timeout=\$blockTime
:log warning \"Blocked IP \$failedIP after \$ipCount failed login attempts!\"
}
}
}
}"
Вариантов было намного больше, но я выложил крайние.
Может кто нибудь поможет в данном вопросе?