2Ağustos
Nishang Framework

Nishang ile Windows Post Exploitation – Part 2

Nishang, Nikhal Mittal tarafından geliştirilen bir post-exploitation araçlar takımıdır. Nishang içerisinde post-exploitation işlemleri sırasında kullanılabilecek olan, Powershell dilinde yazılmış script kodları bulunmaktadır. Nishang’e ait script kodları ile; port taraması, bilgi toplama, hak yükseltme, kimlik bilgilerini ele geçirme, backdoor(arka kapı) bırakma gibi işlemler gerçekleştirilebilir. Powershell ile oluşturulduğundan dolayı Windows işletim sisteminde herhangi bir kurulum gerektirmeden çalıştırılabilir. Aracın önemli özelliklerinden biri de çalıştırılan script’lerin disk üzerinde değil, bellek üzerinde çalışmasıdır.

Önceki bölümü okumak için: https://www.priviasecurity.com/kaynaklar/makale/Nishang-ile-Windows-Post-Exploitation-Part-1

2.3 Backdoor

Bir saldırgan için post-exploitation aşamasının en sonuncusu, sistemde kalıcılık sağlamaktır. Yani saldırgan sisteme istediği zaman erişebilmek için bir arka kapı bırakmak ister. Nishang, post-exploitation işlemlerinde son aşamaya gelindiğinde, bir backdoor bırakarak sistemde kalıcılık sağlamak için çeşitli yöntemler sunmaktadır. Bu yöntemler aşağıda açıklanmıştır:

2.3.1 Add-RegBackdoor

Windows sistemlerde yapışkan tuşları kontrol etmek amacıyla sethc.exe ve erişilebilirlik seçeneklerini ayarlamak için utilman.exe kullanılmaktadır. Bu script ile uzaktan komutların ve scriptlerin yürütülebilmesi için sethc.exe ve utilman.exe Debugger kayıt defteri anahtarlarını ayarlamaktadır ve “Network Level Authentication (NLA)” özelliğini devre dışı bırakmaktadır. Payload’ların RDP ile başlatılabilmesi için “Network Level Authentication (NLA)” devre dışı bırakılmalıdır. Bu scripte ait olan tek parametre “Payload” parametresidir. Bu parametreye ait olan varsayılan değer “cmd.exe” dir. Bu parametre ile hedef üzerinde çalıştırılacak olan uygulama belirtilir.

Resim 2.3.1.1 – Add-RegBackdoor
Resim 2.3.1.4 – NLA Devre Dışı Bırakma

2.3.3 Add-ScrnSaveBackdoor

Windows işletim sistemlerinde uzun bir süre işlem yapılmadığında ekranda bir animasyon görüntüsü belirir. Bu görüntü “Ekran Koruyucu (Screen Saver)” olarak adlandırılır. Windows işletim sistemlerinde “C:\Windows\System32” dizini altında “scrnsaver.scr” adlı bir dosya bulunur ve dosyanın çalıştırılmasıyla ekranda bir ekran koruyucu görünür. Ekran koruyucu özelliğinin aktif edilip, uzun bir süre işlem yapılmadığında çalışabilmesi için “HKCU:\Control Panel\Desktop\” altında “SCRNSAVE.EXE” adlı bir kayıt oluşturulabilir ve bu kayda değer olarak “C:\Windows\System32\scrnsaver.scr” yolu atanabilir.

Bu script kullanılarak ekran koruyucu aracılığıyla payload çalıştırılır. Script, varsayılan olarak  “C:\Windows\System32” altında “Ribbons.scr” adında ekran koruyucu dosyası oluşturur, “HKCU:\Control Panel\Desktop\” altında “SCRNSAVE.EXE” adlı bir alt anahtar oluşturarak bu kayda “C:\Windows\System32\Ribbons.scr” değeri atar. Ekran koruyucu çalıştırıldığında payload çalışması için “HKLM:\SOFTWARE\Microsoft\WindowsNT\CurrentVersion\Image File Execution Options\Ribbons.scr” adlı bir anahtar oluşturarak bu anahtarın altına “Debugger” adlı bir kayıt ekler ve bu kayda değer olarak internet üzerinden script dosyası indirip çalıştıran bir payload veya normal bir payload atar. Böylece ekran koruyucu tetiklendiğinde, bu kayıtlara göre “Ribbons.scr” çalışır ve bununla birlikte belirtilen payload da çalışır.

