Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
Сегодня мы публикуем три работы, получившие Pentest Award в номинации Fuck the Logic. В первой речь пойдет о баге, позволявшем бесконечно выводить деньги с криптобиржи, во второй — о захвате чужих аккаунтов в некой соцсети, в третьей — о ловком реверсе токенов приложения. Pentest Award
В августе 2023 года прошла церемония награждения Pentest Award — премии для специалистов по тестированию на проникновение, которую учредила компания Awillix. Мы публикуем лучшие работы из каждой номинации.
При исследовании приложения мы нашли уязвимость в функции вывода средств из личного кабинета. Баг заключается в переполнении целочисленной переменной, что позволяло получить отрицательное значение счета.
При этом ненулевое отрицательное значение счета позволяло создать ваучеры с уже положительной суммой валюты и неограниченно вывести внутреннюю валюту на внешний криптокошелек. Для этого недобросовестному пользователю было достаточно обналичить ваучеры на втором созданном аккаунте.
Пример эксплуатации выглядел следующим образом. Во время вывода средств из личного кабинета с помощью одной из криптовалют создается тикет с указанием суммы (с расчетом комиссии) и внешнего криптокошелька.
При этом указанная сумма для вывода средств должна была быть целочисленной и не быть меньше нуля или равной нулю.
Тем не менее при обработке запросов на стороне сервера была допущена ошибка: значение переменной cashpoints
, с помощью которой уменьшалось значение суммы счета на аккаунте, позволяло передать значение, превышающее значение int
.
В результате этой ошибки при отправке запроса на вывод средств на сервер можно было передать очень большое значение переменной cashpoints
. Это производило переполнение целочисленного значения счета и делало его отрицательным (при этом в интерфейсе значение счета отображалось как положительное).
Так как запрос на вывод средств на криптокошелек требовал положительного значения, а счет был отрицательным, необходимо было придумать, как все же получить плюс. Так мы нашли функцию создания ваучеров на сайте. Она позволяет передавать другому пользователю код для пополнения счета. При этом проверки на отрицательное значение счета не происходит.
Создаем ваучеры с указанием суммы по ссылке:
https://example.com/account/voucher/create
При этом сумма отрицательного счета аккаунта увеличивается на это значение.
Создаем второй аккаунт и применяем созданные ваучеры:
https://example.com/account/voucher/redeem
В результате значение счета аккаунта увеличено на сумму, соответствующую ваучеру.
Создаем транзакцию, чтобы вывести деньги на внешний криптокошелек:
https://example.com/withdraw/withdrawBalanceInstan>t
В результате получаем криптовалюту.
Так можно было бесконечно создавать ваучеры, обналичивать их на втором аккаунте и выводить деньги.
Используя найденную цепочку уязвимостей, мы для демонстрации вывели средства, эквивалентные 8,26 и 4,13 доллара США. При этом первоначальный баланс обоих аккаунтов был равен нулю и пополнения кошельков не производилось.
Для владельцев сайта такая уязвимость — прямой риск финансовых потерь. Кража средств почти мгновенна и необратима.
Для устранения уязвимости мы порекомендовали проверять длину входных данных и отклонять транзакцию при слишком большом значении переменной. Для уязвимости с созданием ваучеров — проверять значение баланса счета на отрицательное значение.
Эту уязвимость я нашел, исследуя приложение одной популярной региональной соцсети. Проблема заключается в том, что при авторизации пользователя в приложении при помощи SMS необходимые для успешного входа данные генерируются на стороне клиента. Злоумышленник, не имея доступа к телефону жертвы, может подделать цепочку запросов и ответов приложения и получить доступ к аккаунту жертвы.
Приложение доступно в виде версий для iOS и Android, как вариант можно использовать веб‑интерфейс. На момент написания этой статьи только на Android насчитывается более миллиона загрузок. Версия для iOS входит в топ-200 самых популярных приложений для общения в App Store.
Анализ программы производился методом черного ящика — на основе публично доступных приложений и веб‑клиента. При анализе приложений я обнаружил хорошо настроенный SSL Pinning. На Android его удалось частично обойти с помощью кастомизации скриптов Frida. На iOS разработчики использовали последние версии защитных функций, обхода для которых пока что нет.
Главной проблемой при исследовании стало то, что приложение использовало gRPC (на основе Protobuf) для общения с сервером. Поскольку тестирование происходило методом черного ящика, proto-файла с описанием структур у меня не было. Поэтому все найденные уязвимости были обнаружены в процессе ручного анализа proto-запросов.
Чтобы работать gRPC, я использовал расширение Blackbox Protobuf для Burp Suite. Однако версия из репозитория некорректно парсила поля запросов. Чтобы заставить ее нормально работать, пришлось модифицировать расширение, добавить сообщениям новый заголовок и изменить алгоритм парсинга поля Additional Data в gRPC.
Источник: xakep.ru