Windows Server

RDP Ataklar için Kritik Önlemler

Dışarıya açık sistemler her zaman bir güvenlik zafiyeti oluşturmaktadır. Ancak çoğunlukla hizmet sunmak amacı başta olmak üzere aslında bu en temel iş ihtiyacı olduğu için dışarıya açık pek çok system olduğunu görüyoruz. En temel internet üzerinde gezdiğimiz bütün sitelerin herkese açık olduğunu düşünürseniz aslında çok ciddi bir büyüklükten söz ediyoruz. Böylesine büyük bir okyanusta benim web sitemi, uygulamamı veya sistemimi mi bulacaklar diye düşünmeyin. Çünkü hep söylediğim bir şey olan “değişen ve gelişen teknoloji ile yeni nesil atakları görüyoruz” artık AI kullanarak yapılan atakları görünce gerçekten çok yerinde bir cümle oluyor. Dahası makalemizdeki gibi RDP temelli ataklar artık herkesin kolaylıkla yapabildiği bir atak türü haline gelmiş durumda. Yani çok büyük alışveriş veya sosyal medya platformlarını düşündüğümüz zaman gerçekten inanılmaz ataklar ile karşı karşıyalar, ancak ben daha temel bir konuya odaklandım. Bunun en temel sebebi ise her ne kadar şifreleme atakları yüzünden pek çok müşteri artık dışarıya açık RDP portunu kapatsa da hala ne yazık ki bizim güvenlik ekibine haftada en az 1-5 arası vaka gelmektedir. Bu da aslında bir şekilde kısa süreli, POC amaçlı, gözden kaçan veya unutulan RDP sistemlerinin hala ciddi bir tehlike oluşturduğunu gösterir.

Güncelleme 13.05.2019

Makaleye gelen yorumlardan sanki tüm RDP sistemleri için öneriler tadında bir makale beklentisi oluşmuş. Bu kadar uğraşacağına MFA yaparız gibi yorumlar görüyorum. Arkadaşlar zaten VPN yapsanız iş bitiyor, olay VPN, MFA yada sertifika doğrulama gibi kurumsal çözümleri kullanmayan müşteriler için kıssadan hisse öneride bulunuyorum.

Aslında bende yukarıdaki konulardan gol yemiş birisiyim. Herkesin farklı bir hikayesi vardır benimkisi çok basit, udemy eğitimlerim için POC ortamı hazırladım, ancak VPN vs ile bağlanmak çok pratik gelmedi, içerisinde bilgi de yoktu ancak günün sonunda en değerli şeyim olan vaktimi kaybettim. Exchange Server ortamı, GPO ortamı derken birkaç günlük kurulmuş mis gibi sistem şifrelendi. Neyse ki demo, poc ortamları bizde hep ayrı fiziksel sunucu ve network de olduğu için prod ortam olan ÇözümPark bundan etkilenmiyor. Gerçi bunun içinde bulut yedek senaryomuz var ama oradaki kesinti bizi üzer.

Bu durumda daha sonra ortak etkinlikle için kullandığımız birkaç ortamda meydana geldi. Tabiki bu işin kesin yöntemini sizler gibi bizde çok iyi biliyoruz. VPN. Fakat bazen ISP den kaynaklı, bazen danışmanın eğitmenin bulunduğu yer ve zaman nedeni ile T anında o RDP açılması gerekiyor 😊 Ama gel gör ki ne oluyorsa ya o sırada oluyor ya da her insan gibi bu yoğun gündemde unutuluyor.

Peki bu iş gerçekten bu kadar riskli mi? Bende her seferinde kendime soruyorum çünkü genel olarak müşterilerimin büyük çoğunluğu kurumsal firma, durum böyle olunca acaba ne kadar makine vardır bu şekilde diye düşünmeden edemiyorum ve an itibari ile 2.3 milyon makinenin bu durumdan etkilenebileceğini görüyorum

Bende bundan bir ders çıkardım. Madem bu işi çok iyi biliyoruz, elinde VPN imkânı olmayan, ip bazlı sınırlama imkânı olmayanlar için bir sıkılaştırma çözümü yapamaz mıyız? Aslında yapabiliriz.

Benim temel 3 adımda RDP için sıkılaştırma yönetimim aşağıdaki gibidir;

1 – Administrator ismini hemen değiştirin.

Yeni bir sistem kurduktan sonra varsayılan olan “Administrator” hesabı çok büyük tehlike içermektedir. Zaten otomatik yapılan atakların başında Administrator hesabına yapılmaktadır. Bunun için local GPO ile aşağıdaki yolu izleyebilirsiniz