Resim 2.3.2.1 – Add-ScrnSaveBackdoor
Resim 2.3.2.3 – Powershell Oturumu

2.3.3 DNS_TXT_Pwnage

Bu script  DNS TXT kayıtlarını kullanarak payload çalıştırma ve shell elde etme amacıyla kullanılır. Script çalıştığı sırada, durdurulmadığı sürece DNS sunucusuna sürekli istek atar ve TXT kayıtları aracılığıyla, komutları tekrar tekrar çalıştırır. Scriptin kullanılması için bir DNS sunucusuna ihtiyaç olacaktır. Bu yazıda yapılacak örnekle, metasploit ile Powershell oturumu elde edilmesi hedeflenmektedir. Bu örnekte DNS sunucusu olarak sanal ortamda kurulu olan “privia.labs” adlı DNS sunucusu kullanılmıştır.

İlk olarak DNS TXT kayıtlarından yararlanarak shell elde etmek için metasploit ile oturum elde edilmesini sağlayan kodlar TXT kayıtlarına eklenmelidir. Bunun için her bir TXT kaydına yerleştirmek adına, zararlı kodları Base64 ile encode edip parçalara ayıran Nishang “Out-DnsTxt” script kullanılabilir. Bu script ile kodlar encode edilerek, TXT kayıtlarına eklenmek üzere parçalara ayrılır.

Resim 2.3.3.1 – Out-DnsTxt
Resim 2.3.3.2 – Parçalanmış Kodlar

Yukarıdaki resimde görüldüğü üzere zararlı komutlar encode edildi ve 7 parçaya ayrılmış bir şekilde “encoded.txt” dosyasına kaydedildi. Bu işlemden sonra “encoded.txt” dosyasındaki her bir satır, domain için oluşturulmuş olan TXT kayıtlarına yerleştirilmelidir.

Resim 2.3.3.3 – TXT Kayıtları

Yukarıdaki resimde görüldüğü üzere, “32.privia.labs” adlı bir subdomain oluşturuldu ve her bir satır TXT kayıtlarına yerleştirildi. Scriptin çalışması için, bir komutun mu yoksa bir powershell scriptinin mi çalışması gerektiğini belirleyen “StartDomain” ve bir komut çalıştırılması için “CommandDomain” parametresine ihtiyaç vardır.

Resim 2.3.3.4 – TXT Kayıtları

Bu işlemlerden sonra DNS_TXT_Pwnage cmdlet çalıştırılabilir. Bu script ile verilen parametrelere göre DNS sunucusunda bulunan TXT kayıtları alınacak ve Base64 ile encode edilen kodlar decode edilerek, ele geçirilen makine üzerinde çalıştırılacaktır.

Resim 2.3.3.5 – DNS_TXT_Pwnage

Yukarıdaki resimde görüldüğü üzere, scriptin çalıştırılması için bazı parametreler kullanılmıştır. İlk parametre “StartDomain” parametresidir. Bu parametreye bir TXT kaydına sahip domain adı atanır. TXT kaydına ait olan metin, “cmdstring”, “psstring” ve “StopString” parametrelerine atanan değerler ile karşılaştırılır.

  • Eğer TXT kaydı “cmdstring” ile eşleşirse, “commanddomain” ile belirtilen domain adına ait TXT kaydında bulunan komut çalıştırılır.
  • Eğer TXT kaydı “psstring” ile eşleşirse, “psdomain” ile belirtilen domain adına ait olan, “Subdomains” parametresi ile belirtilen sayıda TXT kaydında bulunan komutlar birleştirilir ve çalıştırılır.
  • Eğer TXT kaydı “StopString” ile eşleşirse, script istek atmayı ve çalışmayı durdurur. “AuthNS” parametresi ise, belirtilen alanlar için yetkili bir nameserver (ad sunucusu) belirtir.

