Home

Виталий Рудных

11 мая 2018

Google ругается на вредоносное ПО track.inspidsp.com (виноват pluso.ru)

Пару лет назад сервис социальных кнопок уже был в центре скандала. И похоже что история повторяется. За последние пару дней в сети появилось большое количество сообщение от пользователей, который сообщают о том что их сайт попал в бан гугла из-за наличия ссылки:
https://track.inspidsp.com/track_pixel.png?prid=1&pruid=gY5pGTwJ85uU5555ql3M
(ссылка может иметь другой вид, но домен один и тот же).

Изучив несколько сайтов заблокированных Google, я обнаружил что общее среди них одно, это установленный скрипт share.pluso.ru.


Если лень читать весь пост: Чтобы Google исключил ваш сайт из черного списка, удалите со всех страниц сайта установленный скрипт от Pluso и запросите повторную проверку у технической поддержки.

Редирект происходит по следующей цепочке:
share.pluso.ru/pluso-like.js > kitbit.net/kb.js > tag.digitaltarget.ru/adcm.js > dmg.digitaltarget.ru/1/4002/i/i?q=scc > https://track.inspidsp.com/track_pixel.png


Попробуем создать пустую страницу с установленным скриптом от Pluso.

<b>Hello World!</b><hr>
<script type="text/javascript">(function() {
  if (window.pluso)if (typeof window.pluso.start == "function") return;
  if (window.ifpluso==undefined) { window.ifpluso = 1;
    var d = document, s = d.createElement('script'), g = 'getElementsByTagName';
    s.type = 'text/javascript'; s.charset='UTF-8'; s.async = true;
    s.src = ('https:' == window.location.protocol ? 'https' : 'http')  + '://share.pluso.ru/pluso-like.js';
    var h=d[g]('body')[0];
    h.appendChild(s);
  }})();</script>
<div class="pluso" data-background="#ebebeb" data-options="big,square,line,horizontal,counter,theme=04" data-services="vkontakte,odnoklassniki,facebook,twitter,google,moimir,email,print"></div>

После открытия данной странице смотрим в раздел “Network” Dev Tools и видим (!!!) 34 запроса. Попробуем разобраться, что же такого грузит данный скрипт.
Первым грузится скрипт http://share.pluso.ru/pluso-like.js
Чтобы привести его в более удобочитаемый вид воспользуемся сервисом http://jsbeautifier.org/
В данном скрипте находится основной функционал share-кнопок, но больше всего нас интересуют строки:

setTimeout(function() {
    var s = document.createElement("script"),
    h = document.getElementsByTagName("head")[0];
    s.async = 1;
    s.src = "//kitbit.net/kb.js";
    s.type = "text/javascript";
    if (h) h.appendChild(s)
}, 10);

Через 10 миллисекунд после загрузки, в тело сайта будет внедрен скрипт http://kitbit.net/kb.js

Примечательно что оба сайта kitbit.net (31.131.252.94) и pluso.ru (31.131.252.90) расположены в одной подсети и домены делегированы на один DNS-сервер ns1.dnsmadeeasy.com. Могу предположить что создатели Pluso связанны с сайтом kitbit.net, слишком много совпадений.

Скрипт инжектит в тело сайта gif’ку размером 1х1 пиксель (видимо используется для сбора пользовательских данных) и еще два скрипта:
http://kitbit.net/s.js?u=http%3A%2F%2Fu91206vl.beget.tech%2F
https://tag.digitaltarget.ru/adcm.js

