Group-IB corporate blog
Information Security
Payment systems
Reverse engineering
Research and forecasts in IT
May 14

Четыре JavaScript-сниффера, которые подстерегают вас в интернет-магазинах



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

От снифферов уже пострадали почти 400 000 пользователей сайта и мобильного приложения авиакомпании British Airways, а также посетители британского сайта спортивного гиганта FILA и американского дистрибьютора билетов Ticketmaster.

Аналитик Threat Intelligence Group-IB Виктор Окороков рассказывает о том, как снифферы внедряются в код сайта и крадут платежную информацию, а также о том, какие CRM они атакуют.



«Скрытая угроза»


Так вышло, что долгое время JS-снифферы оставались вне поля зрения антивирусных аналитиков, а банки и платежные системы не видели в них серьезной угрозы. И совершенно напрасно. Эксперты Group-IB проанализировали 2440 зараженных онлайн-магазинов, посетители которых — суммарно около 1,5 миллионов человек в день — подвергались риску компрометации. Среди пострадавших — не только пользователи, но и онлайн-магазины, платежные системы и банки, выпустившие скомпрометированные карты.

Отчет Group-IB стал первым исследованием даркнет-рынка снифферов, их инфраструктуры и способов монетизации, приносящей их создателям миллионы долларов. Мы выявили 38 семейств снифферов, из которых лишь 12 ранее были известны исследователям.

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

Семейство ReactGet


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

Кампания с применением этого семейства снифферов началась в мае 2017 года, атаке подверглись сайты под управлением CMS и платформ Magento, Bigcommerce, Shopify.

Как ReactGet внедряется в код онлайн-магазина


Кроме «классического» внедрения скрипта по ссылке, операторы снифферов семейства ReactGet используют особую технику: при помощи JavaScript-кода проверяется, соответствует ли текущий адрес, на котором находится пользователь, определенным критериям. Вредоносный код будет запущен только в том случае, если в текущем URL-адресе присутствует подстрока checkout или onestepcheckout, onepage/, out/onepag, checkout/one, ckout/one. Таким образом, код сниффера исполнится именно в тот момент, когда пользователь перейдет к оплате покупок и введет платежную информацию в форму на сайте.


Этот сниффер использует нестандартную технику. Платежные и персональные данные жертвы собираются вместе, кодируются при помощи base64, а затем полученная строка используется как параметр для отправки запроса на сайт злоумышленников. Чаще всего путь до гейта имитирует JavaScript-файл, к примеру resp.js, data.js и так далее, но также используются ссылки на файлы изображений, GIF и JPG. Особенность в том, что сниффер создает объект изображения размером 1 на 1 пиксель и использует полученную ранее ссылку как параметр src изображения. То есть для пользователя такой запрос в трафике будет выглядеть как запрос обычной картинки. Похожая техника была использована в снифферах семейства ImageID. Кроме того, техника с использованием изображения размером 1 на 1 пиксель применяется во многих легитимных скриптах онлайн-аналитики, что также может ввести пользователя в заблуждение.


Анализ версий


Анализ активных доменов, используемых операторами снифферов ReactGet, позволил обнаружить много разных версий снифферов этого семейства. Версии отличаются наличием или отсутствием обфускации, а кроме того, каждый сниффер предназначен для определенной платежной системы, обрабатывающей платежи по банковским картам для онлайн-магазинов. Перебрав значение параметра, соответствующего номеру версии, специалисты Group-IB получили полный список доступных вариаций снифферов, а по названиям полей форм, которые каждый сниффер ищет в коде страницы, определили платежные системы, на которые нацелен сниффер.

