Tôi có ý tưởng viết một script PowerShell đơn giản để tự động chặn (blacklist) các địa chỉ IP, nơi phát hiện các nỗ lực brute-force RDP hoặc các cuộc tấn công RDP liên tục, trong Windows Firewall. Ý tưởng như sau: script PowerShell phân tích nhật ký sự kiện hệ thống và nếu đã có hơn 5 lần thử xác thực qua RDP thất bại từ cùng một địa chỉ IP trong 3 giờ qua, địa chỉ IP đó sẽ tự động được thêm vào quy tắc chặn của Windows Firewall.
Vì vậy, có một mạng văn phòng nhỏ. Để truy cập vào nó, một cổng RDP được chuyển tiếp qua NAT đến một trong các máy tính văn phòng qua cổng Internet gateway chạy Linux (TCP 15221 trả lời từ bên ngoài, và cổng RDP mặc định 3389 được chuyển tiếp bên trong). Thỉnh thoảng, các tài khoản người dùng đã biết bị khóa bởi chính sách mật khẩu miền do các lần thử xác thực thất bại trên máy tính qua RDP. Nhiệm vụ của chúng ta là tự động chặn các địa chỉ IP được dùng để brute-force máy chủ RDP của chúng ta.
Trước hết, tạo một quy tắc tường lửa trên máy tính để chặn kết nối RDP đến từ các địa chỉ IP được chỉ định:
New-NetFirewallRule -DisplayName "BlockRDPBruteForce" –RemoteAddress 1.1.1.1 -Direction Inbound -Protocol TCP –LocalPort 3389 -Action Block

Chúng ta sẽ thêm các địa chỉ IP, nơi phát hiện các nỗ lực brute-force RDP, vào quy tắc tường lửa này.
Bạn có thể viết một quy tắc cho phép bổ sung để script PowerShell không chặn các địa chỉ IP hoặc subnet bạn cần.
Sau đó, bạn sẽ phải thu thập danh sách các địa chỉ IP, nơi phát hiện hơn 5 lần thử xác thực thất bại trong 3 giờ qua, từ nhật ký sự kiện Windows. Để làm điều đó, tìm các sự kiện với EventID 4625 (lần thử truy cập thất bại — An account failed to log on và LogonType = 3, xem bài viết RDP Event Log Forensics) trong nhật ký Security. Trong các sự kiện bạn đã tìm thấy, tìm địa chỉ IP của người dùng cố gắng kết nối và đảm bảo rằng nó xuất hiện trong nhật ký sự kiện hơn 5 lần.
Tôi đang sử dụng mã PowerShell sau để chọn các địa chỉ IP của kẻ tấn công từ danh sách sự kiện trong 3 giờ qua (bạn có thể thay đổi khoảng thời gian):
$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
Để hiển thị danh sách địa chỉ IP tìm thấy, sử dụng: $getip
Bây giờ thêm tất cả địa chỉ IP của kẻ tấn công tìm được vào quy tắc tường lửa BlockRDPBruteForce được tạo trước đó. Để quản lý Windows Firewall, chúng ta sẽ sử dụng mô-đun PowerShell tích hợp NetSecurity. Trước hết, lấy danh sách địa chỉ IP hiện đang bị chặn và thêm các địa chỉ mới vào nó.
$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 # ghi sự kiện chặn IP vào file log
}
Set-NetFirewallRule -DisplayName "BlockRDPBruteForce" -RemoteAddress $current_ips

Đảm bảo rằng các địa chỉ IP mới đã được thêm vào quy tắc chặn trong Windows Defender Firewall.

Bây giờ bạn chỉ cần sao chép mã PowerShell này vào file c:\ps\block_rdp_attack.ps1 và thêm nó vào Task Scheduler để chạy mỗi 2 giờ, ví dụ.
Bạn có thể tạo tác vụ Scheduler bằng script PowerShell hoặc thủ công:
$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
Hoặc bạn có thể chạy script PowerShell của mình nếu EventID 4625 xuất hiện trong log (xem bài viết Windows Event Triggers), vì vậy bạn sẽ phản ứng với cuộc tấn công brute-force RDP nhanh hơn.
Bạn có thể sửa đổi script này theo nhu cầu của mình và sử dụng để chặn các cuộc tấn công RDP.