SlideShare a Scribd company logo
POWERSHELL NEDİR, NASIL ÇALIŞIR,TEMEL
POWERSHELL KULLANIMI ve OFANSİF
POWERSHELL
Ramin KARIMKHANI
Cyber Security Intern
Temmuz 2018
1. POWERSHELL NEDİR?
Windows sistemler, GUI (Graphical User Interface – Kullanıcı Grafik Arayüzü) olarak adlandırılan ,
kullanıcılar için kullanım kolaylığı sağlayan arayüzü ön planda tutmaktadır. Ama bazı durumlarda
sistemin derinlerine inmek ve derinliklerde işlem yapmak gerekebilir. Böyle durumlarda GUI
kullanımı işleri karmaşıklaştırabilir. Linux sistemlerde bu gibi durumlarda sistem yöneticilerine
kolaylık sağlaması için CLI (Command Line Interface) ön planda tutulmaktadır. CLI aracılığı ile Linux
sistemler, çeşitli işlevsel komutlar ile sistemin yönetimini kolaylaştırır. Ayrıca GUI yerine, bir komut
satırı uygulaması kullanılması, bellekten kazanç sağlar. Bu durumlardan mütevellit Windows
Server ailesinde sistem yöneticileri tarafından kullanılmak üzere, 2006 yılında Windows Vista ile
yeni bir fikir ortaya POWERSHELL adlı komut satırı dili PowerShell versiyon 1.0 olarak sunuldu.
PowerShell, sistemin çeşitli komutlarla rahat bir şekilde kullanılmasını sağlar ve kullanıcılara geniş
çaplı işlevsellik sunar. Örnek olarak PowerShell ile dizinleri listeleme, dosya oluşturma, dosya silme
gibi basit işlemler yapılabilirken; Registry, Certificate Store gibi kayıt alanlarına da kolay bir şekilde
erişim sağlanabilir. PowerShell ile bu tarz işlemlerin yapılması yazılan komutlara göre gerçekleşir.
PowerShell, Windows 7 ve daha sonra gelen Windows işletim sistemi versiyonları ile entegreli bir
şekilde gelirken; Windows XP, Windows 2003 ve Windows Vista işletim sistemlerinde sonradan
kurularak kullanılma özelliğine sahiptir. Güncel olan Windows 10 gibi işletim sistemlerinde son
sürüm olan PowerShell 5.0 versiyonu kullanılmaktadır. Tablo 1’de PowerShell sürümleri, çıkış
tarihleri, varsayılan olarak kullanıldıkları işletim sistemi versiyonları ve hangi işletim sistemi
versiyonlarında kullanılabileceği bilgileri yer almaktadır.
Tablo 1 – PowerShell versiyonları
PowerShell Çıkış Tarihi Varsayılan Windows İşletim Kullanılabilen Windows İşletim
Versiyon Sistemi Versiyonu Sistemi Versiyonları
PowerShell 1.0 Kasım 2006 Windows Server 2008 Windows XP SP2
Windows XP SP3
Windows Server 2003 SP1
Windows Server 2003 SP2
Windows Server 2003 R2
Windows Vista
Windows Vista SP2
PowerShell 2.0 Ekim 2009 Windows 7 Windows XP SP3
Windows Server 2008 R2 Windows Server 2003 SP2
Windows Vista SP1
Windows Vista SP2
Windows Server 2008 SP1
Windows Server 2008 SP2
PowerShell 3.0 Eylül 2012 Windows 8 Windows 7 SP1
Windows Server 2012 Windows Server 2008 R2 SP1
Windows Server 2008 SP2
PowerShell 4.0 Ekim 2013 Windows 8.1 Windows 7 SP1
Windows Server 2012 R2 Windows Server 2008 R2 SP1
Windows Server 2012
PowerShell 5.0 Nisan 2014 Windows 10 Windows 8.1
Windows Server 2012 R2
PowerShell .NET Framework kütüphanesini destekler. Sistemin yönetiminin ve denetlemelerinin
otomatize edilmesine yardımcı olur. PowerShell .NET tabanlı bir platform olduğu için ve .NET
kütüphanelerini desteklediği için, .NET komutlarını PowerShell uygulamasında kullanabilir ve bu
komutları kullanarak PowerShell üzerinde küçük çaplı uygulamalar geliştirebiliriz. Böylece, GUI ile
gerçekleştirebileceğimiz işlemleri bu işlevsellik sayesinde kısa sürede gerçekleştirebiliriz.
PowerShell uygulamasının en önemli özelliklerinden biri tutarlı olmasıdır. Bu özelliği nitelendirecek
olursak PowerShell uygulamasının çalıştırılan bir komutun başka komutlarında çıktısı olması
özelliğinden bahsedebiliriz. Böylece tek bir komut içerisinde gerekli bağlayıcıları veya
parametreleri kullanarak birden fazla yönetimsel işi yerine getirebiliriz.
2. POWERSHELL NASIL ÇALIŞIR?
PowerShell, kullanıcılara sunulan komut satırı arayüzü üzerinde çalıştırılan komutlar ile çalışmaktadır.
Bu komutlar cmdlet(command – let) olarak adlandırılır. Cmd komut satırı arayüzünde ve Linux
sistemlerde kullanılan komut satırı arayüzünde çalıştırılan komutlar arka planda çalışan birer bağımsız
uygulama iken, PowerShell komut satırı üzerinde çalışan komutlar bağımsız uygulama değil, .NET
Framework sınıfları kullanılarak oluşturulan nesnelerdir. Böylelikle PowerShell, cmd.exe gibi
uygulamalar için metin işleme araçlarını kullanmaz. Onun yerine nesne manipülasyon komutlarını
kullanarak istenilen yere erişim sağlar. PowerShell kullanıcıyı, varsayılan olarak bulunan cmdlet’ler ile
sınırlamaz. İstenildiği takdirde varsayılan olarak bulunmayan farklı cmdlet’ler eklenebilir. Ayrıca
PowerShell üzerinde sadece cmdlet’ler değil, cmd.exe ve UNIX tabanlı komutlar da çalıştırılabilir.
PowerShell üzerinde, PowerShell’den bağımsız olan uygulamalar da çalıştırılabilir. Örnek olarak bir
cmd.exe uygulamasını PowerShell üzerinden çalıştırabiliriz. Fakat cmd.exe uygulamasının PowerShell
üzerinden başlatılması sadece PowerShell’in uygulama çalıştırması ile alakalı bir durumdur. Bu özelliğin
dışında PowerShell cmd.exe uygulamasının çalışmasını etkilemez. Sadece uygulamayı başlatır ve
kullanıcı tarafından cmd.exe uygulaması, PowerShell’den bağımsız bir şekilde çalışır. PowerShell
uygulamasında kullanılan cmdlet’ler, .NET Framework tabanlı çalışan C# programlama diline
benzemektedir. C# programlama dili ile uygulama geliştirmiş olan kullanıcılar bu benzerliği
farkedebilmektedir. Fakat bu durum PowerShell cmdlet kullanımı için C# programlama dili bilgisi
gerektirmez. C# programlama dili ile uygulama geliştirmemiş olan bir kullanıcı bile, PowerShell
üzerinde kolay bir şekilde cmdlet kullanabilir.
2.1. TEMEL POWERSHELL CMDLET
PowerShell kullanımının cmdlet ile gerçekleştiğinden üst kısımda bahsettik. Bu bölümde ise,
PowerShell kullanılmak için çalıştırılan temel cmdlet’lere değineceğiz.
PowerShell kullanıcılara kolay kullanım ve tutarlılık sunmaktadır. Örneğin, bir cmdlet çalıştırdığımız
zaman, bu cmdlet genişletilerek benzer işlemler için de kullanılabilir ve tutarlılık sağlar. Kolay
kullanımın ve tutarlılığın sağlanması cmdlet yapısından gelmektedir. Cmdletlerin tümü verb-noun
yapısı ile çalışır. Yani yapılacak işlemin fiil kökü yazılır, tire işareti konulur ve fiil hangi işlemi
yapacaksa o işlemin ismi yazılır. Bu yapıyı test etmek için öncelikle PowerShell komut satırını
çalıştırmalıyız. PowerShell farklı yöntemler ile çalıştırılabilir. Örneğin; bir cmd.exe uygulaması
çalıştırılıp komut satırına PowerShell yazılabilir, C:WindowsSystem32WindowsPowerShellv1.0
lokasyonuna gidilerek PowerShell.exe uygulaması ile çalıştırılabilir ya da Win Key+R tuşları ile
‘Çalıştır’ uygulamasına PowerShell yazılarak çalıştırılabilir vs. PowerShell uygulamasını
çalıştırdığımız zaman karşımıza mavi renkte bir arayüz gelecektir. Win Key+R tuşları ile ‘Çalıştır’
uygulamasına PowerShell yazarak uygulamayı çalıştırıyoruz.
Resim 1 - PowerShell uygulaması çalıştırma
Resim 1’ de görüldüğü üzere PowerShell uygulamasını çalıştırmak için ‘Çalıştır’ uygulamasına
PowerShell yazdıktan sonra, ‘OK’ butonuna basarak uygulamayı çalıştırıyoruz.
Resim 2 - PowerShell arayüzü
Resim 2’de görüldüğü üzere, PowerShell uygulaması çalıştı ve arayüz ekranı karşımıza geldi.
Ardından cmdlet yazarak örnekler yapacağız.
PowerShell üzerinde çalışan bir çok cmdlet bulunmaktadır. Bunları görebilmek adına komut
satırına ‘Get-Command’ yazıyoruz.
Resim 3 - Tüm komutlar
Resim 3’de görüldüğü üzere cmdlet çalıştırdık ve tüm cmdletlerin çıktısını aldık. Resmin
görünmeyen kısmıyla beraber yüzlerce cmdlet karşımıza çıkacaktır. Aynı zamanda bu komutu
çalıştırarak verb-noun yapısını da görmüş olduk. Tüm komutları almak istediğimiz için almak
anlamına gelen Get fiilini yazdık ve tire işareti koyarak komutları almak istediğimiz için Command
yazdık ve istediğimiz çıktıyı cmdlet kullanarak PowerShell aracılığı ile elde ettik.
PowerShell cmdletlerinin tutarlılığına bir örnek verecek olursak, ilk örneğimizde kullandığımız bir
cmdlet olan ‘Get-Command’ komutunu detaylandırabiliriz. Örneğin ben komut almak istersem,
fakat almak istediğim komutlar tüm komutlar değilde belirli komutlar ise, bu cmdlet genişletilebilir
ve bu işlem için çok daha farklı bir cmdlet kullanmaya gerek kalmaz. Süreçler ile ilgili komutları
istediğimizi varsayacak olursak ‘-Noun Process’ parametresiyle, süreçler ile ilgili komutları elde
edebiliriz.
Resim 4 - Tutarlılık
Resim 4’de görüldüğü üzere parametre eklenerek sadece süreçler (process) ile ilgili komutları elde
ettik.
PowerShell ile UNIX ve cmd.exe tabanlı komutları çalıştırabileceğimizden bahsettik. Örneğin dosya
listeleme işlemini gerçekleştirmek için, UNIX tabanlı ‘ls’ ve cmd.exe tabanlı ‘dir’ komutlarını
çalıştıracağız. Öncelikle, PowerShell uygulamasının cmd.exe uygulamasına göre daha işlevsel
olduğunu da test etmek için, bu iki komutu cmd.exe uygulamasında çalıştıralım.
Resim 5 - cmd.exe Üzerinde Komut Çalıştırma
Resim 5’de görüldüğü üzere, cmd.exe uygulamasının desteklediği ‘dir’ komutunu yazdık ve
çalıştırdık. Bu komut sayesinde bulunduğumuz dizindeki tüm dosyalar ve dizinler listelendi. Fakat
UNIX tabanlı ‘ls’ komutunu çalıştırdığımızda ise hata ile karşılaştık. Çünkü cmd.exe UNIX tabanlı
komutları desteklememektedir. Aynı komutları PowerShell üzerinde de çalıştıralım.
Resim 6 - PowerShell üzerinde cmd.exe ve UNIX tabanlı komutlar
Resim 6’da görüldüğü üzere, PowerShell uygulaması cmd.exe ve UNIX tabanlı komutları
desteklediğinden dolayı, dir ve ls komutlarını çalıştırdı.
PowerShell üzerinde çalıştırılan komutlara örnek olarak dizin/dosya oluşturma işlemini
gerçekleştirebiliriz. PowerShell üzerinde çalışan komutlar geniş kapsamlıdır. Yani bir cmdlet aldığı
farklı parametrelerle birçok işlemi gerçekleştirebilir. Buna örnek olarak bir dizin/dosya oluşturmak
için New-Item cmdletini kullanacağız. Adı üzerinde yeni bir item oluşturmak için New-Item
kullanılır. Dolayısıyla bu cmdlet yalnızca dizin/dosya oluşturmak ile kısıtlı değildir. Yeni bir
dizin/dosya oluşturmak için öncelikle New-Item yazılır. Devamında dizin/dosya adını belirlemek
için –Name parametresi kullanılır. Dizinin/dosyanın oluşturulacağı dizinin yolunun belirtilmesi için
–Path parametresi kullanılır. Oluşturulacak dizinin/dosyanın tipinin belirlenmesi için –ItemType
parametresi kullanılır. Resim 7’de örnek gösterilmektedir.
Resim 7 - Dosya Oluşturma
Resim 7’ de görüldüğü üzere gerekli parametreler ile New-Item cmdlet kullanılarak a.txt adında bir
dosya oluştu. –Path parametresine ‘.’ Değeri atayarak oluşturulacak dosyanın bulunduğumuz
dizinde oluşturulacağını belirttik (Bulunduğumuz dizinde bir dosya oluşturmak için –Path
parametresi kullanmak şart değildir.). –Name ile dosyanın adını ‘a.txt’ olarak belirttik ve –
ItemType parametresine ‘file’ değerini atayarak oluşturulacak nesnenin bir dosya olduğunu
belirledik. Böylece a.txt adlı dosya oluştu.
PowerShell ile ‘Get-Help’ cmdlet kullanılarak farklı cmdletlerin nasıl çalıştığı hakkında yardım
alınabilir. Örnek olarak ‘Get-Help New-Item’ komutu ile New-Item cmdlet hakkında yardım
alabiliriz.
Resim 8 - Get-Help cmdlet
PowerShell ile bir dizini/dosyayı farklı bir dizine kopyalayabiliriz. Bunun için ‘Copy-Item’ cmdlet
kullanılır. Bu cmdletin devamında dosyanın yolu, kopyalanacak hedefin belirtilmesi için –
Destination parametresi ile kopyalama işlemi yapılacak dizinin yolu belirtilir. Eğer dizin kopyalama
işlemi gerçekleştirilecekse –Recurse parametresi kullanılır. Bu parametrenin kullanılma amacı,
dizini içerisinde bulunan dosya ve dizinlerle beraber kopyalamaktır.
Resim 9 – Copy-Item cmdlet
Resim 9’da görüldüğü üzere C:UsersAdministrator dizininde bulunan a.txt adlı dosyayı, hedef
olarak belirttiğimiz C:Users dizinine kopyaladık. Aynı işlem dizin kopyalama işlemi için
gerçekleştirilebilir.
Resim 10 – Dizin kopyalama
Resim 10’da görüldüğü üzere C:UsersAdministrator dizini içerisinde ‘dizin’ adlı bir dizin
bulunmaktadır ve bu dizin içerisinde ‘dosya.txt’ adlı bir dosya bulunmaktadır. Bu dizini kopyalamak
için Copy-Item cmdlet kullandık ve dikkat ederseniz, -Recurse parametresini kullanmadık. Böylece,
C:Users dizinine ‘dizin’ adlı dizin kopyalandı fakat, ls komutu ile dizinin içeriğini görüntülediğimiz
zaman hiçbir sonuç alamadık. Çünkü –Recurse parametresi kullanılmadığı için sadece dizinin
kendisi kopyalandı.
Resim 11 – Recurse parametresi ile dizin kopyalama
Resim 11’de görüldüğü üzere bu kez –Recurse parametresi kullandık ve kopyalanan ‘dizin’ adlı
dizin, içerisinde bulunan ‘dosya.txt’ adlı dosya ile birlikte kopyalandı.
PowerShell ile dizin kopyalama işlemini yaptığımız gibi, taşıma işlemi de gerçekleştirebiliriz. Bu
işlem için ‘Move-Item’ cmdlet kullanılır. Copy-Item ile çok benzer olan bu cmdlet, taşıma işlemi
için – Destination ve bir dizini içeriği ile beraber taşımak için –Recurse parametrelerini kullanır.
PowerShell ile oluşturduğumuz bir dizinin/dosyanın adını değiştirebiliriz. Bunun için Rename-Item
cmdlet kullanılır.
Resim 12 – Rename-Item
Resim 12’de görüldüğü üzere Rename-Item cmdlet ile dosya.txt adlı dosyanın adını DOSYA.txt
olarak değiştirdik
Resim 13 – Move-Item cmdlet
Resim 13’de görüldüğü üzere, C:Usersdizin yolu ile belirtilen dizin içerisinde bulunan ‘dosya.txt’
adlı dosya, C:UsersAdministratorDesktop yolu ile belirtilen dizin içerisine taşındı.
Temel işlemlere değinmeye devam edecek olursak, PowerShell üzerinde çalışan ‘Remove-Item’
cmdlet ile dizin/dosya silmekten bahsedebiliriz.
Resim 14 – Remove-Item cmdlet
Resim 14’te görüldüğü üzere, Remove-Item cmdlet ile ‘dosya.txt’ adlı dosyayı sildik.
Bahsetmiş olduğumuz bu cmdletleri göstermek amaçlı yapılan örneklerde, dizin içeriği listeleme
amacı ile ‘ls’ adlı UNIX tabanlı bir komut kullandık. Aslında dizin listelemek için bir cmdlet olan
‘Get-ChildItem’ kullanılır.
Resim 15 – Get-ChildItem cmdlet
Resim 15’te görüldüğü üzere bulunduğumuz dizinin içeriğini listeletmiş olduk.
PowerShell ile, oluşturmuş olduğumuz ‘.txt’ uzantılı gibi olan metin dosyalarının içeriğini çıktı
olarak bastırabiliriz. Bunun için ‘Get-Content’ cmdlet kullanılır.
Resim 16 - .txt dosyası
Resim 16’da görüldüğü üzere, Notepad metin editörü ile dosya.txt adlı dosyayı açtık ve içerisinde
‘Selamlar’ yazdığını görmüş olduk. Şimdi dosya.txt adlı dosyanın içeriğini Get-Content cmdlet ile
görüntüleyelim.
Resim 17 – Get-Content cmdlet
Resim 17’de görüldüğü üzere dosya.txt içerisinde yazan metni yazdırdık.
PowerShell uygulamasının işlevselliğinden bahsettik. PowerShell’in işlevsel olmasının sebebi tek
satırda birçok işlem yapabilmemizi sağlamasından dolayıdır. Pipeline işareti ( | ) bu işlevselliğin
örneklerindendir. Pipeline ile bir satırda birden fazla cmdlet çalıştırılabilir ve sol taraftan itibaren
yazılarak gelen komutlar, pipeline işaretinden sonra gelen komutların çıktısı olarak işlev gösterir.
Resim 9’ da pipeline işareti ile ilgili bir örnek bulunmaktadır.
Resim 18 - Pipeline kullanımı
Resim 18’i inceleyecek olursak, öncelikle dosya ve dizinleri listelemek için ls komutunu çalıştırdık.
Ardından, sadece Mode sütununa ait verileri listelemek için ls komutundan sonra pipeline işareti
koyarak ‘Select-Object Mode’ komutunu yazdık ve böylece en sol tarafta dizinleri listelemek için
yazdığımız ls komutunun çıktıları, pipeline işaretinden sonra gelen Select-Object cmdlet’i için girdi
oldu ve Select-Object cmdlet’i Mode değerini alarak, ls komutu çıktısı için sadece Mode
sütununun çıktılarını gösterdi.
PowerShell üzerinde, cmdlet atamak amacı ile ‘$’ ile başlayan değişkenler kullanılabilir. Örneğin,
çok fazla kullanacağımız bir komutu defalarca yazmak yerine, ‘$’ ile başlayan bir değişkene atıp, bu
değişken ile komut çalıştırabiliriz.
Resim 19 – Değişken kullanımı
Resim 19’ da görüldüğü üzere, ‘$listele’ adında bir değişken oluşturduk. Değişkene Get-ChildItem
cmdlet atadık. Ardından komut satırına $listele yazıp çalıştırdık ve Get-ChildItem cmdletinin
çalıştığını gördük.
PowerShell ile değişkenlere cmdlet atamak dışında, örnek olarak bir veri kümesi yerleştirip, bu
kümede bulunan elemanları listeleyebiliriz.
Resim 20 – Değişken kullanımı
Resim 20’de görüldüğü üzere $kume adlı bir değişken tanımladık ve bu değişkene bir veri kümesi
atadık. Ardından pipeline işaretinin arkasından, sort komutu ile verileri alt alta sıralı bir şekilde
listeledik. Bu listeleme için sort terimi yerine Sort-Object cmdlet de kullanılabilir.
PowerShell’de kendi belirlediğimiz değişkenlerle birlikte, varsayılan olarak bulunan ‘$’ işareti ile
başlayan özel değişkenlerde vardır. Bu değişkenler PowerShell ile ilgili bilgileri depolamak amaçlı
kullanılır. PowerShell ile ilgili bir bilgi alınmak istendiği zaman bu değişkenler kullanılabilir.
Resim 21 – Özel Değişkenler
Resim 21’de birkaç özel değişken örneği yaptık ve çıktılar elde ettik. Bu örnekte; $PID değişkeni
PowerShell uygulamasının process ID değerini, $PSHOME PowerShell uygulamasının kurulu olduğu
dizin yolunu ve $HOME ise kullanıcı dizininin yolunu belirtir. Bu değişkenler PowerShell üzerinde
script çalıştırmak ya da cmdletlere yardımcı olmak amaçlı olarakta kullanılabilirler. Bu değişkenler
örnekte gösterildiği gibi 3 adetle sınırlı değil, oldukça fazladır. Bu değişkenlerin ne olduğunu ve ne
işe yaradıklarını https://www.tutorialspoint.com/PowerShell/PowerShell_special_variables.htm
linkine gidip okuyabilirsiniz.
PowerShell üzerinde, script yazıp çalıştırılabileceğimizden bahsettik. Buna örnek olarak PowerShell
komut satırı üzerinde bir döngü işlemi gerçekleştirebiliriz.
Resim 22 – For Döngüsü
Resim 22’de görüldüğü üzere, PowerShell üzerinde 1’den 10’a kadar yazdıran bir for döngüsü
çalıştırdık.
PowerShell üzerinde script çalıştırabilmek için, PowerShell komut satırına kod yazmak ile birlikte, .ps1
uzantılı bir dosya oluşturularak scriptler bu dosya içerisine yazılır ve PowerShell üzerinde çalıştırılabilir.
Çünkü, satır sayısı fazla olacak olan ya da daha sonra da kullanabilmek amacı ile
saklayabileceğimiz scriptler oluşturmak istersek, .ps1 uzantılı bir dosya içerisine script yazmak
daha uygun olacaktır.
Resim 23 – Script dosyası çalıştırma
Resim 23’de görüldüğü üzere bir script dosyası çalıştırdık. Bu dosyayı çalıştırmak için hata almamak
adına, öncelikle ‘Set-ExecutionPolicy RemoteSigned’ komutunu çalıştırarak, çalıştırma politikasını
değiştirmemiz gerekmektedir. Ardından script kodumuzu görüntülemek amacı ile ‘Get-Content
.selam.ps1’ yazarak, script dosyamızın içeriğini görüntüledik. Oluşturmuş olduğumuz bu script
dosyasında bulunan kodlar, PowerShell komut satırına 6 defa ‘Selam’ yazdıracaktır. Son olarak
.selam.ps1 yazarak script dosyamızı çalıştırdık ve ekran çıktısını aldık.
PowerShell ile Registry ya da Certificate Store gibi kayıt alanlarına erişebileceğimizi söylemiştik. Bu
erişim işlemi fazla zahmetli değildir. Örnek olarak PowerShell üzerinden Registry kayıt alanına
erişmek istediğimizi varsayalım. Registry içerisinde anahtarlar, hiyerarşik dizin yapısında bulunan
dizinlerde tutulur. Dolayısıyla PowerShell üzerinden Registry kayıt alanına normal bir dizine erişir
gibi erişebiliriz.
Resim 24 – Registry Erişim
Resim 24’te görüldüğü üzere, HKEY_LOCAL_MACHINE dizinine erişebilmek için, cd ya da Set-
Location cmdlet ile erişeceğim Registry dizin yolunu belirtmemiz yeterli olacaktır. Ardından
PowerShell üzerinden Registry yönetimi gerçekleştirilebilir.
3. POWERSHELL REMOTING
PowerShell uygulaması, uzak sistemlere erişmek için de kullanılabilir. PowerShell v2.0 ile uzak erişim
özelliği geliştirildi. Bu özellik sayesinde, kullandığımız Windows sistemin PowerShell uygulaması ile
erişmek istediğimiz makineye bağlanabiliriz ve o makineyi yönetebiliriz. Bunun için RDP (Remote
Desktop Protocol – Uzak Masaüstü Protokolü) aracılığı ile erişmek istediğimiz makineye bağlanıp, o
makine üzerinde PowerShell uygulaması çalıştırma gibi bir durum söz konusu değildir. PowerShell,
erişilmek istenen makieneye SSH ile bağlanır gibi bağlanmamızı sağlar. Bu bağlantının
gerçekleştirilebilmesi için kendi makinemizin ve erişmek istediğimiz makinenin Windows Remote
Management(WinRM) servisi çalışıyor durumda olmalıdır. Eğer çalışmıyor ise Enable-PSRemoting
cmdlet ile bu özellik aktif edilebilir. PowerShell uygulamasının komut satırına bu cmdleti yazarak,
Windows Remote Management servisini aktif hale getirebiliriz. Ayrıca Güvenlik Duvarı ayarları
üzerinden de bu özellik aktif edilmelidir. Aksi takdirde güvenlik duvarı bağlantıya izin vermeyecektir.
Resim 25 – Windows Remote Management Servisini Aktif Etme
Resim 25’te görüldüğü üzere, WinRM servisini aktif ettik. Bu sayede erişim sağlamak istediğimiz
makine ile bağlantı kurma işlemini gerçekleştirebiliriz.
Resim 26 – PowerShell Remoting Çalışma Yapısı
Resim 26’da PowerShell Remoting çalışma altyapısı görülmektedir. Bu yapıya göre,
1. Sol tarafta bulunan bilgisayar, kendi içinde WSMan (Web Services for Management –
Yönetim için Web Hizmetleri) adlı protokol ile iletişime geçer. WSMan bu şablonda, uzak
erişim özelliğinin kullanılmasını sağlayacak olan, HTTPS tabanlı bir protokoldür.
2. Sunucu bilgisayarda, istemciden gelecek olan uzak erişim isteği için, WinRM servisi çalışır
ve dinleme modunda olarak WSMan trafiği bekler.
3. WinRM dinleyicileri, istemci tarafından WSMan trafiği aldığı an, istemci bilgisayar için
sunucu bilgisayarda PowerShell oturumu başlayacaktır. Bu oturumun açılması ise sunucu
bilgisayarda wsmprovhost.exe adlı process’in çalışması anlamına gelir.
Karşı makineye PowerShell üzerinden bağlanmamız için, bağlantıya geçecek olan iki makinenin de
bir takım özelliklerinin aktif olması gerekmektedir. İlk olarak iki makine üzerinde de, karşılıklı
iletişimin sağlanması için, güvenlik duvarının uzak bağlantıya izin vermesi gerekmektedir.
Resim 27 – Firewall Uzak Erişim İzni
Güvenlik duvarı ile izin verdikten sonra, PowerShell uygulamasını açacağız ve iki makine için de
Enable-PSRemoting cmdlet ile PowerShell ile uzak bağlantı kurmayı aktif edeceğiz. Bu cmdleti
çalıştırdıktan sonra onay vermemiz gereken sorular gelecektir. Bu sorularla karşılaşmayıp tümünü
onaylamak adına cmdlet ile beraber –Force parametresi kullanılabilir.
Resim 28 – PowerShell Uzak Erişim
Özellik aktif edildikten sonra, bağlantı kurulacak makine ile bizim makinemiz arasında, WSMan
protokolü için güven ilişkisi kurulması gerekmektedir. Bunun için Set-Item cmdlet ile WSMan
protokol dizinine gidip, wsman:localhostclient dizini altında bulunan trustedhosts değerinin,
iletişim kurulacak makinenin IP adresi olarak belirlenmesi gerekmektedir. Eğer tüm istemcilerle
iletişim kurulmasına izin verilmek isteniyorsa ‘*’ işareti kullanılmalıdır. Diğer durumlarda iletişim
kurulacak makinelerin IP adresleri, aralarına virgül işareti konularak girilmelidir.
Resim 29 – Güvenilir Adresler
Bu işlemlerin ardından değişikliklerden istifade edebilmek için WinRM servisini yeniden
başlatmamız gerekmektedir. Bunun için Restart-Service WinRM komutunu kullanacağız.
Resim 30 – Servisi Yeniden Başlatma
Servisi yeniden başlattıktan sonra, bağlantının test edilmesi için Test-WSMan cmdlet
kullanılmaktadır. Bu cmdlet ile WSMan protokolü aracılığı ile bağlantı gerçekleşip
gerçekleşmeyeceği kontrol edilir. Resim 31’ de görüldüğü gibi bir çıktı alınırsa bağlantı olduğu
anlamına gelmektedir.
Resim 31 – WSMan kontrolü
Son olarak makine ile bağlantı kurmak için Enter-PSSession cmdlet kullanacağız. Bağlanacağımız
makinenin IP adresini belirlemek için –ComputerName, kullanıcı adını belirlemek için –Credential
parametresini kullanacağız.
Resim 32 – Bağlantı Kurma
Resim 32’ de görülen komutu çalıştırdıktan sonra bizden, karşı makineye bağlanacağımız hesabın
parola bilgisini isteyecektir. Bu parolayı doğru bir şekilde girdikten sonra bağlantı sağlanacaktır.
Resim 33 – Kimlik Bilgileri
Resim 34 – Uzak Bağlantı
Resim 34’te görüldüğü üzere karşı makinemiz, 192.168.222.143 IP adresli makineye bağlandık. Bu
bağlantı süreci, biz bağlantıyı kesene kadar sürecektir.
4. EXECUTION POLICY
Execution policy, PowerShell’in hangi koşullarda çalışması gerektiğini belirleyen kurallardır.
Execution policy, kullanıcıların sistem üzerinde çalıştıracakları yanlış bir scriptin ya da sistemin
başka bir tarafını olumsuz etkileyebilecek bir scriptin, sisteme vereceği zararları önlemek amacı ile
ortaya çıkmıştır.. ‘Get-ExecutionPolicy’ cmdlet ile çalışma politikasını görüntüleyebilirsiniz ve ‘Set-
ExecutionPolicy <<Politika>>’ komutu ile politikayı değiştirebilirsiniz. Execution Policy’nin çeşitli
politikaları bulunmaktadır.
4.1. Restricted
En güvenilir politika olarak ‘Restricted’ kabul edilir. Çünkü, Restricted politikası PowerShell
kullanımı ve tek satırlık komutlar çalıştırma dışında, script çalıştırılmasına izin vermez. Windows
2012 R2 ve Windows Server 2016 işletim sistemi versiyonları dışındaki tüm versiyonlarda
varsayılan çalışma politikasıdır.
4.2. AllSigned
Bu politika ile sadece güvenilir otoriteler tarafından imzalanmış olan scriptlerin çalıştırılmasına izin
verilir. Scriptler çalıştırılmadan önce onay istenir.
4.3. RemoteSigned
RemoteSigned politikası ile bizim oluşturduğumuz scriptler çalıştırılır. İnternet üzerinden indirilen
scriptlerin çalışması için güvenilir otoriteler tarafından imzalı olması gerekmektedir.
4.4. Unrestricted
Unrestricted politikası, scriptlerin çalışması için imza kontrolü yapmaz ve kısıtlama koymaz.
Yalnızca internetten indirilen scriptler çalıştırıldığı zaman uyarı verecektir.
4.5. Bypass
Bypass politikası, en güvensiz politika diyebileceğimiz bir politikadır. Bu politika uyarı vermez, onay
istemez ve her türlü scriptin çalışmasına izin verir.
4.6. Undefined
Undefined, herhangi bir politika atanmadığı durumlarda, varsayılan olaral Restricted politikasının
atanmasıdır.
Resim 35 – Politika Seçimi
5. POWERSHELL ile SALDIRGAN YAKLAŞIM
PowerShell’in ortaya çıkması ile birlikte, sistem yöneticileri için kolaylık sağlayan bu dil, sunduğu
imkanlar ile saldırganların da gözdesi olmuştur. Çünkü PowerShell ile, sistem yönetimi
derinlemesine yapılabilmektedir ve saldırganlar PowerShell kullanarak, sistemi derinden
mahvedebilirler.
Saldırganların PowerShell kullanma nedenlerine kısaca değinecek olursak:
1. PowerShell Remoting özelliğinin aktif olduğu sistemlere direk erişim gerçekleştirebiliriz.
2. Hedef üzerinde az iz bırakmamızı sağlar.
3. Oluşturduğumuz scriptler için obfuscation(gizleme) özelliği sağlar ve tespit edilme
olasılığının düşmesini sağlar.
4. Hak yükseltme (Privilege Escalation) yapılabilir.
5. Kimlikler (Credentials) çalınabilir.
6. Ağ üzerindeki diğer hedeflere atlanabilir.
7. Sistemde kalıcılık sağlanabilir.
8. Sistemin işleyişi bozulabilir.
Bu özellikler sadece PowerShell ile saldırgan yaklaşıma, çok çok az sayıda birer örnektir. Bu
özellikler daha da artırılabilir.
5.1. Execution Policy
Execution Policy scriptlerin çalıştırılmasından sorumludur. Eğer bir sisteme sızılıp, bu sistem
üzerinde PowerShell çalıştırılırsa, PowerShell üzerinde script çalıştırabilmemiz için, çalışma
politikası Bypass olarak ayarlanabilir. Böylece çalıştırmak istenilen scriptler hiçbir kısıtlama
olmadan çalıştırılabilir.
Resim 36 – Execution Policy
5.2. Base64 Encode
PowerShell ile çalıştırılacak olan her bir cmdlet ve çalıştırılacak olan scriptler Base64 ile
kodlanarak, çalıştırılmak istenen zararlı komutlar gizlenebilir.
Resim 37 – Base64 Encode
Resim 37’da bir metnin nasıl Base64 ile kodlandığına dair örnek yaptık. İlk olarak $cmdlet adlı bir
değişken tanımladık ve Base64 ile kodlamak istediğimiz Get-ExecutionPolicy cmdleti değişkene
atadık. Sonra, System.Text.Encoding adlı sınıfta bulunan, Unicode sınıfının GetBytes fonksiyonu
ile $cmdlet değişkeninin her bir karakterini kodlanacak şekilde, $EncodeText değişkenine atadık.
Ardından Convert sınıfından, ToBase64String fonksiyonu ile $EncodeText değişkenini Base64 ile
kodladık ve $EncodeCmdlet değişkenine atadık. Son olarak, $EncodeCmdlet değişkenini yazıp
çalıştırdık ve ‘Get-ExecutionPolicy’ cmdletinin Base64 ile kodlanmış halini elde ettik.
Resim 38 – Base64 Kod Kullanımı
Resim 38’de görüldüğü üzere PowerShell (PowerShell, kendi içerisinde çalıştırılabilir ve
parametreler alabilir.) uygulamasının –enc (encode) parametresi ile $EncodeCmdlet adlı cmdleti
kullanarak, Get-ExecutionPolicy cmdleti çalıştırdık ve Execution Policy olarak ayarlanmış
‘Restricted’ değerini ekranda gördük.
Base64 ile oluşturduğumuz bir zararlı scripti encode edip karşı tarafta çalıştırabiliriz. Buna örnek
olarak, 64 bit mimarili bir Windows 7 makine üzerinde, Base64 ile encode edilmiş bir zararlı script
çalıştıracağız ve Ubuntu makinemizle, Windows 7 makineye PowerShell ile bağlanacağız. Sızma
işlemi adımları aşağıda maddelenmiştir:
İlk olarak sızacağımız makinenin, Execution Policy değerine bakıyoruz ve ‘Restricted’
olduğunu görüyoruz.
Resim 39 – Windows 7 Execution Policy
Ubuntu makinemizde, msfvenom aracı ile Resim 39 ‘da görülen seçili komutu çalıştırarak,
ps.ps1 adında bir zararlı script oluşturuyoruz.
Resim 40 – Zararlı Script Oluşturma
Resim 40’ta görüldüğü üzere, zararlı scriptin içeriğini görüntüledik. Bu script ile ilgili
detaylardan bahsedecek olursak:
o Bu script bir powershell komutu çalıştırmaktadır. Komuta göre –nop parametresi
“no profile” anlamına gelmektedir ve o an aktif olan kullanıcının profilinin
yüklenmemesi için kullanılır.
o –w parametresi “window” anlamına gelmektedir. –w parametresine verilen
hidden değeri ile, komut çalıştığı an powershell penceresi gizlenecektir ve arka
planda çalışmasına devam edecektir.
o -noni parametresi “non-interactive” anlamına gelmektedir. Script kodlarının
sadece tek satır halinde powershell komut satırı uygulaması üzerinde çalıştırılması
interaktif mod olarak adlandırılır. Bu moddan çıkmak için –noni parametresi
kullanılır.
o –ep parametresi ise, script kodlarımızı çalıştırabilmemiz için kural sağlamak adına
kullanılır ve bir önceki bölümde bahsettiğimiz “execution policy” anlamına
gelmektedir. –ep parametresine Bypass değerini vererek, script çalışma politikasını
tamamen ortadan kaldırarak her türlü scriptin çalışmasına izin
verebiliriz. o Gizli kod için ise objeleri inceleyecek olursak:

