蚁剑改造计划之实现其他参数的随机化
字数 1524 2025-08-20 18:17:31
蚁剑改造计划:实现其他参数的随机化
前言
本文档详细讲解如何对蚁剑进行改造,实现其他参数的随机化处理,以增强对抗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编码处理器:
/**
* 增加随机前缀的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值,解决方案:
- 将
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,只需按照相同模式修改对应模板文件即可实现参数的随机化处理。