# WebSocket Saldırıları {{#include ../banners/hacktricks-training.md}} ## WebSocket Nedir WebSocket bağlantıları, başlangıçta bir **HTTP** el sıkışması ile kurulur ve **uzun ömürlü** olacak şekilde tasarlanmıştır; bu, herhangi bir zamanda iki yönlü mesajlaşmaya olanak tanır ve bir işlem sistemine ihtiyaç duymaz. Bu, WebSocket'leri, **düşük gecikme veya sunucu tarafından başlatılan iletişim** gerektiren uygulamalar için özellikle avantajlı hale getirir, örneğin canlı finansal veri akışları. ### WebSocket Bağlantılarının Kurulması WebSocket bağlantılarının kurulması hakkında ayrıntılı bir açıklama [**buradan**](https://infosecwriteups.com/cross-site-websocket-hijacking-cswsh-ce2a6b0747fc) erişilebilir. Özetle, WebSocket bağlantıları genellikle aşağıda gösterildiği gibi istemci tarafı JavaScript ile başlatılır: ```javascript var ws = new WebSocket("wss://normal-website.com/ws") ``` `wss` protokolü, **TLS** ile güvenli bir WebSocket bağlantısını belirtirken, `ws` **güvensiz** bir bağlantıyı gösterir. Bağlantı kurulumu sırasında, tarayıcı ve sunucu arasında HTTP üzerinden bir el sıkışma (handshake) gerçekleştirilir. El sıkışma süreci, tarayıcının bir istek göndermesi ve sunucunun yanıt vermesi ile ilgilidir; aşağıdaki örneklerde gösterildiği gibi: Tarayıcı bir el sıkışma isteği gönderir: ```javascript GET /chat HTTP/1.1 Host: normal-website.com Sec-WebSocket-Version: 13 Sec-WebSocket-Key: wDqumtseNBJdhkihL6PW7w== Connection: keep-alive, Upgrade Cookie: session=KOsEJNuflw4Rd9BDNrVmvwBF9rEijeE2 Upgrade: websocket ``` Sunucu el sıkışma yanıtı: ```javascript HTTP/1.1 101 Switching Protocols Connection: Upgrade Upgrade: websocket Sec-WebSocket-Accept: 0FFP+2nmNIf/h+4BP36k9uzrYGk= ``` Bağlantı kurulduktan sonra, her iki yönde mesaj alışverişi için açık kalır. **WebSocket El Sıkışma Anahtar Noktaları:** - `Connection` ve `Upgrade` başlıkları, bir WebSocket el sıkışmasının başlatıldığını işaret eder. - `Sec-WebSocket-Version` başlığı, genellikle `13` olan istenen WebSocket protokol sürümünü belirtir. - `Sec-WebSocket-Key` başlığında, her el sıkışmanın benzersiz olmasını sağlamak için Base64 kodlu rastgele bir değer gönderilir; bu, önbellek proxy'leri ile ilgili sorunları önlemeye yardımcı olur. Bu değer kimlik doğrulama için değil, yanıtın yanlış yapılandırılmış bir sunucu veya önbellek tarafından üretilmediğini doğrulamak içindir. - Sunucunun yanıtındaki `Sec-WebSocket-Accept` başlığı, `Sec-WebSocket-Key`'in bir hash'idir ve sunucunun bir WebSocket bağlantısı açma niyetini doğrular. Bu özellikler, el sıkışma sürecinin güvenli ve güvenilir olmasını sağlar, verimli gerçek zamanlı iletişim için zemin hazırlar. ### Linux konsolu Bir websocket ile ham bir bağlantı kurmak için `websocat` kullanabilirsiniz. ```bash websocat --insecure wss://10.10.10.10:8000 -v ``` Veya bir websocat sunucusu oluşturmak için: ```bash websocat -s 0.0.0.0:8000 #Listen in port 8000 ``` ### MitM websocket bağlantıları Eğer istemcilerin mevcut yerel ağınızdan bir **HTTP websocket**'e bağlı olduğunu bulursanız, istemci ile sunucu arasında bir MitM saldırısı gerçekleştirmek için bir [ARP Spoofing Attack ](../generic-methodologies-and-resources/pentesting-network/index.html#arp-spoofing) denemek isteyebilirsiniz.\ İstemci sizinle bağlantı kurmaya çalıştığında, o zaman şunu kullanabilirsiniz: ```bash websocat -E --insecure --text ws-listen:0.0.0.0:8000 wss://10.10.10.10:8000 -v ``` ### Websockets enumeration **Aracı** [**https://github.com/PalindromeLabs/STEWS**](https://github.com/PalindromeLabs/STEWS) **kullanarak websockets'te bilinen** **güvenlik açıklarını** **otomatik olarak keşfedebilir, parmak izi çıkarabilir ve arama yapabilirsiniz.** ### Websocket Debug tools - **Burp Suite**, MitM websockets iletişimini, normal HTTP iletişimi için yaptığına çok benzer bir şekilde destekler. - [**socketsleuth**](https://github.com/snyk/socketsleuth) **Burp Suite eklentisi**, **geçmişi** alma, **yakalama kuralları** ayarlama, **eşleşme ve değiştirme** kuralları kullanma, **Intruder** ve **AutoRepeater** kullanarak Burp'ta Websocket iletişimlerini daha iyi yönetmenizi sağlar. - [**WSSiP**](https://github.com/nccgroup/wssip)**:** "WebSocket/Socket.io Proxy"nun kısaltması olan bu araç, Node.js ile yazılmıştır ve istemci ile sunucu arasındaki tüm WebSocket ve Socket.IO iletişimlerini **yakalamak, kesmek, özel** mesajlar göndermek ve görüntülemek için bir kullanıcı arayüzü sağlar. - [**wsrepl**](https://github.com/doyensec/wsrepl), özellikle penetrasyon testi için tasarlanmış bir **etkileşimli websocket REPL**'dir. **Gelen websocket mesajlarını gözlemlemek ve yenilerini göndermek** için bir arayüz sağlar ve bu iletişimi **otomatikleştirmek** için kullanımı kolay bir çerçeve sunar. - [**https://websocketking.com/**](https://websocketking.com/) diğer weblerle **websockets** kullanarak iletişim kurmak için bir **web**'dir. - [**https://hoppscotch.io/realtime/websocket**](https://hoppscotch.io/realtime/websocket) diğer iletişim/protokol türleri arasında, diğer weblerle **websockets** kullanarak iletişim kurmak için bir **web** sağlar. ## Decrypting Websocket - [https://github.com/Anof-cyber/PyCript](https://github.com/Anof-cyber/PyCript) - [https://github.com/Anof-cyber/PyCript-WebSocket/](https://github.com/Anof-cyber/PyCript-WebSocket/) ## Websocket Lab [**Burp-Suite-Extender-Montoya-Course**](https://github.com/federicodotta/Burp-Suite-Extender-Montoya-Course) içinde websockets kullanarak bir web başlatmak için bir kod bulabilirsiniz ve [**bu yazıda**](https://security.humanativaspa.it/extending-burp-suite-for-fun-and-profit-the-montoya-way-part-3/) bir açıklama bulabilirsiniz. ## Cross-site WebSocket hijacking (CSWSH) **Cross-site WebSocket hijacking**, ayrıca **cross-origin WebSocket hijacking** olarak da bilinir, WebSocket el sıkışmalarını etkileyen **[Cross-Site Request Forgery (CSRF)](csrf-cross-site-request-forgery.md)**'nin özel bir durumu olarak tanımlanır. Bu güvenlik açığı, WebSocket el sıkışmalarının yalnızca **HTTP çerezleri** aracılığıyla kimlik doğrulaması yaptığı durumlarda ortaya çıkar; **CSRF tokenleri** veya benzeri güvenlik önlemleri yoktur. Saldırganlar, savunmasız bir uygulamaya çapraz alan WebSocket bağlantısı başlatan **kötü niyetli bir web sayfası** barındırarak bunu istismar edebilir. Sonuç olarak, bu bağlantı, uygulama ile kurbanın oturumunun bir parçası olarak kabul edilir ve oturum yönetim mekanizmasında CSRF korumasının eksikliğinden yararlanır. ### Simple Attack **Websocket** bağlantısı **kurulduğunda** **çerez** sunucuya **gönderilir**. **Sunucu**, her **belirli** **kullanıcıyı** gönderilen çereze dayalı olarak **websocket** **oturumu** ile **ilişkilendirmek** için bunu kullanıyor olabilir. Daha sonra, **örneğin** **websocket** **sunucusu**, bir mesaj "**READY"** gönderildiğinde bir kullanıcının konuşma geçmişini **geri gönderirse**, o zaman bağlantıyı kuran **basit bir XSS** (çerez **otomatik olarak** kurban kullanıcının yetkilendirilmesi için **gönderilecektir**) **"READY"** göndererek **konuşma** geçmişini **geri alabilecektir**. ```html ``` ### Cross Origin + Cookie with a different subdomain Bu blog yazısında [https://snyk.io/blog/gitpod-remote-code-execution-vulnerability-websockets/](https://snyk.io/blog/gitpod-remote-code-execution-vulnerability-websockets/) saldırgan, web soket iletişiminin gerçekleştiği alanın **alt alanında rastgele Javascript çalıştırmayı** başardı. Çünkü bu bir **alt alan** idi, **çerez** **gönderiliyordu** ve çünkü **Websocket, Origin'i düzgün kontrol etmediği için**, onunla iletişim kurmak ve **ondan token çalmak** mümkün oldu. ### Stealing data from user Taklit etmek istediğiniz web uygulamasını kopyalayın (örneğin .html dosyaları) ve web soket iletişiminin gerçekleştiği scriptin içine bu kodu ekleyin: ```javascript //This is the script tag to load the websocket hooker ; //These are the functions that are gonig to be executed before a message //is sent by the client or received from the server //These code must be between some