воскресенье, 24 ноября 2019 г.

Скрипт для блокировки перебора паролей RDP | RDP bruteforce block script

Создать задание с интервалом выполнения каждые 5 минут.

Ниже переделанный скрипт для блокировки всех протоколов для указанного адреса (используется порт равный 0), если по случился перебор паролей с этого ip.
В скрипте используется несколько раз (Get-NetFirewallRule | ? DisplayName -eq $firewall_rule_name) для того, чтобы избежать конфликтной ситуации, если вдруг запустится копия скрипта или пока выполняется скрипт, руками кто-то создаст данное правило.

Import-Module "Microsoft.Powershell.Management"
Import-Module "International"
Import-Module "NetSecurity"


$start_time_event_search = (Get-Date).AddMinutes(-5)
$current_locale=(Get-WinSystemLocale).Name
$time_span=(New-TimeSpan -Start $start_time_event_search -End (get-date)).Minutes
$firewall_rule_name="BanIP"
$local_port=-1 #0 is mean all protocols, 1-65535 - block this TCP and UDP ports
$ip_address_list=@()


if ($current_locale -eq 'ru-RU') {
    $match_pattern='Тип входа'
} else {
    $match_pattern='Logon type'
}

$match_pattern+=':\s+(3)\s'
if ($local_port -eq -1) {
    $local_port=(Get-ItemProperty "HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp\" -name PortNumber).PortNumber
    if (!($?)) {
        $local_port=3389 #if no value, than use default 3389 port
    }
}

$bad_RDP_logons = Get-EventLog -LogName 'Security' -After $start_time_event_search -InstanceId 4625 | ? {$_.Message -match $match_pattern} | select @{n='IpAddress';e={$_.ReplacementStrings[-2]} }
$get_ip = $bad_RDP_logons | group -property IpAddress | ? {$_.Count -gt 5} | Select -property Name
if (Get-NetFirewallRule | ? DisplayName -eq $firewall_rule_name) {
    foreach ($ip in (Get-NetFirewallRule -DisplayName $firewall_rule_name | Get-NetFirewallAddressFilter).RemoteAddress) {$ip_address_list+=$ip}
}
foreach ($ip in $get_ip.Name) { 
    foreach ($exist_ip in $ip_address_list) {
        if ($exist_ip -eq $ip) {
            $this_ip_exist=$true
            break
        }
    }
    if (!($this_ip_exist)) {$ip_address_list+=$ip}
    $this_ip_exist=$false
    $log_body='IP ' + $ip + ' заблокирован за ' + ($bad_RDP_logons | ? {$_.IpAddress -eq $ip}).Count + " попыток входа в систему за $time_span минут"
    if (!(Get-NetFirewallRule | ? DisplayName -eq $firewall_rule_name)) {
        if ($local_port -eq 0) {
            New-NetFirewallRule -DisplayName $firewall_rule_name –RemoteAddress $ip_address_list -Direction Inbound -Action Block
        } else {
            New-NetFirewallRule -DisplayName $firewall_rule_name –RemoteAddress $ip_address_list -Direction Inbound –LocalPort $local_port -Action Block -Protocol TCP
            New-NetFirewallRule -DisplayName $firewall_rule_name –RemoteAddress $ip_address_list -Direction Inbound –LocalPort $local_port -Action Block -Protocol UDP
        }
    } else {
        Get-NetFirewallRule | ? DisplayName -eq $firewall_rule_name | Set-NetFirewallRule -RemoteAddress $ip_address_list
    }
    Write-EventLog -LogName 'System' -Source 'System' -Message $log_body -EventId 666 -EntryType Warning
}

#(Get-NetFirewallRule -DisplayName $firewall_rule_name | Get-NetFirewallAddressFilter).RemoteAddress | sort

Комментариев нет:

Отправить комментарий