Список снифферов и соответствующих им платежных систем
URL сниффера
Платежная система
reactjsapi.com/react.js Authorize.Net
ajaxstatic.com/api.js?v=2.1.1 Cardsave
ajaxstatic.com/api.js?v=2.1.2 Authorize.Net
ajaxstatic.com/api.js?v=2.1.3 Authorize.Net
ajaxstatic.com/api.js?v=2.1.4 eWAY Rapid
ajaxstatic.com/api.js?v=2.1.5 Authorize.Net
ajaxstatic.com/api.js?v=2.1.6 Adyen
ajaxstatic.com/api.js?v=2.1.7 USAePay
ajaxstatic.com/api.js?v=2.1.9 Authorize.Net
apitstatus.com/api.js?v=2.1.1 USAePay
apitstatus.com/api.js?v=2.1.2 Authorize.Net
apitstatus.com/api.js?v=2.1.3 Moneris
apitstatus.com/api.js?v=2.1.5 USAePay
apitstatus.com/api.js?v=2.1.6 PayPal
apitstatus.com/api.js?v=2.1.7 Sage Pay
apitstatus.com/api.js?v=2.1.8 Verisign
apitstatus.com/api.js?v=2.1.9 PayPal
apitstatus.com/api.js?v=2.3.0 Stripe
apitstatus.com/api.js?v=3.0.2 Realex
apitstatus.com/api.js?v=3.0.3 PayPal
apitstatus.com/api.js?v=3.0.4 LinkPoint
apitstatus.com/api.js?v=3.0.5 PayPal
apitstatus.com/api.js?v=3.0.7 PayPal
apitstatus.com/api.js?v=3.0.8 DataCash
apitstatus.com/api.js?v=3.0.9 PayPal
asianfoodgracer.com/footer.js Authorize.Net
billgetstatus.com/api.js?v=1.2 Authorize.Net
billgetstatus.com/api.js?v=1.3 Authorize.Net
billgetstatus.com/api.js?v=1.4 Authorize.Net
billgetstatus.com/api.js?v=1.5 Verisign
billgetstatus.com/api.js?v=1.6 Authorize.Net
billgetstatus.com/api.js?v=1.7 Moneris
billgetstatus.com/api.js?v=1.8 Sage Pay
billgetstatus.com/api.js?v=2.0 USAePay
billgetstatus.com/react.js Authorize.Net
cloudodesc.com/gtm.js?v=1.2 Authorize.Net
cloudodesc.com/gtm.js?v=1.3 ANZ eGate
cloudodesc.com/gtm.js?v=2.3 Authorize.Net
cloudodesc.com/gtm.js?v=2.4 Moneris
cloudodesc.com/gtm.js?v=2.6
Sage Pay
cloudodesc.com/gtm.js?v=2.7 Sage Pay
cloudodesc.com/gtm.js?v=2.8 Chase Paymentech
cloudodesc.com/gtm.js?v=2.9 Authorize.Net
cloudodesc.com/gtm.js?v=2.91 Adyen
cloudodesc.com/gtm.js?v=2.92 PsiGate
cloudodesc.com/gtm.js?v=2.93 CyberSource
cloudodesc.com/gtm.js?v=2.95 ANZ eGate
cloudodesc.com/gtm.js?v=2.97 Realex
geisseie.com/gs.js USAePay
gtmproc.com/age.js Authorize.Net
gtmproc.com/gtm.js?v=1.2 Authorize.Net
gtmproc.com/gtm.js?v=1.3 ANZ eGate
gtmproc.com/gtm.js?v=1.5 PayPal
gtmproc.com/gtm.js?v=1.6 PayPal
gtmproc.com/gtm.js?v=1.7 Realex
livecheckpay.com/api.js?v=2.0 Sage Pay
livecheckpay.com/api.js?v=2.1 PayPal
livecheckpay.com/api.js?v=2.2 Verisign
livecheckpay.com/api.js?v=2.3 Authorize.Net
livecheckpay.com/api.js?v=2.4 Verisign
livecheckpay.com/react.js Authorize.Net
livegetpay.com/pay.js?v=2.1.2 ANZ eGate
livegetpay.com/pay.js?v=2.1.3 PayPal
livegetpay.com/pay.js?v=2.1.5 CyberSource
livegetpay.com/pay.js?v=2.1.7 Authorize.Net
livegetpay.com/pay.js?v=2.1.8 Sage Pay
livegetpay.com/pay.js?v=2.1.9 Realex
livegetpay.com/pay.js?v=2.2.0 CyberSource
livegetpay.com/pay.js?v=2.2.1 PayPal
livegetpay.com/pay.js?v=2.2.2 PayPal
livegetpay.com/pay.js?v=2.2.3 PayPal
livegetpay.com/pay.js?v=2.2.4 Verisign
livegetpay.com/pay.js?v=2.2.5 eWAY Rapid
livegetpay.com/pay.js?v=2.2.7 Sage Pay
livegetpay.com/pay.js?v=2.2.8 Sage Pay
livegetpay.com/pay.js?v=2.2.9 Verisign
livegetpay.com/pay.js?v=2.3.0 Authorize.Net
livegetpay.com/pay.js?v=2.3.1 Authorize.Net
livegetpay.com/pay.js?v=2.3.2 First Data Global Gateway
livegetpay.com/pay.js?v=2.3.3 Authorize.Net
livegetpay.com/pay.js?v=2.3.4 Authorize.Net
livegetpay.com/pay.js?v=2.3.5 Moneris
livegetpay.com/pay.js?v=2.3.6 Authorize.Net
livegetpay.com/pay.js?v=2.3.8 PayPal
livegetpay.com/pay.js?v=2.4.0 Verisign
maxstatics.com/site.js USAePay
mediapack.info/track.js?d=funlove.com USAePay
mediapack.info/track.js?d=qbedding.com Authorize.Net
mediapack.info/track.js?d=vseyewear.com Verisign
mxcounter.com/c.js?v=1.2 PayPal
mxcounter.com/c.js?v=1.3 Authorize.Net
mxcounter.com/c.js?v=1.4 Stripe
mxcounter.com/c.js?v=1.6 Authorize.Net
mxcounter.com/c.js?v=1.7 eWAY Rapid
mxcounter.com/c.js?v=1.8 Sage Pay
mxcounter.com/c.js?v=2.0 Authorize.Net
mxcounter.com/c.js?v=2.1 Braintree
mxcounter.com/c.js?v=2.10 Braintree
mxcounter.com/c.js?v=2.2 PayPal
mxcounter.com/c.js?v=2.3 Sage Pay
mxcounter.com/c.js?v=2.31 Sage Pay
mxcounter.com/c.js?v=2.32 Authorize.Net
mxcounter.com/c.js?v=2.33 PayPal
mxcounter.com/c.js?v=2.34 Authorize.Net
mxcounter.com/c.js?v=2.35 Verisign
mxcounter.com/click.js?v=1.2 PayPal
mxcounter.com/click.js?v=1.3 Authorize.Net
mxcounter.com/click.js?v=1.4 Stripe
mxcounter.com/click.js?v=1.6 Authorize.Net
mxcounter.com/click.js?v=1.7 eWAY Rapid
mxcounter.com/click.js?v=1.8 Sage Pay
mxcounter.com/click.js?v=2.0 Authorize.Net
mxcounter.com/click.js?v=2.1 Braintree
mxcounter.com/click.js?v=2.2 PayPal
mxcounter.com/click.js?v=2.3 Sage Pay
mxcounter.com/click.js?v=2.31 Sage Pay
mxcounter.com/click.js?v=2.32 Authorize.Net
mxcounter.com/click.js?v=2.33 PayPal
mxcounter.com/click.js?v=2.34 Authorize.Net
mxcounter.com/click.js?v=2.35 Verisign
mxcounter.com/cnt.js Authorize.Net
mxcounter.com/j.js Authorize.Net
newrelicnet.com/api.js?v=1.2 Authorize.Net
newrelicnet.com/api.js?v=1.4 Authorize.Net
newrelicnet.com/api.js?v=1.8 Sage Pay
newrelicnet.com/api.js?v=4.5 Sage Pay
newrelicnet.com/api.js?v=4.6 Westpac PayWay
nr-public.com/api.js?v=2.0 PayFort
nr-public.com/api.js?v=2.1 PayPal
nr-public.com/api.js?v=2.2 Authorize.Net
nr-public.com/api.js?v=2.3 Stripe
nr-public.com/api.js?v=2.4 First Data Global Gateway
nr-public.com/api.js?v=2.5 PsiGate
nr-public.com/api.js?v=2.6 Authorize.Net
nr-public.com/api.js?v=2.7 Authorize.Net
nr-public.com/api.js?v=2.8 Moneris
nr-public.com/api.js?v=2.9 Authorize.Net
nr-public.com/api.js?v=3.1 Sage Pay
nr-public.com/api.js?v=3.2 Verisign
nr-public.com/api.js?v=3.3 Moneris
nr-public.com/api.js?v=3.5 PayPal
nr-public.com/api.js?v=3.6 LinkPoint
nr-public.com/api.js?v=3.7 Westpac PayWay
nr-public.com/api.js?v=3.8 Authorize.Net
nr-public.com/api.js?v=4.0 Moneris
nr-public.com/api.js?v=4.0.2 PayPal
nr-public.com/api.js?v=4.0.3 Adyen
nr-public.com/api.js?v=4.0.4 PayPal
nr-public.com/api.js?v=4.0.5 Authorize.Net
nr-public.com/api.js?v=4.0.6 USAePay
nr-public.com/api.js?v=4.0.7 EBizCharge
nr-public.com/api.js?v=4.0.8 Authorize.Net
nr-public.com/api.js?v=4.0.9 Verisign
nr-public.com/api.js?v=4.1.2 Verisign
ordercheckpays.com/api.js?v=2.11 Authorize.Net
ordercheckpays.com/api.js?v=2.12 PayPal
ordercheckpays.com/api.js?v=2.13 Moneris
ordercheckpays.com/api.js?v=2.14 Authorize.Net
ordercheckpays.com/api.js?v=2.15 PayPal
ordercheckpays.com/api.js?v=2.16 PayPal
ordercheckpays.com/api.js?v=2.17 Westpac PayWay
ordercheckpays.com/api.js?v=2.18 Authorize.Net
ordercheckpays.com/api.js?v=2.19 Authorize.Net
ordercheckpays.com/api.js?v=2.21 Sage Pay
ordercheckpays.com/api.js?v=2.22 Verisign
ordercheckpays.com/api.js?v=2.23 Authorize.Net
ordercheckpays.com/api.js?v=2.24 PayPal
ordercheckpays.com/api.js?v=2.25 PayFort
ordercheckpays.com/api.js?v=2.29 CyberSource
ordercheckpays.com/api.js?v=2.4 PayPal Payflow Pro
ordercheckpays.com/api.js?v=2.7 Authorize.Net
ordercheckpays.com/api.js?v=2.8 Authorize.Net
ordercheckpays.com/api.js?v=2.9 Verisign
ordercheckpays.com/api.js?v=3.1 Authorize.Net
ordercheckpays.com/api.js?v=3.2 Authorize.Net
ordercheckpays.com/api.js?v=3.3 Sage Pay
ordercheckpays.com/api.js?v=3.4 Authorize.Net
ordercheckpays.com/api.js?v=3.5 Stripe
ordercheckpays.com/api.js?v=3.6 Authorize.Net
ordercheckpays.com/api.js?v=3.7 Authorize.Net
ordercheckpays.com/api.js?v=3.8 Verisign
ordercheckpays.com/api.js?v=3.9 PayPal
ordercheckpays.com/api.js?v=4.0 Authorize.Net
ordercheckpays.com/api.js?v=4.1 Authorize.Net
ordercheckpays.com/api.js?v=4.2 Sage Pay
ordercheckpays.com/api.js?v=4.3 Authorize.Net
reactjsapi.com/api.js?v=0.1.0 Authorize.Net
reactjsapi.com/api.js?v=0.1.1 PayPal
reactjsapi.com/api.js?v=4.1.2 Flint
reactjsapi.com/api.js?v=4.1.4 PayPal
reactjsapi.com/api.js?v=4.1.5 Sage Pay
reactjsapi.com/api.js?v=4.1.51 Verisign
reactjsapi.com/api.js?v=4.1.6 Authorize.Net
reactjsapi.com/api.js?v=4.1.7 Authorize.Net
reactjsapi.com/api.js?v=4.1.8 Stripe
reactjsapi.com/api.js?v=4.1.9 Fat Zebra
reactjsapi.com/api.js?v=4.2.0 Sage Pay
reactjsapi.com/api.js?v=4.2.1 Authorize.Net
reactjsapi.com/api.js?v=4.2.2 First Data Global Gateway
reactjsapi.com/api.js?v=4.2.3 Authorize.Net
reactjsapi.com/api.js?v=4.2.4 eWAY Rapid
reactjsapi.com/api.js?v=4.2.5 Adyen
reactjsapi.com/api.js?v=4.2.7 PayPal
reactjsapi.com/api.js?v=4.2.8 QuickBooks Merchant Services
reactjsapi.com/api.js?v=4.2.9 Verisign
reactjsapi.com/api.js?v=4.2.91 Sage Pay
reactjsapi.com/api.js?v=4.2.92 Verisign
reactjsapi.com/api.js?v=4.2.94 Authorize.Net
reactjsapi.com/api.js?v=4.3.97 Authorize.Net
reactjsapi.com/api.js?v=4.5 Sage Pay
reactjsapi.com/react.js Authorize.Net
sydneysalonsupplies.com/gtm.js eWAY Rapid
tagsmediaget.com/react.js Authorize.Net
tagstracking.com/tag.js?v=2.1.2 ANZ eGate
tagstracking.com/tag.js?v=2.1.3 PayPal
tagstracking.com/tag.js?v=2.1.5 CyberSource
tagstracking.com/tag.js?v=2.1.7 Authorize.Net
tagstracking.com/tag.js?v=2.1.8 Sage Pay
tagstracking.com/tag.js?v=2.1.9 Realex
tagstracking.com/tag.js?v=2.2.0 CyberSource
tagstracking.com/tag.js?v=2.2.1 PayPal
tagstracking.com/tag.js?v=2.2.2 PayPal
tagstracking.com/tag.js?v=2.2.3 PayPal
tagstracking.com/tag.js?v=2.2.4 Verisign
tagstracking.com/tag.js?v=2.2.5 eWAY Rapid
tagstracking.com/tag.js?v=2.2.7 Sage Pay
tagstracking.com/tag.js?v=2.2.8 Sage Pay
tagstracking.com/tag.js?v=2.2.9
Verisign
tagstracking.com/tag.js?v=2.3.0 Authorize.Net
tagstracking.com/tag.js?v=2.3.1 Authorize.Net
tagstracking.com/tag.js?v=2.3.2 First Data Global Gateway
tagstracking.com/tag.js?v=2.3.3 Authorize.Net
tagstracking.com/tag.js?v=2.3.4 Authorize.Net
tagstracking.com/tag.js?v=2.3.5 Moneris
tagstracking.com/tag.js?v=2.3.6 Authorize.Net
tagstracking.com/tag.js?v=2.3.8 PayPal