Gpedit.msc – Computer Configuration – Windows Settings – Security Settings – Local Policies – Security Options altına “Accounts: Rename administrator account”

Örnek dışarıya açık bir sistemde en çok atak denemesi yapılan hesaplar aşağıdaki gibidir;

ADMINISTRATOR

Audit

Test

Ftp

Warehouse

Fax

Lab

Postgres

User1

User2

Guest

Webmaster

Admin

User

Sistema

Adm

Archive

Update

İnfo

Test2

Finans

Muhasebe

Report

Görüldüğü gibi aslında bu işin temelinde kullanıcı hesabını tahmin etmek var, yani siz bundan sonraki diğer iki önlemi almasanız bile sadece bu hareket ile ciddi manada VPN’ siz, dış dünyaya açık bir RDP sistemi için sıkılaştırma yapmış olursunuz.

Peki ikinci adım nedir?

Aslında bu ilk adım ile beraber kullanıldığı zaman çok etkili bir koruma yöntemi oluyor.

Lock Policy.

Yani diyelim administrator hesabını değiştirdik ancak yine de tespit edildi veya tahmin edildi, bu durumda da 3 veya 5 veya size uygun bir yanlış deneme sayısından sonra otomatik hesabın lock olması. Tabi bu süreyi çok uzun tutmamak lazım aksi halde sizin de erişim sorunlarınız kaçınılmaz olur.

Bunun için yine local GPO’ da aşağıdaki yolu izleyebilirsiniz. Computer Configuration – Windows Settings – Security Settings – Account Policies – Account Lockout Policy

Altından ayarları kendinize göre yapabilirsiniz. Peki birisi hesabı buldu ve lock etti sisteme nasıl erişeceğim?

Evet bu ihtimale karşın mutlaka “Reset account Lockout counter after” bölümünü kullanmanız lazım. Zaten atakları incelerseniz süreklilik gösterirken mutlaka 5dk veya 10dk ara verirler.

Peki ikinci yöntem de tamam. Gelelim en son yönteme. Bu ise aslında yukarıdaki iki çözümden sonra sürekli loglarda atakları gördükten sonra aklıma gelen ve küçük bir araştırma ile benim gibi başkalarının da düşündüğü bir çözüm gördüm. Her ne kadar güvenli bir ortam oluştursam da sürekli sunucumu taciz etmeleri beni biraz rahatsız etti. Sonuçta bu hareketleri aşağıdaki iki log’ dan görebiliyoruz;

1 – Security loglarından;

İkinci olarak

Event Viewer- Application and Services Logs- Microsoft- Windows- RemoteDesktopServices-RdpCoreTS altındaki Operational loglarından event id 140

İlk log içerisinde kullanıcı bilgisi bu log içerisinde ise atak yapılan kaynak ip adresini görüyoruz. Tabi burada heyecanlanmayın, muhtemel bunlar zombi yani zararlı bulaştırılmış makineler olduğu için bunların üzerinden kimin size saldırı düzenlediğini bulmanız çok mümkün değil. Zaten size özel bir saldırı olmuyor genelde, makalemin başında söylediğim gibi karanlık veya derin web dediğimiz ortamda bir sürü otomatik RDP portu arayan ve kullanıcı adı şifre deneyen araçlar var.

Ben buradan yola çıkarak şunu düşündüm, bu ip adreslerini otomatik alıp windows firewall üzerindeki bir kurala ekleyecek. Tamda bunu yapacağız.

Öncelikle bir kural oluşturalım;

Custom bir kural hazırlayacağız.

Program sekmesinde “All programs” bölümünü seçip ilerliyorum.

Protocol ve Port bölümünde ise “any” seçiyorum.

Bu bölümde ise remote ip adres kısmına iki tane gerçek olmayan ip yazın.

Son olarak bu ip adreslerinden gelen herhangi bir port isteğini yasaklayacak bir kural olması için “Block the connection” seçeneğini seçiyorum.

Son olarak firewall kuralımız için bir isim seçiyoruz. Burası önemli, çünkü PS içerisinde hangi kurala ip adreslerini ekleyeceğini seçerken lütfen buraya yazacağınız ismi not edin.

Kuralımız hazır, şimdi olay günlüğünden ip adreslerini alacak ve bu firewall kuralına yazacak bir PS lazım.

PS komutu aşağıdaki gibidir;

### Variables ###
# The name of the firewall rule in Windows Firewall
$firewallRuleName = "Block RDP Attackers"

