Windows'ta RDP Kaba Kuvvet (Brute-Force) Saldırıları Nedir?
İnternete açık Windows Server (2025, 2022, 2019, 2016) veya Windows 10/11 sistemleri, 3389 Uzak Masaüstü (RDP) portu üzerinden sürekli olarak otomatik botnet orduları tarafından kaba kuvvet (Brute-Force) şifre deneme saldırılarına maruz kalır. Bu saldırılar sistem kaynaklarını tüketir, log dosyalarını şişirir ve sunucunun şifresinin kırılma riskini artırır.
Linux dünyasındaki popüler Fail2ban mantığını hiçbir üçüncü taraf ücretli yazılıma ihtiyaç duymadan, Windows'un yerleşik PowerShell, Windows Defender Güvenlik Duvarı ve Olay Görüntüleyicisi (Event Viewer) bileşenleriyle %100 yerel ve otomatik çalışan bir savunma kalkanına dönüştürebilirsiniz.
AutoBlock-RDP-Global kuralına ekleyerek sunucuya erişimini tamamen keser ve 24 saat sonra banı otomatik kaldırır.Adım 1: RDPBlocker Klasörünü Hazırlama
- 1Sunucunuzda Yerel Disk (C:) sürücüsünü açın.
- 2İçinde
RDPBlockeradında yeni bir klasör oluşturun (Klasör yolu tam olarakC:\RDPBlockerolmalıdır).
Adım 2: Gelişmiş PowerShell Banlama Betiğini Oluşturma
Başlat menüsünden Not Defteri (Notepad) uygulamasını açın ve aşağıdaki kodun tamamını yapıştırın:
# --- YAPILANDIRMA ---
$Threshold = 2 # 2 Hatalı denemede ANINDA BAN
$BanDurationMinutes = 1440 # 24 Saat Ban
$ScanIntervalSeconds = 5 # Her 5 Saniyede Bir Kontrol Et
$MainRuleName = "AutoBlock-RDP-Global"
$LogFile = "C:\RDPBlocker\BlockedIPs_Log.csv"
if (-not (Test-Path $LogFile)) {
"IP,BlockedAt" | Out-File -FilePath $LogFile -Encoding utf8
}
$Rule = Get-NetFirewallRule -DisplayName $MainRuleName -ErrorAction SilentlyContinue
if (-not $Rule) {
New-NetFirewallRule -DisplayName $MainRuleName -Direction Inbound -Action Block -Protocol Any -Profile Any
}
while ($true) {
try {
# 1. 24 Saati Dolan IP'leri Temizle
$BlockedLog = Import-Csv -Path $LogFile -ErrorAction SilentlyContinue
$ValidEntries = @()
if ($BlockedLog) {
foreach ($Entry in $BlockedLog) {
if ($Entry.BlockedAt) {
$BlockedDate = [DateTime]::Parse($Entry.BlockedAt)
if ((Get-Date) -lt $BlockedDate.AddMinutes($BanDurationMinutes)) {
$ValidEntries += $Entry
}
}
}
}
# 2. Son 3 Dakikadaki Tüm Hatalı Girişleri Tara (4625)
$Since = (Get-Date).AddMinutes(-3)
$Events = Get-WinEvent -FilterHashtable @{ LogName = 'Security'; Id = 4625; StartTime = $Since } -ErrorAction SilentlyContinue
$BadIPs = @()
if ($Events) {
foreach ($Event in $Events) {
$Xml = [xml]$Event.ToXml()
$IP = ($Xml.Event.EventData.Data | Where-Object { $_.Name -eq 'IpAddress' }).'#text'
if ($IP) {
# IPv6 formatını düzelt (::ffff:1.2.3.4 -> 1.2.3.4)
$CleanIP = $IP -replace '::ffff:', ''
if ($CleanIP -and $CleanIP -ne '-' -and $CleanIP -ne '127.0.0.1' -and $CleanIP -ne '::1' -and $CleanIP -ne '0.0.0.0') {
$BadIPs += $CleanIP
}
}
}
}
# 3. Eşiği Aşan Yeni IP'leri Listeye Ekle
if ($BadIPs) {
$Grouped = $BadIPs | Group-Object | Where-Object { $_.Count -ge $Threshold }
foreach ($Item in $Grouped) {
$TargetIP = $Item.Name
if (-not ($ValidEntries.IP -contains $TargetIP)) {
$ValidEntries += [PSCustomObject]@{
IP = $TargetIP
BlockedAt = (Get-Date).ToString("o")
}
}
}
}
# 4. CSV ve Güvenlik Duvarını Güncelle
if ($ValidEntries) {
$ValidEntries | Export-Csv -Path $LogFile -NoTypeInformation -Encoding utf8
$ActiveIPs = $ValidEntries.IP | Select-Object -Unique
Set-NetFirewallRule -DisplayName $MainRuleName -RemoteAddress $ActiveIPs
}
}
catch {
# Hata koruması
}
Start-Sleep -Seconds $ScanIntervalSeconds
}Not Defterinde Dosya > Farklı Kaydet yolunu izleyin:
• Kayıt Yeri: C:\RDPBlocker
• Dosya Adı: Block-BruteForce.ps1
• Kayıt Türü: Tüm Dosyalar (*.*)
şeklinde kaydedip pencereyi kapatın.
Adım 3: Görev Zamanlayıcı (Task Scheduler) ile 7/24 Arka Plan Servisi Yapma
Betiğin sunucu açıldığında otomatik başlaması ve arka planda kullanıcı oturumundan bağımsız olarak kesintisiz çalışması için PowerShell'i Yönetici Olarak açın ve şu komut bloğunu çalıştırın:
# Eski görevi temizle (varsa)
Unregister-ScheduledTask -TaskName "RDP-Continuous-AutoBlock" -Confirm:$false -ErrorAction SilentlyContinue
# Gizli ve SYSTEM yetkisinde çalışan eylemi tanımla
$action = New-ScheduledTaskAction -Execute 'powershell.exe' -Argument '-NonInteractive -NoProfile -WindowStyle Hidden -ExecutionPolicy Bypass -File "C:\RDPBlocker\Block-BruteForce.ps1"'
$trigger = New-ScheduledTaskTrigger -AtStartup
$settings = New-ScheduledTaskSettingsSet -AllowStartIfOnBatteries -DontStopIfGoingOnBatteries -RestartCount 99 -RestartInterval (New-TimeSpan -Minutes 1) -ExecutionTimeLimit (New-TimeSpan -Days 365)
# Görevi kaydet ve hemen başlat
Register-ScheduledTask -TaskName "RDP-Continuous-AutoBlock" -Action $action -Trigger $trigger -Settings $settings -User "NT AUTHORITY\SYSTEM" -RunLevel Highest
Start-ScheduledTask -TaskName "RDP-Continuous-AutoBlock"
Get-ScheduledTask -TaskName "RDP-Continuous-AutoBlock" | Select-Object TaskName, StateState: Running yazısını görüyorsanız sistem aktifleşmiştir ve sunucunuz yeniden başlasa bile otomatik olarak arka planda çalışacaktır.Banlı IP'leri Kontrol Etme & Listeleme Yöntemleri
Sistemin hangi IP'leri yakalayıp banladığını kontrol etmek için aşağıdaki yöntemlerden birini kullanabilirsiniz:
1. Arayüzlü Grafik Tablo Şeklinde Açmak (En Pratik Yol)
PowerShell'de şu komutu çalıştırdığınızda önünüze üst kısmında canlı arama çubuğu olan, tarihe göre sıralanabilen şık bir tablo açılır:
Import-Csv "C:\RDPBlocker\BlockedIPs_Log.csv" | Out-GridView -Title "Banlı IP Listesi"2. Konsol Üzerinden Hızlı Liste Almak
Import-Csv "C:\RDPBlocker\BlockedIPs_Log.csv" | Format-Table -AutoSize3. Güvenlik Duvarında Engellenen IP'leri Canlı Doğrulama
Güvenlik Duvarı kuralının içine işlenen IP adreslerini doğrudan çekmek için:
(Get-NetFirewallRule -DisplayName "AutoBlock-RDP-Global" | Get-NetFirewallAddressFilter).RemoteAddressBetiği Güncelledikten Sonra Görevi Yeniden Başlatma
Betiğin kodunu değiştirdiğinizde PowerShell'de Restart-ScheduledTask komutu bulunmadığı için şu durdur-başlat komutunu kullanmalısınız:
Stop-ScheduledTask -TaskName "RDP-Continuous-AutoBlock" -ErrorAction SilentlyContinue
Start-ScheduledTask -TaskName "RDP-Continuous-AutoBlock"
Get-ScheduledTask -TaskName "RDP-Continuous-AutoBlock" | Select-Object TaskName, StateSaldırıları %99 Oranında Tamamen Kesmek İçin Ek Tavsiye
Otomatik IP banlama sistemi gelen her saldırganı etkisiz hale getirir; ancak botnetler milyonlarca IP'ye sahip olduğu için Event Viewer'da log görmeye devam edebilirsiniz. Saldırıları neredeyse sıfırlamak için en kesin çözüm varsayılan 3389 RDP portunu değiştirmektir:
# Portu Kayıt Defterinde Değiştir (Örnek: 54321)
Set-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp' -Name "PortNumber" -Value 54321
# Yeni Port İçin Güvenlik Duvarı İzni Aç
New-NetFirewallRule -DisplayName "RDP-CustomPort-54321" -Direction Inbound -Action Allow -Protocol TCP -LocalPort 54321
# Uzak Masaüstü Servisini Yeniden Başlat
Restart-Service -Name "TermService" -Force