Bug Bounty, Bug Hunting, Cross Site Web Socket Hijacking (CSWSH), Охота за ошибками

#44 Bug Bounty. Cross Site Web Socket Hijacking (CSWSH).

Здравствуйте, дорогие друзья.

Введение

Я довольно редко сталкиваюсь с приложением, использующим веб-сокеты, но когда нахожу, то почти всегда есть перехват веб-сокетов между сайтами (CSWSH). Настройка полнодуплексного канала связи позволяет использовать как чтение, так и отправку данных. Эту уязвимость можно использовать для выполнения XSS, SQL-инъекций, RCE и т.д.

Веб-сокеты

WebSocket — это протокол компьютерной связи, обеспечивающий полнодуплексный канал связи по одному TCP-соединению. Полный дуплекс означает, что мы можем как читать, так и писать в соединение. Приложения, использующие веб-сокеты, обычно нуждаются в живом механизме двусторонней связи. Например, чат приложение может использовать веб-сокеты для отправки сообщений туда и обратно.

Web socket connection

Как показано выше, соединение начинается с рукопожатия веб-сокета. и HTTP-запроса на обновление. Такой подход используется для установки связи веб-сокета. Пример рукопожатия веб-сокета показан ниже:

Web socket handshake

После того, как рукопожатие установлено, Вы можете начать отправлять и получать сообщения из приложения.

CSWSH

Перехват веб-сокетов между сайтами (CSWSH) похож на CSRF, поскольку мы используем целевые файлы cookie для выполнения запросов. Кроме того, как и CSRF, цель должна была бы посетить нашу вредоносную страницу, войдя на целевой сайт, чтобы это сработало. Основное отличие заключается в том, что вместо отправки POST-запроса мы инициируем связь с веб-сокетом. После того, как соединение WebSocket установлено, мы можем делать все, что угодно. Предположим, у нас есть веб-приложение с функцией живого чата, которая использует веб-сокет для связи.

Live chat using web sockets

Первое, что Вы хотите сделать, это изучить трафик в burp. Только большинство людей знает, как использовать burp для тестирования HTTP-трафика, но он также может обрабатывать трафик веб-сокетов, как показано ниже:

Burp web socket traffic

Следующий шаг — создать POC, чтобы посмотреть, сможем ли мы захватить WebSocket пользователя. Мы можем использовать следующий веб-сайт для проверки уязвимости:

http://websocket.org/echo.html

Чтобы проверить CSWSH, Вам нужно войти в целевое приложение, как если бы Вы были законным пользователем. Затем Вы открываете вторую вкладку в том же браузере и пытаетесь создать подключение через веб-сокет. В этом примере я буду подключаться к живому чату. Если конечная точка уязвима, мы сможем создать веб-сокет соединение с использованием файлов cookie пользователя.

CSWSH POC website

Как Вы можете видеть на изображении выше, я смог инициировать веб-сокет соединение с использованием файлов cookie пользователей. Именно это делает ее таким похожим на CSRF. А реальная атака потребовала бы от пользователя посещения вредоносного сайта, при входе в систему уязвимого приложения. Затем вредоносный сайт может использовать файлы cookie пользователей для установки соединения через веб-сокет и отправлять сообщения от имени пользователя. Сайт также содержит код POC, если Вам нужно внести какие-либо изменения. Всегда рекомендуется отправлять POC-код при отправке для вознаграждения.

<!DOCTYPE html>

<meta charset=»utf-8″ />

<title>WebSocket Test</title>

<script language=»JavaScript» type=»text/JavaScript»>

var wsUri = «wss://echo.websocket.org/»;

var output;

function init()

{

output = document.getElementById(«output»);

testWebSocket();

}

function testWebSocket()

{

websocket = new WebSocket(wsUri);

websocket.onopen = function(evt) { onOpen(evt) };

websocket.onclose = function(evt) { onClose(evt) };

websocket.onmessage = function(evt) { onMessage(evt) };

websocket.onerror = function(evt) { onError(evt) };

}

function onOpen(evt)

{

writeToScreen(«CONNECTED»);

doSend(«WebSocket rocks»);

}

function onClose(evt)

{

writeToScreen(«DISCONNECTED»);

}

function onMessage(evt)

