从防护角度看一句话木马的发展变形
字数 1951 2025-08-18 11:39:26

一句话木马的发展变形与防护分析

一、前言

一句话木马采用了一种独特的命令下发思路:不直接发送命令编码,而是将命令代码直接发送给木马端执行。这种设计使得木马端文件特别小,但由于每条命令需要通过网络传输,数据包会比较大。这些工具的流量也是IPS、WAF等网络安全设备的检测重点。

一句话木马的发展历程:

  • 中国菜刀(早期代表)
  • Cknife(开源工具)
  • 中国蚁剑
  • 冰蝎(近两年出现)
  • Poison Ivy(二进制远控,零几年就已出现)

二、WEB一句话木马

2.1 Cknife连接分析

2.1.1 PHP一句话连接

基础PHP一句话木马:

<?php @eval($_POST['pass']);?>

工作原理:

  1. 通过Cknife等发包工具将PHP脚本片段通过密码pass参数传给服务器端
  2. 服务器通过eval函数执行接收到的代码
  3. 命令在config.ini中定义

示例解码后的PHP命令:

@ini_set("display_errors","0");
@set_time_limit(0);
@set_magic_quotes_runtime(0);
echo("- |");;
$D=base64_decode($_POST["z1"]);
$F=@opendir($D);
if($F==NULL){
    echo("ERROR:// Path Not Found Or No Permission!");
}else{
    $M=NULL;$L=NULL;
    while($N=@readdir($F)){
        $P=$D."/".$N;
        $T=@date("Y-m-d H:i:s",@filemtime($P));
        @$E=substr(base_convert(@fileperms($P),10,8),-4);
        $R="\t".$T."\t".@filesize($P)."\t".$E."";
        if(@is_dir($P))$M.=$N."/".$R;
        else $L.=$N.$R;
    }
    echo $M.$L;
    @closedir($F);
};
echo("|<-");die();

2.1.2 PHP一句话连接流量检测

