WinRM Penetrasyon Testi
Windows Uzaktan Yönetim (WinRM), Microsoft tarafından Windows makinelerinde donanım ve işletim sistemlerini uzaktan yönetmek için geliştirilen bir protokoldür. Windows Yönetim Çerçevesi'nin bir bileşenidir ve yazılım ve donanımın uzaktan yönetimi için tasarlanmış standart bir web hizmetleri protokolü olan WS-Yönetim Protokolünü uygular. WS-Yönetimi SOAP'a dayanır ve XML şemasını destekler. WinRM, HTTP taşıma için 5985 ve HTTPS Taşıma için 5986 portunu kullanır.
İçindekiler
- Laboratuvar Kurulumu
- Bağlantıyı test etme
- Yanal Hareket (Yerel)
- Enter-PSSession kullanarak sunucuya bağlanılıyor
- Winrs kullanarak sunucuya bağlanılıyor
- PowerShell kullanarak sunucuya bağlanma
- Yanal Hareket (Uzaktan)
- Tarama
- WinRM kimlik doğrulama yöntemlerini tanımlama
- WinRM oturum açma kaba kuvvet
- Nxc kullanarak şifre püskürtme
- Metasploit kullanarak WinRM'yi kullanma
- Docker kullanarak uzak kabuğu bağlama
- Ruby betiğini kullanarak uzak kabuğu bağlama
- Çözüm
Laboratuvar Kurulumu
Hedef Makine: Windows Server 2019 (192.168.31.70)
Bağımsız Bireysel Makine: Windows 10
Saldırgan Makinesi: Kali Linux (192.168.31.141)
Laboratuvar kurulumunu gerçekleştirmek için, hem sunucuda hem de ayrı bir makinede WinRM hizmetini etkinleştirmemiz ve yapılandırmamız gerekir. Burada Windows 10'u ayrı bir makine olarak ve sunucuyu Windows Server 2019 olarak kullanıyoruz.
Öncelikle Windows Server 2019 üzerinde PowerShell kullanarak WinRM'yi yapılandıracağız, bunun için aşağıdaki prosedür kullanılabilir:
- Yürütme Politikası Baypas:
Bazı betikleri çalıştırmak veya herhangi bir görevi gerçekleştirmek için yürütme politikasının atlanması gerekir. Bu yöntem sistem genelindeki yürütme politikasını değiştirmez ve yalnızca geçerli PowerShell oturumuna uygulanır. Aşağıdaki komuttur:
- PSRemoting'i Etkinleştir:
Enable -PSRemoting cmdlet'i, bilgisayarı WS-Management teknolojisi kullanılarak gönderilen PowerShell uzak komutlarını alacak şekilde yapılandırır. Komut aşağıdaki gibidir:
- WinRM yapılandırması:
Varsayılan olarak, WinRM HTTP için 5985 ve HTTPS için 5986 portunu dinler. Ayrıca, belirli uzak ana bilgisayarlardan gelen bağlantılara izin verme esnekliği vardır. Burada ağdaki tüm makineler için joker karakter (*) kullanıyoruz. Komutlar şunlardır:
- Hizmeti yeniden başlat:
Yapılandırma tamamlandıktan sonra, artık servis aşağıdaki komut kullanılarak yeniden başlatılabilir:
Yapmamız gereken bir diğer yapılandırma ise Remote Management Users yerel grubuna yönetici kullanıcısını eklemektir .
Şimdi bireysel makinede yapılandırmak için, sunucu yapılandırması durumunda uyguladığımız aynı eylemi gerçekleştireceğiz. Enable-PSRemoting komutunun bir hata verdiği ancak komutun başarılı bir şekilde yürütüleceği fark edilebilir.
Bağlantıyı test etme
Bağlantıyı test-wsman ile kontrol edebiliriz, eğer bağlantı başarılı olursa komut versiyon detaylarını döndürecektir.
Yanal Hareket (Yerel)
Hizmet aktif olduğundan, şimdi WinRM hizmetini doğrudan kullanarak yatay olarak hareket etmenin farklı yollarını deneyebiliriz. Burada, sistemde bir kullanıcı olarak ilk erişimi zaten elde ettiğimizi varsayıyoruz, şimdi yatay olarak hareket etmeye çalışıyoruz.
Enter-PSSession kullanarak sunucuya bağlanılıyor
Enter -PSSession, bağlanmak istediğimiz makine olan ComputerName parametresini ve uzak bağlantılar için güvenilir olan hesap adı olan Credential'ı kullanarak uzak sunucuya bağlanmak için kullanılabilir . Bağlantı sağlandıktan sonra sistem komutlarını çalıştırabiliriz.
Winrs kullanarak sunucuya bağlanılıyor
winrs, uzak sistemlere bağlanmak ve komutları yürütmek için WinRM servisini kullanan bir diğer komuttur.
Ayrıca sonrasında komutları doğrudan çalıştırabileceğimiz etkileşimli bir kabuk elde etmek için de kullanılabilir.
Powershell kullanarak sunucuya bağlanma
PowerShell Invoke-Command kullanarak bağlanmak için bir yöntem daha var , burada ComputerName parametresinde ana bilgisayarı, Credential parametresinde hesap adını ve Kimlik Doğrulama türünü Negotiate olarak ayarlamamız gerekiyor. Negotiate kullandığımızda, PowerShell'in başlangıçta Kerberos kimlik doğrulamasını kullanacağı, başarılı olmazsa NTLM'ye geri döneceği anlamına gelir . Ancak, etki alanı ortamında olmayan sistemler için Credential'ı vermemiz gerekir . Burada ScriptBlock parametresinde komutu verebiliriz .
Ayrıca, pass'ı argüman olarak alacak cred olarak bir nesne de oluşturabiliriz . Bir SecureString oluşturmak için -AsPlainText ve -Force parametrelerini vermemiz gerekir , aksi takdirde bir hata verir. Oluşturulan pass dizesi, PSCredential sınıfı kullanılarak System.Management.Automatic ad alanı kullanılarak oluşturulan cred nesnesinde bir değişken olarak geçirilebilir .
Yanal Hareket (Uzaktan)
Tarama
WinRM servisine uzaktan bağlanmak için öncelikle numaralandırma işlemini yapmamız gerekiyor.
5985 portunun açık olduğu ve WinRM bağlantıları için HTTP'yi desteklediği görülebilir.
WinRM kimlik doğrulama yöntemlerini tanımlama
Metasploit modülündeki winrm_auth_methods yardımcı programı kimlik doğrulama yöntemlerini belirlemek için kullanılabilir. WinRM destekleniyorsa bu yardımcı program
WinRM oturum açma kaba kuvvet
WinRM'deki kaba kuvvet, başarılı kimlik bilgilerini saymak için de gerçekleştirilebilir. Burada Metasploit modülü içinde yardımcı/tarayıcı/winrm/winrm_login kullanıyoruz . Burada DOMAIN'i varsayılan olarak tutuyoruz, yani WORKSTATION. Kullanıcı adlarını user_file'da ve parolaları pass_file'da belirtebiliriz.
Geçerli kimlik bilgileri bulunduğunda oturumun elde edildiği görülebilir.
Nxc kullanarak şifre püskürtme
nxc, WinRM servisinde parola spreyi yapmak için kullanılabilir, sadece kullanıcı adı ve parola dosyasını girdi olarak geçirmemiz gerekiyor.
Geçerli kullanıcı adı ve şifre elde edildikten sonra evil-winrm aracını kullanarak uzak sisteme giriş yapabiliriz.
Geçerli kimlik bilgileri bulunduktan sonra, nxc'yi kullanarak -x bayrağını vererek komutları doğrudan da çalıştırabiliriz .
Metasploit kullanarak WinRM'yi kullanma
Geçerli kimlik bilgilerini bulduğumuzda, Metasploit içindeki auxiliary/scanner/winrm/winrm_cmd'yi kullanarak komut yürütme işlemini gerçekleştirebiliriz . Komutlar şunlardır:
Geçerli kimlik bilgilerine sahip olduğumuzda meterpreter oturumunu da alabiliriz. Komut dosyasını yürütmek için exploit/windows/winrm/winrm_script_exec kullanılabilir. Bu exploit, sistem düzeyindeki bir işleme geçerek otomatik olarak ayrıcalık yükseltmesi gerçekleştirmeye çalışır.
WQL (WMI Sorgu Dili), Windows Yönetim Araçları (WMI) çerçevesi içinde veri sorgulamak için tasarlanmış SQL'in (Yapılandırılmış Sorgu Dili) özel bir alt kümesidir .
WinRM hizmeti için geçerli kimlik bilgileri elde edildiğinde, WMI işlevselliği hedef sistemde keyfi WQL sorguları yürütmek için kullanılabilir. Modül ayrıca bu sorguların sonuçlarını ganimet olarak depolayacaktır.
Burada Win32_Service'den servisin adını ve durumunu almak için sorguyu verebiliriz .
Docker kullanarak uzak kabuğu bağlama
Linux'tan Windows'a PS-Remoting'e izin vermek için NTLM desteğiyle PowerShell'in bir Docker görüntüsünü çalıştırabiliriz . Bağlantıdan sonra geçerli kimlik bilgilerini sağlayabilir ve Enter-PSSession aracılığıyla oturumu alabiliriz.
Ruby betiğini kullanarak uzak kabuğu bağlama
WinRM'nin etkinleştirildiği uzak sunucuya bir ruby betiği kullanarak da bağlanabiliriz. Betik buradan indirilebilir:
https://raw.githubusercontent.com/Alamot/code-snippets/master/winrm/winrm_shell_with_upload.rb
Bu scripti geçerli bir kullanıcı adı, şifre ve uç nokta vererek değiştirmemiz gerekiyor.
Scripti değiştirdikten sonra ruby kullanarak çalıştırabiliriz.
Çözüm
WinRM günlük görevlerde çok kullanışlı bir hizmettir, ancak düzgün yapılandırılmazsa saldırganlar tarafından kabuk erişimi elde etmek için kötüye kullanılabilir. Bu nedenle kimlik doğrulama izinlerinin yalnızca güvenilir kullanıcılara ve herkese değil verilmesi önerilir.