# IPs that will not be blacklisted. i.e. your home IP if you are using Dyndns or any other static IP
$whiteList = @(
   [System.Net.Dns]::GetHostAddresses("myhome.dyndns.org").IPAddressToString, #Example for DNS entry
   "89.20.58.68" #Example for IP
   )


### Script ###
Write-Host "Running at $(Get-Date)"
$regExIp = "\d\d?\d?.\d\d?\d?.\d\d?\d?.\d\d?\d?"

# Get the current Eventlogs with the 140 event
$currentAttackers = Get-Winevent Microsoft-Windows-RemoteDesktopServices-RdpCoreTS/Operational | Where-Object {$_.Id -eq 140} | Select Message -ExpandProperty Message

# If there is no response, there are no attacks
if ($currentAttackers -eq $null) {
   Write-Host "No current attackers"
   return
}

# Get each attackermessage and filter the IP from it using the regex above
for ($i = 0; $i -lt $currentAttackers.Count; $i++) {
   if ($currentAttackers[$i] -match $regExIp){
      $currentAttackers[$i] = $Matches[0]
   } 
}

# Get the already known attackers from the firewall rule
$knownAttackers = (Get-NetFirewallRule -DisplayName $firewallRuleName | Get-NetFirewallAddressFilter).RemoteAddress
if ($knownAttackers -eq $null){
   $knownAttackers = @()
}
$knownAttackers = $knownAttackers | Sort-Object -Unique

# Check each logged attacker and check if it is already known
foreach($newAttacker in $currentAttackers) {
   if ($knownAttackers.Contains($newAttacker)) { #If it is known, don't do anything
      continue
   }
   elseif ($whiteList -contains $newAttacker) { #If it is whitelisted, don't do anything
      Write-Host "$newAttacker is dynamically whitelisted"
      continue
   }
   else{ #otherwise it is a new attacker and add it to the blacklist
      $knownAttackers += $newAttacker
      Write-Host "Added $newAttacker"
   }
}

# remove dublicates (should not be there, but anyway...)
$knownAttackers = $knownAttackers | Sort-Object -Unique
Write-Host "$($knownAttackers.Count) IPs on blacklist"

# Setting Firwall rules with all known and all new attackers
Set-NetFirewallRule -DisplayName $firewallRuleName -RemoteAddress $knownAttackers
Write-Host ""

İndirdiğimiz dosyası örneğin ben C:\komut dizinine indirdim ve çalıştırdım.

Gördüğünüz gibi ilk çalıştırmada 31 adet ip adresini yasakladı. Aslında PS süper çalışıyor ancak sorun sürekli bunu elle mi çalıştıracağız? Tabiki hayır. Bu durumda PS için zamanlanmış bir görev yapalım

Buraya yazacaklarımız sırası ile aşağıdaki gibidir;

Action: “Start a program”

Setting Program/Script: “powershell.exe“

Add arguments (optional): -ExecutionPolicy Bypass C:\komut\RDPBlock.ps1 (Burada tabi siz PS için verdiğiniz isim ve path tanımlayın)

Alt bölümdeki kutucuğu işaretleyerek finish dedikten sonra açılan yeni ekranda bu zamanlanmış görevler için özellikler penceresini açmış olacağız

Burada yapmamız gereken değişiklik “Run whether user is logged on or not” olmalıdır. Bu sayede siz login olmasanız da PS arka planda çalışacaktır.

Son olarak yetkili bir hesap ile zamanlanmış görevi tamamlıyoruz.

Peki durumu biraz inceleyelim neler oluyor?

Gördüğünüz gibi atak ortalama her 5dk da bir tekrarlanıyor. 5:03, 5:08, 5:13, 5:19 ve en son 5:36. Ancak 5.36 dan sonra dikkat ederseniz saatin 6:12 olmasına karşın tekrarlanmadığıdır. Bunun sebebi ise 77 adet ip adresini PS loglardan alıp kural içerisine eklemiştir.

Biz tabi öyle bir sistem kurunca bize saldıranda biraz hırs yaptı ve ip sayısını arttırdı.

Ancak ben zamanlanmış görevi her 5dk da bir çalışacak şekilde yaptığım için çok ilgilenmiyorum açıkçası. Özetle sistem otomatik olarak ip adreslerini eklediği sürece içim rahat.

Peki bu ip adresleri maksimum kaç tane olabilir? Windows Firewall için limit 1000 tanedir.  1000 taneden fazla ip ile size saldırmaları durumunda zaten daha kurumsal bir çözüm kullanmanızı tavsiye ederim.

Not: bu arada PS şöyle geliştirilebilir, örnek 10 gün veya 30 günden önce eklenen ip adresleri otomatik silinebilir bu sayede sistem otomasyona döner.