IO.StreamReader ile tüm script akışı okunur.


IO.Compression.GzipStream ile akış sıkıştırılır.


IO.MemoryStream ile akış hafızaya alınır.


[Convert]::FromBase64String ile hafızaya alınan encode edilmiş gizli script,

Convert namespace içerisinde bulunan FromBase64String fonksiyonu ile
çözülür.


Son kısımda bulunan [IO.Compression.CompressionMode]::Decompress ile sıkıştırılan
akış açılır.


ReadToEnd() fonksiyonu ise tüm script akışının baştan sona kadar okunmasını sağlar.

Böylece, msfvenom ile oluşturulmuş zararlı script çalışmaya başladığında, kurban
makineye sızmamız için bir bağlantı sağlayacaktır.
Kurban makinede, zararlı scriptimizi çalıştırmak için Base64 ile encode edeceğiz. Bunun
için internet üzerinden bir web sitesinde, kodumuzu Unicode olarak Base64 ile encode
ediyoruz. Böylece kurban makineye gönderdiğimiz scriptin yapısının bozulmadan
çalışmasını sağlayabiliriz.
Resim 41 – Base64 ile Zararlı Script Encode Etme
Elde ettiğimiz kodları kurban makinede çalıştıracağız. Fakat bu işlemden önce Ubuntu
makinede dinleme modu başlatmamız gerekecektir. Bu işlem için metasploit framework
çalıştıracağız. Çalıştırdıktan sonra dinleme modu için, exploit/multi/handler modülünü
kullanacağız.
Resim 42 – Metasploit Framework
Dinleme işlemini başlatmak için payload kullanmamız gerekmektedir. Zararlı script
oluştururken payload olarak windows/x64/PowerShell_reverse_tcp kullandık. Bu payload,
kurban makineye bağlandığımızda, o makine üzerinde işlemler gerçekleştirebilmek için
PowerShell oturumu başlatacaktır. Bu payload seçildikten sonra, zararlı script LHOST ve
LPORT parametrelerine atadığımız yerel IP adresi ve port değerlerini, tekrar bu payload için
LHOST ve LPORT parametrelerine atamamız gerekmektedir.
Resim 43 – Payload Seçimi
Bu işlemden sonra dinleme modunu exploit komutu ile başlatıyoruz.
Resim 44 – Dinleme Modu
Encode edilmiş scripti kurban makinede çalıştırıyoruz.
Resim 45 – Script Çalıştırma
Script çalıştıktan sonra Ubuntu makinemizde, kurban makineyi kontrol edebilmek için
PowerShell oturumu açılacaktır. Bu oturum açıldıktan sonra, kurban makineyi PowerShell
üzerinden çeşitli cmdletler ya da scriptler ile kontrol edebiliriz.
Resim 46 – PowerShell oturumu
Resim 47 – PowerSploit Import-Module cmdlet
5.3. Hak Yükseltme (Privilege Escalation)
Hak yükseltme, sınırlı yetkilere sahip kullanıcı hesaplarıyla sızılmış bir sistemde, bu sınırlı yetkileri
artırmak amaçlı kullanılan bir yöntemdir. Hak yükseltme işlemi için çeşitli yöntemler mevcuttur.
Örneğin, Windows sistemlerde UAC (User Account Control – Kullanıcı Hesap Denetimi) koruması
altında olan bir sisteme sızıldıktan sonra, UAC koruması bypass edilerek, UAC kısıtlamaları aşılabilir ve
kısıtlanan yetkiler kullanılabilir. Bunun dışında yetkili kullanıcılara ait token elde edilerek, bu token
aracılığıyla yetkili kullanıcı gibi sistem içerisinde çeşitli işlemler geliştirilebilir. Powersploit aracı ile bir
sistemde hak yükseltme işlemi gerçekleştirilebilir. Powersploit, sızma testlerinde kullanmak amacıyla
oluşturulmuş PowerShell modülleri topluluğudur. Bu modüller ile, penetrasyon testleri yapılacak olan
sistemlerde, PowerShell üzerinde sisteme yönelik, sızma sonrası işlemler
gerçekleştirilebilir. Bu işlemleri gerçekleştirebilmek için,
‘https://github.com/PowerShellMafia/PowerSploit’ linkinden dosyaların indirilmesi gerekmektedir. Bu
dosya indirildikten sonra, hedef sistemde modüller arasına eklenmesi gerekmektedir. Eğer modüller
arasına eklenmez ise, modül ile yüklenecek olan komutlar çağırılamayacaktır. Modül ekleme işlemi için
Import-Module cmdlet kullanılır. Powersploit, sisteme hangi hesap üzerinden sızdıysak, o hesabın
görüntüleyebileceği diğer kimlik bilgileri sayesinde token elde ederek, yetkili bir kullanıcının token
bilgisi ile hak yükseltme işlemi gerçekleştirmeye olanak sağlamaktadır. Bu işlem Token Manipulation
olarak adlandırılır. Powersploit ile hak yükseltme işlemi yapabilmek için, öncelikle modül eklemek
gerekmektedir. Modül ekleme işlemi ile beraber çeşitli komutlar yüklenmektedir. Yüklenen bu
modüller Invoke ile birlikte kullanılır. Hak yükseltme işlemi için modül ile birlikte yüklenen Token
Manipulation işlemini Invoke ile birlikte çağırarak, token elde edebileceğimiz kullanıcıları
görüntüleyebilir ve yetkili bir kullanıcının token bilgisini kullanarak hak yükseltme işlemi
gerçekleştirebilir. Bu işlemleri adımlayacak olursak:
Öncelikle sistemin hangi kullanıcı ile kullanıldığını görüntülemek için whoami komutunu
çalıştırıyoruz.
Resim 48 – Etkin hesap
Sonra, hak yükseltme işlemi yapabilmek adına modül yüklemek gerekmektedir. Modül
yüklendikten sonra Invoke-TokenManipulation cmdlet token manipülasyon işlemi için
kullanılır ve kimlik bilgilerinin listelenmesi için –Enumerate parametresi kullanılır.
Resim 49 – Token Bilgileri
Token manipülasyon işlemi gerçekleştirilecek hesaplar arasından en yetkili hesap olan NT
AUTHORITYSYSTEM hesabı ile token manipülasyonu işlemini gerçekleştiriyoruz. Bu işlem için
tekrar Invoke-TokenManipulation cmdlet kullanacağız. Kimliğine bürüneceğimiz hesabı
belirlemek için –Username, kimliğe büründüğümüz kullanıcı ile yetki işlemleri yapabilmek için
çalıştıracağımız process’i belirlemek için –CreateProcess parametrelerini kullanacağız.
Resim 50 – Hak Yükseltme İşlemi
Komut çalıştırıldıktan sonra, process olarak cmd.exe uygulaması çalışacaktır. Resim 43’te
görüldüğü üzere yeni açılan process üzerinde, whoami komutu çalıştırdığımız zaman, en
yetkili hesap olan ‘nt authoritysystem’ hesabı ile karşılaşacağız.
Resim 51 – Hak Yükseltme İşlemi ile Çalışan Process
5.4. Veri Sızdırma (Data Exfiltration)
Veri sızdırma işlemi, saldırganlar tarafından çokça yapılmakta olan, birtakım verilerin belirtilen bir
sunucuya yönlendirilmesi olayıdır. Bir saldırgan bir sisteme sızdığı zaman, sistemde bulunan
birtakım bilgileri sızdırmak isteyebilir. Bu işlemin gerçekleşmesi için sisteme erişen saldırgan,
sızdırmak istediği verilere ulaşır ve bu verileri ilgili sunucuya yönlendirir. Bu işlem normal bir
şekilde yapılabileceği gibi, şifreleme algoritmalarının ya da kodlama yöntemlerinin kullanılmasıyla
gerçekleştirilebilir. Saldırganlar, sızdıkları sistemde yapmış oldukları işlemlerin anlaşılmasını
istemezler. Bu nedenle bir veri sızdırma işlemi yapılacaksa, bu verilerin açık bir şekilde sızdırılması,
sistemdeki kayıtların incelenmesi ile ortaya çıkabilir. Fakat sızdırılacak olan veriler, şifreleme
algoritmaları ile şifrelenip ilgili sunucuya yönledirilirse, sistem kayıtlarından yönlendirilen verilerin
ne olduğu anlaşılamaz. Böylece veri sızdırma işlemi istenildiği gibi olumlu bir şekilde gerçekleşmiş
olur.
Eriştiğimiz bir sistemde, PowerShell ile veri sızdırma işlemi yapabiliriz. Bu işlemin gerçekleşmesi için,
sistemde bir parola dosyası bulduğumuzu varsayalım. Bu dosyadaki verileri okuyup, web üzerinden bir
web sitesi sunucusuna yönlendirebiliriz. Bu işleme ilk olarak verileri okumakla başlayabiliriz:
Öncelikle parola dosyasındaki veriler
gerçekleşebileceği için bir değişkende
Get-Content cmdlet ile okunur. Okuma işlemi tekrar
tutulur.
Resim 52 – Verileri Okuma
Parolaların şifrelenmesi için bir anahtar belirlenir ve değişkene atanır.
Resim 53 – Anahtar belirleme
Sonra, System.Security.SecureString sınıfına ait bir obje oluşturulur ve değişkene atanır.
Resim 54 – Güvenli metin objesi
Şifreleme işleminin gerçekleşmesi için, parolalar dosyasındaki her bir parola değerinin
harfleri, birer birer $guvenliMetin değişkenine eklenir. Bu işlem için bir döngü kullanılır.
Her seferinde, parolaların her bir harfi ile döngü çalışır ve her döngüde, $guvenliMetin
değişkenine bir harf atanır.
Resim 55 – Parolaları harflerine ayırma
Ardından elde edilen metne göre, anahtar ve metin devreye sokularak, şifreleme işlemi
gerçekleştirilir. Şifreleme işlemi ConvertFrom-SecureString cmdlet ile gerçekleştirilir. Bu
cmdlet asıl olarak verinin güvenli bir hal alması için kullanılır. Bunun için sistem AES
standartını kullanır.
Resim 56 – Şifreli Veri
Son olarak, veri şifrelenmiş bir şekilde istenilen sunucuya gönderilir. Farklı protokoller
kullanılarak veri sızdırma işlemi gerçekleştirilebilir. Biz bu örnekte veri göndermek için http
protokolü kullanacağız ve şifreli verimizle bir web sunucusuna istek atacağız.
Resim 57 – Web İsteği
Komut çalıştırıldıktan sonra şifreli verimiz başarılı bir şekilde web sunucusuna ulaşacaktır.
Verinin başarılı bir şekilde ulaşma durumu Resim 58’ de Wireshark programı ile yapılan
analiz ile ispatlanmıştır.
Resim 58 – Şifreli verinin HTTP protokolü üzerinden başarılı bir şekilde gönderilmesi
5.5. Kimlik Çalma (Credential Theft)
Kimlik çalma işlemi, erişim sağladığımız bir makinede bulunan hesapların kimlik bilgilerine
ulaşmamız ve bu bilgiler ile sisteme kimlik bilgilerini elde ettiğimiz hesap üzerinden sisteme
erişmemiz amacıyla gerçekleştirilir. Windows sistemlerde kimlik bilgileri SAM (Security Account
Manager) dosyasında tutulur. Bu kimlik bilgilerine erişmemiz için PowerShell üzerinden script
çalıştırılarak, SAM dosyası içerisinde tutulan kimlik bilgileri ortaya çıkartılabilir. Bunun için
PowerShell üzerinde Mimikatz aracının, kimlik bilgilerini ortaya çıkaran komutu olan
sekurlsa::logonPasswords kullanılarak bilgileri listeleyen bir script çalıştıracağız.
İlk olarak github.com sitesinde bulunan script dosyasını indireceğiz. Bu dosyayı indirmek
Invoke-Expression cmdlet aracılığı ile için PowerShell üzerinde komut çalıştıracağız.
Resim 59 – Script Dosyası İndirme
İndirilen bu dosyayı, kurban makinede çalıştırmak için PowerShell üzerinde Remoting
özelliğini kullanarak, daha önceden kimlik bilgilerini bildiğimiz Administrator hesabı
aracılığı ile sisteme yükleyeceğiz. Bunun için New-PSSession cmdlet ile bir oturum
tanımlayıp Copy-Item cmdlet ile kurban makineye dosyayı yükleyeceğiz.
Resim 60 – New-PSSession cmdlet
Resim 61– New-PSSession cmdlet
Resim 62 – Açılan Oturum
Resim 63 – Dosya Kopyalama
Dosya yükleme işlemi tamamlandıktan sonra Mimikatz modülünün çalıştırılması için, modül
eklememiz gerekmektedir. Modülü ekledikten sonra Invoke-Mimikatz cmdlet oluşacaktır. Bu
cmdleti çalıştırdıktan sonra, kimlik bilgileri listelenecektir.
Resim 64 – Modül Ekleme ve Çalıştırma
Mimikatz aracını farklı parametreler ile kullanabiliriz. Örneğin, kimlik bilgilerini ele geçirmek için
parametresiz olarak Invoke-Mimikatz cmdlet kullanabildiğimiz gibi, -DumpCreds parametresini
kullanarak kimlik bilgilerini ele geçirebiliriz. –DumpCerts parametresini kullanarak sistemde tutulan
sertifikalar hakkında bilgi alabilmemiz için .der ve .pfx uzantılı iki dosya oluşur ve sertifikaları bu
dosyalar aracılığı ile inceleyebiliriz. Eğer bunların dışında, mimikatz aracına ait komutları kullanarak
çeşitli işlemler yapmak istersek, bunun için –Command parametresini kullanabiliriz. Böylece Invoke-
Mimikatz cmdlet ile –Command parametresini kullanarak daha farklı işlemler gerçekleştirebiliriz.
Resim 65 – Kullanıcı Kimlik Bilgileri
Resim 66 – Sertifikalar Hakkında Bilgi
Resim 67 – Command Parametresi Kullanımı
Resim 67 ‘de görüldüğü üzere, Command parametresini kullanarak, bizim belirlemiş olduğumuz;
debug modunda çalıştırma işlemini yapan privilege::debug ve Kerberos’a ait biletler hakkında bilgi
veren sekurlsa::tickets komutlarını çalıştırdık.
Invoke-Mimikatz cmdlet kullanarak kimlik bilgilerini elde etme işlemini kurban makinede
gerçekleştirmiş olduk. Fakat bazı durumlarda kurban makinede uzun süre kalmamamız gereken
durumlar olabilir. Bu nedenle kimlik bilgilerini ve bilet bilgilerini kurban makinede incelememiz,
işimizin yarıda kesilmesine sebep olabilir. Bu nedenle kimlik bilgilerini ve biletleri birer dosya
halinde alıp kurban makineden çıkabiliriz. Böylece, bu bilgileri daha sonra kendi makinemizde
mimikatz aracı ile inceleyebiliriz.
Mimikatz, kimlik bilgilerini incelemek için lsass.exe adlı process’e bakar. Bu process, Windows
sistemlerde güvenlik ilkelerinin uygulanmasından sorumludur ve kullanıcıların; oturum açma,
parola değiştirme işlemlerinin doğrulanması bu process tarafından yapılan işlemlerdendir.
Böylece, lsass.exe process’inin .DMP uzantılı dump dosyası elde edilerek kurban makinede
bulunan kimlik bilgileri, başka makinelerde mimikatz aracı ile incelenebilir. Bunun için Out-
Minidump adlı cmdlet ile lsass.exe adlı process’in dump dosyasını elde edeceğiz.
Resim 68 – Out-Minidump cmdlet Kullanımı
Resim 68’ de görüldüğü üzere Import-Module ..out-minidump.ps1 komutu ile modül ekleme işlemini
gerçekleştirdik. Get-Process lsass komutu ile lsass.exe adlı process’i aldık ve pipe işareti ile bu process’i
Out-Minidump cmdlet ile çıktı olarak kullandık. Ardından lsass_720.dmp adlı dosyayı elde ettik. Ortaya
çıkan bu dosyanın adında bulunan 720 sayısı, lsass.exe process’inin ID değeridir.
Resim 69 – Farklı Bir Makinede dump Dosyasının İncelenmesi
5.6. Code Execution
5.6.1. ShellCode Execution
Shell kodları, çeşitli işlemlerin gerçekleşmesi için CPU tarafından çalıştırılan OP (Operation-İşlem)
kodlarıdır. OP kodları işlemci tarafından çalıştırılır ve işlemci tarafından işlem gerçekleştirilir.
ShellCode Execution ise, kurban makinada zararlı shell kodları çalıştırarak, sisteme sızmamız için
kullandığımız bir yöntemdir. Bunun için, karşı sistemde çalıştırmak üzere zararlı Shell kodları
oluşturulur, kurban makinaya gönderilir ve bu Shell kodların çalışmasıyla sisteme sızma işlemi
gerçekleştirilir. ShellCode Execution yöntemi için Invoke-ShellCode script’ini kullanacağız. Invoke-
ShellCode, PowerShell üzerinde Shell kodu çalıştırmamızı sağlar. Böylece bu cmdlet ile zararlı Shell
kodlarını kurban makinede çalıştırarak sisteme sızabiliriz.
İlk olarak msfvenom aracını kullanarak C# formatında bir payload oluşturacağız.
Oluşturacağımız bu payload ile sisteme sızmamız için gerekli bağlantıyı sağlayacak olan
Shell kodları, C# programlama dilinde byte tipinde bir buf adlı dizi değişkenine atanacaktır.
Böylece kurban makinede çalıştırmak için oluşan Shell kodları kullanacağız.
Resim 70 – ShellCode Oluşturma
Sonra, sisteme sızmak amacıyla, makinemizde metasploit aracını kullanarak dinleme
işlemi başlatacağız.
Resim 71 – Dinleme Modu
Almış olduğumuz Shell kodlarını Invoke-ShellCode ile birlikte çalıştırabilmek için,
PowerShell script dosyasına yerleştirebiliriz. Böylece bu dosyayı modül olarak ekleyip,
Shell kodları atadığımız $buf değişkenini kullanabiliriz.
Resim 72 – Shell Kodları
Shell kodlarını ekledikten sonra, Invoke-ShellCode modülünü ekleyerek,
Invoke-ShellCode –ShellCode @($buf)
komutu ile Shell kodlarını çalıştırıyoruz.
Resim 73 – Shell Kodlarını çalıştırma
Ardından saldırgan makinemizin dinleme moduna baktığımız zaman, kurban makine
üzerinde bir oturum açıldığını görmüş olacağız.
Resim 74 – Kurban makinede oturum açılması
Bu yöntem ile kurban makineye sızmamız için bağlantı oluşturan process, Shell kodları
çalıştırdığımız PowerShell uygulamasıdır. Bu nedenle meterpreter oturumunu elde ettikten sonra,
sistemde rahatça gezinmemize izin verecek bir process’e geçmemiz daha iyi olacaktır. Çünkü
kurban makinede çalıştırdığımız bu komut, kurban tarafından çalıştırılırsa, kurban komut satırında
hiçbir işlem gerçekleşmediğini görünce, komutun çalışmasını sonlandırabilir veya direk olarak
PowerShell uygulamasını kapatabilir. Bu durum bizim bağlantımızın kopmasına sebep olacaktır.
5.6.2. Dll Injection
DLL(Dynamic Link Library-Dinamik Link Kütüphanesi), Windows sistemlerde programların çalışması
için gerekli fonksiyonları barındıran kütüphanedir. Windows makinelerde çalışan process’ler DLL
içerisinde bulunan fonksiyonların yardımıyla çalışmaktadır. Buradan yola çıkarak bir process, bizim
oluşturduğumuz zararlı bir DLL ile çalıştırılabilir. Böylece zararlı DLL sisteme sızmamız için bize bir
bağlantı oluşturabilir.
Powershell üzerinde çalıştırmak için Invoke-DllInjection adında bir cmdlet bulunmaktadır. Bu
cmdlet ile bir process aracılığıyla dll dosyası çalıştırılır ve kurban makine üzerinde bir bağlantı
oluşturmuş oluruz.
Öncelikle msfvenom aracı ile .dll uzantılı zararlı bir DLL dosyası oluşturuyoruz.
Resim 75 – Zararlı DLL Oluşturma
Sonra, zararlı DLL çalıştırmak için Invoke-DllInjection.ps1 adlı script modülünü ekliyoruz.
Resim 76 – Invoke-DllInjection Modül Ekleme
Modül eklendikten sonra Invoke-DllInjection cmdlet oluşacaktır. Bu cmdlet ile bir process
yardımı ile zararlı DLL dosyamızı devreye sokacağız ve sızma işlemini gerçekleştireceğiz. Bunun
için 2 adet parametre bulunmaktadır. Birincisi –ProcessID parametresidir. Bu parametre ile
çalışan process ID’lerinden biri seçilir ve bu parametreye değer olarak atanır. İkinci parametre
ise DLL dosyası belirteceğimiz –dll parametresidir. Zararlı DLL dosyamızın
yolu bu parametreye değer olarak atanır.
o –ProcessID parametresine atacayacığımız process ID değerini belirliyoruz. Bunun
için çalışan process’lerden biri olan vmtoolsd.exe uygulamasının ID değerini
(1960) alıyoruz. Ardından –Dll parametresi için zararlı DLL dosyamızın (dll.dll) adını
alıyoruz.
Resim 77- Process ID
Resim 78 – Zararlı DLL Çalıştırma
Komutun çalıştırılmasıyla birlikte, vmtoolsd.exe aracının çalıştığı SYSTEM hesabının hak ve
yetkileri ile bir oturum açılacaktır ve sızma işlemi gerçekleşmiş olacaktır.
Resim 79 – Meterpreter Oturumu
NOT: Oluşturduğumuz zararlı DLL dosyası çalıştırma işlemi, sadece sisteme sızmak amaçlı
değil, daha çok hak yükseltme amaçlı kullanılmaktadır. Bir saldırgan sızdığı bir sistemde çalışan
process’lerin ID değerlerini ve hangi hesabın hak ve yetkileri ile çalıştığını anladıktan sonra,
yetkili bir hesabın hak ve yetkilerine sahip olabilmek için kurban makinede zararlı DLL dosyası
çalıştırabilir. Böylece yüksek hak ve yetkiler ile yeni bir oturum başlatılır.

