Как я провёл аудит Андроид-приложения

Попросил один знакомый узнать почему в Android-приложении в игре одной кофейни всегда выпадают ноли, то есть всегда проигрыш, бесплатный кофе не выигрывается ни разу.


Я являюсь всего лишь программистом-любителем (знаю по немного C#, Python, Delphi, Visual Basic), никогда не пилил приложение для Андроида (хотя давно уже хочется сделать свой первый "Hello World!", на каком нибудь фреймворке.


До этого меня тоже просили сделать аудит фирменного Андроид-приложения, где я сейчас работаю (это был первый аудит), поэтому маломальский опыт в этом уже есть.


Скачав приложение, вооружившись сниффером траффика, запускаю приложение. Просит авторизацию по телефону. Вводим левый номер, смотрим сниффер. И что мы видим?
Мы видим отправку HTTP запроса с номером телефона и получаем в ответ.... ОТПРАВЛЕННЫЙ КОД ДЛЯ СМС!!! То есть не "ОК, я отправил СМСку", а сразу код, который должен придти по СМС! Наверно это сделано, что бы не долбали запросом с неверными кодами СМС, а он просто сравнивает в памяти приложения что вводит пользователь и полученный по HTTP-запросу код.
Итак. Первая уязвимость уже найдена. Мы можем авторизоваться под любым номером, даже не имея его.


Я решил проверить вторую уязвимость, которую находил в первом приложении при аудите, а это отправка 100500 СМСок с кодом авторизации.

Для удобства отправки запросов, я решил мучать уже не их приложение, а Python и Grab.

Накидав небольшой скрипт, подставил запросы из сниффера, ввожу номер знакомого и запускаю 6 раз подряд. В ответ получил 6 разных кодов. Спрашиваю знакомого, сколько пришло СМС? В ответ кидает те же самые 6 кодов.

Итак. Сразу 2 уязвимости - СМС-флуд (задолбать конкретный номер) и возможность атакующего обнулить баланс у СМС-провайдера, который отправляет СМС. В среднем 1 СМС стоит 1,5 рубля (уже работал с ними). Неспешная скорость отправки СМС 1-3 СМС в секунду. Это значит за час можно опустошить счет ~5400-16200р. кидая СМС на один и тот же или на разные номера (зависит от настроек скрипта).


Идем дальше. Смотрим какие запросы еще попали в сниффер.

Проверка номера телефона. Отправляется только номер телефона. В ответ получаем его ID, баланс, переписку с фирмой.


Так же получаем еще один HTTP-запрос об истории покупок, где покупал, сколько потратил.


В итоге получаем еще одну уязвимость. Точнее утечку информации.

Можно по номеру телефона узнать кто где когда бывал и и сколько тратил.

Обязательно ли знать номер телефона что бы получить инфу? Нет.
Получаем еще одну утечку. Можно просто перебирать все ID и получить ВСЮ информацию:
телефон, на что тратил, когда тратил, сколько потратил, переписку.

Перебирая все ID, можно вытянуть всю базу и составить статистику по каждому пользователю, адресу кафешки, баристе. Можно получить базу телефонов и использовать в своих целях (спам, ну или рассылка вируса, мол вы VIP-клиент кафешки, для вас спец приложения со скидками, ага. Ну или социальный инжиниринг).


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


С помощью другого приложения я сделал Backup программы и получил APK-файл приложения и скачал его на комп.

Дальше я его распаковал его как и ZIP-архив и смотрю структуру файлов.

Целью было найти все возможные HTTP-команды.

Обнаружив в папке assemblies Xamarin библиотеки, я смекнул, что приложение походу писали на .Net framework и решил проверить это. Для этого я вооружился JustDecompile и открываю одну из библиотек. И действительно! Программа смогла её вскрыть. Правда распознала не весь исходный код, как оказалось после, но другой Решейпер распознал примерно так же, так что не его вина.


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


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


Итог:
1. Возможна авторизация без СМС под любым номером.

2. Можно организовать СМС-флуд, опустошить счет провайдера.

3. Утечка информации (телефоны, заказы (что, где когда, почем, у кого), переписка). Не обязательно знать номер телефона, можно прогнать циклом ID.
4. Сбор номеров телефонов посетителей кафешки из п.3. И использовать в своих целях

5. Возможно искажение информации (например обнуление рейтинга всех заказов так же циклом по ID заказа).


6. И самое интересное: Как мне сказал тот знакомый, что бы получить халявный кофе, достаточно сказать  номер телефона. Можно найти в результатах у кого есть халявный кофе и выпить за него )))

