# 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"