Windows Server Servisinde Bulunan Kritik Açıklık (MS08-067) - Ulusal Bilgi Güvenliği Kapısı
Yazarın bu bölümdeki diğer yazıları... KriptoKilit için KriptoAnahtar Kripto kilit yöntemini kullanan şantajcı zararlı yazılım Fatura Zararlı Yazılımı (FatMal) Tinba Zararlı Yazılım Analizi Kullanıcı Erişim Bilgilerinin (Access Token) Tahrif Edilmesi Stuxnet'i özel yapan ne? Nam-ı Diğer Conficker (Downadup, Kido) Solucanı 64 bit Vista Kernel Hacking	Windows Server Servisinde Bulunan Kritik Açıklık (MS08-067)	Osman PAMUK, TÜBİTAK BİLGEM	27.10.2008	23 Ekim 2008 Perşembe günü Microsoft normal güncelleme yayınlama periyodunun dışına çıkarak en yüksek kritiklik seviyesinde olduğunu bildirdiği bir yama yayınladı . Bildiriye göre bu yamanın kapattığı açıklık bütün Windows türlerini tehdit etmektedir. Özellikle de Windows 2000, XP ve 2003 işletim sistemlerinde uzaktan kod çalıştırılmasına izin vermektedir. Windows Vista ve Windows 2008 Server işletim sistemlerinde ise servis dışı bırakma saldırılarına olanak sağlamaktadır . Bilindiği üzere genel olarak üretici firma işletim sistemi
güncellemelerini dağıtmaya başladıktan sonra birkaç gün içinde
güncellemelerin kapattığı açıklıkları kullanan kötü niyetli yazılımlar
ortaya çıkmaktadır. Aynı şekilde bu açıklığın duyurulduğu ve yama
dağıtılmaya başlandığı gün açıklığı kullanan kod parçaları internette
yayınlanmaya başladı. Diğer taraftan, “Microsoft Malware Protection
Center” yine aynı gün bu açıklığı hedefleyen saldırılarla
karşılaştığını ve kullanıcıların acilen önlem alması gerektiğini
Bu teknik yazıda açıklığın hangi işletim sistemlerini nasıl tehdit
ettiğine ve korunma yollarına yer verdik. Hem ev kullanıcılarının hem
de kurumların acil olarak Microsoft’un yayınlamış olduğu yamayı
kurmalarını tavsiye ediyoruz. Yama, http://www.microsoft.com/technet/security/Bulletin/MS08-067.mspx adresinden edinilebilir. MS08-067 Kod Numaralı Açıklık
Bu açıklık Microsoft destekli tüm Windows işletim sistemlerinde ortak olan netapi32.dll kütüphanesinin NetpwPathCanonicalize fonksiyonunda bulunmaktadır. Koddaki hatadan dolayı uzaktan yetkisiz bir kullanıcı özel tasarlanmış bir RPC istemiyle yığın (stack) tabanlı arabellekte (buffer) bir taşmaya sebep olabilmektedir . Örnek Bir Saldırı
Saldırganın bir bilgisayara saldırabilmesi için sadece TCP/139 “netbios-ssn” ve TCP/445 “Microsoft-ds/direct hosted SMB” portlarına ulaşabilmesi yeterlidir. Bu iki port Windows işletim sistemlerinde dosya ve yazıcı paylaşımı hizmetlerine olanak sağlayan ve kurulumla beraber açık olarak gelen portlardır. Saldırıyı gerçeklemek için en çok kullanılan işletim sistemlerinden biri olan Windows XP SP3 işletim sistemine sahip bilgisayarı test ortamına kurduk. Amacımız sadece bu açıklığı kullanılarak yetkisiz bir kullanıcının uzaktan kod çalıştırabileceğini göstermek. Bu yüzden saldırı için deney amaçlı yazılmış olan bir kodu kullanabiliriz. Etik açıdan bu kodun erişim adresini yayınlamıyoruz. Saldırımız başarılı olduğu takdirde kurban bilgisayardaki ilgili servis hata verecek ve çalışmayı durduracaktır. Hatanın gerçekten bizim saldırımızın başarılı olmasından kaynaklandığını görmek için kurban bilgisayarın ilgili servisini bir debuggera (hata ayıklayıcısına) bağlamak mantıklı olacaktır. Debugger olarak Microsoft’un Windbg programını kullanabiliriz . İlk olarak debug edeceğimiz servisin hangi servis olduğunu bulmamız gerekli. Bunun için komut satırından “tasklist /svc” komutunu çalıştırabiliriz.
“Lanmanserver” ve “Browser” hizmetlerinin çalıştığı “svchost.exe” servisi bizim debug etmemiz gereken servis . Daha sonra aşağıdaki gibi Windbg programından bu servise servis ismi ve pid değerine göre bulup bağlanabiliriz. Şimdi dışarıdan saldıracağımız serviste herhangi bir hata oluştuğu zaman oluşan hatayı ayrıntılarıyla görebiliriz. Kurban tarafındaki düzeneği hazırladıktan sonra saldırgan bilgisayarına geçiyoruz. Saldırganın yapması gereken ilk iş, internetten indirdiği kodu derlemek, daha sonra da kurban bilgisayara anonim bir kullanıcı bağlantısı açmak ve biraz önce derlediği kodu çalıştırmak olacaktır. Saldırı sonrasında saldırının etkilerini daha iyi görmek için kurban bilgisayarına geri dönüyoruz. Eğer saldırı başarıyla gerçekleştiyse kurban bilgisayarındaki debuggerda aşağıdakine benzer mesajlar gelecektir. Yukarıda da görüldüğü gibi debuggera bağladığımız svchost servisi hata verip çalışmayı durdurdu. Amacımız sadece servis dışı bırakma saldırısı yapmak olsaydı başarılı olmuştuk. Fakat gerçekte açıklığın bize sunduğu saldırı olanakları bu kadar kısıtlı değil. Çünkü aldığımız “Access violation” hatası, normal şartlarda çalışan servisin okumaya izni olmadığı bir hafıza parçasına ulaşmaya çalışmasından kaynaklanmakta. Okumaya ve çalıştırmaya çalıştığı hafızanın adresini ise EIP registerının içeriğinden görebiliriz. Bu değer 00 78 00 78 adresidir. Bu adres de aslında bizim deneysel kodumuzdaki aşağıdaki kod satırından gelmektedir. Yukarıdaki x karakterlerinin hafıza karşılığı 00 78. Yani daha dikkatli bir taşma sağlandığı takdirde rahatlıkla çalıştırılacak olan kod hafızaya yüklenebilir ve EIP registerının değeri o kodu çalıştıracak şekilde ayarlanabilir. Farklı İşletim Sistemlerinde Açıklığın Etkisi 
Windows 2000 işletim sistemlerinde standart kurulumunda TCP/139 “netbios-ssn” ve TCP/445 “microsoft-ds” portları anonim (yetkisiz kullanıcı) erişime açıktır ve Windows 2000 işletim sistemlerinde güvenlik duvarı varsayılan olarak bulunmamaktadır. Özel olarak bu hizmetler kapatılmağı veya herhangi bir güvenlik duvarı ile erişim engellenmediği sürece Windows 2000 işletim sistemleri uzaktan kod çalıştırma saldırısına açıktır.
Windows XP yüklü bilgisayarlarda SP2 den sonraki sürümlerde standart kurulumda Windows güvenlik duvarı tarafından TCP/139 ve TCP/445 portlarına erişimler kapatılmıştır. Dolayısıyla dışarıdan saldırı gerçekleştirilemez. Fakat genellikle etki alanına üye bilgisayarda Windows güvelik duvarı kapatılmaktadır. Aynı şekilde dosya ve yazıcı paylaşımı açıldığında veya basit dosya paylaşımı kullanıldığında güvenlik duvarının ilgili portları da açılmaktadır. Bu durumlarda Windows XP işletim sistemleri standart olarak anonim erişimi kabul etmektedir ve uzaktan kod çalıştırma saldırılarına açıktır.
Windows 2003 yüklü bilgisayarlarda standart kurulumda güvenlik duvarı kapalıdır ve ilgili portlar anonim erişime açıktır. Dolayısıyla özel bir ayar yapılmadığı takdirde uzaktan kod çalıştırma saldırılarına karşı savunmasızdırlar.
Windows Vista ve Windows 2008 yüklü bilgisayarlarda standart kurulumda güvenlik duvarı ilgili portlara erişimi engellemektedir. Güvenlik duvarında erişim açıldığı takdirde bile işletim sistemi anonim (yetkisiz kullanıcı) erişime izin vermemektedir. Fakat güvenlik duvarından ilgili portlara erişim açılsa ve “Password Protected Sharing” özelliği kapalı hale getirilse dahi ancak servis dışı bırakma saldırılarına maruz kalabilir. Çünkü Vista ve üstü işletim sistemlerinde XP işletim sistemlerinde de olan DEP (Data Execution Prevention) özelliğinin yanı sıra ASLR(Address space layout randomization) özelliği bulunmaktadır. DEP ve ASLR özellikleri sayesinde de bir saldırganın stack based buffer overflow(yığın tabanlı arabellek taşması) yöntemiyle servis içinde istediği adrese kodunu yazması ve çalıştırması çok zordur. Korunma Yolları 
1) En etkili yöntem; ilgili güncellemeyi işletim sisteminin almasını sağlamaktır. Bunun için güncellemenin sayfasından  yama indirilip kurulabileceği gibi internete bağlı bir sistemde “Windows Update” uygulaması “%SystemRoot%\system32\wupdmgr.exe” komutuyla çalıştırılıp işletim sisteminin kendisinin gerekli yamaları bulup indirmesi ve kurması sağlanabilir. Ancak yama kurulduktan sonra aktif hale gelmesi için işletim sisteminizi yeniden başlatmanız gerekecektir.
2) İlgili portları açan ve dinleyen “Bilgisayar Tarayıcısı” ve “Sunucu” servislerini kapatabilirsiniz. Bunun için Denetim Masası->Yönetimsel Araçlar->Hizmetler penceresi açılır. Hizmetler penceresinden “Bilgisayar Tarayıcısı” ve “Sunucu” hizmetleri seçilerek başlangıç türü “Devre Dışı” olarak seçilir. Daha sonra da “Durdur” düğmesine basılarak çalışması durdurulur. “Sunucu” hizmetini yukarıdaki gibi kapattığınız takdirde dosya yazıcılarınızı paylaşamaz hale geleceksiniz fakat başka bilgisayarlardaki dosya ve yazıcı paylaşımlarından faydalanmaya devam edebilirsiniz.
3) TCP 139 ve TCP 445 portlarına dışarıdan olan erişimi bir güvenlik duvarı yardımıyla kapatabilirsiniz. Güvenlik duvarı olarak Windows güvenlik duvarını kullanabileceğiniz gibi kendi kurduğunuz farklı bir güvenlik duvarını da kullanabilirsiniz. Windows güvenlik duvarını kullanacağınız takdirde; güvenlik duvarınızı ilk önce aktif hale getiriniz. Daha sonra “Özel Durumlar” sekmesinde “Programlar ve Hizmetler” bölümündeki “Dosya ve Yazıcı Paylaşımı” iznini kaldırıp pasif hale getiriniz. Bu ayar sonucunda bu portları kullanarak haberleşen hizmetlerinizin çalışması aksayacaktır. 4) Yukarıdaki nispeten basit çözümlerin yanında başka yöntemlerde kullanabilirsiniz. Mesela eğer Windows Vista veya Windows Server 2008 kullanıyorsanız bu açıklıktan etkilenen RPC tanımlayıcısını filtreleyebilirsiniz . Bunun yanında tam test edilmemiş bir çözüm olarak, referanslardaki web sayfasından gerekli programı indirip, anonim erişime açık işletim sistemlerinde anonim erişim hakkını kaldırabilirsiniz . Referanslar  http://www.microsoft.com/technet/security/Bulletin/MS08-067.mspx  http://blogs.technet.com/swi/archive/2008/10/23/More-detail-about-MS08-067.aspx
 http://www.nynaeve.net/?p=226 Favori olarak ekle (1) | Görüntüleme sayısı: 14707Yorumlar (3)
