webshell多种方法免杀
0x00 前提
- -2020 最后一天了,这个月其实没有完整的写完东西,这是以前的存货了,应为生病了,真的的难受的不行,什么也干不了,天天站不行坐不行,躺着也不行了。。。哎。。。总之身体真的很重要,别搞坏了身体!!!
- webshell这个东西对于web方向的还是极其重要的,getshell被杀了很难受,于是来研究一波自己的免杀马儿,毕竟别人没有自己的好用,而且分享出来分分钟被杀。
- 在本篇文章中将会介绍一些常用的木马免杀技巧
0x01 检测情况
- WAF一般都是维护一个规则库,记录webshell常用的函数、方法等等,通过这个规则库匹配从而检测是否是木马。
- 当匹配上对应特征时就是告警,但是规则匹配肯定会有误报,waf一直告警也很烦,所以waf一般会稳定为首要目标,也会放宽一下规则,这就是绕的基础
查杀软件我首先:D盾
『D盾_防火墙』专为IIS设计的一个主动防御的保护软件,以内外保护的方式 防止网站和服务器给入侵,在正常运行各类网站的情 况下,越少的功能,服务器越安全的理念而设计! 限制了常见的入侵方法,让服务器更安全!
0x02 PHP一句话
这次主要是对php的一句话免杀实验
首先我们先看一下最常见的php一句话
1 | eval(@$_POST['a']); |
解析一下:
- 其中 eval () 就是执行命令的函数,
- $_POST[‘a’] 就是接收的数据的函数,a是传递的参数。
- eval函数把接收的数据当作PHP代码来执行。
- 这便是一句话木马
我更加喜爱assert函数
1 | <?php assert(@$_POST['a']); ?> |
原因:
php5和php7是有差异的
函数 | 说明 |
---|---|
eval | PHP 4, PHP 5, PHP 7+ 均可用,接受一个参数,将字符串作为PHP代码执行 |
assert | PHP 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() 可以被可变函数调用,例如诸多的回调函数,这样就方便了许多
1 | <?php |
0x03 assert函数
assert是一个断言函数,当assert进行判断时,如果为false,则会发出Warning的提醒,但是依然会继续向下执行。对于调试很好,尤其是可以使用回调函数的时候,如果对用户输入的数据过滤不严谨的话,assert的危害比eval还要大。
便需要结合不同编程语言要有不同的应对方式,我用php做实例,总的思路就是:要刨除代码和函数的关系
大体有以下几个思路:
- 字符串变换(拼接、编码、等等。。。)
- 函数特性
- 类特性
- 混合免杀
- 奇思妙想
0x03 字符串变换
单纯的字符串变化还是有可疑,我们还需要配合其他
1 |
|
0x04 函数特性
函数特性里面我知道的有:
- 自定义函数绕过
- 变形回调
- 数组
- 可变变量
自定义函数绕过
纯自定义函数还是可以绕过的
下面是送大家的免杀马,估计过几天就废了
1 | <?php |
回调函数+组合绕过
这个现在有点费劲了,找了下面这些
大部分都已经被拉黑了。。。单独用都得死
1 | call_user_func_array() |
- 所以只能稍微配合上面的内容,奉献下面的免杀马
- 这个那就是定义个函数加个简单的拼接
1 | <?php |
数组绕过
二维数组
考虑见要执行的一句话木马程序放到数组中执行达到绕过的目的
下面也是老样子,免杀马送上
1 | <?php |
可变变量
PHP中有一种变量叫做可变变量,这种变量不是一种基础类型的变量。可变变量是指一个普通变量的值可以作为另一个变量的名称被使用。这句话听起来有些抽象。我们可以通过实例来展示可变变量的定义以及实用。
例如
1 | $a = 'hello'; |
在上面这段代码中,第一行是一个普通的变量定义,变量名称为a,变量值为hello。
第二行使用变量a的值,定义了一个变量,这个变量的名字叫做hello(也就是a的值),值为world。
将这个变量输出之后的结果是:world。
1 | <?php |
不行了,这个已经有点问题了,那么只能把eval函数在再处理一下,要结合下面的特殊字符干扰
0x05 特殊字符干扰
- 要求是能干扰到杀软的正则判断,还要代码能执行。
- 这个可以自己fuzz
- 大概就是说各种回车、换行、null和空白字符
- 我这里试了一下成功了,配合上面的可变变量
下面送上免杀马一个:
1 | <?php |
0x06 使用类绕过
类现在发现好多人在用,这个好像D盾检测的最轻,用类自然就少不了魔法函数
简单构造一个类的免杀马
1 | <?php |
0x07 还有一种无字母的马
主要思路就是:
- 没有字母,简单来说就是字母被替代了
- 就是用各种运算,例如异或,拼装出来想要的函数
- 最后能构造出a-z中任意一个字符。
- 然后再利用PHP允许动态函数执行的特点,
- 拼接处一个函数名,如“assert”,然后动态执行之即可。
参考P牛的,这个讲的已经很清楚,想了解的可以看看
https://www.leavesongs.com/PENETRATION/webshell-without-alphanum.html
我送上一道之前做的题,异曲同工,很有意思。
1 | <?php |
0x08 总结
- 感觉下来一句话的免杀还是比较简单的,单一的方法不太好多,但是组合几个方法还是很方便的。
- 个人感觉PHP免杀的要点就在于PHP允许动态函数执行的特点,提供很多的思路。
- 后续就是研究流量的免杀和菜刀的免杀了。