Webinar’a Katılın | Siber Tehditlere Karşı Güçlü Koruma

PowerShell Hardening

PowerShell Nedir?

PowerShell, sistem yöneticilerinin yönetim görevlerini basitleştirmesi ve otomatikleştirmesi için daha iyi bir arabirim sağlamak üzere Microsoft tarafından geliştirilen yerleşik bir komut dosyası dili ve bir komut satırı yürütücüsüdür. Microsoft Windows sistemlerinin her yerinde bulunabilmesi ve Windows sistemlerinin tam olarak kontrol etmek için kullanılan kolaylığı nedeniyle sistem yönetimi araç setinin önemli bir parçasıdır. PowerShell’in asıl kullanım amacı görev otomasyonunu etkinleştirme, veri erişilebilirliği, altyapıyı kod olarak yönetme ve uzaktan komutları kolaylaştırmaktır. PowerShell’in gücü, onu, engellenmesi ve tespit edilmesi zor olan dosyasız saldırılar için saldırganlar için kullanışlı bir araç haline getirir.

PowerShell, .NET Framework ile entegredir ve Bileşen Nesne Modeli (Component Object Model [COM]) ve Windows Yönetim Araçları (Windows Management Instrumentation[VMI]) işlevselliklerine tam erişime sahiptir. Aynı zamanda .NET Framework aracılığıyla Windows Uygulama Programlama Arayüzü’ne (WinAPI) tam erişime sahiptir. Bu durum temel sisteme güçlü ve kullanımı kolay bir arayüz sağlar aynı zamanda çeşitli görevlerin otomasyonuna izin verir.

Fakat bilinmelidir ki PowerShell, Windows Uzaktan Yönetim (WinRM) olarak bilinen bir özellik aracılığıyla yerel olarak veya ağ üzerinden çalıştırılabilir. Bunun gerçekleştirilmesi için kodun yürütüldüğü uzak iş istasyonları ve sunucularda uzaktan iletişimin etkinleştirilmesi gerekir. Microsoft Windows Server 2012 ve daha yeni Microsoft işletim sistemlerinde uzaktan erişim varsayılan olarak etkindir.

PowerShell’in Güvenlik Sorunları:

PowerShell, genelde saldırganın ilk erişimi sırasında saldırganın kod yürütme (code execution) kazandığında kullanılır. Saldırganların PowerShell ortamından diğer işlemlere kötü amaçlı kodu diske bırakmadan code injection gerçekleştirmesine olanak tanır, birçok güvenlik korumasını atlarken ve bir sistemde neredeyse hiç kalıntı bırakmadan etkin bir şekilde rastgele kod yürütme sağlar.

Bu, PowerShell içindeki herhangi bir güvenlik açığından kaynaklanmaz, bunun yerine hassas sistem işlevlerine son derece güçlü ve kullanımı kolay bir arabirim sağlayan .NET Framework ile sıkı entegrasyonunun bir göstergesidir. PowerShell, saldırganın ilk kod yürütme yetkisini kazandıktan sonra ana makine sistemini numaralandırmak ve işlemesi açısından saldırgana uygun bir arabirime sahip olmasına izin verir. Aynı zamanda kod yürütme yetkisi dışında PowerShell zararlı yazılımı direkt olarak çalıştırabilir. Zararlının çalışmasının muhtemel etkisi zararlı çalıştıktan sonra C2 yardımı ile uzaktan kod yürütme olacaktır.

Kötü amaçlı kodu diske bırakmamak, bir siber saldırının ne zaman gerçekleştiğini belirlemek açısından zor olabilir ve adli soruşturmaların gerçekleştirilmesi ciddi anlamda zorlaştırabilir. PowerShell’in sağladığı kapsamlı işlevsellik ile birleştiğinde, PowerShell’in son derece güçlü bir sömürü sonrası araç olduğu açıktır.

Microsoft tarafından sağlanan güvenlik iyileştirmelerine rağmen, saldırganların PowerShell’i tercih etmelerinin üç ana nedeni vardır;

  1. Güçlü komut dosyası ortamı,
  2. Geniş kurulum tabanı olan Win32 API’ine doğrudan erişim
  3. İyi bir şekilde çoğunlukla korunmaması.

PowerShell, saldırganlar açısından bir saldırıda çeşitli şekil ve aşamalarda kullanılması için güçlü bir araçtır. Ancak PowerShell’inde sömürülmesi noktasında sistemlerdeki hizmetlere ve bileşenlere güvenli yapılandırma ayarları yapılarak engellenebilir.

Örneğin, dosyasız bir tıklama sahtekarlığı kötü amaçlı yazılımı olan Kovter, kötü amaçlı modüllerini tamamen kayıt defterinde gizler. Bu modüller daha sonra, virüslü sistem yeniden başladığında, tıklama sahtekarlığı sürecinin başlamasını isteyen PowerShell işlemine enjekte edilir.