常见检测规则示例(Snort规则):

  • 检测字符串:=@eval(base64_decode($_POST
  • 问题:规则过于严格,容易漏报(如Cknife报文中eval后带有\x01)

检测建议:

  • 参数名、参数值模式匹配
  • 流量特征分析
  • 避免过于严格的规则

2.1.3 JSP一句话连接

Java没有eval函数,因此最初没有一句话木马。后来出现了通过定制(customize)方式传输命令码的webshell。

特点:

  • 短请求
  • 参数名、参数值有特定模式

2.1.4 JSP一句话连接流量检测

检测难点:

  • 请求较短
  • 无明显特征

检测思路:

  • 常见工具流量模式分析
  • 参数名、参数值规律匹配

2.2 冰蝎连接

冰蝎采用加密传输,解决了Cknife/菜刀明文传输可被检测的问题。

Java实现原理:

  1. 提交数据先解密
  2. 解密数据作为class文件的字节码
  3. 通过自定义classloader的get方法调用父类defineclass方法动态生成类
  4. 调用重载的equals函数执行命令

技术细节:

  • 父类defineclass方法是protect属性,子类可直接调用
  • 继承父类classloader可避免不同classloader找不到相关类
  • 重载的equals函数接受pagecontext参数,可调用页面参数并设置应答内容

流量检测难点:

  • 全加密传输
  • 与传统菜刀/Cknife原理完全不同

三、二进制一句话木马

3.1 Poison Ivy Reload分析

3.1.1 被控端

主要结构:

  • 配置文件和函数地址定义在global_data_t结构
  • 使用宏指令生成紧凑结构

客户端配置:

  • 连接方式
  • 启动项
  • 连接密码等

API地址:

  • 加载后重新计算偏移进行修复

主要流程:

  1. 初始化global_config配置
  2. 主动外联控制端
  3. 发送17字节头部(上线通知)
  4. RC4加密后发送
  5. 等待接收shellcode命令
  6. 收到数据后RC4解密
  7. 分配内存,解压缩并拷贝数据
  8. 执行代码

启动方式:

  1. 本进程启动
  2. 远程注入到IE启动

启动项选项:

  • 多种持久化方式

3.1.2 控制端

特点:

  • Delphi编写
  • 使用shellcode实现功能
  • shellcode代码在loader文件夹下

功能模块:

  • function目录:基础控制函数
    • shell_main.c:控制端传来的第一段shellcode,初始化结构并作为消息处理框架
    • information:收集被控端本地信息
    • cmdshell:反弹cmd端口
    • screenspy:抓取屏幕
    • process:列当前进程
    • thumbnail:获取图标
  • loader_function和extra_function目录:其他功能函数
    • 添加启动项
    • 远程注入
    • socks5连接等

3.1.3 通信流量分析

交互流程:

  1. 第一次交互:被控端上线,控制端发送shellcode_main作为消息处理框架
  2. 第二次交互:被控端请求information的shellcode(功能函数)
  3. 第三次交互:执行shellcode并回传结果

功能函数示例:

  • get_lan_info:获取局域网信息
  • get_os_version:获取操作系统版本
  • get_cpu_frequency:获取CPU频率

3.1.4 流量检测

检测难点:

  • 加密流量
  • 私有协议

可能的检测方法:

  1. 上线流量模式识别(前期流量较固定)
  2. 心跳包统计(大量ping pong包)
  3. 会话统计分析(非传统特征匹配)

四、防护总结

当前防护挑战:

  1. 交互流量加密
  2. 协议私有化
  3. 传统特征匹配失效

未来防护方向:

  1. 态势感知系统
  2. 统计分析功能
  3. 行为模式识别
  4. 异常流量检测

参考资料

  1. Poison Ivy Reload GitHub
  2. Behinder GitHub
  3. 其他相关技术分享博客
一句话木马的发展变形与防护分析 一、前言 一句话木马采用了一种独特的命令下发思路:不直接发送命令编码,而是将命令代码直接发送给木马端执行。这种设计使得木马端文件特别小,但由于每条命令需要通过网络传输,数据包会比较大。这些工具的流量也是IPS、WAF等网络安全设备的检测重点。 一句话木马的发展历程: 中国菜刀(早期代表) Cknife(开源工具) 中国蚁剑 冰蝎(近两年出现) Poison Ivy(二进制远控,零几年就已出现) 二、WEB一句话木马 2.1 Cknife连接分析 2.1.1 PHP一句话连接 基础PHP一句话木马: 工作原理: 通过Cknife等发包工具将PHP脚本片段通过密码pass参数传给服务器端 服务器通过eval函数执行接收到的代码 命令在config.ini中定义 示例解码后的PHP命令: 2.1.2 PHP一句话连接流量检测 常见检测规则示例(Snort规则): 检测字符串: =@eval(base64_decode($_POST 问题:规则过于严格,容易漏报(如Cknife报文中eval后带有\x01) 检测建议: 参数名、参数值模式匹配 流量特征分析 避免过于严格的规则 2.1.3 JSP一句话连接 Java没有eval函数,因此最初没有一句话木马。后来出现了通过定制(customize)方式传输命令码的webshell。 特点: 短请求 参数名、参数值有特定模式 2.1.4 JSP一句话连接流量检测 检测难点: 请求较短 无明显特征 检测思路: 常见工具流量模式分析 参数名、参数值规律匹配 2.2 冰蝎连接 冰蝎采用加密传输,解决了Cknife/菜刀明文传输可被检测的问题。 Java实现原理: 提交数据先解密 解密数据作为class文件的字节码 通过自定义classloader的get方法调用父类defineclass方法动态生成类 调用重载的equals函数执行命令 技术细节: 父类defineclass方法是protect属性,子类可直接调用 继承父类classloader可避免不同classloader找不到相关类 重载的equals函数接受pagecontext参数,可调用页面参数并设置应答内容 流量检测难点: 全加密传输 与传统菜刀/Cknife原理完全不同 三、二进制一句话木马 3.1 Poison Ivy Reload分析 3.1.1 被控端 主要结构: 配置文件和函数地址定义在global_ data_ t结构 使用宏指令生成紧凑结构 客户端配置: 连接方式 启动项 连接密码等 API地址: 加载后重新计算偏移进行修复 主要流程: 初始化global_ config配置 主动外联控制端 发送17字节头部(上线通知) RC4加密后发送 等待接收shellcode命令 收到数据后RC4解密 分配内存,解压缩并拷贝数据 执行代码 启动方式: 本进程启动 远程注入到IE启动 启动项选项: 多种持久化方式 3.1.2 控制端 特点: Delphi编写 使用shellcode实现功能 shellcode代码在loader文件夹下 功能模块: function目录:基础控制函数 shell_ main.c:控制端传来的第一段shellcode,初始化结构并作为消息处理框架 information:收集被控端本地信息 cmdshell:反弹cmd端口 screenspy:抓取屏幕 process:列当前进程 thumbnail:获取图标 loader_ function和extra_ function目录:其他功能函数 添加启动项 远程注入 socks5连接等 3.1.3 通信流量分析 交互流程: 第一次交互:被控端上线,控制端发送shellcode_ main作为消息处理框架 第二次交互:被控端请求information的shellcode(功能函数) 第三次交互:执行shellcode并回传结果 功能函数示例: get_ lan_ info:获取局域网信息 get_ os_ version:获取操作系统版本 get_ cpu_ frequency:获取CPU频率 3.1.4 流量检测 检测难点: 加密流量 私有协议 可能的检测方法: 上线流量模式识别(前期流量较固定) 心跳包统计(大量ping pong包) 会话统计分析(非传统特征匹配) 四、防护总结 当前防护挑战: 交互流量加密 协议私有化 传统特征匹配失效 未来防护方向: 态势感知系统 统计分析功能 行为模式识别 异常流量检测 参考资料 Poison Ivy Reload GitHub Behinder GitHub 其他相关技术分享博客