Сниффер паролей


Одним из преимуществ JavaScript-снифферов, работающих на клиентской стороне сайта, является универсальность: внедренный на сайт вредоносный код способен похитить данные любого типа, будь то платежные данные или логин и пароль от пользовательского аккаунта. Специалисты Group-IB обнаружили образец сниффера, относящегося к семейству ReactGet, предназначенный для кражи адресов электронной почты и паролей пользователей сайта.


Пересечение со сниффером ImageID


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


Универсальный сниффер


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

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


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


Далее персональные данные жертвы и платежная информация собирались воедино и отправлялись на подконтрольный злоумышленнику сайт: в этом конкретном случае были обнаружены две версии универсального сниффера ReactGet, расположенные на двух разных взломанных сайтах. Однако обе версии отправляли украденные данные на один и тот же взломанный сайт zoobashop.com.


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

  • Authorize.Net
  • Verisign
  • First Data
  • USAePay
  • Stripe
  • PayPal
  • ANZ eGate
  • Braintree
  • DataCash (MasterCard)
  • Realex Payments
  • PsiGate
  • Heartland Payment Systems

Какие инструменты используются для кражи платежной информации


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


Второй обнаруженный инструмент предназначен для генерации кода, отвечающего за подгрузку основного сниффера. Данный инструмент генерирует JavaScript-код, который проверяет, находится ли пользователь на странице оплаты, путем поиска в текущем адресе пользователя строк checkout, cart и так далее, и если результат положительный, то код подгружает основной сниффер с сервера злоумышленников. Для сокрытия вредоносной активности все строки, включая тестовые строки для определения платежной страницы, а также ссылку на сниффер, закодированы при помощи base64.


