Оказалось, что «предоставлением» свободного доступа к аккаунтам своих пользователей.
После 5 минут гугла выяснилось:
- их софт для оплаты счетов с помощью смартфона и для различных программ лояльности;
- это все начали делать в iiko, где я когда-то был на интервью;
- их в начале года купил Сбербанк;
- у них 3,5 миллиона пользователей.
Поигрался с промокодом, ничего интересного не нашел. Решил посмотреть как происходит авторизация и регистрация. После ввода номера телефона просят ввести каптчу. За спиной уже был опыт автоматического прохождения некоторых каптч. В данном случае можно было даже не смотреть на внутренности реализации каптчи и не нужны даже тяжелые OCR алгоритмы. Цифры на изображение всегда:
- на одном месте
- одного цвета
- их всегда 4
Типичная каптча
То есть нам хватит проверки пары контрольных точек для прохождения каптчи. Вот и первое слабое место. Но как оказалось, каптчу можно даже и не проходить.
После проверки каптчи на указанный номер приходит SMS с паролем для входа в кабинет. Но судя по всему связка каптча-сессия не помечается пройденной, и мы можем присылать новые пароли на любой номер телефона в неограниченном количестве. Тем самым можно устроить атаку на модуль отсылки.
Подпись «Если смс не пришло, запросите пароль повторно. Это можно будет сделать через 10 минут» всего лишь фикция, не существует никаких временных ограничений для запроса нового пароля, как собственно и функционала для запроса его.
Переходим к вишенке на торте: к паролю для авторизации в кабинете. Пароль — это 4 десятичные цифры. Попробовал вбить пару невалидных — получил приглашение попробовать еще. Попробовал: ограничением на число попыток и не пахнет, как собственное и сроком жизни такого пароля. Быстренько накатал скрипт для «взлома» своего аккаунта:
[UPD #1 Скрыл скрипт на время, дабы сервис не загнулся от DDoS-а. Позже верну для истории]
Эксперимент показал, что мой трехдневный пароль был все еще валиден для входа. Как вы можете догадаться, пароль не помечается использованным после успешной авторизации, что дает злоумышленнику возможность входы в любой кабинет, даже не тревожа владельца SMS.
Доступ в кабинет позволяет получить доступ к различным личным данным и возможно к оплате, которая проходит через привязываемую в кабинете банковскую карту. Я не рискнул тестировать данную часть, так как страшно привязывать свои кровные к таким ненадежным вещам.
К этому всему можно получить доступ
Я первый раз шел на интервью с знанием о серьезных дырах в безопасности приложений — интересный опыт, я вам скажу. Волны адреналина сменяются периодами спокойствия. На интервью после ритуальных танцев с тестами и задачками (которые перешли в наследство от iiko), я рассказал о найденных уязвимостях. Правда, судя по всему, это не считается чем-то критичным, и заделывать дыры никто не спешит. Что огорчает.
Эпилог
По прошествии почти двух недель ничто не починено. Как выяснилось, багбаунти у них нет, и вообще все грустно. Непонятно, почему подзабивают на вещи, которые несут, на мой взгляд, колоссальные репутационные проблемы и возможные финансовые потери для клиентов.
Вопрос о поиске номеров телефонов с кабинетом в платиусе остается открытым, но уверен, что есть прямые или косвенные способы эти данные получить. Допустим, по профилям лайкающих группу Platius вконтакте. Также открыт вопрос о входе в мобильное приложение без предварительно отсылки SMS на номер атакуемого. Задача скорее всего сведется в подмене локальных хранилищ приложения. Так что исследователям есть где развернуться.
Комментарии (31)
dinikin
06.10.2015 12:38Карты у них подвязываются через paymentgate.ru
dinikin
06.10.2015 12:46+10… у которого веб-сервисы, директории и тестовые страницы наружу торчат
paymentgate.ru/payment/webservices
engine.paymentgate.ru/merchant
test.paymentgate.ru/testpayment/merchants/alfa-test/test.html
tomoto
06.10.2015 12:51+1После таких статей понимаешь, что оплата всегда должна быть через отдельную специальную карту…
maratfmu
06.10.2015 16:36Попробовал перебрать, что то не получается… видимо пофиксили уже
fryday
06.10.2015 17:25+1Ну не совсем пофиксили… просто отключили вход. Вообще.
Скрытый текстChikey
06.10.2015 17:05+2Использовать 4-6 значные коды практически всегда плохая идея — всегда кого то да взломают после долгого брута. Берите хотя бы 9 цифр.
fryday
06.10.2015 17:19На мой взгляд ненормально позволять вводить неверный код более 5 раз. Далее надо требовать запрос нового кода, причем позволять это делать допустим раз в 10 минут. Ну и ввести временную блокировку аккаунта допустим при 15 подряд идущих неверных вводах.
А 9 цифр — это очень ударяет по удобству для юзера.Chikey
06.10.2015 18:32Это сделает брутофорс дольше, но для 4-6 цифр и для тысячи аккаунтов, вероятность что кого то взломает все равно остается высока. А полностью блокировать аккаунт не получится. Значит надо увеличивать длинну кода чтобы сделать брут на порядки сложнее и бесмысленней
mickvav
08.10.2015 12:18+1Дык, можно в разные аккаунты ломиться. Вероятность угадывания когда остаётся той же. Нужно после скольких-то попыток IP банить, тогда поможет.
nmk2002
06.10.2015 18:42+1Использовать пароль (тем более получаемый по СМС) для аутентификации в сервис работающий с деньгами вообще плохая идея.
eMptywee
06.10.2015 18:48Вопрос к автору, не совсем очевидно для чего дважды друг за другом tac?
$ curl 'https://platius.ru/ru-RU/Login/PasswordStep' --data 'Login=%2B7xxxxxxxxxx&Password={}' -kis | head -n 1 HTTP/1.1 200 OK $ curl 'https://platius.ru/ru-RU/Login/PasswordStep' --data 'Login=%2B7xxxxxxxxxx&Password={}' -kis | tac | tac | head -n 1 HTTP/1.1 200 OK
Может какой скрытый смысл есть два раза переворачивать stdin?fryday
06.10.2015 22:23Это такой хак, который позволяет не получить от curl следующую ошибку:
$ curl 'https://platius.ru/ru-RU/Login/PasswordStep' --data 'Login=%2B7xxxxxxxxxx&Password={}' -kis | head -n 1 HTTP/1.1 200 OK (23) Failed writing body
Дело в том, что head закрывает pipe до того, как curl запишет туда страницу полностью. Если знаете более элегантный путь, отпишите пожалуйста.eMptywee
06.10.2015 22:29Хм, у меня не воспроизводится. Завсегда нормально отдает и head кажет все без ошибок.
З.Ы. Погуглил ваш случай, действительно, workaround двойным tac'ом :)
ksukhonosenko
12.10.2015 12:24+2Ребята, привет!
Меня зовут Кирилл Сухоносенко — я технический директор Platius.
От лица компании Platius я хочу сказать следующее:
- Во-первых, спасибо Артему за найденную уязвимость!
- Во-вторых, мы ее закрыли.
- В-третьих, мы сожалеем, что такая проблема проскочила через наше тестирование.
- В-четвертых, насколько мы знаем, этой дырой в безопасности не успели воспользоваться злоумышленники. И мы приняли меры, чтобы они не смогли ей воспользоваться впредь.
- В-пятых, мы думаем, что стоит объявить награду за ошибки, подобной этой. Поэтому мы готовы начислить 10 000 бонусных рублей Platius на указанный Артемом счет, которые он сможет потратить в отличном месте — Цурцум-кафе — www.facebook.com/zurzum
- В-шестых, мы думаем открыть программу bug bounty — опубликуем условия, как только решим как это лучше организовать.
- В-седьмых, мы просим community бережнее относиться к нашим пользователям, и не публиковать в открытых источниках полный код exploit-а. Не стоит подвергать пользователей системы реальному риску. Пожалуйста — пишите нам на security@platius.ru — мы закроем «дыру», внесем вас в Hall of Fame, и не допустим, чтобы наши пользователи подверглись угрозе. К слову, статья с кодом эксплоита подпадает под действия статей 272, 33 и 34 УК РФ…
ПС: We’re hiring! Мы ищем новых коллег, которые готовы присоединиться к нашей команде. Сильные C# программисты и team leads — welcome!
Присылайте ваши резюме на job@platius.ru!nmk2002
12.10.2015 13:13+3Проблема явно в том, что человек извне не может донести до ответственного за безопасность информацию об уязвимости.
Все сообщения о дырах в безопасности должны обрабатываться любым сотрудником компании. Элементарно взять контакты у заявившего об уязвимости и передать ответственному за безопасность.fryday
13.10.2015 10:01Действительно, в 80% случаев можно получить полный игнор и наблюдать уязвимость годами. Иногда еще попадаются угрожающие типы, которым видимо не нравится что их ткнули лицом в их недочет или некомпетентность, и в угрозах они видят способ возвысить себя над нахалом с того конца Email. А чтобы по факту исправленной уязвимости еще и отписали, так это вообще редкий случай. Так что в данном аспекте респект ksukhonosenko.
Думаю подобные проблемы могут быть исправлены участием в багбаунти через платформы аля HackerOne. Все довольно открыто и прозрачно.
Ohar
13.10.2015 17:11бонусных рублей Platius
Скрытый текстksukhonosenko
13.10.2015 17:28+1Ohar, добрый день!
Ведь только благодаря этой публикации вы закрыли дыру.
Это не так. Честно.
А вы шутник.
Это не шутки. Это вполне серьезно. У меня есть разъяснения от нашей юридической фирмы по данному вопросу.
Но дело не в этом. Я хотел сказать, что если ты white hat — то не стоит забывать о древнем принципе «не навреди». А если black hat — то будь готов.
Ohar
13.10.2015 17:51+1Это не так. Честно.
Очень хорошо, если это так.
И то, что вы ведёте диалог и хотите вводить баунти-программу — тоже отлично.
Но угрожать уголовным кодексом человеку, который в меру своих сил стремится сделать ваш сервис лучше, несмотря на разгильдяйство некоторых ваших сотрудников — моветон.
ksukhonosenko
13.10.2015 18:05+1Вы не так меня поняли — я не угрожал. Я просто сказал, как такие вещи квалифицирует наш УК. К сведению.
Мы не собираемся преследовать никого по данному инциденту. Наоборот, мы благодарны Артему за найденную дыру.
Но, вместе с тем, мы хотим защитить наших пользователей от будущих проблем. Поэтому мы просим не публиковать полного кода эксплоита. Или делать это после того, как дыра закрыта. Мы можем договориться между собой сколько времени нужно на фикс, и после фикса писать в паблик.
Важно одно — данные пользователей должны быть защищены. А не наоборот. Потому что «наоборот» — это потенциальный ущерб для пользователей и нарушение закона.
Ohar
Сбербанк, говорите?..
fryday
Так точно
http://www.banki.ru/news/lenta/?id=7808994
Sap_ru
Вы намекаете, что это не баг, а фича?
Dreyk
это СберБаг
Ohar
Скорее фирменный стиль