Bildiğiniz üzere TRAPMINE olarak 5 haziran tarihinde, NSA EsteemAudit exploit’inin sömürdüğü güvenlik zafiyetini kapatan üçüncü parti ücretsiz bir yama yayınlamıştık. Bu yamanın detaylarını sizlerle paylaşmak istiyoruz.
Öncelikle yamayı geliştirme aşamasında bizi en çok zorlayan nokta, Shadow Brokers grubunun sızdırdığı FuzzBanch arşivi içindeki EsteemAudit exploitini , Windows Server 2003 sistemlere karşı başarılı bir şekilde çalıştırıp, zafiyeti tetikleme kısmıydı. Güvenlik zafiyeti sadece Active Directory kurulu Windows Server 2003 ve bir domaine kayıtlı XP istemcileri etkilemekteydi. Biz ilk testlerimizi, Active Directory kurulumu olmayan bir Windows Server 2003 ‘ de yaptığımız için, EsteemAudit exploitini çalıştırabilmek için epey uğraştık. Smart Card logon özelliğinin Active Directory ile geldiğini bilmiyorduk.
Daha sonra Active Directory kurulumunu yapıp, exploiti başarıyla çalıştırdıktan sonra yama için çok fazla vakit harcamadık diyebiliriz. Yamanın detaylarına gelecek olursak, zafiyeti analiz ettikten sonra, zafiyetin gpkcsp.dll modülünde olduğunu gördük. “gpkcsp” modülü, Smart Card logon için kullanılan bir modül.
EsteemAudit exploiti, hedef sisteme sahte bir SmartCard Information paketi gönderiyor. Bu paketi işleyen zafiyetli modül ise, paket içerisindeki belirli bir datayı (Smartcard PCI paketi) memcpy() fonksiyonuna gönderiyor.
Memcpy fonksiyonun <size> parametresi ise (dword_8176DDC) , doğrudan gönderilen Smartcard PCI paketinin <size>’ından alınıyor. Smartcard PCI paketi , kullanıcı tarafından belirlenebilen bir paket. (Burada kullanıcı EsteemAudit oluyor. EsteemAudit exploiti, bir smart card gibi davranarak sahte paket gönderiyor.)
Dolayısıyla , elimizde <size> ve <source> parametreleri kontrol edilebilen bir memcpy() fonksiyonu mevcut. Bu memcpy() fonksiyonun <destination> adresi ise sadece 0x80 bytelık bir yığın(chunk). Yani zafiyet özünde bir hafıza taşması hatası.
Bu zafiyeti kapatmak için yayınladığımız yamada yaptığımız ise, bu modül (gpkcsp.dll) hafızaya yüklendiği anda, yukarıda bahsettiğimiz memcpy() fonksiyonun size değerini 0x80 ‘ e eşitlemek. Bu sayede olası bir hafıza taşmasının önüne geçmiş olacağız. Bunun için, ilgili memcpy() fonksiyonun adresini bulup, opcode’ları , aşağıdaki gibi değiştirmemiz gerekmektedir.
Yamamız aslında winlogon.exe process ‘ ine enjekte edilecek bir DLL dosyası. Hazırlayacağımız DLL dosyası, ilk etapta zafiyetli memcpy’nin adresini bulmalı. Bizim yaptığımız testlerde, bu memcpy fonksiyonu Windows 2003 SP1/SP2 EN/TR x86 sistemlerde, her zaman gpkcsp+0xE280 adresinde bulunuyordu. Bu yüzden gpkcsp modülünün base adresini alıp, üzerine 0xE280 ekleyerek, yamayacağımız adresi tespit edebiliriz. Bunun için GetModuleHandle() API ‘ ini kullanabiliriz.
Patchlenecek adresi tespit ettikten sonra , buradaki 6 byte’lık “mov ecx, dword_8176DDC” kodu, bizim patch kodumuz olan (mov ecx, 0x80) ile değiştirmek. Bunu da öncelikle, ilgili adresi VirtualProtect ile RWX olarak işaretliyoruz ve daha sonra bu adresteki 6 byte’ı, kendi opcode’larımız ile değiştiriyoruz.
Bir sonraki işlem ise DLLMain ‘i tanımlamak ve enjekte olduğumuz process içerisinde, yukarıda tanımladığımız kodu CreateThread ile çalıştırmak;
Ve yamamız hazır ! Yukarıda gördüğünüz gibi yama kodu oldukça basit. Zor olan kısım ise exploit’i kullanarak zafiyeti analiz etmek ve nereyi / nasıl yamayacağımıza karar vermek.
DLL Kaynak Kodları: http://www.trapmine.com/patch/patchdll.cpp