{

writeToScreen(‘<span style=»color: blue;»>RESPONSE: ‘ + evt.data+'</span>’);

websocket.close();

}

function onError(evt)

{

writeToScreen(‘<span style=»color: red;»>ERROR:</span> ‘ + evt.data);

}

function doSend(message)

{

writeToScreen(«SENT: » + message);

websocket.send(message);

}

function writeToScreen(message)

{

var pre = document.createElement(«p»);

pre.style.wordWrap = «break-word»;

pre.innerHTML = message;

output.appendChild(pre);

}

window.addEventListener(«load», init, false);

</script>

<h2>WebSocket Test</h2>

<div id=»output»></div>

Я лично использовал эту уязвимость для взлома нескольких приложений. Один из экземпляров позволил мне полностью взять на себя управление машинами пользователей в качестве веб-сайта. Соединение сокета использовалось для отправки команд оболочки на удаленный сервер. Это позволило мне добиться удаленного выполнения кода (RCE).

Вывод

Вы не будете часто сталкиваться с приложениями, использующими веб-сокеты. Большинство разработчиков и охотников за ошибками даже не знают, что это за уязвимость. Как и CSRF, это атака на пользователей, и может использоваться для установления соединения через веб-сокет при маскировке как жертва.

Резюмирую

В этом разделе рассмотрено лишь небольшое количество уязвимостей типа OWASP. Вероятно, самая популярная обнаруженная уязвимость — XSS. Кажется, что любое приложение содержит XSS, и выплата за уязвимость может быть где-нибудь от $ 50 до $ 1000, в зависимости от критичности и компании. Еще одна распространенная уязвимость — SQL-инъекция. CSRF — еще одна уязвимость, которую я кажется, нахожу все время. В большинстве случаев я нахожу ее в письме об изменении функциональности веб-сайта, которая позволяет мне изменить адрес электронной почты пользователя. Оттуда Вы можете сбросить пароль, чтобы получить доступ к учетной записи. SSRF кажется менее известная уязвимость, но я все еще нахожу ее довольно часто.

На этом все. Всем хорошего дня!

#1 Bug Bounty. Подготовка к Bug Bounty. Введение.

#2 Bug Bounty. Организация. Введение.

#3 Bug Bounty. Заметки. Введение.

#4 Bug Bounty. Подготовка к охоте. База знаний.

#5 Bug Bounty. RSS-каналы.

#6 Bug Bounty 101. Выбор платформы.

#7 Bug Bounty. Выбор правильной цели.

#8 Bug Bounty. Методология — рабочие процессы.

#9 Bug Bounty. Рабочий процесс GitHub.

#10 Bug Bounty. Гугл Дорки Рабочий процесс.

#11 Bug Bounty. Эксплойты — Рабочий процесс.

#12 Bug Bounty. CMS — Рабочий процесс.

#13 Bug Bounty. Брутфорс — Рабочий процесс.

#14 Bug Bounty. Раздел 2. Разведка.

#15 Bug Bounty. Reverse Whois.

#16 Bug Bounty. Гугл Дорки.

#17 Bug Bounty. Разведка — Фаза 2. Словарь.

#18 Bug Bounty. Перечисление поддоменов.

#19 Bug Bounty. Поисковый движок.

#20 Bug Bounty. Перестановка поддоменов.

#21 Bug Bounty. Разрешения DNS.

#22 Bug Bounty. Wayback Machine crawl data.

#23 Bug Bounty. Проверка файлов JavaScript.

#24 Bug Bounty. Гугл Дорки.

#25 Bug Bounty. Часть 8: Фаза fingerprint.

#26 Bug Bounty. Censys. Nmap. Masscan.

#27 Bug Bounty. Веб-приложение.

#28 Bug Bounty. Этап эксплуатации.

#29 Bug Bounty. GitHub.

#30 Bug Bounty. Неправильно настроенные сегменты облачного хранилища.

#31 Bug Bounty. Облачное хранилище Google.

#32 Bug Bounty. Elastic Search DB.

#33 Bug Bounty. Docker API.

#34 Bug Bounty. Kubernetes API.

#35 Bug Bounty. .git/.svn

#36 Bug Bounty. Эксплуатация CMS. WordPress.

#37 Bug Bounty. Joomla. Drupal. Adobe AEM.

#38 Bug Bounty. Эксплуатация OWASP. XML External Entity (XXE).

#39 Bug Bounty. Межсайтовый скриптинг (XSS).

#40 Bug Bounty. Server Side Request Forgery (SSRF).

#41 Bug Bounty. Cross Site Request Forgery (CSRF).

#42 Bug Bounty. SQL-инъекция (SQLI).

#43 Bug Bounty. Command Injection.