1. 05-11-2008 13:27
Deneysel kod olarak bahsettiğimiz kod başka bir web sayfasından alındı ama yazıda da belirttiğimiz gibi bu web sayfalarını yayınlayamıyoruz. Ama halen public kullanıma açık bir çok kodu internetten bulabilirsiniz. Access violation aldığımız hafıza adresini kodun içinden ayarlayabiliyoruz. Yazıdaki örnekte rastgele bir address e yönlendirme olduğu için access violation hatası alıyoruz. Yoksa düzgün bir adrese (stack overflowla yüklenen zararlı kodun ilk instructionına) yönlenecek şekilde ayarlanabilir ve kurban kullanıcı hiç bir hata almayabilir. Hali hazırda da bunu kullanan solucanlar gezinmeye başlamış.
2. 05-11-2008 08:52
Yazıyı beğendim. bilgi verici olmuş. Ancak deneysel kod ile kastettiğiniz kendi geliştirdiğiniz kod mudur? Çünkü zaten access violation aldığımızı belirttiğimiz bir hafıza adresini kod içinde mi veriyoruz? Eğer boyle ise ilk anda buffer overflow da verdirilebilir diye düşünmekteyim. Ancak tabi ki kurbanın hissetmemesini sağlayacak isek çok daha farklı çözümler geliştirilebilir.:)
3. 28-10-2008 14:33
Kritik ve güzel bir yazı olmuş. Teşekkürler.