蚁剑改造计划之实现其他参数的随机化
字数 1524 2025-08-20 18:17:31

蚁剑改造计划:实现其他参数的随机化

前言

本文档详细讲解如何对蚁剑进行改造,实现其他参数的随机化处理,以增强对抗WAF的能力。蚁剑默认对其他参数仅进行base64编码,这留下了明显的特征容易被WAF识别。通过本改造,可以在参数前添加随机字符串,打乱base64解码,提高隐蔽性。

问题分析

蚁剑存在以下历史遗留问题:

  • 对其他参数仅进行base64编码(如执行cmd时发送base64编码的cmd字符串)
  • 即使使用aes编码器也只加密主payload,其他参数仍暴露攻击行为
  • 现有解决方案(如双重base64或固定前缀)容易被WAF规则识别

解决方案

采用在每个第三方参数前添加用户自定义长度的随机字符串的方法:

  1. 用户可自定义随机前缀长度
  2. 修改核心payload模板处理随机前缀
  3. 随机字符串打乱base64解码,使WAF无法直接分析参数内容

具体实现步骤

1. 前端设置

在设置界面添加文本框用于获取用户输入的随机前缀长度:

  • 修改source/core/base.js定义randomPrefix变量
  • source/modules/settings/adefault.js中设置默认值

2. 后端处理

后端通过opts.otherConf["random-Prefix"]获取用户定义的随机前缀长度值。

3. 参数处理流程修改

蚁剑参数处理流程:

  1. 各类型shell模板文件定义默认payload及参数编码方式(如source/core/php/template/filemanager.js
  2. parseTemplate函数提取、解析、组合参数形成最终payload(source/core/base.js

需要修改两个部分:

  1. 核心payload模板 - 用#randomPrefix#标记偏移量
  2. 其他参数组合模块 - 添加随机前缀

4. 新增编码处理器

添加newbase64编码处理器:

/**
 * 增加随机前缀的base64编码
 * @param {String} str 字符串
 * @return {String} 编码后的字符串
 */
newbase64(str) {
  let randomString=(length)=>{
    let chars='0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
    let result = '';
    for (let i = length; i > 0; --i) 
      result += chars[Math.floor(Math.random() * chars.length)];
    return result;
  }
  return randomString(randomPrefix)+Buffer.from(iconv.encode(Buffer.from(str), encode)).toString('base64');
}

5. 模板修改

修改后的模板示例:

  • 将参数处理函数改为newbase64
  • 处理format()函数中opts值的传递问题(原代码已注释掉new this.format改用Base.prototype.format

6. 参数传递调整

由于无法在format()函数中直接获取opts值,解决方案:

  1. opts传给format函数
  2. format中重新获取所需变量

测试与使用

  1. 前缀长度默认设为2,可自定义修改(建议不要设为4的倍数)
  2. 使用示例:
    • 原始参数值:prototype=/phpStudy/PHPTutorial/WWW/phpMyAdmin/
    • 处理后参数:prototype=ojRDovcGhwU3R1ZHkvUEhQVHV0b3JpYWwvV1dXL3BocE15QWRtaW4v
    • 直接base64解码为乱码
    • 去除前两位后解码可得到正确结果

注意事项

  1. 前缀长度建议设为10位以上,增加分析难度
  2. 已在PHP类型下测试13个主要功能,确认可用
  3. 修改位于父类Base中,其他类型shell只需按相同模式修改对应模板
  4. 由于涉及核心payload修改,需充分测试确保无bug后再应用于其他类型

技术原理

  1. base64解码特性:base64解码时每4个字符为一组处理,添加非4倍数长度的随机前缀会打乱解码过程
  2. 随机性防御:用户自定义长度的随机前缀使WAF难以通过固定规则识别
  3. 完整加密链:配合强加密型编码器,实现从主payload到参数的全链路保护

扩展应用

该方法可应用于蚁剑支持的各种类型shell,只需按照相同模式修改对应模板文件即可实现参数的随机化处理。

蚁剑改造计划:实现其他参数的随机化 前言 本文档详细讲解如何对蚁剑进行改造,实现其他参数的随机化处理,以增强对抗WAF的能力。蚁剑默认对其他参数仅进行base64编码,这留下了明显的特征容易被WAF识别。通过本改造,可以在参数前添加随机字符串,打乱base64解码,提高隐蔽性。 问题分析 蚁剑存在以下历史遗留问题: 对其他参数仅进行base64编码(如执行cmd时发送base64编码的cmd字符串) 即使使用aes编码器也只加密主payload,其他参数仍暴露攻击行为 现有解决方案(如双重base64或固定前缀)容易被WAF规则识别 解决方案 采用在每个第三方参数前添加用户自定义长度的随机字符串的方法: 用户可自定义随机前缀长度 修改核心payload模板处理随机前缀 随机字符串打乱base64解码,使WAF无法直接分析参数内容 具体实现步骤 1. 前端设置 在设置界面添加文本框用于获取用户输入的随机前缀长度: 修改 source/core/base.js 定义 randomPrefix 变量 在 source/modules/settings/adefault.js 中设置默认值 2. 后端处理 后端通过 opts.otherConf["random-Prefix"] 获取用户定义的随机前缀长度值。 3. 参数处理流程修改 蚁剑参数处理流程: 各类型shell模板文件定义默认payload及参数编码方式(如 source/core/php/template/filemanager.js ) parseTemplate 函数提取、解析、组合参数形成最终payload( source/core/base.js ) 需要修改两个部分: 核心payload模板 - 用 #randomPrefix# 标记偏移量 其他参数组合模块 - 添加随机前缀 4. 新增编码处理器 添加 newbase64 编码处理器: 5. 模板修改 修改后的模板示例: 将参数处理函数改为 newbase64 处理 format() 函数中 opts 值的传递问题(原代码已注释掉 new this.format 改用 Base.prototype.format ) 6. 参数传递调整 由于无法在 format() 函数中直接获取 opts 值,解决方案: 将 opts 传给 format 函数 在 format 中重新获取所需变量 测试与使用 前缀长度默认设为2,可自定义修改(建议不要设为4的倍数) 使用示例: 原始参数值: prototype=/phpStudy/PHPTutorial/WWW/phpMyAdmin/ 处理后参数: prototype=ojRDovcGhwU3R1ZHkvUEhQVHV0b3JpYWwvV1dXL3BocE15QWRtaW4v 直接base64解码为乱码 去除前两位后解码可得到正确结果 注意事项 前缀长度建议设为10位以上,增加分析难度 已在PHP类型下测试13个主要功能,确认可用 修改位于父类 Base 中,其他类型shell只需按相同模式修改对应模板 由于涉及核心payload修改,需充分测试确保无bug后再应用于其他类型 技术原理 base64解码特性 :base64解码时每4个字符为一组处理,添加非4倍数长度的随机前缀会打乱解码过程 随机性防御 :用户自定义长度的随机前缀使WAF难以通过固定规则识别 完整加密链 :配合强加密型编码器,实现从主payload到参数的全链路保护 扩展应用 该方法可应用于蚁剑支持的各种类型shell,只需按照相同模式修改对应模板文件即可实现参数的随机化处理。