Fileless Malware Phishing PowerShell:

  1. Kovter gönderdiği phishing maili spam kutusuna düşer.
  2. Shell Spawning teknikleri için bileşenleri otomatik olarak kurar.
  3. Kötü amaçlı komut dosyaları içeren kayıt defteri girdisi oluşturur.
  4. Sistem yeniden başlatıldığında veya batch file yürütülmesinden sonra PowerShell işlemine bir script enjekte eder.
  5. Shell code, click fraud için çeşitli URL’lere bağlanacak olan regsvr32.exe işlemini başlatacaktır.

Dosyasız saldırı tehdidi göz önüne alındığında, PowerShell günlüğünü(logging) etkinleştirmek ve verileri daha sonra analiz için depolamak önemlidir. PowerShell’de günlüğün(logging) iki türü mevcuttur.

  • PowerShell Module Logging
  • PowerShell Script Block Logging

PowerShell Module Logging: Module Logging, değişken başlatma ve komut çağrıları dahil olmak üzere PowerShell yürütülürken işlem hattı yürütme ayrıntılarını kaydeder. Module logging, komut dosyalarının bölümlerini, bazı gizlenmiş kodları ve çıktı için biçimlendirilmiş bazı verileri kaydeder. Bu günlük kaydı, yürütülen komutları güvenilir bir şekilde yakalamasa da, diğer PowerShell günlük kaydı kaynakları tarafından kaçırılan bazı ayrıntıları yakalayacaktır. Module Logging, PowerShell 3.0’dan beri mevcuttur. Module logging, Olay Kimliği (EID) 4103’e yazılır.

Module Logging Etkinleştirmek için;

  1. Yerel Grup İlkesi Düzenleyici’ye girdikten sonra Cihaz Konfigürasyonu’nda bulunan Yönetim Şablonları’na tıkladıktan sonra Windows Bileşenlerinde bulunan Windows PowerShell’e çift tıkladıktan sonra karşımıza çıkan Modül Günlüğünü Açın kısmına tıkladıktan sonra etkinleştiri seçip onaylıyoruz. Modül İsimleri kısmının yanında bulunan göster seçeneğine tıklayıp kutuda belirtilen değer kısmına “ * ” değerini yazıyoruz.

  1. Kayıt Defteri Düzenleyicisini açıp HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Policies\Microsoft\PowerShell\ModuleLogging dizinine gidip Modülü Etkinleştir dizini Dword ile Düzenle tıklayıp değeri “1” yapıyoruz.

  1. Kayıt Defteri Düzenleyicisini açıp HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Policies\Microsoft\PowerShell\ModuleLogging\ModuleNames dizinine gidip String Düzenle dedikten sonra resimde belirtilen kısma Veri Değerine “ * “ değeri giriyoruz.

Script Block Logging: Script Block Logging, kod bloklarını PowerShell motoru tarafından yürütüldükleri şekilde kaydeder, böylece komut dosyaları ve komutlar da dahil olmak üzere bir saldırgan tarafından yürütülen kodun tüm içeriğini yakalar. Script Block logging doğası gereği yürütülürken gizlenmiş kodu da kaydeder. Örneğin, orjinal gizlenmiş kodu kaydetmeye ek olarak PowerShell’in -EncodedCommand argümanıyla geçirilen kodu çözülmüş komutların yanı sıra XOR,Base64,ROT13, şifreleme vb. ile gizlenmiş komutları da kaydeder. Script Block Günlüğü, yürütülen koddan çıktıyı kaydetmez. Script Block Günlüğü günlük kaydı etkinlikleri EID 4104’te kaydedilir.

Script Block Logging Etkinleştirmek İçin;

  1. Yerel Grup İlkesi Düzenleyici’ye girdikten sonra Cihaz Konfigürasyonu’nda bulunan Yönetim Şablonları’na tıkladıktan sonra Windows Bileşenlerinde bulunan Windows PowerShell’e çift tıkladıktan sonra karşımıza çıkan Script Block Logging Enabled kısmına tıkladıktan sonra etkinleştiri seçip onaylıyoruz.

  1. Kayıt Defteri Düzenleyicisini açıp HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Policies\Microsoft\PowerShell\ ScriptBlockLogging dizinine gidip Modülü Etkinleştir diznini Dword ile Düzenle tıklayıp değeri “1” yapıyoruz.

