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.
Escalation
Post-Exploitation aşamalarının önemli aşamalarından biri, “Hak Yükseltme (Privilege Escalation)” aşamasıdır. Bir makine üzerinde exploitation gerçekleştirilerek ilk adım atıldıktan sonra, kısıtlı yetkilere sahip olunan bir makinede, hak yükseltmek gerekebilir. Nishang araçlar takımında, hak yükseltmek adına 3 adet script bulunmaktadır. Bu scriptler aşağıda açıklanmıştır.
Enable-DuplicateToken
Windows sistemler üzerinde yönetici haklarına sahip olan hesaplar, sistem üzerinde yüksek ayrıcalıklara sahiptirler ve yönetimsel işlemleri gerçekleştirebilirler. Fakat bazen yönetici hesaplarının da erişim kısıtlamasıyla karşılaştığı durumlar bulunmaktadır. Windows sistemlerde bulunan kayıt defterindeki “HKLM:\SECURITY” yoluna yönetici hesaplarının erişim yetkisi yoktur. Bu yola erişmek için SYSTEM ayrıcalıklarına sahip olmak gerekmektedir. Bu script kullanılarak SYSTEM ayrıcalıklarıyla çalışan “lsass.exe” adlı process tarafından kullanılan Access Token (Erişim Belirteci) çoğaltılır ve bu scripti çalıştıran hesap tarafından alınarak SYSTEM ayrıcalıklarıyla işlemler gerçekleştirilebilir. Bu scripti çalıştıran hesap, yönetici ayrıcalıklarına sahip olmalıdır.
Invoke-PsUACMe
Bu script ile https://github.com/hfiref0x/UACME deposunda bulunan yöntemler kullanılarak UAC atlatılır. Tüm UAC atlatma yöntemleri DLL hijacking, çalıştırılabilir dosyaların adını değiştirme ve konumları değiştirme ile alakalıdır. Bu script, bu yöntemlere dayanarak UAC atlatabilmektedir. Bu script için parametreler aşağıdaki gibidir.
- Payload: Ayrıcalık elde edilmiş olan process üzerinden çalıştırılacak olan powershell komutunu belirler.
- Method: Hak yükseltme için kullanılacak yöntemi belirler. Varsayılan olarak sysprep değerini alır.
- Path: Payload yolunu belirler. Varsayılan yol: C:\Windows\temp\cmd.bat
- CustomDLL64: Özel olarak oluşturulan 64 bitlik DLL dosyasının yolu
- CustomDLL32: Özel olarak oluşturulan 32 bitlik DLL dosyasının yolu
Aşağıdaki tabloda metodlar listelenmiştir.
Remove-Update
Bu script ile tüm güncelleştirmeler kaldırılır. “KBID” parametresi ile güncelleştirmeye ait olan ID değeri belirlenir ve o güncelleme silinir.
Execution
Post-Exploitation aşamasında bazı durumlarda; uzak bir noktadan dosya çekerek komut çalıştırma veya farklı bir noktadan bağlantı alma gibi durumlar gerekebilir. Bu nedenle saldırgan, bir payload veya bir komut dosyası çalıştırma ihtiyacı hissedebilir. Bunun için Nishang komut çalıştırabilmek adına çeşitli yöntemler sunmaktadır. Bu yöntemler aşağıda açıklanmıştır.
Download-Execute-PS
Bu script kullanılarak, belirtilen bir URL adresi üzerinden, bir powershell scripti indirilir ve çalıştırılır. URL “ScriptURL” parametresi ile belirtilebilir. URL ile belirtilen script, “Arguments” parametresi ile belirlenen argümanlarla çalıştırılabilir. Eğer çalıştırılan script dosyasının kurban makinede kaydedilmesi istenmezse “Nodownload” parametresi kullanılır.
Download_Execute
Bu script ile metin dosyasına çevrilmiş olan çalıştırılabilir dosya, yeniden çalıştırılabilir bir uygulamaya dönüştürülerek çalıştırılır. Bu uygulama için kullanılan tek parametre “URL” parametresidir ve bu URL üzerinden dosya indirilerek çalıştırılır. Bir çalıştırılabilir dosyayı metin dosyasına dönüştürmek için Nishang içerisinde bulunan “exetotext.ps1” scripti kullanılabilir.
Execute-Command-MSSQL
Bu script ile uzak sunucuda çalışan MSSQL Server servisine ait yönetici hesabının kullanıcı adı ve parolası belirtilerek xp_cmdshell aktif edilir ve kurban makine üzerinden bir powershell shell, sql shell veya cmd shell elde edilebilir. Eğer MSSQL tarafından Windows Kimlik Doğrulama kullanılıyorsa Windows Kimlik Doğrulama yapılır ve bu yöntem için kullanıcı adı ve parola gerekmez. Bu script için kullanılan parametreler aşağıda açıklanmıştır.
- ComputerName: MSSQL Server çalışan makinenin adı veya IP adresi
- UserName: MSSQL yönetici kullanıcı adı
- Password: Kullanıcı parolası
- WindowsAuthentication: SQL ServerWindows Kimlik Doğrulaması’nı kullanmak için bu parametre kullanılır.
Execute-DNSTXT-Code
Bu script ile sistem üzerinde bulunan DNS sunucusunun TXT sorgularından yararlanılarak shell elde edilebilir. Script, saldırgan makinenin kurban makineye erişmesini sağlayan payload shell kodlarını DNS TXT kayıtlarından Base64 olarak alır, decode eder ve çalıştırır. Böylece bağlantı sağlanır. Shell kodların Base64 olarak TXT kayıtlarına yerleştirilmesi için Nishang “Out-DnsTxt” script kullanılabilir.
Script, çalışmak için minimum 3 parametreye ihtiyaç duyar: “shellcode32”, “shellcode64” ve “AuthNS”. Bu parametreler ile 32 bit ve 64 bit shell kodların Base64 olarak yerleştirildiği TXT kayıtlarının bulunduğu alan adları ve yetkili bir nameserver belirtilir.
Out-RundllCommand
Bu script kullanılarak rundll32.exe uygulamasının çalıştırabileceği komutlar oluşturulur. Kurban makinede rundll32.exe uygulamasının çalışması sonucu, bir powershell oturumu elde edilir. Bu script kurban makinede çalıştırıldıktan sonra, dinleme modu başlatılan saldırgan makinede, kurban makine üzerinden bir reverse powershell oturumu elde edilir. Bu script için parametreler aşağıdaki gibidir.
- IPAddress: Saldırgan makinenin dinleme modu başlattığı makine
- Port: Saldırgan makinenin açtığı dinleme portu
Rundll32 komutu kurban makinede çalıştırıldığında powershell oturumu elde edilecektir.
Gather
Bir makine saldırgan tarafından ele geçirildikten sonra, post-exploitation aşamalarının gerçekleştirilmesi için saldırganın bilgi toplaması gerekecektir. Sistem üzerinde ilerleme kaydetmek için; host bilgisi, kimlik bilgileri vb. bilgiler toplamak gerekecektir. Nishang, bilgi toplamak amacıyla bazı yöntemler sunmaktadır. Bu yöntemler aşağıda açıklanmıştır.
Check-VM
Bu script kullanılarak, kayıt defterinin incelenmesi ile makinenin bulunduğu sanal ortam bilgisi alınır. Script, kayıt defteri anahtarları ve çalışan servisleri inceleyerek Hyper-V, VMWare, Sanal Bilgisayar, Sanal Kutu, Xen ve QEMU için kontrol yapar.
Copy-VSS
Bu script kullanılarak, Windows sistemlerde kimlik bilgilerini tutmak amacıyla kullanılan SAM, NTDS.DIT veritabanlarının ve SYSTEM kovanının kopyası alınır. Bu dosyalar işletim sisteminin çalışmasıyla birlikte sürekli çalıştığı için açılamaz. Dolayısıyla bu script ile kopya alınarak incelenebilir.
FireBuster
Bu script kullanılarak ağa hangi port üzerinden çıkılacağı tespit edilebilir. Script öncelikle, port taraması gerçekleştirir ve açık portları bulur. Daha sonra tüm paketleri, dinleme modu başlatan FireListener’a gönderir.
FireListener
FireListener, FireBuster’ın paketleri gönderebileceği bir dinleme modu başlatır.
Get-Information
Bu script hedeften bilgi almak için kullanılır. Kayıt defterinden ve bazı komutlar ile bilgileri ortaya çıkartır.
Get-LSASecret
Windows sistemlerde; güvenlik politikalarını yönetmek, kullanıcı hesaplarını kontrol etmek, kullanıcı girişlerini kontrol etmek ve hesap parolalarını depolamak gibi işlemlerden LSA (Local Security Authority) sorumludur. Windows sistemlerde LSA ile ilgili gizlilikler, “HKLM:\SECURITY\Policy\Secrets” altında şifrelenmiş bir şekilde tutulur. Bu script kullanılarak LSA gizli bilgileri “HKLM:\SECURITY\Policy\Secrets” konumundan çekilir. Şifreli metnin çözülmesi için anahtarları çekmek adına Enable-TSDuplicateToken scripti kullanılabilir. Bu bilgiler 32 bit kayıt defterinde tutulduğundan dolayı, powershell 32 bit olarak çalıştırılmalıdır ve bu scriptler 32 bit powershell üzerinden çalıştırılmalıdır. Bu script HKLM:\SECURITY kayıtlarına erişeceği için SYSTEM hakları ile çalıştırılmalıdır.
Show-TargetScreen
Bu script ile MJPEG (Motion JPEG) kullanılarak kurban bilgisayarın masaüstü izlenebilir. Script çalıştırıldıktan sonra MJPEG destekli tarayıcılarda, kurban masaüstü gerçek zamanlı olarak görüntülenebilir. Bu script “Reverse” parametresi ile çalıştırılarak tarayıcı, bağlantıyı “IPAddress” ve “Port” parametreleri ile belirtilen makineye yönlendirebilir. Bu scripti çalıştırmak için istemci taraflı saldırı scriptlerinden yararlanmak gerekecektir. Bunun için bu scripte ait komut, Nishang’e ait istemci taraflı saldırı scriptlerinin bir argümanı olarak çalıştırılacaktır. Bağlantının yönlendirilmesi için bir dinleyici başlatmak gerekmektedir. Bunun için “powercat” kullanılabilir. Powercat ile bir dinleme modu başlatıldıktan sonra, istemci taraflı saldırı scriptinin çalıştırılmasıyla, powercat ile belirtilen TCP portuna kurban makinenin görüntüsü gelecektir. Böylece MJPEG destekleyen tarayıcı ile bu porta HTTP protokolü üzerinden bağlanılarak, gerçek zamanlı izleme yapılabilir.
Get-PassHashes
Windows sistemlerde belirlenen kullanıcı parolaları LM ve NTLM hash algoritmaları ile karmaşıklaştırılır ve bu halleriyle SAM ve “Active Directory Domain Service” kurulu ise NTDS.DIT veritabanlarında tutulur. Bu script kullanılarak SAM ve NTDS.DIT veritabanlarından, kullanıcılara ait olan ID, LM ve NTLM hash bilgileri alınır. Bilgileri PSObject formatında almak için “PSObjectFormat” parametresi kullanılabilir.
Get-PassHints
Windows sistemlerde parola belirleyen bir kullanıcı, parolasını hatırlatmak adına ilk yanlış denemede karşısına çıkacak olan bir ipucu belirleyebilir. Bu ipuçları, HKLM:\SAM kovanında saklanır. Bu ipuçlarını almak amacıyla Get-PassHints scripti kullanılır. Sonuçlar ekrana “<kullanıcı_adı>:<ipucu>” formatında basılır.
Get-WLAN-Keys
Bu script ile kaydedilmiş WLAN anahtarları açık metin halinde alınabilir.
Get-WebCredentials
Windows sistemlerde, Windows 7 işletim sisteminden itibaren “Credential Manager” getirilmiştir. Önceki sürümlerde parolalar daha sonra kolayca erişebilmek için sadece saklanırken, yeni sürümle beraber parolaların yedeklenmesi ve geri yüklenmesi özellikleri de getirildi. Bu işlemler sonucu kimlik bilgileri Credential Manager özelliğine ait saklama alanı olan “Windows Vault” üzerinde tutulur. Bu script ile Windows Vault üzerinde tutulan Web kimlik bilgileri alınabilir.
Invoke-CredentialPhish
Bu script powershell komut satırında çalıştırıldığında, bir kimlik doğrulama penceresi açılır ve doğru kimlik bilgileri girilene kadar bu pencere kaybolmaz. Böylece kullanıcıya ait kimlik bilgileri alınır.
Resim 2.8.12.2’de görüldüğü üzere, kullanıcı kimlik bilgilerinin alınması ve doğrulama kontrolü yapılması, bir “while” döngüsü içerisinde gerçekleşmektedir. Eğer kimlik doğrulanırsa “break” ile kod bloğundan çıkılır. Aksi takdirde döngü sürekli devam edecektir.
Invoke-Mimikatz
Mimikatz, Benjamin Delpy tarafından geliştirilen; kimlik saklama alanlarından kimlik bilgilerini alma, sertifikaları alma ve kalıcılık sağlama (Örn: Pass-the-Ticket) gibi işlemler gerçekleştirmeye olanak sağlayan bir araçtır. Bu script, mimikatz aracını powershell ile belleğe yükler ve çalışmasını sağlar. Böylece sistem üzerinde mimikatz ile post-exploitation işlemleri gerçekleştirilebilir. Bu script için kullanılabilen parametreler aşağıdaki gibidir.
- DumpCreds: LSASS adlı process üzerinden kimlik bilgilerini almak için kullanılır.
- DumpCerts: Tüm özel sertifikaları almak için kullanılır.
- Command: Mimikatz aracına ait özel komutlar bulunmaktadır. İsteğe bağlı olarak bir mimikatz komutu çalıştırmak için bu parametre kullanılır.
- ComputerName: Komut dosyasını çalıştırmak için kullanılan bilgisayar adlarını belirler.
Invoke-MimikatzWDigestDowngrade
Windows 8.1 ve Windows Server 2012 R2 sürümleri ve sonraki işletim sistemi sürümlerinde oturum açmış kullanıcıların parolaları açık metin halinde tutulmaz. Bu script kullanılarak, kayıt defterinde bir kayıt açılır ve WDigest ile oturum açmış kullanıcı bilgilerinin kullanılması sağlanır. Böylece oturum açan kullanıcıların açık metin parolaları alınabilir. Bu script çalıştırıldıktan sonra “HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest” içerisine, “UseLogonCredential” kaydı eklenir ve bu kayıt “1” değerini alır.
Bu script powershell üzerinde çalıştırıldıktan sonra kullanıcı oturumu kapanır. Kullanıcı tarafından tekrar giriş yapıldıktan sonra, “Invoke-Mimikatz” scriptinin çalıştırılmasıyla birlikte giriş yapan kullanıcıların açık metin parolaları elde edilir. Böylece mimikatz aracı ile Windows 8.1 ve Server 2012 R2 işletim sistemleri ve sonraki sürümler açık metin parolalar alınabilir. Eğer RDP anahtarı kullanılıyorsa, bu script RDP kullanıcılarını da hedefler. Bunun için “RDP” parametresi kullanılır.
Yukarıdaki resimde görüldüğü üzere “Invoke-MimikatzWDigestDowngrade” komutu çalıştırıldı ve aktif hesapların oturumları kapandı. Giriş yapıldıktan sonra “Invoke-Mimikatz” komutunun çalıştırılmasıyla giriş yapan hesapların parolası açık metin halinde alındı.
Invoke-Mimikittenz
Bu script, bilgileri bellekten almak için kullanılır. Regex ile kurban makinenin belleğinden bilgileri almak için ReadProcessMemory() fonksiyonu çalışır.
Invoke-SSIDExfil
Bu script, kullanıcı kimlik bilgileri ile bir “Hosted Network” oluşturmak amacıyla kullanılmaktadır. Script çalıştırıldıktan sonra, kimlik bilgilerinin girilmesi için bir pencere açılır. Bu pencere kimlik doğrulanana kadar kapanmaz ve doğru kimlik bilgileri girmeyi mecburi kılar. Doğru kimlik bilgileri girildikten sonra kullanıcı adı ve parola açık metin halinde ROT13 ile encode edilir ve “ROT13(Domain):ROT13(kullanıcı_adı):ROT13(parola)” formatında bir SSID değeri almış ağ başlar. Böylece kullanıcıların kimlik bilgileri bu yöntem ile açık metin halinde ele geçirilebilir.
Keylogger
Bu script, klavyeden girilen her bir karakteri, encode edilmiş bir şekilde %temp% dizininde oluşturulan “key.log” dosyasında saklar. Kaydedilen tuşlar; pastebin, google, tinypaste veya 3’üne birden belirtilen kullanıcı hesabına kaydedilebilir. Encode edilmiş bir biçimde kaydedilen tüm kayıtlar, Nishang içerisinde bulunan “Parse_Key” scripti ile decode edilebilir.
Scriptin çalıştırılması için iki adet parametre gerekmektedir: “CheckURL” ve “MagicString”. “CheckURL” parametresi ile bir web sayfasının linki belirtilir. “MagicString” parametresiyle de bu sayfa içerisinde bulunan bir metin belirtilir. Belirtilen metin sayfada varsa, keylogger sonlanacaktır. Bu nedenle “CheckURL” parametresine içeriği değiştirilebilecek bir link atanmalıdır.
Yukarıdaki resimde görüldüğü üzere, “privia” metninin her bir karakteri ASCII ile encode edilmiş bir şekilde kaydedilmiştir. Ek olarak bu script, “ExfilOption” parametresi ile çalıştırılırsa, basılan tuşlar belirtilen adrese sızdırılır.
MITM
Invoke-Interceptor
Bu script ile bir proxy sunucusu oluşturularak, HTTP(S) istekleri yakalanır ve bir dosyaya kaydedilir. Script çalıştırıldığında, eğer “ListenPort” parametresi ile bir port belirtilmediyse, varsayılan olarak 8081 portu ile bir dinleme modu başlar. Dinleme esnasında elde edilen veriler, “ProxyServer” ve “ProxyPort” parametreleri ile belirtilen proxy sunucusuna yönlendirilir. Ayrıca, dinleme işlemi sırasında yakalanan tüm istekler “LogFile” parametresi ile bir yol belirtilmedikçe, varsayılan olarak kurban bilgisayarın %temp% dizini içerisinde oluşturulan “interceptor.log” adlı dosyasına kaydedilir. Bu script ile ilgili diğer parametreler aşağıda açıklanmıştır:
- HostCA: Bu parametre ile makinelerin Interceptor Root Certificate Authority ile bağlantı kurması sağlanır ve http://<Interceptor_IP>:8082/i.ceradresinden sertifika alınır ve kurulur.
- AutoProxyConfig: Bu script, Interceptor üzerinden trafik yönlendirmek için otomatik olarak proxy ayarlarını değiştirir.
- Cleanup: Bu parametre ile tüm yüklü sertifikalar kaldırılır.
- SearchString: Bu parametre ile istekler üzerinde değiştirilmek istenen metin bulunur.
- ReplaceString: Bu parametre kullanılarak, “SearchString” ile belirtilen metin, bu parametre ile belirtilen metin ile değiştirilir.
- Tamper: “Cyber” kelimesini “Kittens” ile değiştirir.
- Domains: Güvenilir sertifikalar oluşturmak için domainlerin bulunduğu listeyi belirtir.
Misc
Speak
Bu script kullanılarak, “Sentence” parametresi ile belirtilen metin, MS Narrator tarafından seslendirilir.
Pivot
Post exploitation aşamalarının en önemli aşamalarından biri, ağ üzerinde hareket edebilmektir. Saldırgan tüm sistemi ele geçirmek için, ele geçirdiği bir makinenin farklı bir ağda bulunan cihazlarla bağlantısı varsa, saldırgan ele geçirdiği makineyi kullanarak, o cihazlara erişmek isteyecektir. Nishang, bu durum için bazı yöntemler sunmaktadır. Bu yöntemler aşağıda açıklanmıştır.
Create-MultipleSessions
Bu script ile WinRM özelliğinden yararlanılarak, PSSessions aracılığıyla uzak sunucuya bağlanılabilir. Bu script “filename” parametresine, içerisinde bilgisayar adları veya IP adreslerinin bulunduğu bir dosyanın yolu atanarak çalıştırılabilir. Script bu şekilde çalıştığı zaman, çalışan powershell uygulaması hangi hesaba bağlı olarak açılmışsa, o hesabın kimlik bilgileri, dosya içerisinde adı veya IP adresi bulunan makineler üzerinde denenir.
Yukarıdaki resimde görüldüğü üzere, 3 makine üzerinde deneme yapılmış ve 192.168.228.150 IP adresine sahip makinede kimlik doğrulanmıştır. Bu işlem başka kimlik bilgileri ile “Windows Credential Editor (WCE)” kullanılarak denenebilir. WCE ile kimlik bilgileri kullanılarak, o kullanıcının hak ve yetkileri ile yeni bir powershell uygulaması çalıştırılabilir ve bu script yeni powershell uygulamasında çalıştırılabilir.
“CreateSessions” parametresi kullanılarak, kimlik doğrulama işlemi ile beraber, kimlik doğrulama işleminin başarılı olduğu makine üzerinde oturum başlatılır.
Bu script için diğer parametreler aşağıdaki gibidir:
- Creds: Kullanıcı adı ve parola belirtmek amacıyla kullanılır.
- VerboseErrors: Ayrıntılı hata mesajı almak için bu parametre kullanılır.
Invoke-NetworkRelay
Bir sisteme saldırı yapmak için o sistemin ağına dahil olmak her zaman için tüm makinelere direk erişim sağlamak anlamına gelmez. Örneğin bağlı olduğumuz ağda bir SQL sunucusuna erişim sağlayabilirken, DC (Domain Controller) makineye erişim sağlayamayabiliriz. Böyle bir durumda SQL sunucusuna sızıldığını varsayarsak, SQL sunucusu farklı bir ağ arabirimine sahip olduğu için Domain Controller ile iletişime geçebildiğinden dolayı, Domain Controller makineye erişmek için SQL sunucusunu aracı olarak kullanmak gerekecektir. “Invoke-NetworkRelay” kullanılarak sızılan aracı makine (Örn: SQL sunucusu) üzerinde bir port açılarak, Domain Controller makineye ait bir porta, “port yönlendirme” yapılabilir. Böylece saldırgan, farklı bir ağda bulunan Domain Controller’a port yönlendirme (port forwarding) yaparak, aracı makine üzerinden erişim sağlayabilir. Bu script için kullanılan parametreler aşağıda açıklanmıştır.
- Relay: Bağlantı türünü belirtmek için kullanılır. (Varsayılan v4tov4. Diğer seçenekler: v4tov6, v6tov4, v6tov6)
- ListenAddress: Portun yönlendirileceği makinenin adresini belirtir. (Varsayılan 0.0.0.0(IPv4))
- ListenPort: Uzak makinenin portuna yönlendirme yapmak için kullanılan aracı makineye ait port. (Varsayılan 8888)
- ConnectAddress: Port yönlendirme yapılacak olan uzak sunucunun adresini belirtir.
- ConnectPort: Yönlendirme yapılacak olan port belirtilir.
- ComputerName: Port yönlendirme için “netsh” komutunun çalıştırılacağı makineyi belirtir.
- Username: “ComputerName” parametresi ile belirtilen makinede kimlik doğrulama yapmak için kullanılan kullanıcı adı.
- Password: “ComputerName” parametresi ile belirtilen makinede kimlik doğrulama yapmak için kullanılan parola.
- Delete: Bir röle bağlantısını silmek için kullanılır.
- Show: Tüm röle bağlantılarını görüntülemek için kullanılır.
Run-EXEonRemote
Bu script, makine üzerinde komut çalıştırmak için kullanılmaktadır. Varsayılan olarak WCE (Windows Credential Editor) uygulamasını çalıştıran bu script “EXEArgs” parametresi ile WCE uygulamasına ait argümanları alabilir. Bu script başka makineler üzerinde “Invoke-Command” cmdlet kullanılarak çalıştırılabilir.