Bu örnek için “StartDomain” TXT kaydında bulunan metin ile “psstring” parametresinde bulunan metin eşleşmektedir.  Dolayısıyla “32.privia.labs” subdomain’i altında yer alan 7 adet TXT kaydı içerisindeki Base64 ile encode edilmiş metinler birleştirilecek ve decode edildikten sonra çalıştırılacaktır. Böylece bir “Powershell reverse shell” elde edilecektir.

Resim 2.3.3.6 – Powershell reverse shell

2.3.4 Gupt-Backdoor

Gupt, bir Wi-Fi oluşturarak kurban makinede Wi-Fi adına göre indirme ve komut çalıştırma gibi işlemler yapmak için kullanılır. Gupt, her 5 saniyede bir kablosuz ağları kontrol eder ve üç parametreye sahiptir. Bunlardan birincisi “MagicString” parametresidir. “MagicString” parametresinin değeri ile ağda bulunan Wi-Fi bağlantıları SSID değerleri karşılaştırılır. “MagicString” parametresine 4 karakterli bir değer atanabilir ve ilk 4 harfi bu değer ile eşleşen SSID değerine sahip bağlantılar bulunur. SSID değerinin 5. karakteri “c” ise SSID’nin geri kalanı komut olarak algılanır ve o komut çalıştırılır. Eğer SSID değerinin 5. karakteri “u” ise SSID’nin geri kalanı Google URL Shortener’a ait ID kısmı olarak algılanır ve komut dosyası URL’den indirilerek çalıştırılır. Gupt’a ait olan diğer parametrelerden “Arguments” parametresi ile indirilip çalıştırılacak script için argüman sağlanır. “EncodedCmd” parametresi ise SSID içerisinde bulunan komut ROT13 ile encode edilmişse, bu komutu çalıştırmak için kullanılır.

Resim 2.3.4.1 – Kablosuz Ağ
Resim 2.3.4.2 – Gupt-Backdoor

Gupt hiçbir kablosuz ağa bağlanmaz ve bu yüzden ağ trafiğini atlatır.

Resim 2.3.4.3 – Script İndirme

Yukarıdaki resimde görünen kodlar, SSID’nin 5. karakteri “u” olursa geri kalan metni http://goo.gl linkine ekleyerek bu linkten bir script indirecek ve çalıştıracaktır.

Resim 2.3.4.4 – Kod Çalıştırma

Yukarıdaki resimde yer alan kodlar, SSID’nin 5. karakteri “c” olursa geri kalan metnin önce ROT13 ile encode edilip edilmediğini kontrol eder. Eğer şart sağlanmaz ise metni direk $cmd değişkenine atar.  Sonra metnin “exit” olup olmadığını kontrol eder ve şart sağlanırsa diğer şartları kontrol etmez. Ön koşullar kontrol edildikten sonra “Invoke-Expression” ile $cmd değişkeninde bulunan komut çalıştırılır.

2.3.5 HTTP-Backdoor

Bu script ile bir URL sorgulanır ve URL üzerinden powershell scripti indirilerek çalıştırılır. “CheckURL” parametresi ile belirtilen URL içeriği ile “MagicString” parametresine atanan değerin eşleşmesi durumunda script çalışmaya başlar. Çalışmaya başlayan script, “PayloadURL” adresinde belirtilen URL adresini sorgular ve URL ile belirtilen script dosyasını indirerek çalıştırır. İndirilen script ile çalıştırmak üzere, “Arguments” parametresi ile argüman belirtilebilir.  “CheckURL” parametresi ile belirtilen URL içeriği ile “StopString” parametresine atanan değerin eşleşmesi durumunda, script çalışmayı durduracaktır. Ayrıca bu script, script çalıştırıldıktan sonra elde edilen sonuçları Gmail, PasteBin, bir web sunucusu veya bir DNS sunucusuna sızdırmaya olanak sağlar.

Resim 2.3.5.1 – HTTP-Backdoor

2.3.6 Execute-OnTime

