ค้นหาเว็บไซต์

การป้องกัน RDP Brute Force ด้วย PowerShell และกฎไฟร์วอลล์ Windows


ฉันมีความคิดที่จะเขียนสคริปต์ PowerShell อย่างง่ายเพื่อบล็อกที่อยู่ IP (บัญชีดำ) โดยอัตโนมัติ ซึ่งตรวจพบความพยายาม RDP brute-force หรือการโจมตี RDP อย่างต่อเนื่องใน Windows Firewall แนวคิดมีดังนี้: สคริปต์ PowerShell วิเคราะห์บันทึกเหตุการณ์ของระบบ และหากมีการพยายามตรวจสอบสิทธิ์ผ่าน RDP ที่ล้มเหลวมากกว่า 5 ครั้งจากที่อยู่ IP เดียวกันในช่วงสามชั่วโมงที่ผ่านมา ที่อยู่ IP จะถูกเพิ่มโดยอัตโนมัติในกฎการบล็อก Windows Firewall .

เลยมีเครือข่ายสำนักเล็กๆ ในการเข้าถึง พอร์ต RDP จะถูกส่งต่อผ่าน NAT ไปยังคอมพิวเตอร์สำนักงานเครื่องใดเครื่องหนึ่งผ่านทางอินเทอร์เน็ตเกตเวย์ที่ใช้ Linux (TCP 15221 รับสายจากภายนอก และพอร์ต RDP เริ่มต้น 3389 ถูกส่งต่อภายใน) ในบางครั้ง บัญชีผู้ใช้ที่รู้จักจะถูกล็อคโดยนโยบายรหัสผ่านของโดเมน เนื่องจากความพยายามในการรับรองความถูกต้องบนคอมพิวเตอร์ผ่าน RDP ล้มเหลว หน้าที่ของเราคือบล็อกที่อยู่ IP โดยอัตโนมัติเพื่อบังคับให้เซิร์ฟเวอร์ RDP ของเราดุร้าย

ก่อนอื่น สร้างกฎไฟร์วอลล์บนคอมพิวเตอร์เพื่อบล็อกการเชื่อมต่อ RDP ขาเข้าจากที่อยู่ IP ที่ระบุ:

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

เราจะเพิ่มที่อยู่ IP ซึ่งตรวจพบความพยายาม RDP brute-force ให้กับไฟร์วอลล์กฎนี้

คุณสามารถเขียนกฎการอนุญาตเพิ่มเติมเพื่อให้สคริปต์ PowerShell ไม่บล็อกที่อยู่ IP หรือเครือข่ายย่อยที่คุณต้องการ

จากนั้นคุณจะต้องรวบรวมรายการที่อยู่ IP ซึ่งตรวจพบความพยายามในการตรวจสอบสิทธิ์ที่ล้มเหลวมากกว่า 5 ครั้งในช่วง 3 ชั่วโมงที่ผ่านมา จากบันทึกเหตุการณ์ของ Windows ในการดำเนินการ ให้ค้นหากิจกรรมที่มีรหัสเหตุการณ์ 4625 (ความพยายามในการเข้าถึงล้มเหลว — บัญชีเข้าสู่ระบบไม่สำเร็จ และ LogonType=3 ตรวจสอบ บทความ RDP Event Log Forensics) ในบันทึกความปลอดภัย ในเหตุการณ์ที่คุณพบ ให้ค้นหาที่อยู่ IP ของผู้ใช้ที่พยายามเชื่อมต่อและตรวจสอบให้แน่ใจว่าปรากฏในบันทึกเหตุการณ์มากกว่า 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 ของผู้โจมตีทั้งหมดที่พบในกฎไฟร์วอลล์ BlockRDDPbruteForce ที่สร้างขึ้นก่อนหน้านี้ ในการจัดการไฟร์วอลล์ Windows เราจะใช้โมดูล PowerShell ในตัว 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

ตอนนี้คุณต้องคัดลอกรหัส PowerShell นี้ไปยังไฟล์

c:\ps\block_rdp_attack.ps1

และเพิ่มลงใน Task Scheduler เพื่อให้ทำงานทุกๆ 2 ชั่วโมง เป็นต้น

คุณสามารถสร้างงานตัวจัดกำหนดการโดยใช้สคริปต์ 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 ปรากฏในบันทึก (ตรวจสอบบล็อกโพสต์ Windows Event Triggers) ดังนั้นคุณจะตอบสนองต่อการโจมตี RDP brute-force ได้รวดเร็วยิ่งขึ้น

คุณสามารถแก้ไขสคริปต์นี้ตามความต้องการของคุณและใช้เพื่อบล็อกการโจมตี RDP

บทความที่เกี่ยวข้อง