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

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



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

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

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

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


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

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

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

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

Переходим к вишенке на торте: к паролю для авторизации в кабинете. Пароль — это 4 десятичные цифры. Попробовал вбить пару невалидных — получил приглашение попробовать еще. Попробовал: ограничением на число попыток и не пахнет, как собственное и сроком жизни такого пароля. Быстренько накатал скрипт для «взлома» своего аккаунта:
[UPD #1 Скрыл скрипт на время, дабы сервис не загнулся от DDoS-а. Позже верну для истории]

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

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


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

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

Эпилог

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

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

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


  1. Ohar
    06.10.2015 11:07
    +4

    Сбербанк, говорите?..



    1. Sap_ru
      06.10.2015 11:21
      +1

      Вы намекаете, что это не баг, а фича?


      1. Dreyk
        06.10.2015 12:00
        +9

        это СберБаг


      1. Ohar
        06.10.2015 13:54
        +8

        Скорее фирменный стиль


  1. dinikin
    06.10.2015 12:38

    Карты у них подвязываются через paymentgate.ru


    1. dinikin
      06.10.2015 12:46
      +10

      … у которого веб-сервисы, директории и тестовые страницы наружу торчат
      paymentgate.ru/payment/webservices
      engine.paymentgate.ru/merchant
      test.paymentgate.ru/testpayment/merchants/alfa-test/test.html


  1. tomoto
    06.10.2015 12:51
    +1

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


  1. maratfmu
    06.10.2015 16:36

    Попробовал перебрать, что то не получается… видимо пофиксили уже


    1. fryday
      06.10.2015 17:25
      +1

      Ну не совсем пофиксили… просто отключили вход. Вообще.

      Скрытый текст


  1. Chikey
    06.10.2015 17:05
    +2

    Использовать 4-6 значные коды практически всегда плохая идея — всегда кого то да взломают после долгого брута. Берите хотя бы 9 цифр.


    1. fryday
      06.10.2015 17:19

      На мой взгляд ненормально позволять вводить неверный код более 5 раз. Далее надо требовать запрос нового кода, причем позволять это делать допустим раз в 10 минут. Ну и ввести временную блокировку аккаунта допустим при 15 подряд идущих неверных вводах.
      А 9 цифр — это очень ударяет по удобству для юзера.


      1. Chikey
        06.10.2015 18:32

        Это сделает брутофорс дольше, но для 4-6 цифр и для тысячи аккаунтов, вероятность что кого то взломает все равно остается высока. А полностью блокировать аккаунт не получится. Значит надо увеличивать длинну кода чтобы сделать брут на порядки сложнее и бесмысленней


      1. mickvav
        08.10.2015 12:18
        +1

        Дык, можно в разные аккаунты ломиться. Вероятность угадывания когда остаётся той же. Нужно после скольких-то попыток IP банить, тогда поможет.


        1. Chikey
          11.10.2015 09:23

          Найти тысячи дешевых разных айпи не проблема. Как и капча.


          1. mickvav
            11.10.2015 21:18

            Ну, если код 9-ти значный, то без ipv6 уже не найдёте. А если IP не банить — в конце концов сбрутят.


            1. Chikey
              14.10.2015 22:50

              я про 4-6 значные коды. 9 это уже неплохо


    1. nmk2002
      06.10.2015 18:42
      +1

      Использовать пароль (тем более получаемый по СМС) для аутентификации в сервис работающий с деньгами вообще плохая идея.


  1. bootch
    06.10.2015 18:47
    +9

    Так и запишем, если нужен бесплатный пентестинг, пригласить fryday на интервью.


  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?


    1. 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 запишет туда страницу полностью. Если знаете более элегантный путь, отпишите пожалуйста.


      1. eMptywee
        06.10.2015 22:29

        Хм, у меня не воспроизводится. Завсегда нормально отдает и head кажет все без ошибок.

        З.Ы. Погуглил ваш случай, действительно, workaround двойным tac'ом :)


      1. kirichenko
        08.10.2015 10:45

        а какой-нибудь «2>/dev/null» не поможет?


        1. fryday
          08.10.2015 10:50

          Скорее «поможет», так как только скроет ошибку, но не решит ее причины.


  1. 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!


    1. nmk2002
      12.10.2015 13:13
      +3

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


      1. fryday
        13.10.2015 10:01

        Действительно, в 80% случаев можно получить полный игнор и наблюдать уязвимость годами. Иногда еще попадаются угрожающие типы, которым видимо не нравится что их ткнули лицом в их недочет или некомпетентность, и в угрозах они видят способ возвысить себя над нахалом с того конца Email. А чтобы по факту исправленной уязвимости еще и отписали, так это вообще редкий случай. Так что в данном аспекте респект ksukhonosenko.

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


    1. Ohar
      13.10.2015 17:11

      бонусных рублей Platius
      Скрытый текст


      1. ksukhonosenko
        13.10.2015 17:28
        +1

        Ohar, добрый день!

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

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

        А вы шутник.

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


        1. Ohar
          13.10.2015 17:51
          +1

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

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

          Но угрожать уголовным кодексом человеку, который в меру своих сил стремится сделать ваш сервис лучше, несмотря на разгильдяйство некоторых ваших сотрудников — моветон.


  1. ksukhonosenko
    13.10.2015 18:05
    +1

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

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

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

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