从防护角度看一句话木马的发展变形
字数 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']);?>
工作原理:
- 通过Cknife等发包工具将PHP脚本片段通过密码pass参数传给服务器端
- 服务器通过eval函数执行接收到的代码
- 命令在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实现原理:
- 提交数据先解密
- 解密数据作为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
- 其他相关技术分享博客