# Gelişmiş GeoIP Sorgulamalı ve Otomatik Firewall Engelleyicili RDP Analiz Motoru Clear-Host Write-Host "==========================================================" -ForegroundColor Cyan Write-Host " SİBER GÜVENLİK RDP ANALİZ & AKILLI SAVUNMA MOTORU " -ForegroundColor Cyan Write-Host "==========================================================" -ForegroundColor Cyan $ZamanFiltresi = (Get-Date).AddDays(-30) $UtcZaman = $ZamanFiltresi.ToUniversalTime().ToString("yyyy-MM-ddTHH:mm:ss.fffZ") # --- 1. BAŞARILI GİRİŞLER --- Write-Progress -Activity "RDP Güvenlik Analizi" -Status "Başarılı girişler inceleniyor..." -PercentComplete 20 $XmlBasarili = @" "@ $basariliLoglar = Get-WinEvent -FilterXml $XmlBasarili -ErrorAction SilentlyContinue $basarili = [System.Collections.Generic.List[PSCustomObject]]::new() if ($basariliLoglar) { foreach ($log in $basariliLoglar) { $basarili.Add([PSCustomObject]@{ "Tarih_Saat" = $log.TimeCreated; "Kullanici" = $log.Properties[0].Value; "Giris_IP" = $log.Properties[2].Value }) } } # --- 2. BAŞARISIZ GİRİŞLER --- Write-Progress -Activity "RDP Güvenlik Analizi" -Status "Başarısız saldırılar toplanıyor..." -PercentComplete 50 $XmlBasarisiz = @" "@ $basarisizLoglar = Get-WinEvent -FilterXml $XmlBasarisiz -ErrorAction SilentlyContinue $basarisiz = [System.Collections.Generic.List[PSCustomObject]]::new() if ($basarisizLoglar) { foreach ($log in $basarisizLoglar) { $xml = [xml]$log.ToXml() $EvtData = @{} foreach ($node in $xml.Event.EventData.Data) { if ($node.Name) { $EvtData[$node.Name] = $node.'#text' } } if ($EvtData['TargetUserName'] -notmatch 'SYSTEM|SERVICE|ANONYMOUS' -and $EvtData['IpAddress'] -ne "-") { $basarisiz.Add([PSCustomObject]@{ "Tarih_Saat" = $log.TimeCreated; "Denenen_Isim" = $EvtData['TargetUserName']; "Saldigan_IP" = $EvtData['IpAddress'] }) } } } Write-Progress -Activity "RDP Güvenlik Analizi" -Status "Analiz bitti, tablolar hazırlanıyor..." -PercentComplete 90 Write-Progress -Activity "RDP Güvenlik Analizi" -Status "Tamamlandı" -Completed Clear-Host # === ÖZET İSTATİSTİKLER === Write-Host "==========================================================" -ForegroundColor Magenta Write-Host " İSTATİSTİKSEL ÖZET TABLOLAR " -ForegroundColor Magenta Write-Host "==========================================================" -ForegroundColor Magenta # Başarılı Giriş Yapanlar Write-Host "`n[+] EN SIK GİRİŞ YAPAN KULLANICILAR (Başarılı)" -ForegroundColor Green if ($basarili.Count -gt 0) { $basarili | Group-Object Kullanici | Sort-Object Count -Descending | Select-Object @{Name="Giriş Adeti"; Expression={$_.Count}}, @{Name="Kullanıcı Adı"; Expression={$_.Name}} | Format-Table -AutoSize } else { Write-Host "Başarılı veri yok." -ForegroundColor Gray } # Başarısız Deneme Yapan Saldırganlar ve Ülkeleri (Dinamik Canlı Sorgu) Write-Host "`n[-] EN ÇOK ŞİFRE DENEYEN IP ADRESLERİ VE ÜLKELERİ (Başarısız)" -ForegroundColor Red $SaldirganIPler = [System.Collections.Generic.List[PSCustomObject]]::new() if ($basarisiz.Count -gt 0) { $GruplanmisSaldirganlar = $basarisiz | Group-Object Saldigan_IP | Sort-Object Count -Descending foreach ($grup in $GruplanmisSaldirganlar) { $ip = $grup.Name $Ulke = "Bilinmiyor" # IP API üzerinden hızlı ve ücretsiz ülke sorgusu (Üst üste çok hızlı istek atmamak için güvenli metot) if ($ip -notmatch '127.0.0.1|::1|^192\.168\.|^10\.') { try { $GeoRequest = Invoke-RestMethod -Uri "http://ip-api.com" -Method Get -TimeoutSec 2 -ErrorAction SilentlyContinue if ($GeoRequest -and $GeoRequest.country) { $Ulke = $GeoRequest.country } } catch { $Ulke = "Sorgulanamadı (Zaman Aşımı)" } } else { $Ulke = "Yerel Ağ / Kendi Cihazınız" } $SaldirganIPler.Add([PSCustomObject]@{ "Deneme Sayısı" = $grup.Count "Saldırgan IP" = $ip "Ülke" = $Ulke }) } $SaldirganIPler | Format-Table -AutoSize } else { Write-Host "Temiz! Saldırı IP'si tespit edilmedi." -ForegroundColor Green } # === AKILLI FIREWALL ENGELLEME SİSTEMİ === if ($SaldirganIPler.Count -gt 0) { Write-Host "`n==========================================================" -ForegroundColor Yellow Write-Host " OTOMATİK GÜVENLİK DUVARI MENÜSÜ " -ForegroundColor Yellow Write-Host "==========================================================" -ForegroundColor Yellow Write-Host "[!] Tespit edilen yabancı saldırgan IP adreslerini Windows Firewall üzerinden engellemek ister misiniz?" -ForegroundColor Cyan Write-Host "[1] EVET - Türkiye dışındaki tüm saldırgan IP'leri kalıcı olarak engelle" -ForegroundColor Green Write-Host "[2] HAYIR - Sadece analiz et, engelleme yapmadan çık" -ForegroundColor Red $Secim = Read-Host "Seçiminiz (1 veya 2)" if ($Secim -eq "1") { # Türkiye (Turkey) dışındaki veya yerel ağ dışındaki tüm IP'leri filtrele $Engellenecekler = $SaldirganIPler | Where-Object { $_.Ülke -ne "Turkey" -and $_.Ülke -ne "Yerel Ağ / Kendi Cihazınız" } | Select-Object -ExpandProperty "Saldırgan IP" if ($Engellenecekler) { Write-Host "`n[*] Seçilen IP adresleri engelleniyor: $Engellenecekler" -ForegroundColor Yellow # Windows Firewall Kuralı oluştur veya mevcut olana ekle $KuralAdi = "Zararli_RDP_Saldirganlari_Engelleme" $MevcutKural = Get-NetFirewallRule -DisplayName $KuralAdi -ErrorAction SilentlyContinue if ($MevcutKural) { # Kural varsa, yeni IP'leri üzerine ekle Set-NetFirewallRule -DisplayName $KuralAdi -RemoteAddress $Engellenecekler Write-Host "[+] Mevcut Firewall kuralı yeni IP'lerle güncellendi!" -ForegroundColor Green } else { # Kural yoksa sıfırdan oluştur New-NetFirewallRule -DisplayName $KuralAdi -Direction Inbound -Action Block -Protocol TCP -RemoteAddress $Engellenecekler Write-Host "[+] '$KuralAdi' adıyla yeni Windows Firewall engelleme kuralı başarıyla oluşturuldu!" -ForegroundColor Green } } else { Write-Host "[!] Engellenecek yabancı ülke kaynaklı IP adresi bulunamadı (Sadece Türkiye logları var)." -ForegroundColor Yellow } } else { Write-Host "[-] Engelleme işlemi kullanıcı tarafından iptal edildi." -ForegroundColor Gray } } Write-Host "`n==========================================================" -ForegroundColor Cyan Read-Host -Prompt "İşlem tamamlandı. Çıkmak için ENTER tuşuna basın"