Extra Systems Ban Software (ESBANS)

ES-RDP

Модуль rdp-run

Модуль rdp-run нашей оригинальной системы защиты удаленного рабочего стола Windows состоит из двух файлов - основного скрипта для PowerShell rdp-run.ps1 (который и выполняет всю необходимую работу по выявлению и блокировке хакеров) и дополнительного файла rdp-run.bat (который вызывается из Windows Task Scheduler каждые 10 минут и при этом запускает на выполнение основной файл rdp-run.ps1).

Файл rdp-run.bat имеет в нашей системе такой вид:

powershell.exe -File "C:\Scripts\rdp-run.ps1"

Само собой понятно, что вы у себя должны здесь будете заменить "C:\Scripts" на тот адрес, по которому у вас расположена копия нашей системы. Главный файл этого модуля rdp-run.ps1 имеет следующий вид:

. "$PSScriptRoot\common.ps1"

# 2. ПОЛУЧЕНИЕ НАРУШИТЕЛЕЙ (Через цикл по таблице)
$RawOffenders = @()

foreach ($Rule in $BanRules) {
    $StartTime = (Get-Date).AddHours(-$Rule.Hours)
    $Events = Get-WinEvent -FilterHashtable @{LogName=$LogName; ID=$Rule.ID; StartTime=$StartTime} -ErrorAction SilentlyContinue
    
    if ($Events) {
        $List = $Events | ForEach-Object {
            if ($_.Message -match "(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})") {
                $FoundIP = $Matches[1]

                # ПРОВЕРКА ПО WHITELIST
                $IsWhite = $false
                foreach ($WhiteIP in $WhiteList) {
                    if ($FoundIP -like $WhiteIP) { 
                        $IsWhite = $true
                        break 
                    }
                }

                if (-not $IsWhite) { 
                    [PSCustomObject]@{ IP = $FoundIP; Type = $Rule.Type }
                }

            }
        } | Group-Object IP | Where-Object { $_.Count -ge $Rule.Limit }
        
        if ($List) { $RawOffenders += $List }
    }
}

# Объединяем и схлопываем дубликаты
$Offenders = $RawOffenders | Group-Object Name | ForEach-Object { $_.Group[0] }

# 3. БАН НОВЫХ ГАДОВ
if ($Offenders) {
    $CurDate = Get-Date -Format "yyyy-MM-dd"
    foreach ($Offender in $Offenders) {
        $IP = $Offender.Name
        $Type = $Offender.Group[0].Type
	$FirewallPrefix = $FirewallPrefixes['short']
        $TechnicalName = $FirewallPrefix + $IP.Replace('.', '_')
        if (-not (Get-NetFirewallRule -Name $TechnicalName -ErrorAction SilentlyContinue)) {
		$Description = "Type: $Type. Attempts: $($Offender.Count). Created: $(Get-Date)"
		New-NetFirewallRule -Name $TechnicalName -DisplayName "$FirewallPrefix$CurDate`_$IP" -Direction Inbound -Action Block -RemoteAddress $IP -Description $Description | Out-Null

		# --- НОВЫЙ БЛОК ДЛЯ БД ---
		# Вычисляем подсеть: берем всё до последней точки и добавляем .0
		$Subnet = $IP.Substring(0, $IP.LastIndexOf('.')) + ".0"
		# SQL запрос сохраняет и сам IP, и его подсеть
		$LogQuery = "INSERT INTO ban_log (ban_addr, ban_subnet) VALUES (INET_ATON('$IP'), INET_ATON('$Subnet'));"
		# Выполняем запись
		& $mysql_path --user=$mysql_user --password=$mysql_password --database=$mysql_dbName --execute="$LogQuery" 2>$null
		# -------------------------
            
        }
    }
}

Как видно из этого кода, данный скрипт использует общие настройки системы из файла common.ps1, а также документирует свою деятельность в таблице ban_log (это необходимо для работы других модулей, задачей которых является вторичный бан - рецидивисты, блоки адресов и т.п.).


© Extra Systems, 2026 Extra Web Top