Сегодня рассмотрим сразу два кейса – данные клиентов и партнеров двух совершенно разных компаний оказались в свободном доступе «благодаря» открытым серверам Elasticsearch с логами информационных систем (ИС) этих компаний.
В первом случае — это десятки тысяч (а может и сотни тысяч) билетов на различные культурные мероприятия (театры, клубы, речные прогулки и т.п.) продаваемые через систему «Радарио» (www.radario.ru).
Во втором случае — это данные о туристических поездках тысяч (возможно нескольких десятков тысяч) путешественников, купивших туры через турагентства, подключенные к системе «Слетать.ру» (www.sletat.ru).
Сразу отмечу, что отличаются не только названия компаний, допустивших попадание данных в открытый доступ, но и подход этих компаний к признанию инцидента и последующая реакция на него. Но обо всем по порядку…
Дисклеймер: вся информация ниже публикуется исключительно в образовательных целях. Автор не получал доступа к персональным данным третьих лиц и компаний. Информация взята либо из открытых источников, либо была предоставлена автору анонимными доброжелателями.
Случай первый. «Радарио»
Вечером 06.05.2019 наша система обнаружила в свободном доступе сервер Elasticsearch, принадлежащий сервису по продаже электронных билетов «Радарио».
По уже сложившейся печальной традиции, сервер содержал детальные логи информационной системы сервиса, из которых можно было получить персональные данные, логины и пароли пользователей, а также непосредственно сами электронные билеты на различные мероприятия по всей стране.
Общий объем логов превышал 1 Тб.
По данным поисковика Shodan сервер находился в открытом доступе с 11.03.2019. Я оповестил сотрудников «Радарио» 06.05.2019 в 22:50 (МСК) и 07.05.2019 около 09:30 сервер стал недоступен.
В логах находился универсальный (единый) токен авторизации, предоставляющий доступ ко всем купленным билетам по специальным ссылкам, вида:
http://radario.ru/internal/tickets/XXXXXXXX/print?access_token=******JuYWw6MDIzOWRjOTM1NzJiNDZjMTlhZGFjZmRhZTQ3ZDgyYTk
http://radario.ru/internal/orders/YYYYYYY/print?access_token=******JuYWw6MDIzOWRjOTM1NzJiNDZjMTlhZGFjZmRhZTQ3ZDgyYTk
Проблема также заключалась в том, что для учета билетов использовалась сквозная нумерация заказов и простым перебором номера билета (XXXXXXXX) или заказа (YYYYYYY), можно было получить все билеты из системы.
Для проверки актуальности базы я даже честно купил себе самый дешевый билет:
и позже обнаружил его на общедоступном сервере в логах ИС:
http://radario.ru/internal/tickets/11819272/print?access_token==******JuYWw6MDIzOWRjOTM1NzJiNDZjMTlhZGFjZmRhZTQ3ZDgyYTk
Отдельно хочется подчеркнуть, что были доступны билеты как на уже прошедшие мероприятия, так и на те, которые еще только планируются. То есть, потенциальный злоумышленник мог воспользоваться чужим билетом для прохода на планируемое мероприятие.
В среднем в каждом индексе Elasticsearch, содержащем логи за один определенный день (начиная с 24.01.2019 и по 07.05.2019), находилось от 25 до 35 тыс. билетов.
Помимо самих билетов в индексе содержались логины (адреса электронной почты) и текстовые пароли для доступа в личные кабинеты партнеров «Радарио», продающих билеты на свои мероприятия через данный сервис:
Content: \"ReturnUrl=&UserEmail=***@yandex.ru&UserPassword=***\"
Всего было обнаружено более 500 пар логин/пароль. В личных кабинетах партнеров видна статистика продаж билетов:
Также в открытом доступе находились ФИО, телефоны и адреса электронной почты покупателей, решивших осуществить возврат, купленных ранее билетов:
"Content": "{\"name\":\"***\",\"surname\":\"*** \",\"middleName\":\"Евгеньевна \",\"passportType\":1,\"passportNumber\":\"\",\"passportIssueDate\":\"11-11-2011 11:11:11\",\"passportIssuedBy\":\"\",\"email\":\"***@mail.ru\",\"phone\":\"+799*******\",\"ticketNumbers\":[\"****24848\",\"****948732\"],\"refundReason\":4,\"comment\":\"\"}"
За один, случайно выбранный день, было обнаружено более 500 таких записей.
Я получил ответ на оповещение от технического директора «Радарио»:
Я технический директор Радарио, и хотел бы поблагодарить за обнаружение проблемы. Доступ к эластику, как вам известно, мы закрыли и решаем вопрос с перевыпуском билетов для клиентов.
А чуть позже компания сделала официальное заявление:
В электронной системе продажи билетов Radario была обнаружена и своевременно устранена уязвимость, которая могла привести к утечке данных клиентов сервиса, сообщил Агентству городских новостей «Москва» директор по маркетингу компании Кирилл Малышев.
«Нами действительно была обнаружена уязвимость в работе системы, связанная с регулярным обновлением, которая была устранена сразу же после обнаружения. В результате уязвимости при определенных условиях недружелюбные действия третьих лиц могли привести к утечке данных, однако каких-либо инцидентов зафиксировано не было. В данный момент все неисправности устранены», — сообщил К.Малышев.
Представитель компании подчеркнул, что было принято решение перевыпустить все билеты, проданные за время решения проблемы, чтобы полностью исключить возможность любого мошенничества в отношении клиентов сервиса.
Спустя несколько дней я проверил доступность данных по утекшим ссылкам — доступ к «засвеченным» билетам действительно был прикрыт. На мой взгляд это грамотный, профессиональный подход к решению проблемы утечки данных.
Случай второй. «Слетать.ру»
Рано утром 15.05.2019 DeviceLock Data Breach Intelligence выявил общедоступный сервер Elasticsearch с логами некой ИС.
Позже было установлено, что сервер принадлежит сервису по подбору туров «Слетать.ру».
Из индекса cbto__0 можно было получить тысячи (11,7 тыс. включая дубли) адресов электронной почты, а также некоторую платежную информацию (стоимость туров) и данные тур поездок (когда, куда, данные авиабилетов всех вписанных в тур путешественников и т.п.) в количестве около 1,8 тыс. записей:
"full_message": "Получен запрос за создание платежного средства: {\"SuccessReturnUrl\":\"https://sletat.ru/tour/7-1939548394-65996246/buy/?ClaimId=b5e3bf98-2855-400d-a93a-17c54a970155\",\"ErrorReturnUrl\":\"https://sletat.ru/\",\"PaymentAgentId\":15,\"DocumentNumber\":96629429,\"DocumentDisplayNumber\":\"4451-17993\",\"Amount\":36307.0,\"PaymentToolType\":3,\"ExpiryDateUtc\":\"2020-04-03T00:33:55.217358+03:00\",\"LifecycleType\":2,\"CustomerEmail\":\"XXX@mail.ru\",\"Description\":\"\",\"SettingsId\":\"8759d0dd-da54-45dd-9661-4e852b0a1d89\",\"AdditionalInfo\":\"{\\\"TourOfficeAdditionalInfo\\\":{\\\"IsAdditionalPayment\\\":false},\\\"BarrelAdditionalInfo\\\":{\\\"Tickets\\\":[{\\\"Passenger\\\":{\\\"FIO\\\":\\\"XXX VIKTORIIA\\\"},\\\"ReservationSystem\\\":null,\\\"TicketNumber\\\":null,\\\"IsRefundPossible\\\":false},{\\\"Passenger\\\":{\\\"FIO\\\":\\\"XXX ANDREI\\\"},\\\"ReservationSystem\\\":null,\\\"TicketNumber\\\":null,\\\"IsRefundPossible\\\":false},{\\\"Passenger\\\":{\\\"FIO\\\":\\\"XXX Andrei\\\"},\\\"ReservationSystem\\\":null,\\\"TicketNumber\\\":null,\\\"IsRefundPossible\\\":false}],\\\"Segments\\\":[{\\\"Flight\\\":\\\"5659\\\",\\\"AviaCompany\\\":null,\\\"AviaCompanyIataCode\\\":null,\\\"DepartureCity\\\":\\\"LED\\\",\\\"DepartureAirport\\\":\\\"LED\\\",\\\"DepartureAirportIataCode\\\":\\\"LED\\\",\\\"DepartureDate\\\":\\\"2019-04-11T02:45:00\\\",\\\"DepartureTime\\\":null,\\\"ArrivalCity\\\":\\\"SHJ\\\",\\\"ArrivalAirport\\\":\\\"SHJ\\\",\\\"ArrivalAirportIataCode\\\":\\\"SHJ\\\",\\\"ArrivalDate\\\":\\\"2019-04-11T09:40:00\\\",\\\"ArrivalTime\\\":null,\\\"FareCode\\\":null},{\\\"Flight\\\":\\\"5660\\\",\\\"AviaCompany\\\":null,\\\"AviaCompanyIataCode\\\":null,\\\"DepartureCity\\\":\\\"SHJ\\\",\\\"DepartureAirport\\\":\\\"SHJ\\\",\\\"DepartureAirportIataCode\\\":\\\"SHJ\\\",\\\"DepartureDate\\\":\\\"2019-04-14T10:45:00\\\",\\\"DepartureTime\\\":null,\\\"ArrivalCity\\\":\\\"LED\\\",\\\"ArrivalAirport\\\":\\\"LED\\\",\\\"ArrivalAirportIataCode\\\":\\\"LED\\\",\\\"ArrivalDate\\\":\\\"2019-04-14T15:50:00\\\",\\\"ArrivalTime\\\":null,\\\"FareCode\\\":null}]},\\\"Tickets\\\":[{\\\"Passenger\\\":{\\\"FIO\\\":\\\"XXX VIKTORIIA\\\"},\\\"ReservationSystem\\\":null,\\\"TicketNumber\\\":null,\\\"IsRefundPossible\\\":false},{\\\"Passenger\\\":{\\\"FIO\\\":\\\"XXX ANDREI\\\"},\\\"ReservationSystem\\\":null,\\\"TicketNumber\\\":null,\\\"IsRefundPossible\\\":false},{\\\"Passenger\\\":{\\\"FIO\\\":\\\"XXX Andrei\\\"},\\\"ReservationSystem\\\":null,\\\"TicketNumber\\\":null,\\\"IsRefundPossible\\\":false}],\\\"Segments\\\":[{\\\"Flight\\\":\\\"5659\\\",\\\"AviaCompany\\\":null,\\\"AviaCompanyIataCode\\\":null,\\\"DepartureCity\\\":\\\"LED\\\",\\\"DepartureAirport\\\":\\\"LED\\\",\\\"DepartureAirportIataCode\\\":\\\"LED\\\",\\\"DepartureDate\\\":\\\"2019-04-11T02:45:00\\\",\\\"DepartureTime\\\":null,\\\"ArrivalCity\\\":\\\"SHJ\\\",\\\"ArrivalAirport\\\":\\\"SHJ\\\",\\\"ArrivalAirportIataCode\\\":\\\"SHJ\\\",\\\"ArrivalDate\\\":\\\"2019-04-11T09:40:00\\\",\\\"ArrivalTime\\\":null,\\\"FareCode\\\":null},{\\\"Flight\\\":\\\"5660\\\",\\\"AviaCompany\\\":null,\\\"AviaCompanyIataCode\\\":null,\\\"DepartureCity\\\":\\\"SHJ\\\",\\\"DepartureAirport\\\":\\\"SHJ\\\",\\\"DepartureAirportIataCode\\\":\\\"SHJ\\\",\\\"DepartureDate\\\":\\\"2019-04-14T10:45:00\\\",\\\"DepartureTime\\\":null,\\\"ArrivalCity\\\":\\\"LED\\\",\\\"ArrivalAirport\\\":\\\"LED\\\",\\\"ArrivalAirportIataCode\\\":\\\"LED\\\",\\\"ArrivalDate\\\":\\\"2019-04-14T15:50:00\\\",\\\"ArrivalTime\\\":null,\\\"FareCode\\\":null}]}\",\"FinancialSystemId\":9,\"Key\":\"18fe21d1-8c9c-43f3-b11d-6bf884ba6ee0\"}"
К слову сказать, линки на оплаченные туры вполне рабочие:
В индексах с именем graylog_ в открытом виде находились логины и пароли турагентств, подключенных к системе «Слетать.ру» и продающих туры своим клиентам:
"full_message": "Tours by request 155213901 added to local cache with key 'user_cache_155213901' at 5/6/2019 4:49:07 PM, rows found 0, sortedPriceLength 215. QueryString: countryId=90&cityFromId=1265&s_nightsMin=6&s_nightsMax=14&stars=403%2c404&minHotelRating=1¤cyAlias=RUB&pageSize=300&pageNumber=1&s_showcase=true&includeOilTaxesAndVisa=0&login=zakaz%40XXX.ru&password=XXX, Referer: , UserAgent: , IP: 94.154.XX.XX."
По моим прикидкам засветилось несколько сотен пар логин/пароль.
Из личного кабинета турагентства на портале agent.sletat.ru можно было получить данные клиентов, включая номера паспортов, загранпаспортов, даты рождения, ФИО, телефоны и адреса электронной почты.
Я оповестил сервис «Слетать.ру» 15.05.2019 в 10:46 (МСК) и через несколько часов (до 16:00) сервер Elasticsearch исчез из свободного доступа. Позднее в ответ на публикацию в Коммерсанте, руководство сервиса сделало весьма странное заявление через СМИ:
Руководитель компании Андрей Вершинин пояснил, что «Слетать.ру» предоставляет ряду крупнейших туроператоров-партнеров доступ к истории запросов в поисковой системе. И предположил, что DeviceLock получила его: «Однако в указанной базе нет паспортных данных туристов, логинов и паролей турагентств, платежных данных и т. д.». Андрей Вершинин отметил, что никаких доказательств столь серьезных обвинений «Слетать.ру» до сих пор не получила. «Сейчас пытаемся связаться с компанией DeviceLock. Полагаем, что это заказуха. Кому-то не нравится наш стремительный рост», – добавил он. "
Как показано выше и логины, и пароли, и паспортные данные туристов находились в свободном доступе достаточно продолжительное время (как минимум с 29.03.2019, когда сервер компании впервые был зафиксирован в открытом доступе поисковиком Shodan). Разумеется, с нами никто не связывался. Надеюсь, что, хотя бы турагентства они оповестили об утечке и заставили их сменить пароли.
Новости про утечки информации и инсайдеров всегда можно найти на моем Telegram-канале «Утечки информации».