ผมมีความคิดที่จะเขียนสคริปต์ PowerShell เรียบง่ายเพื่อบล็อก (blacklist) ที่อยู่ IP ที่ตรวจพบการพยายาม RDP brute-force หรือการโจมตี RDP ต่อเนื่อง โดยอัตโนมัติใน Windows Firewall แนวคิดคือ: สคริปต์ PowerShell วิเคราะห์ system event log และหากมีการพยายามยืนยันตัวตนผ่าน RDP ล้มเหลวมากกว่า 5 ครั้งจากที่อยู่ IP เดียวกันใน 3 ชั่วโมงที่ผ่านมา ที่อยู่ IP จะถูกเพิ่มเข้าไปในกฎการบล็อกของ Windows Firewall โดยอัตโนมัติ
ดังนั้น มีเครือข่ายสำนักงานเล็กๆ เพื่อเข้าถึง พอร์ต RDP ถูกส่งต่อผ่าน NAT ไปยังคอมพิวเตอร์สำนักงานหนึ่งผ่าน Internet gateway ที่รัน Linux (TCP 15221 ตอบสนองจากภายนอก และพอร์ต RDP เริ่มต้น 3389 ถูกส่งต่อเข้าไปใน) บางครั้ง บัญชีผู้ใช้ที่รู้จักถูกล็อกโดยนโยบายรหัสผ่านโดเมนเนื่องจากการพยายามยืนยันตัวตนล้มเหลวบนคอมพิวเตอร์ผ่าน RDP งานของเราคือบล็อกที่อยู่ IP ที่ใช้ brute force RDP server ของเราโดยอัตโนมัติ
ขั้นแรก สร้างกฎไฟร์วอลล์บนคอมพิวเตอร์เพื่อบล็อกการเชื่อมต่อ RDP เข้า (inbound) จากที่อยู่ IP ที่ระบุ:
New-NetFirewallRule -DisplayName "BlockRDPBruteForce" –RemoteAddress 1.1.1.1 -Direction Inbound -Protocol TCP –LocalPort 3389 -Action Block

เราจะเพิ่มที่อยู่ IP ที่ตรวจพบการพยายาม RDP brute-force เข้าไปในกฎไฟร์วอลล์นี้ต่อไป
คุณสามารถเขียนกฎอนุญาตเพิ่มเติมได้ เพื่อที่สคริปต์ PowerShell จะไม่บล็อกที่อยู่ IP หรือ subnet ที่คุณต้องการ
จากนั้นคุณจะต้องรวบรวมรายการที่อยู่ IP ที่ตรวจพบการพยายามยืนยันตัวตนล้มเหลวมากกว่า 5 ครั้งใน 3 ชั่วโมงที่ผ่านมา จาก Windows event log เพื่อทำเช่นนี้ ให้ค้นหาเหตุการณ์ที่มี EventID 4625 (การพยายามเข้าถึงล้มเหลว — An account failed to log on และ LogonType = 3 ตรวจสอบบทความ RDP Event Log Forensics) ใน Security log ในเหตุการณ์ที่คุณพบ ให้ค้นหาที่อยู่ IP ของผู้ใช้ที่พยายามเชื่อมต่อ และตรวจสอบว่ามันปรากฏใน event log มากกว่า 5 ครั้ง
ผมใช้โค้ด PowerShell ต่อไปนี้เพื่อเลือกที่อยู่ IP ของผู้โจมตีจากรายการเหตุการณ์ใน 3 ชั่วโมงที่ผ่านมา (คุณสามารถเปลี่ยนช่วงเวลาได้):
$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
เพื่อแสดงรายการที่อยู่ IP ที่พบ ใช้: $getip
ตอนนี้เพิ่มที่อยู่ IP ของผู้โจมตีที่พบทั้งหมดเข้าไปในกฎไฟร์วอลล์ BlockRDPBruteForce ที่สร้างไว้ก่อนหน้านี้ เพื่อจัดการ Windows Firewall เราจะใช้ built-in PowerShell module NetSecurity. ขั้นแรก ให้รับรายการที่อยู่ IP ที่ถูกบล็อกอยู่ในปัจจุบันและเพิ่มที่ใหม่เข้าไป
$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

ตรวจสอบให้แน่ใจว่าที่อยู่ IP ใหม่ถูกเพิ่มเข้าไปในกฎการบล็อกใน Windows Defender Firewall

ตอนนี้คุณเพียงแค่ต้องคัดลอกโค้ด PowerShell นี้ไปที่ไฟล์ c:\ps\block_rdp_attack.ps1 และเพิ่มเข้าไปใน Task Scheduler ของคุณเพื่อรันทุก 2 ชั่วโมง ตัวอย่างเช่น
คุณสามารถสร้าง Scheduler task โดยใช้สคริปต์ PowerShell หรือด้วยตนเอง:
$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
หรือคุณสามารถรันสคริปต์ PowerShell ของคุณหาก EventID 4625 ปรากฏใน log (ตรวจสอบบล็อกโพสต์ Windows Event Triggers) ดังนั้นคุณจะตอบสนองต่อการโจมตี RDP brute-force ได้เร็วขึ้น
คุณสามารถปรับเปลี่ยนสคริปต์นี้ตามความต้องการของคุณและใช้เพื่อบล็อกการโจมตี RDP