Фишинговые атаки


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


Инфраструктура
Домен
Дата обнаружения/появления
mediapack.info 04.05.2017
adsgetapi.com 15.06.2017
simcounter.com 14.08.2017
mageanalytics.com 22.12.2017
maxstatics.com 16.01.2018
reactjsapi.com 19.01.2018
mxcounter.com 02.02.2018
apitstatus.com 01.03.2018
orderracker.com 20.04.2018
tagstracking.com 25.06.2018
adsapigate.com 12.07.2018
trust-tracker.com 15.07.2018
fbstatspartner.com 02.10.2018
billgetstatus.com 12.10.2018
aldenmlilhouse.com 20.10.2018
balletbeautlful.com 20.10.2018
bargalnjunkie.com 20.10.2018
payselector.com 21.10.2018
tagsmediaget.com 02.11.2018
hs-payments.com 16.11.2018
ordercheckpays.com 19.11.2018
geisseie.com 24.11.2018
gtmproc.com 29.11.2018
livegetpay.com 18.12.2018
sydneysalonsupplies.com 18.12.2018
newrelicnet.com
19.12.2018
nr-public.com 03.01.2019
cloudodesc.com 04.01.2019
ajaxstatic.com 11.01.2019
livecheckpay.com 21.01.2019
asianfoodgracer.com 25.01.2019