More Related Content

PPTX
DerbyCon 2014 - Making BadUSB Work For You
PPTX
Solid State Drives (Third Generation) 2013
PPTX
Random access memory
PPTX
Just in Time and Lean Manufacturing
PPT
PPT
STORAGE DEVICES
PPT
Decision Support System
PPTX
Etl process in data warehouse
DerbyCon 2014 - Making BadUSB Work For You
Solid State Drives (Third Generation) 2013
Random access memory
Just in Time and Lean Manufacturing
STORAGE DEVICES
Decision Support System
Etl process in data warehouse

Similar to Powershell Nedir, Nasıl Çalışır, Temel PowerShell ve Ofansif Powershell (20)

PPTX
Bilgisayara Giris 2
PDF
Linux Komut Satırı
PDF
Temel Düzeyde MySQL ve PHP Eğitimleri 1
PPTX
Sunu (1)
PPT
Wordpress nedir
PPTX
PPTX
delphi xe5
PPTX
delphi
PDF
Web Uygulamalarında Kaynak Kod Analizi - 1
PDF
Abapgit kurulum kullanım
PDF
Silk Test Framework Kurulumu ve Yazılım Test Otomasyon Mimarisine Giriş
PDF
İleri Seviye T-SQL Programlama - Chapter 21
PPTX
Sunu (1)
PDF
Temel Düzeyde Visual Studio Eğitimleri
PPTX
Delphi Menu
PPTX
Menüler
PDF
Primeface
PPTX
Application Compatibility (Uygulama Uyumluluğu)
PDF
Sistemler Arası Dosya Nasıl Aktarılır? IIS ve FTP Kurulumu
PPTX
Bilgisayara Giris 2
Linux Komut Satırı
Temel Düzeyde MySQL ve PHP Eğitimleri 1
Sunu (1)
Wordpress nedir
delphi xe5
delphi
Web Uygulamalarında Kaynak Kod Analizi - 1
Abapgit kurulum kullanım
Silk Test Framework Kurulumu ve Yazılım Test Otomasyon Mimarisine Giriş
İleri Seviye T-SQL Programlama - Chapter 21
Sunu (1)
Temel Düzeyde Visual Studio Eğitimleri
Delphi Menu
Menüler
Primeface
Application Compatibility (Uygulama Uyumluluğu)
Sistemler Arası Dosya Nasıl Aktarılır? IIS ve FTP Kurulumu
Ad