7. Врут с политикой конфиденциальности. Пишут что используют шифрование (при соединении его нет, обычный HTTP без SSL), Защита личных данных (ага, уже мной доказано, что нет).


Найденные уязвимости исправить не сложно.

1. Для начала нужно использовать защищенное соединение на сайте,

2. Не отсылать код СМС в запросе,

3. Вместо ID и телефона в запросах использовать ID-сессии в формате GUID или более длинный (срок жизни на усмотрение разработчика) после подтверждения номера телефона.

4. Запретить флуд СМС на один и тот же номер с таймером 5 минут и с одного и того же IP-адреса.

5. Более сложное: Анализировать резкий всплеск отправки СМС и временно прекращать отправку СМС (скажем минут на 5), если вдруг например в течении 5 секунд отправилось 10 СМС сразу даже если на разные номера и с разных IP.


Я хотел об этом сказать разработчикам, написал им на почту, на PlayMarket), но пока они не ответили (прошло уже больше суток). Надеюсь у них есть программа Bug Bounty, хотя я сомневаюсь.

Информационная безопасность IT

1.4K постов25.5K подписчиков

Добавить пост

Правила сообщества

Обязательно к прочтению для авторов:

1. Если вы добавляете пост, утверждающий об утечке данных или наличии дыр в системе, предоставьте ссылку на источники или технически подкованное расследование. Посты из разряда "Какой-то банк слил данные, потому что мне звонили мошенники" будут выноситься в общую ленту.
2. Все вопросы "Как обезопасить сервер\приложение\устройство" - в лигу "Компьютер это просто".

Обязательно к прочтению для всех:

Добавление ссылки разрешено если она не содержит описание коммерческих (платных) продуктов и/или идентификаторов для отслеживания перехода и для доступа не нужен пароль или оплата в т.ч. интернет-ресурсы, каналы (от 3-х тематических видео), блоги, группы, сообщества, СМИ и т.д.


Запрещены политические holy wars.

По решению модератора или администратора сообщества пользователь будет забанен за:

1. Флуд и оскорбление пользователя, в т.ч. провокация спора, флуда, холивара (высказывание без аргументации о конкретной применимости конкретного решения в конкретной ситуации), требование уже данного ответа, распространение сведений порочащих честь и репутацию, принижающих квалификацию оппонента, переходы на личности.

2. Публикацию поста/комментария не соответствующего тематике сообщества, в том числе обсуждение администраторов и модераторов сообщества, для этого есть специальное сообщество.

3. За обвинение в киберпреступной деятельности.

4. За нарушение прочих Правил Пикабу.

33
Автор поста оценил этот комментарий

Надеюсь у них есть программа Bug Bounty, хотя я сомневаюсь.

Чаще всего есть программа Нам Пофиг.

17
Автор поста оценил этот комментарий

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

10
Автор поста оценил этот комментарий
Я видимо невнимательно читал. В итоге-то какой шанс на выпадение халявного кофе?
раскрыть ветку
2
Автор поста оценил этот комментарий
Я, конечно, не программист, но по-моему в таких случаях надо сообщать заказчику приложения. Владелец давал задание, принимал и несёт ответственность за эксплуатацию. А разработчику нахуй это надо?
раскрыть ветку
2
Автор поста оценил этот комментарий

Для android .net есть? О_о

раскрыть ветку