Семейство G-Analytics


Это семейство снифферов используется для кражи карт клиентов онлайн-магазинов. Самое первое доменное имя, используемое группой, было зарегистрировано в апреле 2016 года, что может свидетельствовать о начале активности группы в середине 2016 года.

В текущей кампании группа использует доменные имена, имитирующие реально существующие сервисы, такие как Google Analytics и jQuery, маскируя активность снифферов легитимными скриптами и похожими на легитимные доменными именами. Атаке подверглись сайты, работающие под управлением CMS Magento.

Как G-Analytics внедряется в код онлайн-магазина


Отличительная особенность этого семейства — использование различных способов похищения платежной информации пользователя. Помимо классического внедрения JavaScript-кода в клиентскую часть сайта, преступная группа также применяла технику внедрения кода в серверную часть сайта, а именно PHP-скрипты, обрабатывающие введенные пользователем данные. Эта техника опасна тем, что затрудняет обнаружение вредоносного кода сторонними исследователями. Специалистами Group-IB была обнаружена версия сниффера, внедренного в PHP-код сайта, использующая в качестве гейта домен dittm.org.


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


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

В начале 2017 года группа стала использовать домен jquery-js.com, маскирующийся под CDN для jQuery: при переходе на сайт злоумышленников пользователя перенаправляет на легитимный сайт jquery.com.

А в середине 2018 года группа взяла на вооружение доменное имя g-analytics.com и начала маскировать деятельность сниффера под легитимный сервис Google Analytics.



Анализ версий


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

Всего на сайте jquery-js.com было выявлено шесть версий снифферов. Украденные данные эти снифферы отправляют на адрес, расположенный на том же сайте, что и сам сниффер: hxxps://jquery-js[.]com/latest/jquery.min.js:

  • hxxps://jquery-js[.]com/jquery.min.js
  • hxxps://jquery-js[.]com/jquery.2.2.4.min.js
  • hxxps://jquery-js[.]com/jquery.1.8.3.min.js
  • hxxps://jquery-js[.]com/jquery.1.6.4.min.js
  • hxxps://jquery-js[.]com/jquery.1.4.4.min.js
  • hxxps://jquery-js[.]com/jquery.1.12.4.min.js

Более поздний домен g-analytics.com, используемый группой в атаках с середины 2018 года, служит хранилищем для большего числа снифферов. Всего было обнаружено 16 разных версий сниффера. В этом случае гейт для отправки украденных данных был замаскирован под ссылку на изображение формата GIF: hxxp://g-analytics[.]com/__utm.gif?v=1&_v=j68&a=98811130&t=pageview&_s=1&sd=24-bit&sr=2560x1440&vp=2145x371&je=0&_u=AACAAEAB~&jid=1841704724&gjid=877686936&cid
=1283183910.1527732071
:

  • hxxps://g-analytics[.]com/libs/1.0.1/analytics.js
  • hxxps://g-analytics[.]com/libs/1.0.10/analytics.js
  • hxxps://g-analytics[.]com/libs/1.0.11/analytics.js
  • hxxps://g-analytics[.]com/libs/1.0.12/analytics.js
  • hxxps://g-analytics[.]com/libs/1.0.13/analytics.js
  • hxxps://g-analytics[.]com/libs/1.0.14/analytics.js
  • hxxps://g-analytics[.]com/libs/1.0.15/analytics.js
  • hxxps://g-analytics[.]com/libs/1.0.16/analytics.js
  • hxxps://g-analytics[.]com/libs/1.0.3/analytics.js
  • hxxps://g-analytics[.]com/libs/1.0.4/analytics.js
  • hxxps://g-analytics[.]com/libs/1.0.5/analytics.js
  • hxxps://g-analytics[.]com/libs/1.0.6/analytics.js
  • hxxps://g-analytics[.]com/libs/1.0.7/analytics.js
  • hxxps://g-analytics[.]com/libs/1.0.8/analytics.js
  • hxxps://g-analytics[.]com/libs/1.0.9/analytics.js
  • hxxps://g-analytics[.]com/libs/analytics.js