Recently uploaded (8)

PPTX
Müşteri ilişkileri yönetimi kavramı, günümüz pazarlama anlayışının bir sonucu...
PDF
SONU TÜKETMEK KISA FİLM SENARYO AYRIMLAM
PPT
kurumsal eğitim Sekreterya Eğitim dosyası
PDF
9-1-1.pdf kimya bilimi simya dan kimyaya
PPTX
Düşünme, bireyin dil, zihinsel ve sosyal gelişimini sağlayan, öğrenmesine ve ...
PDF
9-1-2.pdf kimya disiplinleri ve çalışma alanları
PDF
9-1-1.pdf kimya bilimi simya dan kimyaya
PDF
Mimari ve İç Mimari Projelerde Mekanik Çözümler - Sn. Seher TÜNÇEL & Sn. Baha...
Müşteri ilişkileri yönetimi kavramı, günümüz pazarlama anlayışının bir sonucu...
SONU TÜKETMEK KISA FİLM SENARYO AYRIMLAM
kurumsal eğitim Sekreterya Eğitim dosyası
9-1-1.pdf kimya bilimi simya dan kimyaya
Düşünme, bireyin dil, zihinsel ve sosyal gelişimini sağlayan, öğrenmesine ve ...
9-1-2.pdf kimya disiplinleri ve çalışma alanları
9-1-1.pdf kimya bilimi simya dan kimyaya
Mimari ve İç Mimari Projelerde Mekanik Çözümler - Sn. Seher TÜNÇEL & Sn. Baha...
Ad

