蚁剑改造过WAF系列(一)
字数 1829 2025-08-25 22:58:55
蚁剑改造过WAF系列教学文档
0x00 前言
本教学文档基于蚁剑改造过WAF系列文章,详细讲解如何对蚁剑进行二次开发以绕过WAF检测。蚁剑作为一款开源的webshell管理工具,其模块化设计使得二次开发相对容易。
0x01 蚁剑基础架构
1.1 蚁剑组成
蚁剑分为两部分:
- 加载器:antsword.exe,无需安装Node.js环境即可运行和调试蚁剑
- 源代码:antsword-master,使用Node.js编写,主要改造部分
1.2 核心功能模块
- 编码器(Encoder):对发送流量进行编码,服务端进行解码
- 解码器(Decoder):服务端对返回流量编码,客户端通过解码器解码还原
1.3 当前限制
- 原版蚁剑只支持PHP的编码解码
- JSP支持较弱,需要类似冰蝎的类加载机制
- 默认webshell脚本特征明显(如
<?php eval($_POST["test"]);?>)
0x02 编码器模块详解
2.1 编码器工作原理
编码器接收三个参数:
pwd:连接密码(string类型)data:传输的数据数组(string数组)ext:扩展选项(包含编解码器名称、当前编码语言、密码、URL等)
输出一个参数:
data:编码器处理后的数组
2.2 Base64编码器示例分析
原始编码器工作流程:
- 将
data[pwd]设置为base64解码代码 - 将
data[randomID]设置为原代码的base64编码数据 - 删除原有payload
data['_']
问题:解码代码在请求中传递,形成明显特征
2.3 改进方案
将解码代码内置到webshell中:
<?php eval(base64_decode($_POST["test"]));?>
对应编码器修改:
- 仅需对payload进行base64编码
- 无需传递解码函数
0x03 解码器模块详解
3.1 解码器组成
解码器导出两个方法:
asoutput:返回一段PHP代码字符串(asenc函数)decode_buff:接收时进行解码操作
3.2 解码器工作流程
- 服务端执行完代码后,调用
asenc函数编码处理返回数据 - 客户端通过
decode_buff解码返回的buffer数组
3.3 实际效果
- 返回流量被编码加密
- 返回部分有前后分界字符串,只有客户端知道分界位置
- WAF难以定位和解码
0x04 高级改造方案
4.1 多参数编码问题
默认情况下,蚁剑会传输多个参数(如执行命令时),其中部分参数可能保持base64编码不变,容易被WAF检测。
解决方案:
方案一:全参数编码
- 在编码器中对所有参数进行编码
- 服务端对请求参数进行统一解码
- 需要修改各语言的"请求获取函数"
方案二:随机前缀+倒序
- 为每个参数值添加随机长度前缀
- 在解码时去掉前缀
- 可添加参数值倒序处理
- 在UI添加前缀长度设置项
优势:
- 简单易实现
- WAF无法预测前缀长度和分割位置
- 配合倒序可防止意外解码
4.2 多语言支持改造
需要针对不同语言特点进行适配:
PHP
- 可覆盖
$_POST变量 - 相对容易实现全参数解码
ASP/ASPX
- 无预定义变量机制
- 难以覆盖request函数获取的值
- 需要更复杂的处理方式
JSP
- 需要类似冰蝎的类加载机制
- 将命令执行、文件管理等操作编译成class
- 硬编码到蚁剑中传输
0x05 实践指南
5.1 自定义编码器开发步骤
- 确定加密算法(如AES、RSA等)
- 编写webshell端解码函数并内置
- 开发对应编码器:
- 处理
data数组 - 实现加密逻辑
- 处理
- 测试编码器功能
5.2 自定义解码器开发步骤
- 编写
asoutput方法:- 返回服务端编码函数
- 确保与webshell端匹配
- 编写
decode_buff方法:- 实现客户端解码逻辑
- 处理分界字符串
- 测试全流程加解密
5.3 高级功能实现
-
随机前缀机制:
- 在UI添加前缀长度设置
- 编码时添加随机前缀
- 解码时去除前缀
-
参数倒序处理:
- 编码时反转参数值
- 解码时恢复顺序
-
多语言适配:
- 为不同语言开发特定处理模块
- 特别是ASP/ASPX/JSP的支持
0x06 参考资源
通过以上改造,可以使蚁剑实现类似冰蝎的加密传输效果,有效绕过WAF检测。关键是将解码函数内置到webshell中,避免在流量中传递解码代码,同时实现全参数混淆处理。