Монетизация украденных данных


Преступная группа монетизирует украденные данные, продавая карты через специально созданный подпольный магазин, оказывающий услуги кардерам. Анализ доменов, используемых атакующими, позволил определить, что google-analytics.cm был зарегистрирован тем же пользователем, что и домен cardz.vc. Домен cardz.vc относится к магазину по продаже украденных банковских карт Cardsurfs (Flysurfs), который обрел популярность еще во времена активности подпольной торговой площадки AlphaBay как магазин по продаже банковских карт, украденных при помощи сниффера.


Анализируя домен analytic.is, расположенный на том же сервере, что и домены, используемые снифферами для сбора украденных данных, специалисты Group-IB обнаружили файл, содержащий логи Cookie-стиллера, который, похоже, позднее был заброшен разработчиком. Одна из записей в логе содержала домен iozoz.com, который ранее был использован в одном из снифферов, активных в 2016 году. Предположительно, этот домен ранее использовался злоумышленником для сбора украденных при помощи сниффера карт. Этот домен был зарегистрирован на email-адрес kts241@gmail.com, который также был использован для регистрации доменов cardz.su и cardz.vc, относящихся к кардинговому магазину Cardsurfs.

Исходя из полученных даннных, можно сделать предположение, что семейство снифферов G-Analytics и подпольный магазин по продаже банковских карт Cardsurfs управляются одними и теми же людьми, а магазин используется для реализации банковских карт, украденных при помощи сниффера.

Инфраструктура
Домен
Дата обнаружения/появления
iozoz.com 08.04.2016
dittm.org 10.09.2016
jquery-js.com 02.01.2017
g-analytics.com 31.05.2018
google-analytics.is 21.11.2018
analytic.to 04.12.2018
google-analytics.to 06.12.2018
google-analytics.cm 28.12.2018
analytic.is 28.12.2018
googlc-analytics.cm 17.01.2019


Семейство Illum


Illum — семейство снифферов, применяемое для атак на онлайн-магазины, работающие под управлением CMS Magento. Помимо внедрения вредоносного кода, операторы этого сниффера также используют внедрение полноценных поддельных форм оплаты, которые отправляют данные на подконтрольные злоумышленникам гейты.

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

Как Illum внедряется в код онлайн-магазина


Первые обнаруженные версии сниффера внедрялись прямо в код скомпрометированного сайта. Украденные данные отправлялись по адресу cdn.illum[.]pw/records.php, гейт же был закодирован при помощи base64.


Позднее была обнаружена упакованная версия сниффера, использующая другой гейт — records.nstatistics[.]com/records.php.


Согласно отчету Willem de Groot, такой же хост использовался в сниффере, который был внедрен на сайт магазина, принадлежащего немецкой политической партии CSU.

Анализ сайта злоумышленников


Специалисты Group-IB обнаружили и проанализировали сайт, используемый данной преступной группой для хранения инструментов и сбора украденной информации.


Среди инструментов, обнаруженных на сервере злоумышленников, были найдены скрипты и эксплойты для повышения привилегий в ОС Linux: к примеру, Linux Privilege Escalation Check Script, разработанный Майком Чумаком (Mike Czumak), а также эксплойт для CVE-2009-1185.

Непосредственно для атак на онлайн-магазины злоумышленники использовали два эксплойта: первый способен внедрить вредоносный код в core_config_data при помощи эксплуатации CVE-2016-4010, второй эксплуатирует уязвимость типа RCE в плагинах для CMS Magento, позволяя выполнить произвольный код на уязвимом веб-сервере.


Также в ходе анализа сервера были обнаружены различные образцы снифферов и фальшивых платежных форм, используемых злоумышленниками для сбора платежной информации со взломанных сайтов. Как можно заметить из списка ниже, некоторые скрипты создавались индивидуально для каждого взломанного сайта, в то время как для определенных CMS и платежных шлюзов использовалось универсальное решение. К примеру, скрипты segapay_standart.js и segapay_onpage.js предназначены для внедрения на сайты, использующие платежный шлюз Sage Pay.