Первый скрипт пустой, но он грузится с параметром u=, в который передается имя домена с которого произошла загрузка скрипта социальных кнопок. Если верить информации из Whois, домен digitaltarget.ru принадлежит фирме LLC AmberData (https://amberdata.ru/).
Смотрим что же происходит дальше, изучаем скрипт https://tag.digitaltarget.ru/adcm.js
В нем происходит инжект скрипта http://tag.digitaltarget.ru/processor.js?i=542873553000391, код досконально не изучал, но похоже что подгрузка этого скрипта происходит только при определенных условиях.

Этот скрипт в свою очередь инжектит еще два. Смотрим строчку:

knownIds: [1, 127, 143, 1041, 1043, 1047, 1048, 1057, 1058, 1064, 1065, 1066, 1067, 1072, 1073, 1075, 1079, 1082, 1083, 1086, 1103, 1131, 1162, 1220, 2039, 2210, 2218, 4009, 6015, 6016, 6229, 6241, 6249, 6273, 6284, 6321, 6331, 6343],
...
this.knownIds.indexOf(this.config.id) >= 0 ? this.load(a, window.location.protocol + "//tag.digitaltarget.ru/extensions/extension_" + this.config.id + ".js?i=" + Math.round(1e15 * Math.random())) : "function" == typeof a() && a()

Пробуем перебрать все возможные варианты от
http://tag.digitaltarget.ru/extensions/extension_1.js
до
http://tag.digitaltarget.ru/extensions/extension_9999.js

Генерируем список в файл js.txt и отдаем его скрипту dirsearch.py:

python3.6 dirsearch.py -u http://tag.digitaltarget.ru/extensions/ --wordlist=js.txt -e php

Результат:

200     0B   http://tag.digitaltarget.ru:80/extensions//extension_1.js
200     0B   http://tag.digitaltarget.ru:80/extensions//extension_127.js
200    76B   http://tag.digitaltarget.ru:80/extensions//extension_143.js
200   182B   http://tag.digitaltarget.ru:80/extensions//extension_1041.js
200    43B   http://tag.digitaltarget.ru:80/extensions//extension_1043.js
200   266B   http://tag.digitaltarget.ru:80/extensions//extension_1047.js
200     2KB  http://tag.digitaltarget.ru:80/extensions//extension_1050.js
200    66B   http://tag.digitaltarget.ru:80/extensions//extension_1048.js
200    66B   http://tag.digitaltarget.ru:80/extensions//extension_1057.js
200    66B   http://tag.digitaltarget.ru:80/extensions//extension_1058.js
200    43B   http://tag.digitaltarget.ru:80/extensions//extension_1064.js
200    43B   http://tag.digitaltarget.ru:80/extensions//extension_1065.js
200    43B   http://tag.digitaltarget.ru:80/extensions//extension_1066.js
200   225B   http://tag.digitaltarget.ru:80/extensions//extension_1067.js
200    43B   http://tag.digitaltarget.ru:80/extensions//extension_1073.js
200    43B   http://tag.digitaltarget.ru:80/extensions//extension_1072.js
200    43B   http://tag.digitaltarget.ru:80/extensions//extension_1075.js
200    43B   http://tag.digitaltarget.ru:80/extensions//extension_1082.js
200    43B   http://tag.digitaltarget.ru:80/extensions//extension_1083.js
200   723B   http://tag.digitaltarget.ru:80/extensions//extension_1086.js
200   225B   http://tag.digitaltarget.ru:80/extensions//extension_1079.js
200    43B   http://tag.digitaltarget.ru:80/extensions//extension_1103.js
200    43B   http://tag.digitaltarget.ru:80/extensions//extension_1131.js
200    43B   http://tag.digitaltarget.ru:80/extensions//extension_1162.js
200    43B   http://tag.digitaltarget.ru:80/extensions//extension_1220.js
200   517B   http://tag.digitaltarget.ru:80/extensions//extension_2025.js
200   530B   http://tag.digitaltarget.ru:80/extensions//extension_2039.js
200     2KB  http://tag.digitaltarget.ru:80/extensions//extension_2210.js
200    43B   http://tag.digitaltarget.ru:80/extensions//extension_2218.js
200     1KB  http://tag.digitaltarget.ru:80/extensions//extension_4009.js
200   185B   http://tag.digitaltarget.ru:80/extensions//extension_6015.js
200   229B   http://tag.digitaltarget.ru:80/extensions//extension_6016.js
200    66B   http://tag.digitaltarget.ru:80/extensions//extension_6229.js
200    43B   http://tag.digitaltarget.ru:80/extensions//extension_6241.js
200    43B   http://tag.digitaltarget.ru:80/extensions//extension_6249.js
200    43B   http://tag.digitaltarget.ru:80/extensions//extension_6273.js
200    43B   http://tag.digitaltarget.ru:80/extensions//extension_6284.js
200    43B   http://tag.digitaltarget.ru:80/extensions//extension_6321.js
200    43B   http://tag.digitaltarget.ru:80/extensions//extension_6331.js
200   876B   http://tag.digitaltarget.ru:80/extensions//extension_6343.js

Как видим, есть некоторые ID которые не фигурируют в скрипте в массиве knownIds[] но при этом так же существуют.
Все скрипты не изучал, но интересен файл:
http://tag.digitaltarget.ru/extensions//extension_1050.js
Если посмотрим в код, то судя по именам функций, можно предположить что скрипт пытается что-то добавить в корзину в каком-то интернет-магазине.

Единственное что я смог нагуглить по строке:

d = b.find("#quantity-quick-buy"),

Это сайт Орифлейм https://www.oriflame.ru
При загрузке сайта Орифлейм в Network фигурирует уже известный нам домен “tag.digitaltarget.ru”.
Подгрузка идет из скриптов:
https://static.dentsu.1dmp.io/77b1533f-e392-42d4-a6e5-de2098130f31/tag-container.js
и
https://www.googletagmanager.com/gtm.js?id=GTM-P2MDQM&l=market_dataLayer
Если верить информации Whois, то домен 1dmp.io принадлежит фирме CleverDATA LLC (http://cleverdata.ru/).
На месте веб-мастеров Орифлейм, я бы проверил на всякий случай все эти скрипты, учитывая что digitaltarget.ru замечены в распространение вредоносного ПО (по версии Google), нужно быть осторожнее.


Вернемся к файлу http://tag.digitaltarget.ru/processor.js, выше я писал что он инжектит два скрипта.
С /extension_.js мы разобрались, второй скрипт грузится строкой:

b.src = window.location.protocol + "//dmg.digitaltarget.ru/1/" + a + "/i/i?" + c

Как генерируется переменная “a” я не разобрался, поэтому решил проверить все возможные варианты, так же как и в случае с /extensions.
Данные URL не грузят JS код, они редиректят и грузят “пиксели отслеживания”. При этом редирект происходит по следующей схеме:

http://dmg.digitaltarget.ru/1/1/i/i -> http://dmg.digitaltarget.ru/1/1/i/i?q=scc -> https://tag.digitaltarget.ru/200.gif

Первая ссылка, с 302 кодом отправляет нас на урл к которому добавляется ?q=scc при этом в заголовке браузеру передается Cookie. На второй ссылке происходит проверка наличия Cookie, если они есть то идет редирект на 1х1 пиксель. Если Cookie нет, то возвращается статус “204 No Content”.

Строка сканирования для dirsearch выглядела следующим образом (на всякий случай добавил User-Agent):

python3.6 dirsearch.py --wordlist=url.txt -u https://dmg.digitaltarget.ru -e php --user-agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36" --cookie="visessid=2c8a6637_16287b3d77f_0000000000fdcac6; viuserid=dOW42VwIgR3M5555RMEp"

Результат:

302 -    0B  - /1/1/i/i?q=scc  ->  https://tag.digitaltarget.ru/200.gif
302 -    0B  - /1/2/i/i?q=scc  ->  https://tag.digitaltarget.ru/200.gif
302 -    0B  - /1/88/i/i?q=scc  ->  https://dmg.digitaltarget.ru/1/1088/i/i?a=88&e=dOW42VwIgR3M5555RMEp&i=218233001522772241902000000098457503
302 -    0B  - /1/117/i/i?q=scc  ->  https://ps.eyeota.net/pixel?pid=0rij2bu&uid=dOW42VwIgR3M5555RMEp
302 -    0B  - /1/119/i/i?q=scc  ->  https://an.yandex.ru/mapuid/dmpamberdata/dOW42VwIgR3M5555RMEp
302 -    0B  - /1/123/i/i?q=scc  ->  https://ssp.adriver.ru/cgi-bin/sync.cgi?dsp_id=117&external_id=dOW42VwIgR3M5555RMEp
302 -    0B  - /1/124/i/i?q=scc  ->  https://ad.mail.ru/cm.gif?p=61&id=dOW42VwIgR3M5555RMEp
302 -    0B  - /1/185/i/i?q=scc  ->  https://sync.rambler.ru/set?partner_id=vi&id=dOW42VwIgR3M5555RMEp
302 -    0B  - /1/1037/i/i?q=scc  ->  https://cm.g.doubleclick.net/pixel?google_nid=crossmedia_ddp&google_cm&c=rs:1037&i=62528001524747114173000000032925245
302 -    0B  - /1/1047/i/i?q=scc  ->  https://cm.g.doubleclick.net/pixel?google_nid=crossmedia_ddp&google_cm&c=rs:1047&i=542105001521909723802000000129107105
302 -    0B  - /1/1082/i/i?q=scc  ->  https://cm.g.doubleclick.net/pixel?google_nid=crossmedia_ddp&google_cm&c=rs:1082&i=2562001524747253053000000032889291
302 -    0B  - /1/1086/i/i?q=scc  ->  https://dmg.digitaltarget.ru/1/117/i/i?a=117&e=dOW42VwIgR3M5555RMEp&i=192924001524747114173000000032957556
302 -    0B  - /1/1088/i/i?q=scc  ->  https://ad.mail.ru/cm.gif?p=61&id=dOW42VwIgR3M5555RMEp
302 -    0B  - /1/1108/i/i?q=scc  ->  https://cm.g.doubleclick.net/pixel?google_nid=crossmedia_ddp&google_cm&c=rs:1108&i=575037001522772242049000000098561189
302 -    0B  - /1/2155/i/i?q=scc  ->  https://ps.eyeota.net/pixel?pid=0rij2bu&t=gif&uid=dOW42VwIgR3M5555RMEp
302 -    0B  - /1/3701/i/i?q=scc  ->  https://cm.g.doubleclick.net/pixel?google_nid=crossmedia_ddp&google_cm&c=rs:3701&i=236768001524746401606000000032330519
302 -    0B  - /1/3702/i/i?q=scc  ->  https://cm.g.doubleclick.net/pixel?google_nid=crossmedia_ddp&google_cm&c=rs:3702&i=906124001524747196483000000032322238
302 -    0B  - /1/3703/i/i?q=scc  ->  https://cm.g.doubleclick.net/pixel?google_nid=crossmedia_ddp&google_cm&c=rs:3703&i=241132001524747289149000000032317374
302 -    0B  - /1/3704/i/i?q=scc  ->  https://cm.g.doubleclick.net/pixel?google_nid=crossmedia_ddp&google_cm&c=rs:3704&i=36336001524747252706000000032257933
302 -    0B  - /1/3705/i/i?q=scc  ->  https://cm.g.doubleclick.net/pixel?google_nid=crossmedia_ddp&google_cm&c=rs:3705&i=127645001522772242024000000097928742
302 -    0B  - /1/3706/i/i?q=scc  ->  https://cm.g.doubleclick.net/pixel?google_nid=crossmedia_ddp&google_cm&c=rs:3706&i=172665001524747196572000000032349386
302 -    0B  - /1/3707/i/i?q=scc  ->  https://cm.g.doubleclick.net/pixel?google_nid=crossmedia_ddp&google_cm&c=rs:3707&i=348282001524747196483000000032332741
302 -    0B  - /1/3708/i/i?q=scc  ->  https://cm.g.doubleclick.net/pixel?google_nid=crossmedia_ddp&google_cm&c=rs:3708&i=98655001524746431187000000032317346
302 -    0B  - /1/4002/i/i?q=scc  ->  https://track.inspidsp.com/track_pixel.png?prid=1&pruid=dOW42VwIgR3M5555RMEp
302 -    0B  - /1/4003/i/i?q=scc  ->  https://code.directadvert.ru/track/309562.gif?ref=prf1
302 -    0B  - /1/4006/i/i?q=scc  ->  https://code.directadvert.ru/track/309562.gif?ref=grn1
302 -    0B  - /1/4010/i/i?q=scc  ->  https://dmg.digitaltarget.ru/1/4011/i/i?a=8&e=dOW42VwIgR3M5555RMEp&i=129430001522695132994000000067270572
302 -    0B  - /1/4024/i/i?q=scc  ->  https://ad.mail.ru/cm.gif?p=61&id=dOW42VwIgR3M5555RMEp
302 -    0B  - /1/4025/i/i?q=scc  ->  https://stats.mos.ru/gc/amd/dOW42VwIgR3M5555RMEp
302 -    0B  - /1/4027/i/i?q=scc  ->  https://googleads.g.doubleclick.net/pagead/viewthroughconversion/860198479/?label=kYmVCMD2tnkQz6yWmgM&guid=ON&
302 -    0B  - /1/6016/i/i?q=scc  ->  https://tag.digitaltarget.ru/200.gif
302 -    0B  - /1/6017/i/i?q=scc  ->  https://tag.digitaltarget.ru/200.gif
302 -    0B  - /1/6018/i/i?q=scc  ->  https://secondmous.online/200.gif
302 -    0B  - /1/6343/i/i?q=scc  ->  https://ad.mail.ru/cm.gif?p=61&id=dOW42VwIgR3M5555RMEp
302 -    0B  - /1/6344/i/i?q=scc  ->  https://code.directadvert.ru/track/309562.gif?ref=op
302 -    0B  - /1/6353/i/i?q=scc  ->  https://a.marketgid.com/1x1.gif?id=332090&type=c&g=x&t=x&tg=&v=1
302 -    0B  - /1/6356/i/i?q=scc  ->  https://mc.yandex.ru/watch/46583541
302 -    0B  - /1/6363/i/i?q=scc  ->  https://sync.datamind.ru/cookie/emitter?source=yandex

Собственно, то из-за чего вся эта статья была написанна это https://track.inspidsp.com/track_pixel.png?prid=1&pruid=dOW42VwIgR3M5555RMEp
Он наделал много шума. Тыц, Тыц, Тыц, Тыц.

Обратимся к Whois. Домен inspidsp.com принадлежит Legato LLC, если обратиться к гуглу то там очень много интересного, например, эту компанию связывают с правительственными хакерами, с АНБ и тому подобное. Тыц, Тыц, Тыц, Тыц.

Как Legato LLC и Russian Ventures (владельцы Pluso) связанны и почему гугл считает что inspidsp.com распространяет вредоносное ПО - неизвестно. Так же, через гугл выяснил что данный домен использовался для каких-то SEO манипуляций по продвижению политической информации.

Мораль: Не все сервисы социальных кнопок, одинаково полезны.
Юзайте кнопки от Яндекс.

P.S. После публикации статьи ко мне обратилось пара человек с просьбой посмотреть их сайты. Заметил одну закономерность, все ссылки находятся на домене .ua (Украина). Похоже что Pluso выдает зараженный URL только на Украинских сайтах.

scribble