Bu script, belirlenen zamanda bir URL adresi üzerinden script dosyası indirerek çalıştırmak amacıyla kullanılmaktadır. Ayrıca bu script, script çalıştırıldıktan sonra elde edilen sonuçları; Gmail, PasteBin, bir web sunucusu veya bir DNS sunucusuna sızdırılmaya olanak sağlar. Bu scriptin çalışması için; PayloadURL, CheckURL, Time, Arguments ve StopString parametrelerinin değer almaları zorunludur. “PayloadURL” ile çalıştırılacak script için URL adres belirtilir. Scriptin indirilip çalıştırılma zamanı, 24 saat cinsinden “Time” parametresi ile belirtilmelidir. Scriptin bir argüman alması gereklidir ve bu argüman “Arguments” parametresi ile belirtilir. Scriptin çalışmasını durdurmak için “StopString” parametresine atanan değer “CheckURL” ile belirtilen adresin içeriği ile eşleşmelidir.

Resim 2.3.6.1 – Execute-OnTime

Yukarıdaki resimde görüldüğü üzere, http://pastebin.com/raw.php?i=Zhyf8rwh adresinden alınan script, “Get-Process” cmdlet’i argüman alarak saat “18:27” de çalıştırılmıştır. “StopString” parametresine atanan değer, https://pastebin.com/raw/BWYF1wAL adresinin içeriği ile eşleşirse, script çalışmayı durduracaktır. Eğer eşleşme olmazsa script çalışmaya devam edecektir.

2.3.7 Invoke-ADSBackdoor

Alternatif Veri Akışı (ADS – Alternate Data Stream), Windows NTFS dosya sisteminin, dosya yazarına göre veya dosya başlığına göre, dosyayı bulmasını sağlayan, özet veriler içeren bir özelliktir. ADS, Windows 7’den günümüze kadar olan tüm işletim sistemlerini desteklemektedir.

ADS, saldırganların kurbanları için bir tehdit oluşturmaktadır. Çünkü, ADS ile bir dosyaya başka bir dosya gömülebilir ve bu işlem dosya üzerinde herhangi bir değişikliğe neden olmaz. Bu nedenle saldırganlar bir dosya için zararlı bir veri akışı oluşturabilir ve bu zararlının çalıştırılmasıyla makineye erişim sağlanabilir.

Invoke-ADSBackdoor ile, bir dosya için iki adet ADS oluşturulur. İlki çalıştırılacak olan zararlı bir payload dosyasıyken, ikincisi bu payload’u çalıştıran VBS (Visual Basic Script) dosyasıdır.

Bu script, öncelikle kullanıcıya ait olan “AppData” dizini için; rastgele adlandırılacak ve içerisine encode edilmiş powershell payload kodları yazılacak bir “.txt” uzantılı dosya oluşturur ve veri akışı olarak ekler. Daha sonra bu veri akışını çalıştırarak içerisindeki payload’un çalışmasını sağlayan “.vbs” uzantılı bir VBS dosyası oluşturur ve bu dosyayı da ikinci veri akışı olarak ekler. Ardından “HKCU:\Software\Microsoft\Windows\CurrentVersion\Run” anahtarının altında “Update” adlı bir alt kayıt oluşturur ve bu kayda

“wscript.exe $env:USERPROFILE\AppData:<VBS_ADS>”

değerini atar. Böylece, makine açıldıktan sonra kullanıcı haklarıyla VBS dosyası otomatik olarak çalıştırılacak ve payload tetiklenerek çalıştırılacaktır. Böylece kalıcılık sağlanmış olacaktır. Aşağıdaki resimde, script “PayloadURL” parametresi ile birlikte çalıştırılmıştır. Bu parametreye atanan URL, Base64 ile encode edilmiş 64 bit meterpreter oturumu sağlayan kodlar içermektedir.

Resim 2.3.7.1 – Invoke-ADSBackdoor

Script çalıştırıldıktan sonra AppData dizini için veri akışları oluşturuldu ve VBS veri akışını tetikleyen kayıt, kayıt defterine eklendi. Aşağıdaki resimde AppData dizininin listelenmesi sonucu oluşturulmuş olan veri akışları görülmektedir.

Resim 2.3.7.2 – Oluşturulmuş Olan Veri Akışları

