Búsqueda de sitios web

RDP Brute Force Protection con PowerShell y reglas de firewall de Windows


Tuve la idea de escribir un script de PowerShell simple para bloquear automáticamente (lista negra) las direcciones IP, en las que se detectan intentos de fuerza bruta de RDP o ataques de RDP continuos, en el Firewall de Windows. La idea es la siguiente: el script de PowerShell analiza el registro de eventos del sistema y si ha habido más de 5 intentos fallidos de autenticación a través de RDP desde la misma dirección IP en las últimas tres horas, la dirección IP se agrega automáticamente a la regla de bloqueo del Firewall de Windows.

Entonces, hay una pequeña red de oficinas. Para acceder a él, se reenvía un puerto RDP a través de NAT a una de las computadoras de la oficina a través de la puerta de enlace de Internet que ejecuta Linux (TCP 15221 responde desde el exterior y el puerto RDP predeterminado 3389 se reenvía al interior). De vez en cuando, las cuentas de usuario conocidas son bloqueadas por la política de contraseñas del dominio debido a intentos fallidos de autenticación en la computadora a través de RDP. Nuestra tarea es bloquear automáticamente las direcciones IP utilizadas para forzar nuestro servidor RDP.

En primer lugar, cree una regla de firewall en la computadora para bloquear las conexiones RDP entrantes desde las direcciones IP especificadas:

New-NetFirewallRule -DisplayName "BlockRDPBruteForce" -RemoteAddress 1.1.1.1 -Direction Inbound -Protocol TCP -LocalPort 3389 -Action Block

Además, agregaremos las direcciones IP, en las que se detectan los intentos de fuerza bruta de RDP, a este firewall de reglas.

Puede escribir una regla de autorización adicional para que el script de PowerShell no bloquee las direcciones IP o las subredes que necesita.

Luego deberá recopilar la lista de direcciones IP, en las que se han detectado más de 5 intentos de autenticación fallidos durante las últimas 3 horas, del registro de eventos de Windows. Para hacerlo, busque los eventos con el EventID 4625 (intento de acceso fallido — Una cuenta no pudo iniciar sesión y LogonType=3, verifique el artículo RDP Event Log Forensics) en el registro de seguridad. En los eventos que haya encontrado, busque la dirección IP del usuario que intenta conectarse y asegúrese de que apareció en el registro de eventos más de 5 veces.

Estoy usando el siguiente código de PowerShell para seleccionar las direcciones IP de los atacantes de la lista de eventos de las últimas 3 horas (puede cambiar el período de tiempo):

$Last_n_Hours = [DateTime]::Now.AddHours(-3)
$badRDPlogons = Get-EventLog -LogName 'Security' -after $Last_n_Hours -InstanceId 4625 | ?{$_.Message -match 'logon type:\s+(3)\s'} | Select-Object @{n='IpAddress';e={$_.ReplacementStrings[-2]} }
$getip = $badRDPlogons | group-object -property IpAddress | where {$_.Count -gt 5} | Select -property Name

Para mostrar la lista de direcciones IP encontradas, utilice:

$getip

Ahora agregue todas las direcciones IP encontradas de los atacantes a la regla de firewall BlockRDPBruteForce creada anteriormente. Para administrar el Firewall de Windows, usaremos el módulo integrado de PowerShell NetSecurity. En primer lugar, obtenga la lista de direcciones IP actualmente bloqueadas y agréguele otras nuevas.

$log = "C:\ps\rdp_blocked_ip.txt"
$current_ips = (Get-NetFirewallRule -DisplayName "BlockRDPBruteForce" | Get-NetFirewallAddressFilter ).RemoteAddress
foreach ($ip in $getip)
{
$current_ips += $ip.name
(Get-Date).ToString() + ' ' + $ip.name + ' The IP address has been blocked due to ' + ($badRDPlogons | where {$_.IpAddress -eq $ip.name}).count + ' attempts for 2 hours'>> $log # writing the IP blocking event to the log file
}
Set-NetFirewallRule -DisplayName "BlockRDPBruteForce" -RemoteAddress $current_ips

Asegúrese de que se hayan agregado nuevas direcciones IP a la regla de bloqueo en el Firewall de Windows Defender.

Ahora solo tienes que copiar este código de PowerShell al archivo

c:\ps\block_rdp_attack.ps1

y agréguelo a su Programador de tareas para que se ejecute cada 2 horas, por ejemplo.

Puede crear una tarea del Programador usando un script de PowerShell o manualmente:

$repeat = (New-TimeSpan -Hours 2)
$duration = ([timeSpan]::maxvalue)
$Trigger= New-ScheduledTaskTrigger -Once -At (Get-Date).Date -RepetitionInterval $repeat -RepetitionDuration $duration
$User= "NT AUTHORITY\SYSTEM"
$Action= New-ScheduledTaskAction -Execute "PowerShell.exe" -Argument "C:\PS\block_rdp_attack.ps1"
Register-ScheduledTask -TaskName "BlockRDPBruteForce_PS" -Trigger $Trigger -User $User -Action $Action -RunLevel Highest -Force

O puede ejecutar su secuencia de comandos de PowerShell si el EventID 4625 aparece en el registro (consulte la publicación de blog Activadores de eventos de Windows), de modo que responderá a un ataque de fuerza bruta RDP más rápidamente.

Puede modificar este script según sus necesidades y usarlo para bloquear ataques RDP.

Artículos relacionados