Список скриптов для различных платежных шлюзов
Скрипт Платежный шлюз
sr.illum[.]pw/mjs_special/visiondirect.co.uk.js //request.payrightnow[.]cf/checkpayment.php
sr.illum[.]pw/mjs_special/topdierenshop.nl.js //request.payrightnow[.]cf/alldata.php
sr.illum[.]pw/mjs_special/tiendalenovo.es.js //request.payrightnow[.]cf/alldata.php
sr.illum[.]pw/mjs_special/pro-bolt.com.js //request.payrightnow[.]cf/alldata.php
sr.illum[.]pw/mjs_special/plae.co.js //request.payrightnow[.]cf/alldata.php
sr.illum[.]pw/mjs_special/ottolenghi.co.uk.js //request.payrightnow[.]cf/alldata.php
sr.illum[.]pw/mjs_special/oldtimecandy.com.js //request.payrightnow[.]cf/checkpayment.php
sr.illum[.]pw/mjs_special/mylook.ee.js //cdn.illum[.]pw/records.php
sr.illum[.]pw/mjs_special/luluandsky.com.js //request.payrightnow[.]cf/checkpayment.php
sr.illum[.]pw/mjs_special/julep.com.js //cdn.illum[.]pw/records.php
sr.illum[.]pw/mjs_special/gymcompany.es.js //request.payrightnow[.]cf/alldata.php
sr.illum[.]pw/mjs_special/grotekadoshop.nl.js //request.payrightnow[.]cf/alldata.php
sr.illum[.]pw/mjs_special/fushi.co.uk.js //request.payrightnow[.]cf/checkpayment.php
sr.illum[.]pw/mjs_special/fareastflora.com.js //request.payrightnow[.]cf/checkpayment.php
sr.illum[.]pw/mjs_special/compuindia.com.js //request.payrightnow[.]cf/alldata.php
sr.illum[.]pw/mjs/segapay_standart.js //cdn.illum[.]pw/records.php
sr.illum[.]pw/mjs/segapay_onpage.js //cdn.illum[.]pw/records.php
sr.illum[.]pw/mjs/replace_standart.js //request.payrightnow[.]cf/checkpayment.php
sr.illum[.]pw/mjs/all_inputs.js //cdn.illum[.]pw/records.php
sr.illum[.]pw/mjs/add_inputs_standart.js //request.payrightnow[.]cf/checkpayment.php
sr.illum[.]pw/magento/payment_standart.js //cdn.illum[.]pw/records.php
sr.illum[.]pw/magento/payment_redirect.js //payrightnow[.]cf/?payment=
sr.illum[.]pw/magento/payment_redcrypt.js //payrightnow[.]cf/?payment=
sr.illum[.]pw/magento/payment_forminsite.js //paymentnow[.]tk/?payment=


Хост paymentnow[.]tk, используемый как гейт в скрипте payment_forminsite.js, был обнаружен как subjectAltName в нескольких сертификатах, относящихся к сервису CloudFlare. Помимо этого, на хосте располагался скрипт evil.js. Судя по имени скрипта, он мог быть использован в рамках эксплуатации CVE-2016-4010, благодаря которой можно внедрить вредоносный код в footer сайта под управлением CMS Magento. В качестве гейта этот скрипт применил хост request.requestnet[.]tk, использующий тот же сертификат, что и хост paymentnow[.]tk.

Поддельные платежные формы


Ниже на рисунке показан пример формы для ввода данных карты. Эта форма использовалась для внедрения на сайт онлайн-магазина и кражи данных карт.


На следующем рисунке — пример поддельной платежной формы PayPal, которую использовали злоумышленники для внедрения на сайты с этим методом оплаты.

Инфраструктура
Домен
Дата обнаружения/появления
cdn.illum.pw 27/11/2016
records.nstatistics.com 06/09/2018
request.payrightnow.cf 25/05/2018
paymentnow.tk 16/07/2017
payment-line.tk 01/03/2018
paymentpal.cf 04/09/2017
requestnet.tk 28/06/2017


Семейство CoffeMokko


Семейство снифферов CoffeMokko, предназначенных для кражи банковских карт пользователей интернет-магазинов, используется как минимум с мая 2017 года. Предположительно, операторами данного семейства снифферов является преступная группа Group 1, описанная специалистами RiskIQ в 2016 году. Атакам подверглись сайты под управлением таких CMS, как Magento, OpenCart, WordPress, osCommerce, Shopify.

Как CoffeMokko внедряется в код онлайн-магазина


Операторы этого семейства создают уникальные снифферы для каждого заражения: файл сниффера располагается в директории src или js на сервере злоумышленников. Внедрение в код сайта осуществляется по прямой ссылке на сниффер.


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


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


Украденная платежная информация отправлялась скрипту на сервере злоумышленников по пути /savePayment/index.php или /tr/index.php. Предположительно, этот скрипт служит для отправки данных с гейта на основной сервер, консолидирующий данные со всех снифферов. Для сокрытия передаваемых данных вся платежная информация жертвы кодируется при помощи base64, а затем происходит несколько замен символов:

  • символ «e» заменяется на «:»
  • символ «w» заменяется на «+»
  • символ «o» заменяется на «%»
  • символ «d» заменяется на «#»
  • символ «a» заменяется на «-»
  • символ «7» заменяется на «^»
  • символ «h» заменяется на «_»
  • символ «T» заменяется на «@»
  • символ «0» заменяется на «/»
  • символ «Y» заменяется на «*»

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