Aşağıdaki komutlar ise son durumu kontrol etmeniz için gereklidir;

(Get-NetFirewallRule -DisplayName “Block RDP Attackers” | Get-NetFirewallAddressFilter).RemoteAddress | Measure-Object

Yukarıdaki komut toplam kaç adet remote ip adresi olduğunu gördüğümüz komut.

(Get-NetFirewallRule -DisplayName “Block RDP Attackers” | Get-NetFirewallAddressFilter).RemoteAddress | Out-file -FilePath c:\komut\remoteipaddress.csv -Encoding utf8

Bu komut ise bu ip adreslerini eğer export etmek istiyorsanız kullanabileceğiniz komut setidir.

Umarım faydalı bir makale olmuştur. Bir sonraki makalemde görüşmek üzere.

Not: Eğer isterseniz bu konuda aynı işi yapan 3.parti bir programda var, onu da deneyebilirsiniz ancak tabiki lisans ücreti ödenmesi gerekiyor- https://www.servolutions.com/shop/Products.aspx?cat=botfence

Powershell için Kaynak

Güncelleme: 24.02.2022: Ben makalelerimde kullandığım resim olsun, komut olsun veya bilgi olsun mutlaka kaynak paylaşırım, ancak kaynak linkin sahibi blog sayfası kapandığı için linki kaldırdım. Bilginize.

Hakan Uzuner

2002 yılından beri aktif olarak bilişim sektöründe çalışmaktayım. Bu süreç içerisinde özellikle profesyonel olarak Microsoft teknolojileri üzerinde çalıştım. Profesyonel kariyerim içerisinde eğitmenlik, danışmanlık ve yöneticilik yaptım. Özellikle danışmanlık ve eğitmenlik tecrübelerimden kaynaklı pek çok farklı firmanın alt yapısının kurulum, yönetimi ve bakımında bulundum. Aynı zamanda ÇözümPark Bilişim Portalı nın Kurucusu olarak portal üzerinde aktif olarak rol almaktayım. Profesyonel kariyerime ITSTACK Bilgi Sistemlerinde Profesyonel Hizmetler Direktörü olarak devam etmekteyim.

İlgili Makaleler

21 Yorum

  1. Özellikle RDP ataklarının artması ve ele geçirilen sistemlere verilen zararlar düşünülürse uygulanması basit ama oldukça önemli bir makale olmuş.
    En güzel tarafı PS ile otomasyon kısmı.
    Bir diğer taraftan rdp ataklarına karşı vpn yada static ip gibi çözümlerin uygulanması mümkün olmayan yerlerde sadece 80 ve 443 ile Trusted SSL üzerinden çalışan (3389 açmaya gerek kalmadan) Remote Desktop Gateway arkasına konumlandırılmış RDP Server kurmak uygun olabilir.

  2. Öncelikle elinize sağlık. Basit bir sorum olacak, bende zaten firewall da rdp portları açık değil kendim dahil ssl vpn üzerinden geliyorum. sizce yine de bunu yapmama gerek var mı?
    Teşekkürler.

  3. Hakan hocam öncelikle eline sağlık çok çok önemli bir konuda güzel bir anlatım olmuş, benimde duyduğum gördüğüm bir kaç yer var hala rdp erişimini inatla dış dünyaya any olarak açmak için mücadele veren müşteriler. En acısı ad üzerinde kullanıcı ismi yerine rakamsal sicil numarası kullanan ve ad üzerinde 1 tane bile rakamsal oturum açma ismi olmayan enable user bulunmamasına rağmen (local account’larda dahil) yine de dosyaları şifrelenmiş bir firma var. Bu iş artık ticari bir şekle bürünmüş ve bu saldırıyı yapanlara kullanıcılar kendi şirket hesaplarını veriyor ve alınan paradan hisse alıyor. Artık düşman hem dışarıda hem içeride varmış gibi plan yapmak en mantıklısı gibi görünüyor. Kullanıcı tespit edildiğinde ise “şifremi çözmüşler ne yapabilirim ki” tarzında bir savunma yapılıyor. Sistem yönetici arkadaşlara sabır ve başarılar diliyorum.

  4. hocam güzel bir anlatım olmuş.
    Elinize emeğinize sağlık.
    Lazım olduğu noktada uygulamak istediğim de “Automatically block RDP attacks using Windows Firewall and PowerShell” dosyasının ilgili linkte olmadığını gördüm.
    Dosyanın orjinaline nasıl ulaşabilirim ?

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Başa dön tuşu