Найти в Дзене
B0rn2beR00T

Решение Chellange HTB (Neovault)

Приветствую, друзья! В новой статье разберём кейс с площадки HTB под названием Neovault. Уязвимая тачка содержит рабочие эндпоинты устаревшей версии API, что приведёт к утечке идентификаторов пользователей. Также мы пощупаем IDOR и столкнёмся c недостатков MongoDB и возможностью подбора идентификаторов. Приступим к разбору! Neovault — это надёжное банковское приложение, которое позволяет пользователям легко переводить средства друг другу и удобно загружать историю транзакций. Мы предлагаем вам изучить приложение на предмет потенциальных уязвимостей и найти скрытый в нём флаг. Итак, web представляет из себя банковское приложение. Форма авторизации не похоже что уязвима. Никаких ошибок синтаксиса или сервера я не увидел после внедрения спец. символов. Значит мы ушли чуть не туда. Оценить в полной мере функционал без учетной записи будет не просто и поэтому регистрируем своего нового пользователя. Внутри web-ресурса уже интереснее обстоят дела. Нам дали 100 американских шекелей как бонус
Оглавление

Приветствую, друзья!

-2

В новой статье разберём кейс с площадки HTB под названием Neovault. Уязвимая тачка содержит рабочие эндпоинты устаревшей версии API, что приведёт к утечке идентификаторов пользователей. Также мы пощупаем IDOR и столкнёмся c недостатков MongoDB и возможностью подбора идентификаторов.

Приступим к разбору!

Сбор информации

Neovault — это надёжное банковское приложение, которое позволяет пользователям легко переводить средства друг другу и удобно загружать историю транзакций. Мы предлагаем вам изучить приложение на предмет потенциальных уязвимостей и найти скрытый в нём флаг.

Итак, web представляет из себя банковское приложение. Форма авторизации не похоже что уязвима. Никаких ошибок синтаксиса или сервера я не увидел после внедрения спец. символов. Значит мы ушли чуть не туда.

-3

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

-4

Внутри web-ресурса уже интереснее обстоят дела. Нам дали 100 американских шекелей как бонус за регистрацию.

Тут из функционала есть общая справка о счёте пользователя, отправка средств, внесение денег на свой счёт, история транзакций, возможность скачать платёжную квитанцию и настройка профиля.

-5

Всё это протыкиваем и далее переходим в Burp Suite и смотрим:

-6

Нам высветились конечный точки API приложения. В одной эндпоинте даже были id пользователей. Это мы сохраним на будущее.

Эндпоинт API — конечная точка веб-сервиса, к которой клиентское приложение обращается для выполнения определённых операций или получения данных.

Если есть версия v2 у API, то возможно разработчики забыли закрыть старую версию v1 и там что-то будет для нас полезное.

Чтобы проверить это поменяем в пути v2 на v1 и глянем что отдаёт сервер:

-7

Сервер отвечает, что v1 уже не поддерживается в этом эндпоинте. В этот момент у меня закралась мысль в голову, что мы можем видеть не все эндпоинты. Тут я полез в исходный код, который виден на стороне клиента (браузер). И вот что я нашёл по итогу:

-8

Теперь можем попробовать перебрать все конечные пути и выявить, что из этого забыто разрабами.

Первый кандидат: /api/v1/auth/change-email

Появляется этот эндпоинт при смене email в настройках пользователя.

-9

Эта конечная точка выдаёт ошибку, указывающую на то, что req.user._id не определено. Мы не можем контролировать значение _id, так как не можем контролировать свойства req.user . Однако это ошибка Nodejs. Пока мы сохраним эту информацию.

-10

Тут я решил погуглить информацию о такой ошибке и обнаружим, что ошибка явно затрагивает MongoDB.

-11

Следующий кандидат: /api/v1/transactions/download-transactions

Этот эндпоинт получаем после скачивания платёжной квитанции пользователя, но только v2.

-12

Поменяв в пути эндпоинта v2 на v1, сервер указывает на то, что не хватает параметра _id.

-13

В ответе сервера видим, что нехватке одного параметра _id

Попробуем добавить параметр _id пользователя NameName, которого нашли ранее и посмотреть на ответ сервера в таком случае:

-14

Сервер отдаёт нам PDF-файл пользователя с этим _id.

Попробуем обратиться с системному пользователю neo_system, вписав его _id

-15

Теперь включим режим перехвата пакетов и отравим такой запрос с _id

-16

Теперь попробуем скачать платёжку:

-17

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

-18

Отравим ему немного денег :)

-19

После отравления денег видим новый эндпоинт от API, где засвечен _id пользователя user_with_flag

-20

Проверим рабочий ли он:

-21

Да, IDOR сработал и в этом случае. Аналогично случаю до этого переходим в режим перехвата запросов и делаем такой же запрос как и в Repeater.

-22

Флаг теперь у нас в кармане! Победа!

-23

Подбор идентификатора MongoDB

Если присмотреться, то можно заметить, что значение _id увеличивается и, вероятно, его можно предсказать (оно не такое уж случайное).

Если мы попытаемся найти решение этой проблемы, то легко обнаружим несколько постов в блогах и инструментов, связанных с прогнозированием ObjectID в MongoDB.

Покопавшись в сети нашёл хорошую утилиту для генерации идентификаторов. На входе даём инструменту найденный идентификатор, а он на выходе список подобных. В репозитории довольно подробно расписано как пользоваться ей.

Можно считать это альтернативным способом решения.

Выводы

Разработчики часто что-то допиливают в своих приложениях и могут забыть закрыть то, что вышло из эксплуатации. Старые эндпоинты вполне могли быть небезопасными. При тестировании стоит выявлять такие места.

Утечка идентификаторов пользователей помогла нащупать IDOR и просмотреть счета других пользователей.

Спасибо за внимание! Не забывайте оценивать моё творчество лайком. Всех благ!