Aşağıdaki resimde, içerisinde Base64 meterpreter payload barındıran “.txt” uzantılı veri akışının içeriği görülmektedir.

Resim 2.3.7.3 – Veri Akışı İçerisinde Yer Alan Payload

Kayıt defterine eklenen kayıt tetiklendiğinde “wscript” uygulaması ile VBS çalıştırılacaktır.

Resim 2.3.7.4 – Kayıt Defterine Eklenen Kayıt

VBS ile payload çalıştırıldıktan sonra meterpreter oturumu elde edilecektir.

Resim 2.3.7.5 – Meterpreter Oturumu

2.3.8 Set-RemotePSRemoting

Windows sistemlerde powershell üzerinden uzak bir bilgisayara erişim sağlanabilmektedir. Her iki makinede de “Powershell Remoting” özelliği aktif edilip, karşılıklı güven ilişkisi sağlandıktan sonra, varsayılan olarak 5985 ve 5986 numaralı portlar aracılığıyla HTTP(S) üzerinden erişim sağlanabilir. Bu erişim için, karşı makineye bağlanan kullanıcı, karşı makinede kayıtlı yönetici yetkilerine sahip bir kullanıcıya ait olan kimlik bilgilerini bilmelidir ve o kimlik bilgileri ile erişim sağlamalıdır.

Bu script kullanılarak yönetici haklarına sahip olmayan bir kullanıcı hesabına Powershell Remoting özelliği için “Full Control” verilir ve kullanıcı hesabı ile uzaktan erişim sağlanabilir. Ayrıca bu script ile Powershell Remoting için tam yetkiye sahip olan bir kullanıcının hakları kısıtlanabilir. Öncelikle, kısıtlı hak ve yetkilere sahip olan ve sadece “Domain Users” grubunda bulunan “backdoor” kullanıcısına, Powershell Remoting ile erişim sağlanmaya çalışıldı.

Resim 2.3.8.1 – Kullanıcı Özellikleri
Resim 2.3.8.2 – Erişim Sağlanamaması

Ardından script, backdoor kullanıcısı için çalıştırıldı ve kullanıcı Powershell Remoting erişimi için tam yetkiye sahip oldu.

Resim 2.3.8.3 – Set-RemotePSRemoting
Resim 2.3.8.4 – Yeniden Uzak Erişim

Bu script bir kullanıcı için “Remove” parametresiyle birlikte çalıştırıldığında, kullanıcının Powershell Remoting özelliği yetkileri kısıtlanacaktır ve erişim sağlanamayacaktır.

Resim 2.3.8.5 – Remove Parametresinin Kullanılması
Resim 2.3.8.6 – Erişim Kısıtlaması

2.3.9 Set-RemoteWMI

Bu script, yönetici ayrıcalıklarına sahip olmayan domain hesaplarına WMI erişimi vermek için, DCOM ve WMI ad alanlarının güvenlik tanımlayıcılarını değiştirmek amacıyla kullanılmaktadır. Script, bu yetkilendirme için “Built-in Administrators” grubunun izinlerini, WMI ve DCOM ad alanlarının erişim kontrol listesine (ACL) ekler. “Namespace” parametresi ile farklı bir namespace belirtilmediği sürece varsayılan değer “root” değeridir. Ayrıca bu işlem uzak bir makine için de yapılabilir.

Aşağıdaki resimde görüldüğü üzere, kısıtlı yetkilere sahip olan bir “Domain Users” hesabı ile WMI aracılığıyla uzaktan komut çalıştırma denemesi yapılmıştır ve işlem başarılı olmamıştır.

Resim 2.3.9.1 – Erişim Engellemesi

Script “backdoor” hesabı için çalıştırıldıktan sonra WMI erişiminde bir problem olmayacaktır.

Resim 2.3.9.2 – Set-RemoteWMI
Resim 2.3.9.3 – Invoke-WMIMethod

Bu script bir kullanıcı için “Remove” parametresiyle birlikte çalıştırıldığında, kullanıcının WMI erişim yetkileri kısıtlanacaktır ve erişim sağlanamayacaktır.

Resim 2.3.9.4 – Remove Parametresinin Kullanılması