蚁剑改造过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 核心功能模块

  1. 编码器(Encoder):对发送流量进行编码,服务端进行解码
  2. 解码器(Decoder):服务端对返回流量编码,客户端通过解码器解码还原

1.3 当前限制

  • 原版蚁剑只支持PHP的编码解码
  • JSP支持较弱,需要类似冰蝎的类加载机制
  • 默认webshell脚本特征明显(如<?php eval($_POST["test"]);?>

0x02 编码器模块详解

2.1 编码器工作原理

编码器接收三个参数:

  • pwd:连接密码(string类型)
  • data:传输的数据数组(string数组)
  • ext:扩展选项(包含编解码器名称、当前编码语言、密码、URL等)

输出一个参数:

  • data:编码器处理后的数组

2.2 Base64编码器示例分析

原始编码器工作流程:

  1. data[pwd]设置为base64解码代码
  2. data[randomID]设置为原代码的base64编码数据
  3. 删除原有payload data['_']

问题:解码代码在请求中传递,形成明显特征

2.3 改进方案

将解码代码内置到webshell中:

<?php eval(base64_decode($_POST["test"]));?>

对应编码器修改:

  • 仅需对payload进行base64编码
  • 无需传递解码函数

0x03 解码器模块详解

3.1 解码器组成

解码器导出两个方法:

  1. asoutput:返回一段PHP代码字符串(asenc函数)
  2. decode_buff:接收时进行解码操作

3.2 解码器工作流程

  1. 服务端执行完代码后,调用asenc函数编码处理返回数据
  2. 客户端通过decode_buff解码返回的buffer数组

3.3 实际效果

  • 返回流量被编码加密
  • 返回部分有前后分界字符串,只有客户端知道分界位置
  • WAF难以定位和解码

0x04 高级改造方案

4.1 多参数编码问题

默认情况下,蚁剑会传输多个参数(如执行命令时),其中部分参数可能保持base64编码不变,容易被WAF检测。

解决方案:

方案一:全参数编码

  • 在编码器中对所有参数进行编码
  • 服务端对请求参数进行统一解码
  • 需要修改各语言的"请求获取函数"

方案二:随机前缀+倒序

  1. 为每个参数值添加随机长度前缀
  2. 在解码时去掉前缀
  3. 可添加参数值倒序处理
  4. 在UI添加前缀长度设置项

优势:

  • 简单易实现
  • WAF无法预测前缀长度和分割位置
  • 配合倒序可防止意外解码

4.2 多语言支持改造

需要针对不同语言特点进行适配:

PHP

  • 可覆盖$_POST变量
  • 相对容易实现全参数解码

ASP/ASPX

  • 无预定义变量机制
  • 难以覆盖request函数获取的值
  • 需要更复杂的处理方式

JSP

  • 需要类似冰蝎的类加载机制
  • 将命令执行、文件管理等操作编译成class
  • 硬编码到蚁剑中传输

0x05 实践指南

5.1 自定义编码器开发步骤

  1. 确定加密算法(如AES、RSA等)
  2. 编写webshell端解码函数并内置
  3. 开发对应编码器:
    • 处理data数组
    • 实现加密逻辑
  4. 测试编码器功能

5.2 自定义解码器开发步骤

  1. 编写asoutput方法:
    • 返回服务端编码函数
    • 确保与webshell端匹配
  2. 编写decode_buff方法:
    • 实现客户端解码逻辑
    • 处理分界字符串
  3. 测试全流程加解密

5.3 高级功能实现

  1. 随机前缀机制

    • 在UI添加前缀长度设置
    • 编码时添加随机前缀
    • 解码时去除前缀
  2. 参数倒序处理

    • 编码时反转参数值
    • 解码时恢复顺序
  3. 多语言适配

    • 为不同语言开发特定处理模块
    • 特别是ASP/ASPX/JSP的支持

0x06 参考资源

  1. 蚁剑官方文档(需代理访问)
  2. 蚁剑流量分析到改装蚁剑之waf绕过
  3. 从静态到动态打造一款免杀的antSword(蚁剑)
  4. 编码器、解码器示例

通过以上改造,可以使蚁剑实现类似冰蝎的加密传输效果,有效绕过WAF检测。关键是将解码函数内置到webshell中,避免在流量中传递解码代码,同时实现全参数混淆处理。

蚁剑改造过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中: 对应编码器修改: 仅需对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绕过 从静态到动态打造一款免杀的antSword(蚁剑) 编码器、解码器示例 通过以上改造,可以使蚁剑实现类似冰蝎的加密传输效果,有效绕过WAF检测。关键是将解码函数内置到webshell中,避免在流量中传递解码代码,同时实现全参数混淆处理。