Piyasada Shared Hosting web sunucuları için en büyük tehditlerden bir taneside yanlış konfigurasyonlardan yararlanan kötü niyetli asp, .net veya php uygulamaları yani Web Shell. Her ne kadar işin erbabı özel olarak hazırlanmış shell uygulamaları kullanıp special defacement istatistiğini arttırsada piyasada bebeler için olan shell uygulamalarıda iş görebliyor. (AspxSpy,CyberSpy5,EFSO.ASP,R57Shell.PHP,C99Shell.PHP gibi)
Bu scriptlerden korunmak için Shared Hosting sunucularında benim uyguladığım bir kaç ayarı paylaşayım hemde bir checklist’im olsun diyerektan aşağıda yazdım.
.Net ile geliştirilmiş olan Shell uygulamaları yoğun olarak Framework içindeki
- System.IO
- Microsoft.Win32
- System.Net,System.ServiceProcess
- System.Management
sınıf kütüphanelerini kullanır.
Bu sınıf kütüphanelerinin Shared Hosting’de güvenli bir şekilde çaışması için içinde Code Access Security dediğimiz xml dosyaları vardır.
.Net 4.0 için
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Config
klasörünün içindedir
Eğer Web sunucunuzu .Net Shell’lerinden korunmak istiyorsanız bu sınıf kütüphanelerinin günveliğini kesinlikle sınırlamanız gerekemektedir. Bunun en basitide varsayılan olara Full gelen .Net Trust Level’ini Medium’a çekmektir.
Medium’a çektiğiniz taktirde Shell uygulamalarının istem derinliklerine ulaşması büyük ölçüde engellenmiş olur. Tabi bu durum normal uygulamalarımda çalışmasını engelleyebilir bu durumda trust config dosyalarında bazı oynamalar yapabilirsiniz duruma göre.
- Security Guidelines: ASP.NET 2.0
http://msdn.microsoft.com/en-us/library/ff649487.aspx - Code Access Security in ASP.NET 4 Applications
http://msdn.microsoft.com/en-us/library/dd984947.aspx
Burada dikkat edilmesi gereken Code Access Security izinleri verirken tüm Framework sürümlerinde ve patformlarında verilmesidir.
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Config\web_mediumtrust.config C:\Windows\Microsoft.NET\Framework64\v2.0.50727\CONFIG\web_mediumtrust.config C:\Windows\Microsoft.NET\Frameworkv\4.0.30319\Config\web_mediumtrust.config C:\Windows\Microsoft.NET\Frameworkv\2.0.50727\CONFIG\web_mediumtrust.config
Örnek olarak FileIOPermission’ı inceleyelim. Aşağıdaki kural uygulamanın sadece çalıştığı dizinde işlem yapmasına izin verir. Böylelikle Shell bir üst klasöre çıkma istediğinde SecurityException alır.
<IPermission class="FileIOPermission" version="1" Read="$AppDir$" Write="$AppDir$" Append="$AppDir$" PathDiscovery="$AppDir$"/>
Trust config’de yapılan değişiklikler bir alt uygulama tarafından ezileblir (override) bunun için allowOverride özellğini “false” olarak işaretlemek lazım yoksa web sitesine bir web.config atılıp Full Trust’da çalıştırılabilir. Bunu önlemek için
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Config\web.config
dosyasındaki location allowOverride=”true” değerini yapın location allowOverride=”false”
Diğer önemli olan konu ise sunucu üzerindeki NTFS (IT Procular ACL demeyi sever. Ben haklar diyorum) kullanıcı hakları.
IIS’in Impersinote (bir kullanıcının başka bir kullanıcı gibi hareket etmesi olayı) özelliği Anonymous kullanıcı seviyesinden User grubu kullanıcı seviyesine kadar çıkabilen bazı özellikle içerir bu nedenle User grubuna yetki verilmiş yerlere direkt erişim sağlanabilecek durumlar sağlanabilir.
Bu nedenle gerekmeyen her yerde User grubunun haklarını kaldırmanız Shell uygulamalarını sunucunun diskinin orasına burasına erişmesini büyük ölçüde engeller.
Örneğin: IceWarp Merak Mail’in çalıştığı klasörün (C:Program Files (x86)IceWarp) bir üst klasörden aldığı hak miraslarını iptal edip sadece SYSTEM ve Administrator grup haklarına sahip olmasının sağlanması gerekir ki herkes her önüne gelen config’leri okuyamasın. (Tabi servisin kullandığı başka kullanıcılar varsa bunuda göz önünde bulundurmayı unutmamak lazım.)
- Sunucudaki klasörlerin hak kontrollerini yapmak için AccessEnum (http://technet.microsoft.com/en-us/sysinternals/bb897332) aracını kullanabilirsiniz.
Aynı şekilde IIS’inde unutmamak gerekir. IIS’i korumak için C:WindowsSystem32inetsrvconfig klasörü içindeki *.config uzantılı dosyaların haklarından Users grubunu kaldırmak doğru olur. Gerçi varsayılan olarak öyle geliyor fakat yinede bazı uygulamalar kendi kafasına göre değiştirebiliyor.
Bazı Shell uygulamalarından mevcut disklerin listelenmesi Group Policy’den engellenebilir. Şöyle ki;
Windows Tuşu + R’ye bastıktan sonra gpedit.msc yazın ve User Configuration > Administrative Templates > Windows Components > Windows Explorer > Hide these specific drives in My Computer > Restrict All Drives seçeneğini “Enable” yapıp “Restrict All Driver” komutunu verin. Bu Bilgisayarıma tıkladığınızda size Diskleri göstermez biraz rahatsız edici ama yinede ek bir önlem.
Shell uygulamaları sunucu üzerinde herhangi bir işlem yapmak için genelde sistemde hazır olan çalıştırılabilir uygulamaları kullanırlar (cmd.exe, cacls.exe, ping.exe) bu hem Code Access Security’i atlatmak (bypass) etmek hemde daha az kod yazmak adına iyidir. Bu nedenle sunucunuzdaki C:WindowsSystem32*.exe ve C:WindowsSyswow64*.exe klasörlerinde *.exe uzantılı dosyaların erişimlerini minimum’a indirmek doğru bir hamle olur.
Bu kritik klasördeki *.exe erişimlerini değiştirmek için öncelikle dosyaların sahipliğini Administrator’a çevirmek gerekir.
Sistemde Administrator hakları ile giriş yapmışken aşağıdaki komutu verin:
takeown /F c:\windows\system32\*.exe
Bu komut System32 klasöründeki tüm .exe uzantılı dosyaların sahipliğini Administrator’a çevirecektir (Default olarak TrustedInstaller gelir)
Daha sonra aşağıdaki komutu çalıştırın:
cacls c:\windows\system32\*.exe /E /D Users
Bu komut da System32 klasöründeki tüm .exe uzantılı dosyaların haklarından Users grubunun kaldırır.
PHP ile geliştirilmiş olan shell uygulamaları içinde php.ini’de yapılacak bir kaç ayar daha var.
Öncelikle sakat fonksiyonları kapatmakla başlamak gerekir. PHP Shell scriptlerini incelerken çeşitli zaafları sömürmek için kullanılan temel fonksiyonlar var bunların bir listesini aşağıda veriyorum
exec, dl, passthru, shell_exec, system, eval, popen, fsockopen, proc_open, proc_get_status, proc_nice, proc_terminate, show_source, stream_socket_server, symlink, link, lchgrp, lchown, chown, chgrp, posix_initgroups, posix_kill, posix_mkfifo, posix_mknod, and posix_setegid, posix_seteuid, posix_setgid, posix_setpgid, posix_setsid, posix_setuid
php.ini dosyasında “disable_functions” değerinin karşısına yukarıdaki satırı ekledikten sonra bir çok shell scriptini elemine etmiş oluyosunuz.
Bir başka ayarda allow_url_fopen‘ın Off olması buna bağlı olarakda allow_url_include ‘un Off olması web sitesi güvenliği ve selameti için iyi olur.
PHP için kilit noktalardan bir taneside her web sitesi için müstakil bir php.ini dosyasının yaratılması ve siteyi onun üzerinden çalıştırmak olacaktır. Böylece her sitenin özel upload_tmp_dir‘ı disable_functions’ı veya disabled_classes’ı olabilir
Bu ayarlar MaestroPanel‘i geliştirirken edindiğim tecrübeler ve testler sonucu piyasada dolaşan bir çok shell uygulamasından sunucunuzu koruyacak korunmanızı sağlayan temel unsurlardır diyebiliriz.
MaestroPanel gibi bir proje geliştirdiğim için bu yazıyı bir inbound marketing metnine çevirmeden yapamazdım tabi :) Bu vesileyle;
Yukarıdaki ayarları ve dahasını MaestroPanel sunucu güvenliği adına itina ile gerçekleştirdiğini belirtmek isterim. Eğer hala MaestroPanel ile tanışmadıysanız buradan takılın ;)
Bunu uyguladıktan sonra windows 2016 da administrator ile de exe dosyaları komut satırından çalıştıramıyorum.
cacls c:\windows\system32\*.exe /E /D Users
Bu komut da System32 klasöründeki tüm .exe uzantılı dosyaların haklarından Users grubunun kaldırır.
Win8k için bir sıkılaştırmaydı bu. Win. 2016 için sorun oluyor anladığım kadarı ile. USERS grubunu tekrar ekleyebilirsiniz belki.