Powershell Nedir, Nasıl Çalışır, Temel PowerShell ve Ofansif Powershell

  • 1. POWERSHELL NEDİR, NASIL ÇALIŞIR,TEMEL POWERSHELL KULLANIMI ve OFANSİF POWERSHELL Ramin KARIMKHANI Cyber Security Intern Temmuz 2018
  • 2. 1. POWERSHELL NEDİR? Windows sistemler, GUI (Graphical User Interface – Kullanıcı Grafik Arayüzü) olarak adlandırılan , kullanıcılar için kullanım kolaylığı sağlayan arayüzü ön planda tutmaktadır. Ama bazı durumlarda sistemin derinlerine inmek ve derinliklerde işlem yapmak gerekebilir. Böyle durumlarda GUI kullanımı işleri karmaşıklaştırabilir. Linux sistemlerde bu gibi durumlarda sistem yöneticilerine kolaylık sağlaması için CLI (Command Line Interface) ön planda tutulmaktadır. CLI aracılığı ile Linux sistemler, çeşitli işlevsel komutlar ile sistemin yönetimini kolaylaştırır. Ayrıca GUI yerine, bir komut satırı uygulaması kullanılması, bellekten kazanç sağlar. Bu durumlardan mütevellit Windows Server ailesinde sistem yöneticileri tarafından kullanılmak üzere, 2006 yılında Windows Vista ile yeni bir fikir ortaya POWERSHELL adlı komut satırı dili PowerShell versiyon 1.0 olarak sunuldu. PowerShell, sistemin çeşitli komutlarla rahat bir şekilde kullanılmasını sağlar ve kullanıcılara geniş çaplı işlevsellik sunar. Örnek olarak PowerShell ile dizinleri listeleme, dosya oluşturma, dosya silme gibi basit işlemler yapılabilirken; Registry, Certificate Store gibi kayıt alanlarına da kolay bir şekilde erişim sağlanabilir. PowerShell ile bu tarz işlemlerin yapılması yazılan komutlara göre gerçekleşir. PowerShell, Windows 7 ve daha sonra gelen Windows işletim sistemi versiyonları ile entegreli bir şekilde gelirken; Windows XP, Windows 2003 ve Windows Vista işletim sistemlerinde sonradan kurularak kullanılma özelliğine sahiptir. Güncel olan Windows 10 gibi işletim sistemlerinde son sürüm olan PowerShell 5.0 versiyonu kullanılmaktadır. Tablo 1’de PowerShell sürümleri, çıkış tarihleri, varsayılan olarak kullanıldıkları işletim sistemi versiyonları ve hangi işletim sistemi versiyonlarında kullanılabileceği bilgileri yer almaktadır. Tablo 1 – PowerShell versiyonları PowerShell Çıkış Tarihi Varsayılan Windows İşletim Kullanılabilen Windows İşletim Versiyon Sistemi Versiyonu Sistemi Versiyonları PowerShell 1.0 Kasım 2006 Windows Server 2008 Windows XP SP2 Windows XP SP3 Windows Server 2003 SP1 Windows Server 2003 SP2 Windows Server 2003 R2 Windows Vista Windows Vista SP2 PowerShell 2.0 Ekim 2009 Windows 7 Windows XP SP3 Windows Server 2008 R2 Windows Server 2003 SP2 Windows Vista SP1 Windows Vista SP2 Windows Server 2008 SP1 Windows Server 2008 SP2 PowerShell 3.0 Eylül 2012 Windows 8 Windows 7 SP1 Windows Server 2012 Windows Server 2008 R2 SP1 Windows Server 2008 SP2 PowerShell 4.0 Ekim 2013 Windows 8.1 Windows 7 SP1 Windows Server 2012 R2 Windows Server 2008 R2 SP1 Windows Server 2012 PowerShell 5.0 Nisan 2014 Windows 10 Windows 8.1 Windows Server 2012 R2
  • 3. PowerShell .NET Framework kütüphanesini destekler. Sistemin yönetiminin ve denetlemelerinin otomatize edilmesine yardımcı olur. PowerShell .NET tabanlı bir platform olduğu için ve .NET kütüphanelerini desteklediği için, .NET komutlarını PowerShell uygulamasında kullanabilir ve bu komutları kullanarak PowerShell üzerinde küçük çaplı uygulamalar geliştirebiliriz. Böylece, GUI ile gerçekleştirebileceğimiz işlemleri bu işlevsellik sayesinde kısa sürede gerçekleştirebiliriz. PowerShell uygulamasının en önemli özelliklerinden biri tutarlı olmasıdır. Bu özelliği nitelendirecek olursak PowerShell uygulamasının çalıştırılan bir komutun başka komutlarında çıktısı olması özelliğinden bahsedebiliriz. Böylece tek bir komut içerisinde gerekli bağlayıcıları veya parametreleri kullanarak birden fazla yönetimsel işi yerine getirebiliriz.
  • 4. 2. POWERSHELL NASIL ÇALIŞIR? PowerShell, kullanıcılara sunulan komut satırı arayüzü üzerinde çalıştırılan komutlar ile çalışmaktadır. Bu komutlar cmdlet(command – let) olarak adlandırılır. Cmd komut satırı arayüzünde ve Linux sistemlerde kullanılan komut satırı arayüzünde çalıştırılan komutlar arka planda çalışan birer bağımsız uygulama iken, PowerShell komut satırı üzerinde çalışan komutlar bağımsız uygulama değil, .NET Framework sınıfları kullanılarak oluşturulan nesnelerdir. Böylelikle PowerShell, cmd.exe gibi uygulamalar için metin işleme araçlarını kullanmaz. Onun yerine nesne manipülasyon komutlarını kullanarak istenilen yere erişim sağlar. PowerShell kullanıcıyı, varsayılan olarak bulunan cmdlet’ler ile sınırlamaz. İstenildiği takdirde varsayılan olarak bulunmayan farklı cmdlet’ler eklenebilir. Ayrıca PowerShell üzerinde sadece cmdlet’ler değil, cmd.exe ve UNIX tabanlı komutlar da çalıştırılabilir. PowerShell üzerinde, PowerShell’den bağımsız olan uygulamalar da çalıştırılabilir. Örnek olarak bir cmd.exe uygulamasını PowerShell üzerinden çalıştırabiliriz. Fakat cmd.exe uygulamasının PowerShell üzerinden başlatılması sadece PowerShell’in uygulama çalıştırması ile alakalı bir durumdur. Bu özelliğin dışında PowerShell cmd.exe uygulamasının çalışmasını etkilemez. Sadece uygulamayı başlatır ve kullanıcı tarafından cmd.exe uygulaması, PowerShell’den bağımsız bir şekilde çalışır. PowerShell uygulamasında kullanılan cmdlet’ler, .NET Framework tabanlı çalışan C# programlama diline benzemektedir. C# programlama dili ile uygulama geliştirmiş olan kullanıcılar bu benzerliği farkedebilmektedir. Fakat bu durum PowerShell cmdlet kullanımı için C# programlama dili bilgisi gerektirmez. C# programlama dili ile uygulama geliştirmemiş olan bir kullanıcı bile, PowerShell üzerinde kolay bir şekilde cmdlet kullanabilir. 2.1. TEMEL POWERSHELL CMDLET PowerShell kullanımının cmdlet ile gerçekleştiğinden üst kısımda bahsettik. Bu bölümde ise, PowerShell kullanılmak için çalıştırılan temel cmdlet’lere değineceğiz. PowerShell kullanıcılara kolay kullanım ve tutarlılık sunmaktadır. Örneğin, bir cmdlet çalıştırdığımız zaman, bu cmdlet genişletilerek benzer işlemler için de kullanılabilir ve tutarlılık sağlar. Kolay kullanımın ve tutarlılığın sağlanması cmdlet yapısından gelmektedir. Cmdletlerin tümü verb-noun yapısı ile çalışır. Yani yapılacak işlemin fiil kökü yazılır, tire işareti konulur ve fiil hangi işlemi yapacaksa o işlemin ismi yazılır. Bu yapıyı test etmek için öncelikle PowerShell komut satırını çalıştırmalıyız. PowerShell farklı yöntemler ile çalıştırılabilir. Örneğin; bir cmd.exe uygulaması çalıştırılıp komut satırına PowerShell yazılabilir, C:WindowsSystem32WindowsPowerShellv1.0 lokasyonuna gidilerek PowerShell.exe uygulaması ile çalıştırılabilir ya da Win Key+R tuşları ile ‘Çalıştır’ uygulamasına PowerShell yazılarak çalıştırılabilir vs. PowerShell uygulamasını çalıştırdığımız zaman karşımıza mavi renkte bir arayüz gelecektir. Win Key+R tuşları ile ‘Çalıştır’ uygulamasına PowerShell yazarak uygulamayı çalıştırıyoruz. Resim 1 - PowerShell uygulaması çalıştırma
  • 5. Resim 1’ de görüldüğü üzere PowerShell uygulamasını çalıştırmak için ‘Çalıştır’ uygulamasına PowerShell yazdıktan sonra, ‘OK’ butonuna basarak uygulamayı çalıştırıyoruz. Resim 2 - PowerShell arayüzü Resim 2’de görüldüğü üzere, PowerShell uygulaması çalıştı ve arayüz ekranı karşımıza geldi. Ardından cmdlet yazarak örnekler yapacağız. PowerShell üzerinde çalışan bir çok cmdlet bulunmaktadır. Bunları görebilmek adına komut satırına ‘Get-Command’ yazıyoruz. Resim 3 - Tüm komutlar Resim 3’de görüldüğü üzere cmdlet çalıştırdık ve tüm cmdletlerin çıktısını aldık. Resmin görünmeyen kısmıyla beraber yüzlerce cmdlet karşımıza çıkacaktır. Aynı zamanda bu komutu çalıştırarak verb-noun yapısını da görmüş olduk. Tüm komutları almak istediğimiz için almak anlamına gelen Get fiilini yazdık ve tire işareti koyarak komutları almak istediğimiz için Command yazdık ve istediğimiz çıktıyı cmdlet kullanarak PowerShell aracılığı ile elde ettik.
  • 6. PowerShell cmdletlerinin tutarlılığına bir örnek verecek olursak, ilk örneğimizde kullandığımız bir cmdlet olan ‘Get-Command’ komutunu detaylandırabiliriz. Örneğin ben komut almak istersem, fakat almak istediğim komutlar tüm komutlar değilde belirli komutlar ise, bu cmdlet genişletilebilir ve bu işlem için çok daha farklı bir cmdlet kullanmaya gerek kalmaz. Süreçler ile ilgili komutları istediğimizi varsayacak olursak ‘-Noun Process’ parametresiyle, süreçler ile ilgili komutları elde edebiliriz. Resim 4 - Tutarlılık Resim 4’de görüldüğü üzere parametre eklenerek sadece süreçler (process) ile ilgili komutları elde ettik. PowerShell ile UNIX ve cmd.exe tabanlı komutları çalıştırabileceğimizden bahsettik. Örneğin dosya listeleme işlemini gerçekleştirmek için, UNIX tabanlı ‘ls’ ve cmd.exe tabanlı ‘dir’ komutlarını çalıştıracağız. Öncelikle, PowerShell uygulamasının cmd.exe uygulamasına göre daha işlevsel olduğunu da test etmek için, bu iki komutu cmd.exe uygulamasında çalıştıralım. Resim 5 - cmd.exe Üzerinde Komut Çalıştırma Resim 5’de görüldüğü üzere, cmd.exe uygulamasının desteklediği ‘dir’ komutunu yazdık ve çalıştırdık. Bu komut sayesinde bulunduğumuz dizindeki tüm dosyalar ve dizinler listelendi. Fakat
  • 7. UNIX tabanlı ‘ls’ komutunu çalıştırdığımızda ise hata ile karşılaştık. Çünkü cmd.exe UNIX tabanlı komutları desteklememektedir. Aynı komutları PowerShell üzerinde de çalıştıralım. Resim 6 - PowerShell üzerinde cmd.exe ve UNIX tabanlı komutlar Resim 6’da görüldüğü üzere, PowerShell uygulaması cmd.exe ve UNIX tabanlı komutları desteklediğinden dolayı, dir ve ls komutlarını çalıştırdı. PowerShell üzerinde çalıştırılan komutlara örnek olarak dizin/dosya oluşturma işlemini gerçekleştirebiliriz. PowerShell üzerinde çalışan komutlar geniş kapsamlıdır. Yani bir cmdlet aldığı farklı parametrelerle birçok işlemi gerçekleştirebilir. Buna örnek olarak bir dizin/dosya oluşturmak için New-Item cmdletini kullanacağız. Adı üzerinde yeni bir item oluşturmak için New-Item kullanılır. Dolayısıyla bu cmdlet yalnızca dizin/dosya oluşturmak ile kısıtlı değildir. Yeni bir dizin/dosya oluşturmak için öncelikle New-Item yazılır. Devamında dizin/dosya adını belirlemek için –Name parametresi kullanılır. Dizinin/dosyanın oluşturulacağı dizinin yolunun belirtilmesi için –Path parametresi kullanılır. Oluşturulacak dizinin/dosyanın tipinin belirlenmesi için –ItemType parametresi kullanılır. Resim 7’de örnek gösterilmektedir.
  • 8. Resim 7 - Dosya Oluşturma Resim 7’ de görüldüğü üzere gerekli parametreler ile New-Item cmdlet kullanılarak a.txt adında bir dosya oluştu. –Path parametresine ‘.’ Değeri atayarak oluşturulacak dosyanın bulunduğumuz dizinde oluşturulacağını belirttik (Bulunduğumuz dizinde bir dosya oluşturmak için –Path parametresi kullanmak şart değildir.). –Name ile dosyanın adını ‘a.txt’ olarak belirttik ve – ItemType parametresine ‘file’ değerini atayarak oluşturulacak nesnenin bir dosya olduğunu belirledik. Böylece a.txt adlı dosya oluştu. PowerShell ile ‘Get-Help’ cmdlet kullanılarak farklı cmdletlerin nasıl çalıştığı hakkında yardım alınabilir. Örnek olarak ‘Get-Help New-Item’ komutu ile New-Item cmdlet hakkında yardım alabiliriz. Resim 8 - Get-Help cmdlet
  • 9. PowerShell ile bir dizini/dosyayı farklı bir dizine kopyalayabiliriz. Bunun için ‘Copy-Item’ cmdlet kullanılır. Bu cmdletin devamında dosyanın yolu, kopyalanacak hedefin belirtilmesi için – Destination parametresi ile kopyalama işlemi yapılacak dizinin yolu belirtilir. Eğer dizin kopyalama işlemi gerçekleştirilecekse –Recurse parametresi kullanılır. Bu parametrenin kullanılma amacı, dizini içerisinde bulunan dosya ve dizinlerle beraber kopyalamaktır. Resim 9 – Copy-Item cmdlet Resim 9’da görüldüğü üzere C:UsersAdministrator dizininde bulunan a.txt adlı dosyayı, hedef olarak belirttiğimiz C:Users dizinine kopyaladık. Aynı işlem dizin kopyalama işlemi için gerçekleştirilebilir. Resim 10 – Dizin kopyalama Resim 10’da görüldüğü üzere C:UsersAdministrator dizini içerisinde ‘dizin’ adlı bir dizin bulunmaktadır ve bu dizin içerisinde ‘dosya.txt’ adlı bir dosya bulunmaktadır. Bu dizini kopyalamak için Copy-Item cmdlet kullandık ve dikkat ederseniz, -Recurse parametresini kullanmadık. Böylece, C:Users dizinine ‘dizin’ adlı dizin kopyalandı fakat, ls komutu ile dizinin içeriğini görüntülediğimiz zaman hiçbir sonuç alamadık. Çünkü –Recurse parametresi kullanılmadığı için sadece dizinin kendisi kopyalandı.
  • 10. Resim 11 – Recurse parametresi ile dizin kopyalama Resim 11’de görüldüğü üzere bu kez –Recurse parametresi kullandık ve kopyalanan ‘dizin’ adlı dizin, içerisinde bulunan ‘dosya.txt’ adlı dosya ile birlikte kopyalandı. PowerShell ile dizin kopyalama işlemini yaptığımız gibi, taşıma işlemi de gerçekleştirebiliriz. Bu işlem için ‘Move-Item’ cmdlet kullanılır. Copy-Item ile çok benzer olan bu cmdlet, taşıma işlemi için – Destination ve bir dizini içeriği ile beraber taşımak için –Recurse parametrelerini kullanır. PowerShell ile oluşturduğumuz bir dizinin/dosyanın adını değiştirebiliriz. Bunun için Rename-Item cmdlet kullanılır. Resim 12 – Rename-Item Resim 12’de görüldüğü üzere Rename-Item cmdlet ile dosya.txt adlı dosyanın adını DOSYA.txt olarak değiştirdik
  • 11. Resim 13 – Move-Item cmdlet Resim 13’de görüldüğü üzere, C:Usersdizin yolu ile belirtilen dizin içerisinde bulunan ‘dosya.txt’ adlı dosya, C:UsersAdministratorDesktop yolu ile belirtilen dizin içerisine taşındı. Temel işlemlere değinmeye devam edecek olursak, PowerShell üzerinde çalışan ‘Remove-Item’ cmdlet ile dizin/dosya silmekten bahsedebiliriz. Resim 14 – Remove-Item cmdlet Resim 14’te görüldüğü üzere, Remove-Item cmdlet ile ‘dosya.txt’ adlı dosyayı sildik.
  • 12. Bahsetmiş olduğumuz bu cmdletleri göstermek amaçlı yapılan örneklerde, dizin içeriği listeleme amacı ile ‘ls’ adlı UNIX tabanlı bir komut kullandık. Aslında dizin listelemek için bir cmdlet olan ‘Get-ChildItem’ kullanılır. Resim 15 – Get-ChildItem cmdlet Resim 15’te görüldüğü üzere bulunduğumuz dizinin içeriğini listeletmiş olduk. PowerShell ile, oluşturmuş olduğumuz ‘.txt’ uzantılı gibi olan metin dosyalarının içeriğini çıktı olarak bastırabiliriz. Bunun için ‘Get-Content’ cmdlet kullanılır. Resim 16 - .txt dosyası Resim 16’da görüldüğü üzere, Notepad metin editörü ile dosya.txt adlı dosyayı açtık ve içerisinde ‘Selamlar’ yazdığını görmüş olduk. Şimdi dosya.txt adlı dosyanın içeriğini Get-Content cmdlet ile görüntüleyelim.
  • 13. Resim 17 – Get-Content cmdlet Resim 17’de görüldüğü üzere dosya.txt içerisinde yazan metni yazdırdık. PowerShell uygulamasının işlevselliğinden bahsettik. PowerShell’in işlevsel olmasının sebebi tek satırda birçok işlem yapabilmemizi sağlamasından dolayıdır. Pipeline işareti ( | ) bu işlevselliğin örneklerindendir. Pipeline ile bir satırda birden fazla cmdlet çalıştırılabilir ve sol taraftan itibaren yazılarak gelen komutlar, pipeline işaretinden sonra gelen komutların çıktısı olarak işlev gösterir. Resim 9’ da pipeline işareti ile ilgili bir örnek bulunmaktadır. Resim 18 - Pipeline kullanımı Resim 18’i inceleyecek olursak, öncelikle dosya ve dizinleri listelemek için ls komutunu çalıştırdık. Ardından, sadece Mode sütununa ait verileri listelemek için ls komutundan sonra pipeline işareti koyarak ‘Select-Object Mode’ komutunu yazdık ve böylece en sol tarafta dizinleri listelemek için yazdığımız ls komutunun çıktıları, pipeline işaretinden sonra gelen Select-Object cmdlet’i için girdi oldu ve Select-Object cmdlet’i Mode değerini alarak, ls komutu çıktısı için sadece Mode sütununun çıktılarını gösterdi.
  • 14. PowerShell üzerinde, cmdlet atamak amacı ile ‘$’ ile başlayan değişkenler kullanılabilir. Örneğin, çok fazla kullanacağımız bir komutu defalarca yazmak yerine, ‘$’ ile başlayan bir değişkene atıp, bu değişken ile komut çalıştırabiliriz. Resim 19 – Değişken kullanımı Resim 19’ da görüldüğü üzere, ‘$listele’ adında bir değişken oluşturduk. Değişkene Get-ChildItem cmdlet atadık. Ardından komut satırına $listele yazıp çalıştırdık ve Get-ChildItem cmdletinin çalıştığını gördük. PowerShell ile değişkenlere cmdlet atamak dışında, örnek olarak bir veri kümesi yerleştirip, bu kümede bulunan elemanları listeleyebiliriz. Resim 20 – Değişken kullanımı Resim 20’de görüldüğü üzere $kume adlı bir değişken tanımladık ve bu değişkene bir veri kümesi atadık. Ardından pipeline işaretinin arkasından, sort komutu ile verileri alt alta sıralı bir şekilde listeledik. Bu listeleme için sort terimi yerine Sort-Object cmdlet de kullanılabilir.
  • 15. PowerShell’de kendi belirlediğimiz değişkenlerle birlikte, varsayılan olarak bulunan ‘$’ işareti ile başlayan özel değişkenlerde vardır. Bu değişkenler PowerShell ile ilgili bilgileri depolamak amaçlı kullanılır. PowerShell ile ilgili bir bilgi alınmak istendiği zaman bu değişkenler kullanılabilir. Resim 21 – Özel Değişkenler Resim 21’de birkaç özel değişken örneği yaptık ve çıktılar elde ettik. Bu örnekte; $PID değişkeni PowerShell uygulamasının process ID değerini, $PSHOME PowerShell uygulamasının kurulu olduğu dizin yolunu ve $HOME ise kullanıcı dizininin yolunu belirtir. Bu değişkenler PowerShell üzerinde script çalıştırmak ya da cmdletlere yardımcı olmak amaçlı olarakta kullanılabilirler. Bu değişkenler örnekte gösterildiği gibi 3 adetle sınırlı değil, oldukça fazladır. Bu değişkenlerin ne olduğunu ve ne işe yaradıklarını https://www.tutorialspoint.com/PowerShell/PowerShell_special_variables.htm linkine gidip okuyabilirsiniz. PowerShell üzerinde, script yazıp çalıştırılabileceğimizden bahsettik. Buna örnek olarak PowerShell komut satırı üzerinde bir döngü işlemi gerçekleştirebiliriz. Resim 22 – For Döngüsü Resim 22’de görüldüğü üzere, PowerShell üzerinde 1’den 10’a kadar yazdıran bir for döngüsü çalıştırdık. PowerShell üzerinde script çalıştırabilmek için, PowerShell komut satırına kod yazmak ile birlikte, .ps1 uzantılı bir dosya oluşturularak scriptler bu dosya içerisine yazılır ve PowerShell üzerinde çalıştırılabilir. Çünkü, satır sayısı fazla olacak olan ya da daha sonra da kullanabilmek amacı ile
  • 16. saklayabileceğimiz scriptler oluşturmak istersek, .ps1 uzantılı bir dosya içerisine script yazmak daha uygun olacaktır. Resim 23 – Script dosyası çalıştırma Resim 23’de görüldüğü üzere bir script dosyası çalıştırdık. Bu dosyayı çalıştırmak için hata almamak adına, öncelikle ‘Set-ExecutionPolicy RemoteSigned’ komutunu çalıştırarak, çalıştırma politikasını değiştirmemiz gerekmektedir. Ardından script kodumuzu görüntülemek amacı ile ‘Get-Content .selam.ps1’ yazarak, script dosyamızın içeriğini görüntüledik. Oluşturmuş olduğumuz bu script dosyasında bulunan kodlar, PowerShell komut satırına 6 defa ‘Selam’ yazdıracaktır. Son olarak .selam.ps1 yazarak script dosyamızı çalıştırdık ve ekran çıktısını aldık. PowerShell ile Registry ya da Certificate Store gibi kayıt alanlarına erişebileceğimizi söylemiştik. Bu erişim işlemi fazla zahmetli değildir. Örnek olarak PowerShell üzerinden Registry kayıt alanına erişmek istediğimizi varsayalım. Registry içerisinde anahtarlar, hiyerarşik dizin yapısında bulunan dizinlerde tutulur. Dolayısıyla PowerShell üzerinden Registry kayıt alanına normal bir dizine erişir gibi erişebiliriz. Resim 24 – Registry Erişim Resim 24’te görüldüğü üzere, HKEY_LOCAL_MACHINE dizinine erişebilmek için, cd ya da Set- Location cmdlet ile erişeceğim Registry dizin yolunu belirtmemiz yeterli olacaktır. Ardından PowerShell üzerinden Registry yönetimi gerçekleştirilebilir.
  • 17. 3. POWERSHELL REMOTING PowerShell uygulaması, uzak sistemlere erişmek için de kullanılabilir. PowerShell v2.0 ile uzak erişim özelliği geliştirildi. Bu özellik sayesinde, kullandığımız Windows sistemin PowerShell uygulaması ile erişmek istediğimiz makineye bağlanabiliriz ve o makineyi yönetebiliriz. Bunun için RDP (Remote Desktop Protocol – Uzak Masaüstü Protokolü) aracılığı ile erişmek istediğimiz makineye bağlanıp, o makine üzerinde PowerShell uygulaması çalıştırma gibi bir durum söz konusu değildir. PowerShell, erişilmek istenen makieneye SSH ile bağlanır gibi bağlanmamızı sağlar. Bu bağlantının gerçekleştirilebilmesi için kendi makinemizin ve erişmek istediğimiz makinenin Windows Remote Management(WinRM) servisi çalışıyor durumda olmalıdır. Eğer çalışmıyor ise Enable-PSRemoting cmdlet ile bu özellik aktif edilebilir. PowerShell uygulamasının komut satırına bu cmdleti yazarak, Windows Remote Management servisini aktif hale getirebiliriz. Ayrıca Güvenlik Duvarı ayarları üzerinden de bu özellik aktif edilmelidir. Aksi takdirde güvenlik duvarı bağlantıya izin vermeyecektir. Resim 25 – Windows Remote Management Servisini Aktif Etme Resim 25’te görüldüğü üzere, WinRM servisini aktif ettik. Bu sayede erişim sağlamak istediğimiz makine ile bağlantı kurma işlemini gerçekleştirebiliriz. Resim 26 – PowerShell Remoting Çalışma Yapısı Resim 26’da PowerShell Remoting çalışma altyapısı görülmektedir. Bu yapıya göre, 1. Sol tarafta bulunan bilgisayar, kendi içinde WSMan (Web Services for Management – Yönetim için Web Hizmetleri) adlı protokol ile iletişime geçer. WSMan bu şablonda, uzak erişim özelliğinin kullanılmasını sağlayacak olan, HTTPS tabanlı bir protokoldür. 2. Sunucu bilgisayarda, istemciden gelecek olan uzak erişim isteği için, WinRM servisi çalışır ve dinleme modunda olarak WSMan trafiği bekler. 3. WinRM dinleyicileri, istemci tarafından WSMan trafiği aldığı an, istemci bilgisayar için sunucu bilgisayarda PowerShell oturumu başlayacaktır. Bu oturumun açılması ise sunucu bilgisayarda wsmprovhost.exe adlı process’in çalışması anlamına gelir.
  • 18. Karşı makineye PowerShell üzerinden bağlanmamız için, bağlantıya geçecek olan iki makinenin de bir takım özelliklerinin aktif olması gerekmektedir. İlk olarak iki makine üzerinde de, karşılıklı iletişimin sağlanması için, güvenlik duvarının uzak bağlantıya izin vermesi gerekmektedir. Resim 27 – Firewall Uzak Erişim İzni Güvenlik duvarı ile izin verdikten sonra, PowerShell uygulamasını açacağız ve iki makine için de Enable-PSRemoting cmdlet ile PowerShell ile uzak bağlantı kurmayı aktif edeceğiz. Bu cmdleti çalıştırdıktan sonra onay vermemiz gereken sorular gelecektir. Bu sorularla karşılaşmayıp tümünü onaylamak adına cmdlet ile beraber –Force parametresi kullanılabilir. Resim 28 – PowerShell Uzak Erişim Özellik aktif edildikten sonra, bağlantı kurulacak makine ile bizim makinemiz arasında, WSMan protokolü için güven ilişkisi kurulması gerekmektedir. Bunun için Set-Item cmdlet ile WSMan protokol dizinine gidip, wsman:localhostclient dizini altında bulunan trustedhosts değerinin, iletişim kurulacak makinenin IP adresi olarak belirlenmesi gerekmektedir. Eğer tüm istemcilerle iletişim kurulmasına izin verilmek isteniyorsa ‘*’ işareti kullanılmalıdır. Diğer durumlarda iletişim kurulacak makinelerin IP adresleri, aralarına virgül işareti konularak girilmelidir.
  • 19. Resim 29 – Güvenilir Adresler Bu işlemlerin ardından değişikliklerden istifade edebilmek için WinRM servisini yeniden başlatmamız gerekmektedir. Bunun için Restart-Service WinRM komutunu kullanacağız. Resim 30 – Servisi Yeniden Başlatma Servisi yeniden başlattıktan sonra, bağlantının test edilmesi için Test-WSMan cmdlet kullanılmaktadır. Bu cmdlet ile WSMan protokolü aracılığı ile bağlantı gerçekleşip gerçekleşmeyeceği kontrol edilir. Resim 31’ de görüldüğü gibi bir çıktı alınırsa bağlantı olduğu anlamına gelmektedir. Resim 31 – WSMan kontrolü Son olarak makine ile bağlantı kurmak için Enter-PSSession cmdlet kullanacağız. Bağlanacağımız makinenin IP adresini belirlemek için –ComputerName, kullanıcı adını belirlemek için –Credential parametresini kullanacağız. Resim 32 – Bağlantı Kurma
  • 20. Resim 32’ de görülen komutu çalıştırdıktan sonra bizden, karşı makineye bağlanacağımız hesabın parola bilgisini isteyecektir. Bu parolayı doğru bir şekilde girdikten sonra bağlantı sağlanacaktır. Resim 33 – Kimlik Bilgileri Resim 34 – Uzak Bağlantı Resim 34’te görüldüğü üzere karşı makinemiz, 192.168.222.143 IP adresli makineye bağlandık. Bu bağlantı süreci, biz bağlantıyı kesene kadar sürecektir.
  • 21. 4. EXECUTION POLICY Execution policy, PowerShell’in hangi koşullarda çalışması gerektiğini belirleyen kurallardır. Execution policy, kullanıcıların sistem üzerinde çalıştıracakları yanlış bir scriptin ya da sistemin başka bir tarafını olumsuz etkileyebilecek bir scriptin, sisteme vereceği zararları önlemek amacı ile ortaya çıkmıştır.. ‘Get-ExecutionPolicy’ cmdlet ile çalışma politikasını görüntüleyebilirsiniz ve ‘Set- ExecutionPolicy <<Politika>>’ komutu ile politikayı değiştirebilirsiniz. Execution Policy’nin çeşitli politikaları bulunmaktadır. 4.1. Restricted En güvenilir politika olarak ‘Restricted’ kabul edilir. Çünkü, Restricted politikası PowerShell kullanımı ve tek satırlık komutlar çalıştırma dışında, script çalıştırılmasına izin vermez. Windows 2012 R2 ve Windows Server 2016 işletim sistemi versiyonları dışındaki tüm versiyonlarda varsayılan çalışma politikasıdır. 4.2. AllSigned Bu politika ile sadece güvenilir otoriteler tarafından imzalanmış olan scriptlerin çalıştırılmasına izin verilir. Scriptler çalıştırılmadan önce onay istenir. 4.3. RemoteSigned RemoteSigned politikası ile bizim oluşturduğumuz scriptler çalıştırılır. İnternet üzerinden indirilen scriptlerin çalışması için güvenilir otoriteler tarafından imzalı olması gerekmektedir. 4.4. Unrestricted Unrestricted politikası, scriptlerin çalışması için imza kontrolü yapmaz ve kısıtlama koymaz. Yalnızca internetten indirilen scriptler çalıştırıldığı zaman uyarı verecektir. 4.5. Bypass Bypass politikası, en güvensiz politika diyebileceğimiz bir politikadır. Bu politika uyarı vermez, onay istemez ve her türlü scriptin çalışmasına izin verir. 4.6. Undefined Undefined, herhangi bir politika atanmadığı durumlarda, varsayılan olaral Restricted politikasının atanmasıdır.
  • 22. Resim 35 – Politika Seçimi
  • 23. 5. POWERSHELL ile SALDIRGAN YAKLAŞIM PowerShell’in ortaya çıkması ile birlikte, sistem yöneticileri için kolaylık sağlayan bu dil, sunduğu imkanlar ile saldırganların da gözdesi olmuştur. Çünkü PowerShell ile, sistem yönetimi derinlemesine yapılabilmektedir ve saldırganlar PowerShell kullanarak, sistemi derinden mahvedebilirler. Saldırganların PowerShell kullanma nedenlerine kısaca değinecek olursak: 1. PowerShell Remoting özelliğinin aktif olduğu sistemlere direk erişim gerçekleştirebiliriz. 2. Hedef üzerinde az iz bırakmamızı sağlar. 3. Oluşturduğumuz scriptler için obfuscation(gizleme) özelliği sağlar ve tespit edilme olasılığının düşmesini sağlar. 4. Hak yükseltme (Privilege Escalation) yapılabilir. 5. Kimlikler (Credentials) çalınabilir. 6. Ağ üzerindeki diğer hedeflere atlanabilir. 7. Sistemde kalıcılık sağlanabilir. 8. Sistemin işleyişi bozulabilir. Bu özellikler sadece PowerShell ile saldırgan yaklaşıma, çok çok az sayıda birer örnektir. Bu özellikler daha da artırılabilir. 5.1. Execution Policy Execution Policy scriptlerin çalıştırılmasından sorumludur. Eğer bir sisteme sızılıp, bu sistem üzerinde PowerShell çalıştırılırsa, PowerShell üzerinde script çalıştırabilmemiz için, çalışma politikası Bypass olarak ayarlanabilir. Böylece çalıştırmak istenilen scriptler hiçbir kısıtlama olmadan çalıştırılabilir. Resim 36 – Execution Policy 5.2. Base64 Encode PowerShell ile çalıştırılacak olan her bir cmdlet ve çalıştırılacak olan scriptler Base64 ile kodlanarak, çalıştırılmak istenen zararlı komutlar gizlenebilir.
  • 24. Resim 37 – Base64 Encode Resim 37’da bir metnin nasıl Base64 ile kodlandığına dair örnek yaptık. İlk olarak $cmdlet adlı bir değişken tanımladık ve Base64 ile kodlamak istediğimiz Get-ExecutionPolicy cmdleti değişkene atadık. Sonra, System.Text.Encoding adlı sınıfta bulunan, Unicode sınıfının GetBytes fonksiyonu ile $cmdlet değişkeninin her bir karakterini kodlanacak şekilde, $EncodeText değişkenine atadık. Ardından Convert sınıfından, ToBase64String fonksiyonu ile $EncodeText değişkenini Base64 ile kodladık ve $EncodeCmdlet değişkenine atadık. Son olarak, $EncodeCmdlet değişkenini yazıp çalıştırdık ve ‘Get-ExecutionPolicy’ cmdletinin Base64 ile kodlanmış halini elde ettik. Resim 38 – Base64 Kod Kullanımı Resim 38’de görüldüğü üzere PowerShell (PowerShell, kendi içerisinde çalıştırılabilir ve parametreler alabilir.) uygulamasının –enc (encode) parametresi ile $EncodeCmdlet adlı cmdleti kullanarak, Get-ExecutionPolicy cmdleti çalıştırdık ve Execution Policy olarak ayarlanmış ‘Restricted’ değerini ekranda gördük. Base64 ile oluşturduğumuz bir zararlı scripti encode edip karşı tarafta çalıştırabiliriz. Buna örnek olarak, 64 bit mimarili bir Windows 7 makine üzerinde, Base64 ile encode edilmiş bir zararlı script çalıştıracağız ve Ubuntu makinemizle, Windows 7 makineye PowerShell ile bağlanacağız. Sızma işlemi adımları aşağıda maddelenmiştir: İlk olarak sızacağımız makinenin, Execution Policy değerine bakıyoruz ve ‘Restricted’ olduğunu görüyoruz. Resim 39 – Windows 7 Execution Policy
  • 25. Ubuntu makinemizde, msfvenom aracı ile Resim 39 ‘da görülen seçili komutu çalıştırarak, ps.ps1 adında bir zararlı script oluşturuyoruz. Resim 40 – Zararlı Script Oluşturma Resim 40’ta görüldüğü üzere, zararlı scriptin içeriğini görüntüledik. Bu script ile ilgili detaylardan bahsedecek olursak: o Bu script bir powershell komutu çalıştırmaktadır. Komuta göre –nop parametresi “no profile” anlamına gelmektedir ve o an aktif olan kullanıcının profilinin yüklenmemesi için kullanılır. o –w parametresi “window” anlamına gelmektedir. –w parametresine verilen hidden değeri ile, komut çalıştığı an powershell penceresi gizlenecektir ve arka planda çalışmasına devam edecektir. o -noni parametresi “non-interactive” anlamına gelmektedir. Script kodlarının sadece tek satır halinde powershell komut satırı uygulaması üzerinde çalıştırılması interaktif mod olarak adlandırılır. Bu moddan çıkmak için –noni parametresi kullanılır. o –ep parametresi ise, script kodlarımızı çalıştırabilmemiz için kural sağlamak adına kullanılır ve bir önceki bölümde bahsettiğimiz “execution policy” anlamına gelmektedir. –ep parametresine Bypass değerini vererek, script çalışma politikasını tamamen ortadan kaldırarak her türlü scriptin çalışmasına izin verebiliriz. o Gizli kod için ise objeleri inceleyecek olursak:  IO.StreamReader ile tüm script akışı okunur.   IO.Compression.GzipStream ile akış sıkıştırılır.   IO.MemoryStream ile akış hafızaya alınır.   [Convert]::FromBase64String ile hafızaya alınan encode edilmiş gizli script,  Convert namespace içerisinde bulunan FromBase64String fonksiyonu ile çözülür.   Son kısımda bulunan [IO.Compression.CompressionMode]::Decompress ile sıkıştırılan akış açılır.   ReadToEnd() fonksiyonu ise tüm script akışının baştan sona kadar okunmasını sağlar.  Böylece, msfvenom ile oluşturulmuş zararlı script çalışmaya başladığında, kurban makineye sızmamız için bir bağlantı sağlayacaktır. Kurban makinede, zararlı scriptimizi çalıştırmak için Base64 ile encode edeceğiz. Bunun için internet üzerinden bir web sitesinde, kodumuzu Unicode olarak Base64 ile encode
  • 26. ediyoruz. Böylece kurban makineye gönderdiğimiz scriptin yapısının bozulmadan çalışmasını sağlayabiliriz. Resim 41 – Base64 ile Zararlı Script Encode Etme Elde ettiğimiz kodları kurban makinede çalıştıracağız. Fakat bu işlemden önce Ubuntu makinede dinleme modu başlatmamız gerekecektir. Bu işlem için metasploit framework çalıştıracağız. Çalıştırdıktan sonra dinleme modu için, exploit/multi/handler modülünü kullanacağız. Resim 42 – Metasploit Framework Dinleme işlemini başlatmak için payload kullanmamız gerekmektedir. Zararlı script oluştururken payload olarak windows/x64/PowerShell_reverse_tcp kullandık. Bu payload, kurban makineye bağlandığımızda, o makine üzerinde işlemler gerçekleştirebilmek için
  • 27. PowerShell oturumu başlatacaktır. Bu payload seçildikten sonra, zararlı script LHOST ve LPORT parametrelerine atadığımız yerel IP adresi ve port değerlerini, tekrar bu payload için LHOST ve LPORT parametrelerine atamamız gerekmektedir. Resim 43 – Payload Seçimi Bu işlemden sonra dinleme modunu exploit komutu ile başlatıyoruz. Resim 44 – Dinleme Modu Encode edilmiş scripti kurban makinede çalıştırıyoruz.
  • 28. Resim 45 – Script Çalıştırma Script çalıştıktan sonra Ubuntu makinemizde, kurban makineyi kontrol edebilmek için PowerShell oturumu açılacaktır. Bu oturum açıldıktan sonra, kurban makineyi PowerShell üzerinden çeşitli cmdletler ya da scriptler ile kontrol edebiliriz. Resim 46 – PowerShell oturumu Resim 47 – PowerSploit Import-Module cmdlet
  • 29. 5.3. Hak Yükseltme (Privilege Escalation) Hak yükseltme, sınırlı yetkilere sahip kullanıcı hesaplarıyla sızılmış bir sistemde, bu sınırlı yetkileri artırmak amaçlı kullanılan bir yöntemdir. Hak yükseltme işlemi için çeşitli yöntemler mevcuttur. Örneğin, Windows sistemlerde UAC (User Account Control – Kullanıcı Hesap Denetimi) koruması altında olan bir sisteme sızıldıktan sonra, UAC koruması bypass edilerek, UAC kısıtlamaları aşılabilir ve kısıtlanan yetkiler kullanılabilir. Bunun dışında yetkili kullanıcılara ait token elde edilerek, bu token aracılığıyla yetkili kullanıcı gibi sistem içerisinde çeşitli işlemler geliştirilebilir. Powersploit aracı ile bir sistemde hak yükseltme işlemi gerçekleştirilebilir. Powersploit, sızma testlerinde kullanmak amacıyla oluşturulmuş PowerShell modülleri topluluğudur. Bu modüller ile, penetrasyon testleri yapılacak olan sistemlerde, PowerShell üzerinde sisteme yönelik, sızma sonrası işlemler gerçekleştirilebilir. Bu işlemleri gerçekleştirebilmek için, ‘https://github.com/PowerShellMafia/PowerSploit’ linkinden dosyaların indirilmesi gerekmektedir. Bu dosya indirildikten sonra, hedef sistemde modüller arasına eklenmesi gerekmektedir. Eğer modüller arasına eklenmez ise, modül ile yüklenecek olan komutlar çağırılamayacaktır. Modül ekleme işlemi için Import-Module cmdlet kullanılır. Powersploit, sisteme hangi hesap üzerinden sızdıysak, o hesabın görüntüleyebileceği diğer kimlik bilgileri sayesinde token elde ederek, yetkili bir kullanıcının token bilgisi ile hak yükseltme işlemi gerçekleştirmeye olanak sağlamaktadır. Bu işlem Token Manipulation olarak adlandırılır. Powersploit ile hak yükseltme işlemi yapabilmek için, öncelikle modül eklemek gerekmektedir. Modül ekleme işlemi ile beraber çeşitli komutlar yüklenmektedir. Yüklenen bu modüller Invoke ile birlikte kullanılır. Hak yükseltme işlemi için modül ile birlikte yüklenen Token Manipulation işlemini Invoke ile birlikte çağırarak, token elde edebileceğimiz kullanıcıları görüntüleyebilir ve yetkili bir kullanıcının token bilgisini kullanarak hak yükseltme işlemi gerçekleştirebilir. Bu işlemleri adımlayacak olursak: Öncelikle sistemin hangi kullanıcı ile kullanıldığını görüntülemek için whoami komutunu çalıştırıyoruz. Resim 48 – Etkin hesap Sonra, hak yükseltme işlemi yapabilmek adına modül yüklemek gerekmektedir. Modül yüklendikten sonra Invoke-TokenManipulation cmdlet token manipülasyon işlemi için kullanılır ve kimlik bilgilerinin listelenmesi için –Enumerate parametresi kullanılır.
  • 30. Resim 49 – Token Bilgileri Token manipülasyon işlemi gerçekleştirilecek hesaplar arasından en yetkili hesap olan NT AUTHORITYSYSTEM hesabı ile token manipülasyonu işlemini gerçekleştiriyoruz. Bu işlem için tekrar Invoke-TokenManipulation cmdlet kullanacağız. Kimliğine bürüneceğimiz hesabı belirlemek için –Username, kimliğe büründüğümüz kullanıcı ile yetki işlemleri yapabilmek için çalıştıracağımız process’i belirlemek için –CreateProcess parametrelerini kullanacağız. Resim 50 – Hak Yükseltme İşlemi Komut çalıştırıldıktan sonra, process olarak cmd.exe uygulaması çalışacaktır. Resim 43’te görüldüğü üzere yeni açılan process üzerinde, whoami komutu çalıştırdığımız zaman, en yetkili hesap olan ‘nt authoritysystem’ hesabı ile karşılaşacağız. Resim 51 – Hak Yükseltme İşlemi ile Çalışan Process
  • 31. 5.4. Veri Sızdırma (Data Exfiltration) Veri sızdırma işlemi, saldırganlar tarafından çokça yapılmakta olan, birtakım verilerin belirtilen bir sunucuya yönlendirilmesi olayıdır. Bir saldırgan bir sisteme sızdığı zaman, sistemde bulunan birtakım bilgileri sızdırmak isteyebilir. Bu işlemin gerçekleşmesi için sisteme erişen saldırgan, sızdırmak istediği verilere ulaşır ve bu verileri ilgili sunucuya yönlendirir. Bu işlem normal bir şekilde yapılabileceği gibi, şifreleme algoritmalarının ya da kodlama yöntemlerinin kullanılmasıyla gerçekleştirilebilir. Saldırganlar, sızdıkları sistemde yapmış oldukları işlemlerin anlaşılmasını istemezler. Bu nedenle bir veri sızdırma işlemi yapılacaksa, bu verilerin açık bir şekilde sızdırılması, sistemdeki kayıtların incelenmesi ile ortaya çıkabilir. Fakat sızdırılacak olan veriler, şifreleme algoritmaları ile şifrelenip ilgili sunucuya yönledirilirse, sistem kayıtlarından yönlendirilen verilerin ne olduğu anlaşılamaz. Böylece veri sızdırma işlemi istenildiği gibi olumlu bir şekilde gerçekleşmiş olur. Eriştiğimiz bir sistemde, PowerShell ile veri sızdırma işlemi yapabiliriz. Bu işlemin gerçekleşmesi için, sistemde bir parola dosyası bulduğumuzu varsayalım. Bu dosyadaki verileri okuyup, web üzerinden bir web sitesi sunucusuna yönlendirebiliriz. Bu işleme ilk olarak verileri okumakla başlayabiliriz: Öncelikle parola dosyasındaki veriler gerçekleşebileceği için bir değişkende Get-Content cmdlet ile okunur. Okuma işlemi tekrar tutulur. Resim 52 – Verileri Okuma Parolaların şifrelenmesi için bir anahtar belirlenir ve değişkene atanır. Resim 53 – Anahtar belirleme Sonra, System.Security.SecureString sınıfına ait bir obje oluşturulur ve değişkene atanır.
  • 32. Resim 54 – Güvenli metin objesi Şifreleme işleminin gerçekleşmesi için, parolalar dosyasındaki her bir parola değerinin harfleri, birer birer $guvenliMetin değişkenine eklenir. Bu işlem için bir döngü kullanılır. Her seferinde, parolaların her bir harfi ile döngü çalışır ve her döngüde, $guvenliMetin değişkenine bir harf atanır. Resim 55 – Parolaları harflerine ayırma Ardından elde edilen metne göre, anahtar ve metin devreye sokularak, şifreleme işlemi gerçekleştirilir. Şifreleme işlemi ConvertFrom-SecureString cmdlet ile gerçekleştirilir. Bu cmdlet asıl olarak verinin güvenli bir hal alması için kullanılır. Bunun için sistem AES standartını kullanır. Resim 56 – Şifreli Veri Son olarak, veri şifrelenmiş bir şekilde istenilen sunucuya gönderilir. Farklı protokoller kullanılarak veri sızdırma işlemi gerçekleştirilebilir. Biz bu örnekte veri göndermek için http protokolü kullanacağız ve şifreli verimizle bir web sunucusuna istek atacağız. Resim 57 – Web İsteği
  • 33. Komut çalıştırıldıktan sonra şifreli verimiz başarılı bir şekilde web sunucusuna ulaşacaktır. Verinin başarılı bir şekilde ulaşma durumu Resim 58’ de Wireshark programı ile yapılan analiz ile ispatlanmıştır. Resim 58 – Şifreli verinin HTTP protokolü üzerinden başarılı bir şekilde gönderilmesi 5.5. Kimlik Çalma (Credential Theft) Kimlik çalma işlemi, erişim sağladığımız bir makinede bulunan hesapların kimlik bilgilerine ulaşmamız ve bu bilgiler ile sisteme kimlik bilgilerini elde ettiğimiz hesap üzerinden sisteme erişmemiz amacıyla gerçekleştirilir. Windows sistemlerde kimlik bilgileri SAM (Security Account Manager) dosyasında tutulur. Bu kimlik bilgilerine erişmemiz için PowerShell üzerinden script çalıştırılarak, SAM dosyası içerisinde tutulan kimlik bilgileri ortaya çıkartılabilir. Bunun için PowerShell üzerinde Mimikatz aracının, kimlik bilgilerini ortaya çıkaran komutu olan sekurlsa::logonPasswords kullanılarak bilgileri listeleyen bir script çalıştıracağız. İlk olarak github.com sitesinde bulunan script dosyasını indireceğiz. Bu dosyayı indirmek Invoke-Expression cmdlet aracılığı ile için PowerShell üzerinde komut çalıştıracağız. Resim 59 – Script Dosyası İndirme İndirilen bu dosyayı, kurban makinede çalıştırmak için PowerShell üzerinde Remoting özelliğini kullanarak, daha önceden kimlik bilgilerini bildiğimiz Administrator hesabı aracılığı ile sisteme yükleyeceğiz. Bunun için New-PSSession cmdlet ile bir oturum tanımlayıp Copy-Item cmdlet ile kurban makineye dosyayı yükleyeceğiz. Resim 60 – New-PSSession cmdlet
  • 34. Resim 61– New-PSSession cmdlet Resim 62 – Açılan Oturum Resim 63 – Dosya Kopyalama Dosya yükleme işlemi tamamlandıktan sonra Mimikatz modülünün çalıştırılması için, modül eklememiz gerekmektedir. Modülü ekledikten sonra Invoke-Mimikatz cmdlet oluşacaktır. Bu cmdleti çalıştırdıktan sonra, kimlik bilgileri listelenecektir. Resim 64 – Modül Ekleme ve Çalıştırma
  • 35. Mimikatz aracını farklı parametreler ile kullanabiliriz. Örneğin, kimlik bilgilerini ele geçirmek için parametresiz olarak Invoke-Mimikatz cmdlet kullanabildiğimiz gibi, -DumpCreds parametresini kullanarak kimlik bilgilerini ele geçirebiliriz. –DumpCerts parametresini kullanarak sistemde tutulan sertifikalar hakkında bilgi alabilmemiz için .der ve .pfx uzantılı iki dosya oluşur ve sertifikaları bu dosyalar aracılığı ile inceleyebiliriz. Eğer bunların dışında, mimikatz aracına ait komutları kullanarak çeşitli işlemler yapmak istersek, bunun için –Command parametresini kullanabiliriz. Böylece Invoke- Mimikatz cmdlet ile –Command parametresini kullanarak daha farklı işlemler gerçekleştirebiliriz. Resim 65 – Kullanıcı Kimlik Bilgileri Resim 66 – Sertifikalar Hakkında Bilgi
  • 36. Resim 67 – Command Parametresi Kullanımı Resim 67 ‘de görüldüğü üzere, Command parametresini kullanarak, bizim belirlemiş olduğumuz; debug modunda çalıştırma işlemini yapan privilege::debug ve Kerberos’a ait biletler hakkında bilgi veren sekurlsa::tickets komutlarını çalıştırdık. Invoke-Mimikatz cmdlet kullanarak kimlik bilgilerini elde etme işlemini kurban makinede gerçekleştirmiş olduk. Fakat bazı durumlarda kurban makinede uzun süre kalmamamız gereken durumlar olabilir. Bu nedenle kimlik bilgilerini ve bilet bilgilerini kurban makinede incelememiz, işimizin yarıda kesilmesine sebep olabilir. Bu nedenle kimlik bilgilerini ve biletleri birer dosya halinde alıp kurban makineden çıkabiliriz. Böylece, bu bilgileri daha sonra kendi makinemizde mimikatz aracı ile inceleyebiliriz. Mimikatz, kimlik bilgilerini incelemek için lsass.exe adlı process’e bakar. Bu process, Windows sistemlerde güvenlik ilkelerinin uygulanmasından sorumludur ve kullanıcıların; oturum açma, parola değiştirme işlemlerinin doğrulanması bu process tarafından yapılan işlemlerdendir. Böylece, lsass.exe process’inin .DMP uzantılı dump dosyası elde edilerek kurban makinede bulunan kimlik bilgileri, başka makinelerde mimikatz aracı ile incelenebilir. Bunun için Out- Minidump adlı cmdlet ile lsass.exe adlı process’in dump dosyasını elde edeceğiz. Resim 68 – Out-Minidump cmdlet Kullanımı Resim 68’ de görüldüğü üzere Import-Module ..out-minidump.ps1 komutu ile modül ekleme işlemini gerçekleştirdik. Get-Process lsass komutu ile lsass.exe adlı process’i aldık ve pipe işareti ile bu process’i Out-Minidump cmdlet ile çıktı olarak kullandık. Ardından lsass_720.dmp adlı dosyayı elde ettik. Ortaya çıkan bu dosyanın adında bulunan 720 sayısı, lsass.exe process’inin ID değeridir.
  • 37. Resim 69 – Farklı Bir Makinede dump Dosyasının İncelenmesi 5.6. Code Execution 5.6.1. ShellCode Execution Shell kodları, çeşitli işlemlerin gerçekleşmesi için CPU tarafından çalıştırılan OP (Operation-İşlem) kodlarıdır. OP kodları işlemci tarafından çalıştırılır ve işlemci tarafından işlem gerçekleştirilir. ShellCode Execution ise, kurban makinada zararlı shell kodları çalıştırarak, sisteme sızmamız için kullandığımız bir yöntemdir. Bunun için, karşı sistemde çalıştırmak üzere zararlı Shell kodları oluşturulur, kurban makinaya gönderilir ve bu Shell kodların çalışmasıyla sisteme sızma işlemi gerçekleştirilir. ShellCode Execution yöntemi için Invoke-ShellCode script’ini kullanacağız. Invoke- ShellCode, PowerShell üzerinde Shell kodu çalıştırmamızı sağlar. Böylece bu cmdlet ile zararlı Shell kodlarını kurban makinede çalıştırarak sisteme sızabiliriz. İlk olarak msfvenom aracını kullanarak C# formatında bir payload oluşturacağız. Oluşturacağımız bu payload ile sisteme sızmamız için gerekli bağlantıyı sağlayacak olan Shell kodları, C# programlama dilinde byte tipinde bir buf adlı dizi değişkenine atanacaktır. Böylece kurban makinede çalıştırmak için oluşan Shell kodları kullanacağız. Resim 70 – ShellCode Oluşturma
  • 38. Sonra, sisteme sızmak amacıyla, makinemizde metasploit aracını kullanarak dinleme işlemi başlatacağız. Resim 71 – Dinleme Modu Almış olduğumuz Shell kodlarını Invoke-ShellCode ile birlikte çalıştırabilmek için, PowerShell script dosyasına yerleştirebiliriz. Böylece bu dosyayı modül olarak ekleyip, Shell kodları atadığımız $buf değişkenini kullanabiliriz. Resim 72 – Shell Kodları Shell kodlarını ekledikten sonra, Invoke-ShellCode modülünü ekleyerek, Invoke-ShellCode –ShellCode @($buf) komutu ile Shell kodlarını çalıştırıyoruz.
  • 39. Resim 73 – Shell Kodlarını çalıştırma Ardından saldırgan makinemizin dinleme moduna baktığımız zaman, kurban makine üzerinde bir oturum açıldığını görmüş olacağız. Resim 74 – Kurban makinede oturum açılması Bu yöntem ile kurban makineye sızmamız için bağlantı oluşturan process, Shell kodları çalıştırdığımız PowerShell uygulamasıdır. Bu nedenle meterpreter oturumunu elde ettikten sonra, sistemde rahatça gezinmemize izin verecek bir process’e geçmemiz daha iyi olacaktır. Çünkü kurban makinede çalıştırdığımız bu komut, kurban tarafından çalıştırılırsa, kurban komut satırında hiçbir işlem gerçekleşmediğini görünce, komutun çalışmasını sonlandırabilir veya direk olarak PowerShell uygulamasını kapatabilir. Bu durum bizim bağlantımızın kopmasına sebep olacaktır. 5.6.2. Dll Injection DLL(Dynamic Link Library-Dinamik Link Kütüphanesi), Windows sistemlerde programların çalışması için gerekli fonksiyonları barındıran kütüphanedir. Windows makinelerde çalışan process’ler DLL içerisinde bulunan fonksiyonların yardımıyla çalışmaktadır. Buradan yola çıkarak bir process, bizim oluşturduğumuz zararlı bir DLL ile çalıştırılabilir. Böylece zararlı DLL sisteme sızmamız için bize bir bağlantı oluşturabilir. Powershell üzerinde çalıştırmak için Invoke-DllInjection adında bir cmdlet bulunmaktadır. Bu cmdlet ile bir process aracılığıyla dll dosyası çalıştırılır ve kurban makine üzerinde bir bağlantı oluşturmuş oluruz.
  • 40. Öncelikle msfvenom aracı ile .dll uzantılı zararlı bir DLL dosyası oluşturuyoruz. Resim 75 – Zararlı DLL Oluşturma Sonra, zararlı DLL çalıştırmak için Invoke-DllInjection.ps1 adlı script modülünü ekliyoruz. Resim 76 – Invoke-DllInjection Modül Ekleme Modül eklendikten sonra Invoke-DllInjection cmdlet oluşacaktır. Bu cmdlet ile bir process yardımı ile zararlı DLL dosyamızı devreye sokacağız ve sızma işlemini gerçekleştireceğiz. Bunun için 2 adet parametre bulunmaktadır. Birincisi –ProcessID parametresidir. Bu parametre ile çalışan process ID’lerinden biri seçilir ve bu parametreye değer olarak atanır. İkinci parametre ise DLL dosyası belirteceğimiz –dll parametresidir. Zararlı DLL dosyamızın yolu bu parametreye değer olarak atanır. o –ProcessID parametresine atacayacığımız process ID değerini belirliyoruz. Bunun için çalışan process’lerden biri olan vmtoolsd.exe uygulamasının ID değerini (1960) alıyoruz. Ardından –Dll parametresi için zararlı DLL dosyamızın (dll.dll) adını alıyoruz. Resim 77- Process ID Resim 78 – Zararlı DLL Çalıştırma Komutun çalıştırılmasıyla birlikte, vmtoolsd.exe aracının çalıştığı SYSTEM hesabının hak ve yetkileri ile bir oturum açılacaktır ve sızma işlemi gerçekleşmiş olacaktır. Resim 79 – Meterpreter Oturumu
  • 41. NOT: Oluşturduğumuz zararlı DLL dosyası çalıştırma işlemi, sadece sisteme sızmak amaçlı değil, daha çok hak yükseltme amaçlı kullanılmaktadır. Bir saldırgan sızdığı bir sistemde çalışan process’lerin ID değerlerini ve hangi hesabın hak ve yetkileri ile çalıştığını anladıktan sonra, yetkili bir hesabın hak ve yetkilerine sahip olabilmek için kurban makinede zararlı DLL dosyası çalıştırabilir. Böylece yüksek hak ve yetkiler ile yeni bir oturum başlatılır.