Так выглядит фрагмент кода сниффера, не подвергавшегося обфускации:


Анализ инфраструктуры


В ранних кампаниях злоумышленники регистрировали доменные имена, похожие на домены легитимных сайтов онлайн-магазинов. Их домен мог отличаться от легитимного одним символом или другим TLD. Зарегистрированные домены использовались для хранения кода сниффера, ссылка на который внедрялась в код магазина.

Также данная группа использовала доменные имена, напоминающие название популярных плагинов для jQuery (slickjs[.]org для сайтов, использующих плагин slick.js), платежных шлюзов (sagecdn[.]org для сайтов, использующих платежную систему Sage Pay).

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


Каждому домену соответствовал сайт, на котором создавалась директория /js или /src. В этой директории хранились скрипты снифферов: по одному снифферу на каждое новое заражение. Сниффер внедрялся в код сайта по прямой ссылке, но в редких случаях злоумышленники модифицировали один из файлов сайта и добавляли в него вредоносный код.

Анализ кода


Первый алгоритм обфускации


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


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


Второй алгоритм обфускации


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


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


Связь с ранними атаками MageCart


В ходе анализа одного из доменов, используемых группой в качестве гейта для сбора украденных данных, было установлено, что на этом домене развернута инфраструктура для кражи кредитных карт, идентичная той, которая использовалась Group 1 — одной из первых групп, обнаруженных специалистами RiskIQ.

На хосте семейства снифферов CoffeMokko были обнаружены два файла:

  • mage.js — файл, содержащий код сниффера Group 1 с адресом гейта js-cdn.link
  • mag.php — PHP-скрипт, отвечающий за сбор украденных сниффером данных

Содержимое файла mage.js

Также было установлено, что самые ранние домены, используемые группой, стоящей за семейством снифферов CoffeMokko, были зарегистрированы 17 мая 2017 года:

  • link-js[.]link
  • info-js[.]link
  • track-js[.]link
  • map-js[.]link
  • smart-js[.]link

Формат этих доменных имен совпадает с доменными именами Group 1, которые были использованы в атаках 2016 года.

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

Инфраструктура
Домен Дата обнаружения/появления
link-js.link 17.05.2017
info-js.link 17.05.2017
track-js.link 17.05.2017
map-js.link 17.05.2017
smart-js.link 17.05.2017
adorebeauty.org 03.09.2017
security-payment.su 03.09.2017
braincdn.org 04.09.2017
sagecdn.org 04.09.2017
slickjs.org 04.09.2017
oakandfort.org 10.09.2017
citywlnery.org 15.09.2017
dobell.su 04.10.2017
childsplayclothing.org 31.10.2017
jewsondirect.com 05.11.2017
shop-rnib.org 15.11.2017
closetlondon.org 16.11.2017
misshaus.org 28.11.2017
battery-force.org 01.12.2017
kik-vape.org 01.12.2017
greatfurnituretradingco.org 02.12.2017
etradesupply.org 04.12.2017
replacemyremote.org 04.12.2017
all-about-sneakers.org 05.12.2017
mage-checkout.org 05.12.2017
nililotan.org 07.12.2017
lamoodbighats.net 08.12.2017
walletgear.org 10.12.2017
dahlie.org 12.12.2017
davidsfootwear.org 20.12.2017
blackriverimaging.org 23.12.2017
exrpesso.org 02.01.2018
parks.su 09.01.2018
pmtonline.su 12.01.2018
ottocap.org 15.01.2018
christohperward.org 27.01.2018
coffetea.org 31.01.2018
energycoffe.org 31.01.2018
energytea.org 31.01.2018
teacoffe.net 31.01.2018
adaptivecss.org 01.03.2018
coffemokko.com 01.03.2018
londontea.net 01.03.2018
ukcoffe.com 01.03.2018
labbe.biz 20.03.2018
batterynart.com 03.04.2018
btosports.net 09.04.2018
chicksaddlery.net 16.04.2018
paypaypay.org 11.05.2018
ar500arnor.com 26.05.2018
authorizecdn.com 28.05.2018
slickmin.com 28.05.2018
bannerbuzz.info 03.06.2018
kandypens.net 08.06.2018
mylrendyphone.com 15.06.2018
freshchat.info 01.07.2018
3lift.org 02.07.2018
abtasty.net 02.07.2018
mechat.info 02.07.2018
zoplm.com 02.07.2018
zapaljs.com 02.09.2018
foodandcot.com 15.09.2018
freshdepor.com 15.09.2018
swappastore.com 15.09.2018
verywellfitnesse.com 15.09.2018
elegrina.com 18.11.2018
majsurplus.com 19.11.2018
top5value.com 19.11.2018


+12
6.3k 66
Comments 9