Анализ утечки второго порядка: когда утекает у тех, кто ворует данные у банка

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



    Сейчас хочется поговорить о том, откуда эта информация берется, на примере конкретного случая с известным российским банком. Чтобы никого не обидеть (а банки очень обидчивы и любят публично поистерить силами своих пиар-отделов, все отрицая в стиле «вы все врете» и «на нас осуществляют информационную атаку»), назову данный банк условно «Эпсилон».


    Мне на анализ попало два весьма интересных PHP-приложения, случайно оказавшихся в открытом доступе на одном из серверов в Нидерландах. Но обо всем по порядку…


    На почту моего Telegram-канала «Утечки информации» пришло письмо от исследователя безопасности Alex Gor (в твиттере — 0xyzq). Письмо содержало скриншот (см. выше) и архив с тем, что собственно и представляет интерес.


    В процессе «охоты» на открытые директории (например, «80.http.get.title:"index of /"») с использованием поисковика Censys.io исследователем был найден некий сервер с адресом 95.179.156.7, на котором весьма удачно, в свободном доступе, расположились некие файлы (.php, .html, .txt и даже один .zip). По данным поисковика Shodan, открытый 80-й порт на этом сервере впервые «засветился» 23.12.2019, а по данным другого поисковика – BinaryEdge, последний раз открытую директорию там «видели» 09.02.2020.



    Тут примечательно имя архива – букву «A» в имени читатели могу попробовать расшифровать сами, буква «P» — от слова «Parse», а вот «v22» явно указывает на версию парсера – 22. Это может говорить о том, что были и другие младшие версии (и скорее всего будут и старшие).


    Внутри архива два файла:


    • parse.php – дата последней модификации 31.12.2019, размер 11 757 байт
    • next.php – дата последней модификации 24.12.2019, размер 6 678 байт

    Чтобы драматически не увеличивать размер статьи, скажу сразу, что оба PHP-приложения обращаются к официальному REST API банка и, «притворяясь» официальным мобильным приложением, пытаются получить от сервера банка некие данные (см. ниже), перебирая входные параметры. REST API банка получают на входе HTTP-запрос, и в ответ выдают данные в формате JSON. Налицо весьма стандартное решение, специалисты «в теме» без труда догадаются, кто и с какими целями его использует.


    1. Приложение parse.php принимает на вход (через HTML-форму) три параметра: «prefix», «from», «to».




    Затем оно в цикле формирует из них входной параметр $reference для функции REST API (путем инкремента в заданном диапазоне), засылает запросы на сервер банка под видом iOS-приложения и проверяет есть ли в ответе сервера нужное поле, и, если есть, то записывает ответ с json-данными сервера в файл с именем «result_префикс диапазона.txt» (см. ниже).


    Параметр $reference представляет собой конкатенацию некоего id (type), далее следует дата (в формате ddmmyy), и затем номер операции, дополненный до 7 знаков. Например:


    H03 111119 0000001


    Здесь H03 – id, а 111119 – дата (11.11.2019). Эти две части не меняются от запроса к запросу. 0000001 – это номер операции в виде инкрементирующегося счетчика. Его очень удобно перебирать от 0000000 до 9999999, и это именно то, что делают парсеры.


    Ниже приведен кусок функции request() из parse.php, которая для очередного $reference отсылает запрос серверу банка, и сохраняет ответ в файл (обработка ответа и сохранение в файл для краткости не показана):



    Можно заметить, что код снабжен комментариями. Кроме того, парсер поддерживает работу через прокси.


    2. Приложение next.php ничем принципиально не отличается и делает примерно тоже, что и первый парсер, но через вызов другой функции REST API: принимает на вход (через HTML-форму) многострочный параметр «AAAAAA».




    Затем данный парсер формирует из каждой строки входной параметр $reference для REST API, засылает для каждой строки запрос на сервер банка и, в случае успешного завершения вызова функции, записывает ответ сервера в файл с именем «result_next_строка из AAAAAA.txt» (см. ниже).


    Если проанализировать результат работы (см. ниже) этого парсера, то можно заметить, что $reference представляет собой конкатенацию некоего префикса p, далее следует дата (в формате ddmmyy). Например:


    p151119


    Здесь p – префикс, а 151119 – дата (15.11.2019).



    Теперь самое интересное – собственно, что за данные получают эти PHP-приложения от сервера банка и что они записывают в текстовые файлы.


    Как я уже отмечал выше, владельцы «нидерландского» сервера оставили в открытом доступе не только исходные коды PHP-приложений, но и текстовые файлы (результаты работы парсеров), заботливо разложив их по директориям «parse» и «next» в поддиректориях «files».



    Результат работы первого парсера (parse.php) содержит номер счета отправителя, номер банковской карты получателя и срок ее действия, валюту и тип счета.



    Всего 30 файлов, суммарно во всех 133 728 строк (выше показана одна строка).


    Результат работы второго парсера (next.php) содержит ФИО, пол, номер мобильного телефона, адрес электронной почты, место работы (название и ИНН), а также потенциально возможно присутствие и других данных (паспорт, данные по кредитам и зарплате, кодовое слово, наличие загранпаспорта и ДМС и т.п.).



    Всего 21 файл, суммарно во всех 113 442 строки (выше показана одна строка).


    Являются ли все строки валидными и сколько среди них уникальных данных, я не проверял.


    По датам последней модификации файлов можно сказать, что оба парсера работали с 29.12.2019 по 04.01.2020, без перерыва на новогодние праздники.


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


    Разумеется, я незамедлительно уведомил банк и ЦБ в лице ФинЦЕРТ. Банк, как ни странно, особого интереса к файлам не проявил и архив не запросил. ФинЦЕРТ – наоборот, запросил и получил все файлы, что описаны выше.


    Еще стоит отметить, что вызовы REST API, используемые описанными выше парсерами, вот так впрямую не работают — сервер банка возвращает 404-ю ошибку. Тут возможно несколько вариантов: либо банк, обнаружив подозрительную активность в начале года убрал вызовы этих функций, либо исходники парсеров не содержат важной части – кода авторизации “Authorization: Bearer“ в HTTP-заголовке (переменные авторизации в коде инициализируются пустой строкой). Этот код авторизации может, например, доставаться злоумышленником в ходе анализа реального трафика общения мобильного приложения банка с сервером. Либо есть какие-то тонкости в составлении HTTP-запросов к серверу в плане наличия определенных заголовков в запросе, которые мы по понятным причинам не можем детально воспроизвести в полевых условиях без доступа к мобильному приложению. Поэтому пришлось ограничиться анализом исходных кодов PHP-приложений и результатов их работы.


    О том, как данные, добытые в том числе и подобным образом, потом используют злоумышленники, уже многократно освещалось и рассказывалось в СМИ. И я удивлюсь, если среди читателей этой статьи не найдется тех, кому не звонили из «службы безопасности» банка.


    Новости про утечки информации и инсайдеров всегда можно найти на Telegram-канале «Утечки информации».

    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More
    Ads

    Comments 59

      +1
      Зачем мобильному приложению в принципе такая информация? Образование? Ну и дата выдачи пенсии — это что-то за гранью.
        +10
        Мы не знаем что это за вызовы. Есть подозрение, что человек это писавший, хорошо себе представлял что делает (это я так мягко намекаю на инсайд) и воспользовался некой уязвимостью. Т.е. эти данные не нужны аппу, но они есть в системе и к ним вот так получилось добраться.
          0
          Ну тут как бы не наличие этих данных в системе, а возможность открыто дернуть за нужную ниточку чтобы система эти данные отдала.
          Так скажу — инсайдеры знают где эти данные лежат и как их получить внутри системы. Но для получения их извне нужно кроме знания еще и наличие технической возможности.

          Я вот лично очень сомневаюсь, что тут

          Еще стоит отметить, что вызовы REST API, используемые описанными выше парсерами, вот так впрямую не работают — сервер банка возвращает 404-ю ошибку


          проблема исключительно в том, что

          исходники парсеров не содержат важной части – кода авторизации “Authorization: Bearer“ в HTTP-заголовке (переменные авторизации в коде инициализируются пустой строкой)


          Или в том, что

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


          Все может быть проще — парсеры запускались во внутренней сети банка, например.
          Или, к примеру, на тестовом сервере, где лежат деперсонализированные данные (но очень похожие на настоящие). А цель выкладки в открытый доступ — продать их какому-нибудь не в меру доверчивому юному дарованию.

          В общем, тут вариантов очень много. От серьезных, до смешных.
        +5
        назову данный банк условно «Эпсилон».

        букву «A» в имени читатели могу попробовать расшифровать сами

        И никакого палева.

          +5
          Эпсилон — т.к. производная.

          А — ну так авторы скрипта назвали, у них и входной парметр «АААААА» называется ;)
            +6

            Конечно-конечно производная.
            Не "Омега" же называть.

              +1
              Или «Бета».

              P.S.: abSession на одном из скринов и hasAlfaCredit на другом как бы намекает
                +4

                "Бета" — это грубо. Могут реально обидеться
                А "Эпсилон" — нормально так.
                И нейтральненько — и прозрачненько.
                PS. Хотя вряд ли достаточно прозрачно для СБ этого банка. Оно у них реально "странное" (мягко говоря).

                  +2
                  "Бета" — это грубо. Могут реально обидеться
                  А "Эпсилон" — нормально так.

                  "Эпсилон" — это случайно не тот, который математики повсеместно устремляют к нулю? ))

            +6

            Да и бины карт, начинающиеся с 5559 есть в России только у одного банка класса «А»)

            +3
            Чтобы никого не обидеть (а банки очень обидчивы и любят публично поистерить силами своих пиар-отделов, все отрицая в стиле «вы все врете» и «на нас осуществляют информационную атаку»)

            Ну так и пусть, в чём проблема-то?
              0
              Проблема в том, что не хочется стук в дверь от залетных оперов из Москвы услышать.
                +2

                Типа фраза "не хотел никого обидеть" когда-то что-то меняла в этом плане.

                  +5
                  Проблема в том, что пока Ашот этого не произнёс, журналисты боятся постить с ссылкой на него. А на хабр банку пофигу, тут сами все догадались.
                    +6
                    До тех пор пока автор явно не сказал «Альфа-Банк» — он никому не интересен. Его намеки хоть и достаточно прозрачные — все же не равны явному указанию.
                      0
                      А зачем нужно было явное указание? Было и интересно и некая интрига. Да практически очевидно, что тем, кто понимает статью, оно не требовалось. И вот до вас, кстати, слов «.....-....» не было на странице.
                        +1
                        Было. 10:19 первое упоминание.
                          0
                          Ладно, пусть так. Только в 10:19 в теме всего один комментарий (с текстом «hasAlfaCredit») и он, вроде, не предполагал написание банка русскими буквами.
                            +3

                            Очень предварительный кредит.
                            Будет еще просто предварительный (beta), потом RC1 и всё такое.
                            Шотакова? )

                              0
                              «Нишо. Не в тему.»
                              Речь шла про то, что коммерческого названия банка в теме не было.
                +5
                Хотелось бы отметить общее падение культуры разработки не только в банках, но и у взломщиков! Все скрипты и скрапленные базы в открытом доступе! :D
                  +8
                  А вдруг это одни и те же разработчики? Да ну нет, не может быть такого :-)
                    –1
                    Ром, ну это реально врятли. Т.к. код — говнокод. Скорее все-таки чел либо сам расковырял что-то (мобильный апп), либо ему подсказали что делать.

                    Плюс чел до этого имел опыт написания околобанковских скриптов несколько лет назад…
                      +5
                      Т.к. код — говнокод

                      О, да-а-а… Так-то банковские приложения (интернет-банки например) — образец прямизы и корректности, ага.
                      PS. не выходит из головы Газпромбанковское "ваша ява не совместима с нашим интернет-банком".
                      Моя Oracle/Sun Java. Не совместима. Не наоборот.

                        0
                        не, ну там совсем не тот код, который пишут люди с опытом «продакшен» кода. но это так мои домыслы…
                    +2
                    Надо пожаловаться в профсоюз взломщиков, чтобы они там навели порядок — стыдоба!

                    С докером всем по… стало, на культуру и аккуратность. Подымаешь инстансы, выполняешь работу, тушишь инстансы. Если что-то не корректно открузилось и допустил оплошность — ничего страшного, кто это заметит.

                    Я на хостинге в аренду взял тачку, получил ip, а мне запросы идут, как интернет магазину. Я не помню адреса, давно это было. Я ещё зашёл на сам магаз, он не мелким мне показался. Суть в том, что даже усилий прилагать не нужно, просто слушай, что тебе их сервера шлюут и анализируй. И самое то интересное не нарушаю же я ничего. Они мне сами эти данные на интерфейс пуляют. Благодать. Наверное, поэтому интернет изобилует мошенничеством. Потому что вот такие вот девопсы понаделают инфраструктуры, как код, получат бабла и побежали дальше в гугл устраиваться. А за ними ни кто не проверяет, какой шлейф тянется. Это общая тенденция во всём. Сейчас очень сильно всё упирается во время, скорость. А безопасность — не, не слыхали.

                    Кстати! Про открытый доступ. Если вы не в курсе, то в открытый доступ выкладывают не по глупости такие данные, чтобы запутать следаков. Вот представьте, сколько туда людей робатов обратилось, кто-то что-то почитал, кто-то себе загрузил… А теперь из всей этой массы выберите, где был мошенник. Так что это не оплошность, а чётко спланированный ход. И статейку ещё на хабре запилить, чтобы подогреть посещения. Тогда точно яровая устанет читать логи.
                    +2
                    Судя по коментариям в виде # код писал, вероятно, какой-то олдфаг.
                      –1
                      там инересно. уже нашел и другой код автора. но пока про это не буду сильно распространяться ;)
                        +1
                        Ну или юникс/линуксоид, привыкшый к sh и производным.
                          0
                          Поэтому и написал, что олдфаг.
                        +1
                        когда утекает у тех, кто ворует данные у банка

                        "У воров нет чести" :)

                          +4
                          Прикольно, но пока читал статью, позвонили из «службы безопасности» сбера, я аж рассмеялся вслух )
                            +11
                            Называя банк условно, можно условно попасть в банк, который так когда-то назывался.
                            История Банка «Объединенный капитал»
                            1993 В Санкт-Петербурге зарегистрирован банк «Эпсилон». Получена лицензия Центрального Банка Российской Федерации на осуществление банковской деятельности.

                            eurocredit.ru/banki/obedinennyj-kapital/#bank_history
                              +1
                              Аналогичную фигню я встречал лет 10 назад. В одном ломанном дедике крутилась фишинговая страница украинского Публичного Банка.
                              Я это увидел, офигел и позвонил в банк, попросил СБ и мне девачко на телефоне сказало — иди отседава мальчик, не до тебя нам.
                                +1
                                Мне кажется я не помню ни одной истории, когда имярек звонил в любой банк, просил соединить с СБ, и его соединяли.

                                А с утечками всё просто. Надо за каждую строчку штрафовать на сто тысяч рублей или эквивалент в твердой валюте. Т.е. примерно от полутора тысяч долларов. Только тогда банки будут действительно заинтересованы в том, чтобы хранить персональные данные и банковскую тайну действительно хорошо.
                                  +1
                                  «уважаемые» люди из отрасли против крупных штрафов за утечки. чуют чем пахнет (клиенты начнут выбираться средства защиты слегка по другим критериям).

                                  www.anti-malware.ru/news/2020-01-30-1447/31867
                                    0
                                    Мне кажется я не помню ни одной истории, когда имярек звонил в любой банк, просил соединить с СБ, и его соединяли.

                                    Одну я помню. Лет семь или восемь назад я как раз работал в СБ банка, и однажды колл-центр на меня перевёл какого-то городского сумасшедшего, который утверждал, что владеет серьёзной инсайдерской информацией про одно предприятие, которое принадлежало тому же владельцу, что и банк. И если он этот инсайд раскроет, то предприятие потеряет какие-то серьёзные контракты. И чего-то требовал. Почему данного персонажа перевели на меня (простого технаря), почему он звонил на входящий номер банка, а не на то самое предприятие — тайна великая есть.
                                    Я всё записал и доложил выше. История никакого развития не получила, кроме того, что я получил выговор от своего непосредственного, потому что не был уполномочен вести разговоры на такие темы.
                                    А про уязвимости там или ещё что-то конструктивное — ни разу не было.
                                      0
                                      Надо за каждую строчку штрафовать на сто тысяч рублей или эквивалент в твердой валюте. Т.е. примерно от полутора тысяч долларов.


                                      Злой вы — даже по GDPR устоявшийся на сейчас штраф ~500 евро за персону.
                                        0

                                        Не добрый. Однако, 1500 не только за персональные данные, а с комбинацией раскрытия банковской тайны.

                                      +1
                                      В данном случае выводы будут. Поверьте ;-)

                                      Что, как, на каком уровне (front, middle, back) пока неясно, но будут.
                                      +2
                                      О! У меня на днях как раз от этого банка Эпсилон пршла СМС о смене телефона, которая по уточнению у техподдержки этого банка, действительно пришла от их сервиса. Только телефон ни кто не менял. Сотрудник техподдержки посоветовал заблокировать карту, на этом всё. Поэтому сейчас на карте красуется 1 тысяча рублей, жду когда её украдут, чтобы подать официально заявление в полицию и пусть закон яровой как следует поработает в этот раз.
                                      А ещё у меня подозрения возникли, когда с каждым звонком мне звонили из этого банка Эпсилон и прелагали кредитную карту, при том, что я всё время говорю, что принципиально не использую кредиты и прошу больше мне не предлагать, а потом понял, что это вообще сторонняя обзванивающая организация. Т.е. эти безобразники выгрузили мои контакты налево обзвонщикам, чтобы предложить свои продукты. А куда эти обзвонщики дальше мои данные пустят, им без разницы. Мы слишком доверяем банкам.

                                      P.S.: С банком Эпсилон довольно-таки толстый намёк — забавно!
                                        0
                                        Есть еще вариант, что скриптик работал через внутреннюю или доверенную сеть банка, когда у сервера туда был поднят vpn или ssh. И «добры» молодцы не озаботились свою пятую точку прикрыть фаерволом.
                                          0
                                          Из внутренней сети все эти данные можно собрать напрямую, минуя REST API. А скриптик написать просто на коленке и выложить типа им собирали. Тем более, что скриптик не работает типа ему «чего-то нехватает».

                                          Тут вариантов масса.

                                          На первом иттретьем скринах данные, которые вообще наружу не нужны. Они нужны внутри. На втором, да, похоже на выписку по карте или счету. Их могут затребовать снаружи. А первый и третий — клиентские данные.

                                          В любом случае, разработчикам в банке теперь есть о чем поговорить :-)
                                            0
                                            Это может быть не настолько внутренняя сеть, чтобы иметь прямой доступ к базе данных. А, скажем, внутренняя сеть, к которой подключены сотрудники филиалов банка. А они вполне могут иметь доступ ко всей информации о клиенте.
                                              0
                                              Ну вроде как у тех, кто к этой кухне близок, есть предположения как это могло быть сделано. Часть уязвимостей уже прикрыли, ведется поиск более радикальных решений по улучшению безопасности.
                                              0
                                              Напрямую с базы палево собирать, запросы к БД обычно жёстко мониторятся. А если парсер мимикрировал под клиент, тогда другое дело.
                                            0
                                            Портал Вот одного такого «нелепого» взломщика данных повязали. Правда он сам разрекламировал свои данные, но извлек он их очень простым парсингом за длительный период
                                              0
                                              Буквально позавчера мне звонили из «Альфа Банка». Обратились по имени отчеству, сказали что надо подтвердить операцию по переводу денег на карту Киви банка на сумму 7000 рублей.

                                              В другой раз я бы «поиграл» бы с ним или банально затролил, но я был на работе и звонили они в момент обсуждения задач и правок по проекту. Я вышел в коридор и хотел по быстрому завершить разговор. Я чуть не попался только потому, что на карте была сумма исключительно для погашения кредита, которая должна была списаться в этот же день. И я подумал «а вдруг и правда пытаются украсть деньги». Правда я потом задался вопросом «А как? Надо же или знать номер карты или как?» Скорее всего по правде никак, но не суть.

                                              Так вот, после того как девушка сказала (фоном, кстати, были звуки колцентра/шумного офиса) что отменяет операцию и помечает её как мошенническую… она спрашивает «а на руках ли у меня карты?» Я отвечаю, что нет их и они дома. Она «а когда вам удобнее перезвонить?» Я, без задней мысли и просто не хочу тратить время, говорю что вечером зайду в отделение банка и там решу на счёт карт и уточню вопрос (ну тот что она хотела сейчас мне задать, будь у меня карты на руках). После этого она быстро попрощалась. И я пошёл обратно в кабинет… и вот уже зайдя в кабинет я понял кто и зачем звонил.

                                              Позже перезвонил в банк и конечно же… конечно же никаких операций не было и с банка мне не звонили. Номер с которого звонила девушка 8 (495) 256-256-0 в гугле находится с комментариями «мошенники, представляются СБ Сбербанка/ВТБ/Тинькофа».

                                              p.s. — ну почему они звонят не в то время, когда я ничем не занят и могу поболтать с ними затраливая звонящего. Правда как-то пришла смс-ка, что карта заблокирована и надо перезвонить на номер билайн. Звоню… спрашивают ФИО, говорю «Пушкин Александр Се… Семёнович». Говорят «Спасибо, ваша карта разблокирована» и вешают трубку. Всё!))) Больше ничего не спросили, разговор занял меньше двух минут. У меня даже где-то запись разговора сохранилась.
                                                +3
                                                Мне как-то из «Сбера» позвонили. Благо время было с ними поговорить. Говорили минут пять, когда дело дошло до момента что «вам сейчас придет код, надо его продиктовать» (ну или что-то в этом духе) пришлось ответить «я бы рад вам помочь, но у меня в сбере ни счета ни карты нет» :-) По-моему, они там обиделись т.к. стразу трубку кинули…
                                                  0
                                                  Можно было назвать рандомные цифры и посмотреть, что будет дальше.
                                                  0
                                                  > поболтать с ними

                                                  Не лучшая идея с ними болтать. Мало ли что можно сделать потом с записью вашего голоса. Я стараюсь либо вообще не брать, если есть подозрения, либо говорить по минимуму, не использовать утвердительные слова типа «Да».
                                                  –1
                                                  После звонков из «службы безопасности» я перезваниваю в банк и сообщаю о звонке. В ответ слышу, что данный номер к банку отношения не имеет и благодарят за сообщение. Не знаю, что банк делает с этой информацией, но может это как-то поможет быстрее нейтрализовать номера с которых звонят мошенники. Походу, это всё что я могу сделать для борьбы с мошенниками.
                                                    +1
                                                    Сегодня ночью заблокировали одну мою карту из-за компрометации. Судя по задержкам в ответах операторов (>10 минут на вип-линии) и их комментариям, заблокировали целую кучу карт. Возможно, связано с этим постом.
                                                      +1
                                                      хорошо если так. в том смысле, что из ФинЦЕРТа на банк все-таки наехали (иначе откуда бы банк знал, что блокировать). ну либо это не связано совсем и просто очередная (другая) утечка данных карт.
                                                        0
                                                        У супруги тоже карту заблокировали. Обе эти наши карты были оформлены до даты утечки.
                                                        При этом мою кредитную (дата выпуска тоже до утечки) и детские дебетовые (выпуск уже в этом году) не блокировали.
                                                          0
                                                          Банк знает, что была утечка :-) Проблема активно обсуждается, кое-какие меры со стороны разработки уже приняты.
                                                          0
                                                          Да, только что увидел
                                                          блокирока карт Альфы и тоже подумал что связано.
                                                            +2

                                                            Вот так пишешь нейтральную статью на Хабре о безопасности — а потом окажешься виноват в блокировке карт по всему Союзу пространству.
                                                            Как жить?

                                                            +1
                                                            Точно! Сегодня утром в Twitter зашёл и там все пишут про блокировку карт. И как раз вот нашёл эту статью. Тоже подумал, что связано.

                                                            Only users with full accounts can post comments. Log in, please.