Bu kaynakların her biri, PowerShell etkinliğini analiz etmek için değerli olan benzersiz verileri kaydeder. Günlük boyutlarının önemli ölçüde artırılamadığı ortamlarda, komut dosyası bloğu günlüğü ve transkripsiyonun etkinleştirilmesi, oluşturulan günlük verilerinin miktarını en aza indirirken çoğu etkinliği kaydeder. Saldırgan komutlarını ve kod yürütmeyi tanımlamak için en azından komut dosyası bloğu günlüğü etkinleştirilmelidir.

Öneriler:

Çoğu durumda, standart kullanıcılar günlük işlerini gerçekleştirirken PowerShell’e ihtiyaç duymazlar. Yalnızca yasal iş görevleri için PowerShell’e ihtiyaç duyan ağ yöneticileri ve BT uzmanlarının erişime sahip olmalıdır. Standart kullanıcılara PowerShell erişimi vermek, şirketler için gereksiz risk oluşturur. PowerShell’in idari olarak işlevlere sahip olduğundan yürütülmesini engellemek zaman zaman mümkün olmayabilir. Bunun yerine erişim izni olan ağ yöneticileri ve BT uzmanları ile sınırlamak ve ayrıca uzaktan yürütme için PowerShell kullanımını önlemek için Windows Uzaktan Yönetim Hizmetinin devre dışı bırakılması yada bu işlemi gerçekleştirilmesi adına en azından bir erişim kısıtlaması gerekebilir.

Kurumsal düzeyde Windows PowerShell güvenliği için bu güvenliği kurmadan önce temellerini bilmek gerekir. Kullanıcılar, Windows PowerShell’in en son sürümünü kullanmalıdır. Kullanıcı, PowerShell güvenliğinin Windows PowerShell’in en son sürümü ile ayarlanması gerektiğini burada belirtmelidir. Daha düşük bir sürüm ise (PowerShell sürüm 2 gibi) yarardan çok zarar verebilir. Bu nedenle, kullanıcıların her zaman için PowerShell’in en son sürümlerini kullanmalarını ve sürekli güncel tutmaları tavsiye edilir. Aynı zamanda kullanıcılara, Windows PowerShell’in en son sürümünün yanı sıra, işletim sisteminde de en yeni sürümü seçilmelidir. PowerShell güvenliğini kurmak için Windows 11 veya Windows 10 en uyumlu işletim sistemidir. Bu yüzden kullanıcıların eski Windows sürümlerini Windows11/10’a yükseltmeleri ve kullanabilecekleri tüm güvenlik özelliklerini gözden geçirmeleri tavsiye edilir.

Neden PowerShell güvenli komut dosyalarını uygulamalısınız?

PowerShell güvenli komut dosyaları, ihtiyacımız olana kadar bir o kadar ihtiyacımız olmayan bir özelliktir. BT altyapısının yönetiminin az sayıda çalışanlara devredildiği küçük kuruluşlarda, imzası komut dosyalarının çalıştırılması normal bir senaryodur. Çünkü altyapı ortamı küçüktür ve ekip içinde çok daha şeffaf iletişim vardır. Özellikle kimin ne yaptığını bilmek noktasında.

Böyle bir altyapının yönetiminin ekipler arasında, bazen farklı coğrafi bölgelerde devredileceği bir kurumsal ortamda kimin neyi ve hangi sistemler üzerinde çalıştığını kontrol etmek karmaşıktır. Doğru kişilerin doğru komut dosyalarını çalıştırmasını sağlamak daha da zor olabilir.

Tüm bunlar yürütme kontrolü, komut kaçırma (command hijacking), kimlik ve bütünlük gibi olası sorunlara yol açar.

PowerShell’de yürütme kontrolü(execution control), sistemin hangi komut dosyalarını çalıştırdığını belirtir. Buna bağlı olarakta Windows’un dört tür yürütme denetimi ilkesi vardır; Restricted(Kısıtlı), AllSigned, RemoteSigned ve Unrestricted(Kısıtlamasız).

Restricted: Sistemin yerel, uzak veya indirilmiş herhangi bir komut dosyasının çalıştırılmasına izin vermediği en kısıtlayıcı politikadır.

AllSigned: Tüm komut dosyalarını bir sertifika kullanılarak dijital olarak imzalanmaya zorlar, aksi takdirde sistem bunları çalıştırmaz.

RemoteSigned: Uzak UNC(Universal Naming Convention) ve indirilen komut dosyalarını yalnızca dijital olarak imzalanmış olmaları durumunda çalışmasına izin verir. Yerel komut dosyaları ne olursa olsun çalıştırılabilir.

Unrestricted: Çoğu şirkette, özellikle de bir komut dosyası yürütme uygulaması gerekmeyen tek bir sistem yöneticinin olduğu küçük şirketlerde, kısıtlamasız bulunur. Bu durumda, dijital olarak imzalanıp imzalanmadıklarına bakılmaksızın tüm komut dosyaları çalışır.

 

Kategoriler Makaleler